What this automation does
A customer emails “need pricing on 40 of the 3/4 brass ball valves and 2 cases of the PTFE tape we got last time” and a correct quote goes back in minutes, not tomorrow.
- Receive the request. A shared quotes inbox or web form triggers the workflow. Attachments are pulled along with the body.
- Identify the customer. Match the sender’s email and domain to a customer record, which determines their price list, terms and tax status.
- Extract line items. The model returns each requested item with description, quantity, unit of measure and any part number mentioned, as structured JSON.
- Map to SKUs. A matching step checks the customer cross-reference table, then the catalog, then order history (“what we got last time”). Each line gets a match confidence.
- Price in code. For matched lines, code pulls the customer’s price, applies volume breaks and contract terms, adds freight rules and tax status, and computes margin per line and overall.
- Check and route. Quotes with all lines matched and margin above the floor are created ready to send. Anything with an unmatched line, a below-floor margin, or an unusual total goes to a rep or manager for approval.
- Create, send, track. The quote is created in the CRM or accounting system with a validity date, sent as a PDF, and a follow-up is scheduled before it expires.
When it is worth building
It pays off when quote requests arrive as free-form emails, inside sales spends much of the day keying them into a system, and slow turnaround costs you orders. In distribution and trade sales, the first accurate quote back often wins the order.
Skip it if your quotes are a few complex, engineered jobs a week; those need an estimator and possibly the proposal generation approach. If customers already order through a portal with live pricing, improve the portal instead. For freight pricing specifically, see AI freight quote automation.
Architecture
| Layer | What we use | Why |
|---|---|---|
| Intake | Outlook or Gmail shared inbox, web form | Where quote requests already arrive |
| Extraction | OpenAI’s GPT models or Claude Sonnet 5.5 with structured output | Reads emails, tables and PDF attachments into line items |
| Item matching | Catalog plus cross-reference table in Postgres, with fuzzy and semantic search | Customer wording rarely matches your SKU descriptions |
| Pricing engine | Code reading the price book and customer terms | Deterministic, testable, auditable prices |
| Approvals | Slack or email approval with the margin breakdown | Managers approve exceptions without opening the ERP |
| Quote record | HubSpot or Salesforce quotes, QuickBooks Online estimates, or NetSuite through its REST API | The quote lives where orders and invoices are created |
| Orchestration | n8n | Connects inbox, database, CRM and accounting in one flow |
How to build it
- Export the catalog and price rules. Get SKUs, descriptions, units of measure, price lists, customer-specific pricing and volume breaks into a form code can read. Document any rule that lives only in a rep’s head.
- Build the cross-reference table. Seed it from past quotes and orders: customer part numbers, superseded SKUs, and common shorthand. This table improves every week the system runs.
- Write the extraction schema. Line items with raw text, quantity, unit and part number. Ask the model to keep the customer’s original wording alongside its interpretation.
- Match with confidence. Exact part number matches first, then cross-reference, then semantic search on descriptions limited to in-stock or active items. Set a threshold below which a human confirms.
- Write the pricing engine as tested code. Unit conversions, price lookups, breaks, freight and tax rules each get test cases from real past quotes.
- Set approval rules. Margin floor, maximum auto-quote total, and new-customer handling. Every approval request shows the margin math.
- Run alongside reps. For two to three weeks, generate quotes in parallel with the manual process and compare line by line before letting any quote send automatically.
What breaks in production
- Unit of measure errors. “2 cases” quoted as 2 each, or a box of 12 priced per unit. Store pack sizes per SKU and convert explicitly; this is the most expensive error class.
- Contract pricing missed. A customer with negotiated pricing gets list price and complains, or list-price customers get a contract rate. Customer matching must succeed before pricing runs.
- Stale price book. Supplier cost increases are loaded in the ERP but not in the copy the workflow reads. Read prices live or sync on a schedule with a freshness check.
- Superseded and discontinued SKUs. The model maps to an item you no longer sell. Restrict matching to active items and maintain supersession links.
- Partial quotes. Eight of ten lines match and the quote goes out missing two items. Never send a partial quote without a clear note and rep review.
- Expired quotes honored by accident. Orders arrive against quotes past their validity date. Store the validity date and check it at order entry, as the order processing guide describes.
Timeline and cost
A single inbox, one catalog and one system of record typically take two to four weeks, including the parallel run. Lumeor builds quote automation in the range of $5,000 to $12,000. Large catalogs with messy data, multiple warehouses, or ERP integrations that need partner or admin-level API setup push toward the top of the range. Running costs are model usage per request plus hosting, usually small relative to the rep time saved.
How to measure success
- Median time from request received to quote sent
- Share of line items matched without human correction
- Quotes sent per inside sales rep per day
- Margin exceptions and approval turnaround time
- Quote-to-order conversion rate, compared with the period before