A quote drafter on AWS for a few dollars a month
A prospect emails on Tuesday: “Need pricing on 240 of part A-12, 60 of A-12L, delivered to our Chicago site by the 30th. Can you send a quote?” By Friday afternoon nobody has replied because Sara is at a trade show, the website RFQ form went to a shared inbox nobody really owns, and the pricing sheet that has all the volume breaks lives in a folder six clicks deep. This post walks through the design of a small drafter that catches every RFQ the moment it arrives, extracts the line items, prices each one against your catalog and rules, drafts a complete quote, and parks it in front of a rep for one-tap review — never auto-sending.
Key takeaways
- Three outside surfaces, three AWS pieces. The drafter turns three RFQ sources into one queue.
- Every RFQ ends in one of four moves: auto-draft, clarify, out of scope, reject.
- The drafter prices only from your catalog and rules files. It never invents a SKU, a price, or a discount.
- A quote draft never auto-sends. It always waits for a rep’s one-tap review.
- Designed on AWS for about $4/month at typical small-business RFQ volume.
The whole system on one page
Before any code, here’s the shape of what we’re designing.
What you set up once (the outside)
- Your RFQ sources. The “Request a quote” form on your website, the shared sales inbox, and a small upload portal for prospects sending a spec sheet or tender document. The drafter takes webhooks from the form, reads inbound mail through SES, and accepts presigned uploads to S3. You can disconnect any source in one click if a campaign goes sideways.
- A rules folder. Three short Google Docs in a Drive folder. The catalog doc lists your SKUs, the plain-English names customers actually use for each one, base prices, units, minimum order sizes, and lead times. The rules doc covers tier discounts, volume breaks (the per-unit price drops at certain quantities), regional pricing, payment terms, the biggest discount a rep can approve without a manager, and what your team is allowed (and not allowed) to promise in a first quote. The voice doc has a few cover-paragraph templates, your signature, and your brand’s tone. Edit any of these docs and the drafter picks up the change within minutes. No code change, no deploy.
- A rep destination. The Slack channel or shared review queue your team already watches. Every draft pings here with the original RFQ, the extracted line items with confidence scores, the priced quote with citations, the suggested cover paragraph, and a one-tap approve-and-send button. Out-of-scope and reject moves don’t ping; they show up in the morning digest, where they belong.
What runs on every RFQ (the inside)
- The RFQ intake. Receives or polls each source. Drops duplicates by message-id and email-plus-subject hash, so the same prospect resending a thread twice doesn’t become two drafts. Screens out the obvious junk: banned-domain spam, competitor email domains, banned-phrase floods, and submissions missing required fields. Writes the cleaned RFQ to a single queue. By the time the drafter sees an RFQ, it’s in one shape regardless of source.
- The drafter. For every RFQ in the queue, the drafter reads the message, the form fields, and any attachments. It pulls out three things in parallel: the line items (what they’re asking for, with quantities and variants), the constraints (deadline, delivery address, any payment terms they proposed), and the context (industry, company size, project notes). It looks up each line item in the catalog — by SKU code, but also by the plain-English name customers use. Then it picks one of four moves. With auto-draft, every line maps to a catalog row and the constraints are clear, so the drafter builds the quote. With clarify, the extraction worked but something important is ambiguous — a missing size, a wide quantity range, no deadline. The drafter writes one specific question for the customer instead of guessing. With out of scope, at least one line item didn’t match the catalog. The drafter tags the RFQ for manual handling and pings the sales lead with what matched and what didn’t. With reject, the message is spam, competitor fishing, or a vendor pitch. The drafter archives it with a reason. When the drafter does build a quote, every price cites the catalog row and rules passage that produced it. It never invents a SKU, a price, or a discount.
- Review and send. An auto-draft pings the on-call rep in Slack with the full package: the original RFQ, the line items, the priced quote, the cover paragraph, and a button to approve, edit, or reject. The PDF only renders when the rep opens the draft — nothing renders for drafts that get rejected. A clarify writes one short question for the customer (never two) and parks the RFQ as “awaiting reply.” The rep one-taps it to send. An out-of-scope RFQ skips the auto-draft entirely; it tags the contact in the CRM and pings the sales lead with what matched and what didn’t. A reject archives the message with a reason. Every approved quote — regardless of size — gets written to the CRM with the conversation thread, the priced quote, and the cover paragraph. A draft that sits unactioned pings the rep again at 24 hours and escalates to the sales lead at 48 hours.
In plain words
An email lands in your shared sales inbox at 11:14am. Subject: “Quote request — 240 of A-12 plus 60 of A-12L for our Chicago facility, deadline May 30.” The cloud reads it within a few seconds. The two SKUs are real; they’re in the catalog. The quantities are above your tier-2 volume break, so the rules doc applies a 4% per-unit discount on A-12 and 6% on A-12L. The Chicago address is in your Midwest region, so standard shipping applies. The deadline is sixteen business days out, comfortably above your stated lead time. The cloud builds the quote: two line items with unit prices, line totals, the discount notation citing “rules.md § volume breaks,” subtotal, freight, total, and a 30-day validity. It writes a one-paragraph cover note in your voice. It pings the on-call rep in Slack with the full package. The rep sees it on their phone, glances at the discount line, taps approve. The PDF goes out. The whole loop takes under two minutes. The RFQ arrived at 11:14am Tuesday and would otherwise have sat in the shared inbox until Sara got back from the trade show on Thursday.
Total cost runs in coffee-money territory at small-business volume. Pennies per RFQ, dominated by a few model calls per draft.
Design rules that shaped every decision
- The drafter prices only from your catalog file and your rules file. It never invents a SKU, a price, or a discount.
- Four moves, always. Auto-draft, clarify, out of scope, reject. There is no fifth.
- A draft never auto-sends. The rep’s approval is the only path to the customer.
- Every priced line cites the catalog and rules passage that produced it. The rep can audit a number in one click.
- Configuration lives in Drive. Editing your prices, your discounts, or your terms doesn’t need a deploy.
- Every RFQ is written to the CRM, regardless of move. Nothing falls through.
Why this shape
Most “AI quote” tools fall into one of two traps. The first kind generates beautiful-looking quotes that quietly make up prices — a 7% “loyalty discount” that doesn’t exist in your rules, or a per-unit price that’s 2% off because the model rounded a number it shouldn’t have. You don’t notice until the customer points it out, and now you’re stuck honoring a quote you didn’t mean to send. The second kind needs a strict, form-based input that customers will never produce in a real RFQ. They’ll always write “240 of A-12 by the 30th” in a sentence, not in a form. Neither is what you want when a real prospect writes you on Tuesday and is comparing you to two competitors who’ll quote by Wednesday.
The setup above splits the difference. Messy emails, scattered specs, mixed SKU and plain-English names — all of it turns into clean, priced drafts within seconds. Every price cites the catalog row and rules passage that produced it, so a rep can check any number in one click. Ambiguous RFQs become one specific question for the customer, not a guess. Off-catalog and competitor RFQs never auto-draft; they get tagged and parked. The rep never sees a draft built from numbers nobody can trace.
The next four posts walk through each piece in turn: how an RFQ reaches the drafter, how the drafter reads it, how a quote gets priced against your rules, and how a draft stays honest on its way to the rep. One diagram per post. A cost breakdown and a final engineering reference at the end.
All posts