AI quotation automation for contractors: parse, price, approve

How contractors and service businesses automate quotes without inventing prices. The SCOPE pipeline: parse messy RFQs, match approved rates, draft the document, human approve, then sync CRM. Practical stack with n8n, Postgres, and GoHighLevel.

SaifullahSaifullah
7 min read
AI quotation automation for contractors: parse, price, approve

Your estimator is not slow because they cannot price. They are slow because every RFQ arrives as a PDF, a WhatsApp photo of a marked-up drawing, or three bullet points in an email, and the "system" is still Save As on last month's quote.

I see the same pattern in MEP and facilities contractors, cleaning and maintenance firms, and US home-service shops that quote composite jobs (labor + materials + access difficulty). Hiring another estimator adds capacity and another private spreadsheet. The bottleneck is architectural.

Here is the pipeline I build when quotes are the choke point between inquiry and cash: SCOPE. Parse scope → Catalog match → Output draft → Person approves → Export to CRM/ERP. The language model does language. Code does money. Blur that line and you get a polite hallucination with a dollar sign.

Why templates and ERP quote modules stall

Direct answer: shared Excel masters drift within a quarter, and most ERP quoting screens assume a product SKU catalog. Maintenance and job-based scope is composite ("supply, install, test AHUs on G+4 quarterly"), not a clean item master. Teams bypass the ERP module, return to Word and Excel, and wonder why automation "does not fit contractors."

ApproachWhat worksWhat breaks
Master quote templateFast for a monthFive forks, nobody knows the current rates
ERP item catalogTrading / distribution SKUsExplodes into near-duplicate lines or flattens composites
Hire more estimatorsMore throughputMore interpretation drift
LLM writes the whole quotePretty proseInvented prices, silent margin leaks

If you have not scored where hours leak, run the ops automation audit checklist before buying any "AI quoting" SaaS.

Soft Paper diagram of the SCOPE quotation pipeline from parse to CRM sync

The SCOPE pipeline

S: Scope parse (ingestion)

Accept RFQs from the channels you already use: email inbox, WhatsApp media via the WhatsApp Cloud API, tender portal downloads, photos from site walks.

OCR the scans. Run an LLM only to extract structured lines: description, quantity, unit, location, frequency, constraints. No prices in this step. Output JSON your code can validate.

Example shape I aim for:

{ "source": "whatsapp", "lines": [ { "description": "Quarterly PPM fan coil units", "qty": 12, "unit": "each", "location": "G+4", "frequency": "quarterly" } ], "notes": ["After-hours access required"] }

C: Catalog match (rate store)

This is the company asset. One Postgres table (or equivalent) of approved rates: description, unit, labor/material/plant build-up, markup rules, validity dates, conditions.

Incoming wording never matches your catalog exactly. Use embeddings (pgvector is enough for many shops) to propose the closest approved rate with a confidence score. Exact SKU match when you have one. Never invent a rate.

Update a rate once; every future draft inherits it. That is how pricing stops living in a person's head.

O: Output draft (template generation)

Assemble the BOQ and quote PDF from a template. Rules that keep QS trust:

  • Every money field comes from a lookup
  • The model may draft narrative: assumptions, exclusions, scope prose
  • Unknown lines render as NEEDS_PRICE with a bright flag, not a guessed number

Version every revision. Client asks to drop two lines and add a discount? That is v2. Keep v1. Tender disputes care about what you actually sent.

P: Person approves

No quote leaves without an estimator or owner click. Automation removes re-keying. Humans keep commercial judgment: this client's markup, this site's risk, this exclusion set.

Record who approved and when. In GoHighLevel that can be an opportunity stage; in a custom UI it is an approve button wired to the same audit log.

E: Export (CRM / ERP sync)

On accept, push the won quote into CRM and accounting so ops invoices what sales sold. I usually orchestrate this in n8n: webhook → transform → HubSpot/GHL deal → QuickBooks/Xero/SAP endpoint. Retries and logging matter more than a fancy UI.

For CRM wiring patterns, see connect AI to CRM. For when n8n beats Make on this kind of rail, see n8n vs Make vs custom.

Honesty boundary (tattoo this on the SOW)

The model never emits prices. Deterministic code looks up rates. Unmatched scope escalates to a human. Anything else is a demo toy.

I have seen "AI quotation" tools that generate plausible unit rates from thin air. That will lose you a tender or a lawsuit faster than a slow PDF. If a vendor cannot show the lookup path in their architecture diagram, do not put them on production money.

Practical stack I actually wire

Opinionated, not sacred:

LayerDefault pickWhy
Orchestrationn8nRetries, Code node, self-host option, cheap at volume
CRM / pipelineGoHighLevel or HubSpotEstimator already lives there; stages for draft / approved / won
Rate storePostgres + pgvectorGoverned rates + semantic match
Inbound chat photosWhatsApp Cloud APIWhere site photos already arrive
DocsTemplate → PDF (DocRaptor, Playwright, or your ERP export)Stable layout beats LLM-drawn tables
Lead site (optional)Next.js upload formCleaner than "email us a scope" when you control the funnel

Start with one inbound channel and your top 50 rates. Do not boil the ocean. A paid pilot that turns five real RFQs into approved drafts teaches more than a six-month "quotation platform" project.

Stack diagram showing WhatsApp email into n8n, rate store, human approval, and CRM export

What changes at the desk (numbers that matter)

When SCOPE is working, the estimator's day shifts from typing to reviewing. Concrete targets I set with operators:

  • Draft time: first priced draft in minutes for matched scope, not hours of rebuild
  • Consistency: two people quoting the same PPM scope pull the same rate lines
  • Queue during rush: RFQ clusters around renewals; automation absorbs re-keying so seniors stay on negotiation and site risk
  • Onboarding: new estimators produce on-brand quotes from day one because the store enforces rates

A mid-size maintenance desk I worked with was spending roughly 3 to 5 hours per complex quote rebuilding from prior PDFs. After rate consolidation and a parse → match → approve rail, matched jobs landed as reviewable drafts in under 20 minutes, with seniors only pricing the flagged unknowns. Your numbers will differ. Measure before and after on the same job types.

WhatsApp photo RFQs deserve a special callout: without API + OCR + CRM, those threads die in a phone. Patterns in WhatsApp Business API automation apply here as much as to booking bots.

How to start this month

  1. Export every rate you trust into one sheet. Kill duplicate descriptions.
  2. Pick the highest-volume RFQ channel (usually email or WhatsApp).
  3. Build parse → match → draft for that channel only.
  4. Force human approve. Ship five real quotes. Log misses.
  5. Promote newly priced lines into the rate store so the catalog learns.
  6. Add CRM/ERP sync once the draft quality is boring.

If a partner proposes skipping the rate store and "letting AI price from the web," end the meeting. Compare that pitch to the buyer questions in how to choose an AI automation partner.

Soft close

Quotation automation is not a magic PDF button. It is a governed rate spine with a language model on the messy edges.

If your estimators are drowning in Save As, bring one sample RFQ and your current rate sheet to a free discovery call on cal.com/saifyxpro. We can tell quickly whether you need SCOPE wiring or just a cleaner catalog and a Make scenario.

Share this post