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."
| Approach | What works | What breaks |
|---|---|---|
| Master quote template | Fast for a month | Five forks, nobody knows the current rates |
| ERP item catalog | Trading / distribution SKUs | Explodes into near-duplicate lines or flattens composites |
| Hire more estimators | More throughput | More interpretation drift |
| LLM writes the whole quote | Pretty prose | Invented prices, silent margin leaks |
If you have not scored where hours leak, run the ops automation audit checklist before buying any "AI quoting" SaaS.

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_PRICEwith 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:
| Layer | Default pick | Why |
|---|---|---|
| Orchestration | n8n | Retries, Code node, self-host option, cheap at volume |
| CRM / pipeline | GoHighLevel or HubSpot | Estimator already lives there; stages for draft / approved / won |
| Rate store | Postgres + pgvector | Governed rates + semantic match |
| Inbound chat photos | WhatsApp Cloud API | Where site photos already arrive |
| Docs | Template → PDF (DocRaptor, Playwright, or your ERP export) | Stable layout beats LLM-drawn tables |
| Lead site (optional) | Next.js upload form | Cleaner 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.

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
- Export every rate you trust into one sheet. Kill duplicate descriptions.
- Pick the highest-volume RFQ channel (usually email or WhatsApp).
- Build parse → match → draft for that channel only.
- Force human approve. Ship five real quotes. Log misses.
- Promote newly priced lines into the rate store so the catalog learns.
- 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.

