Series · 7 parts Published June 15, 2026

Quote follow-up

A serverless system that makes sure a sent quote never goes cold. After you send a quote, it follows up on a sensible cadence with a friendly nudge, watches for the customer’s reply, and stops the moment they accept, decline, or ask a question — handing those straight to you. It flags quotes about to expire and tells you which deals are still open. Never pushy; a person handles every real reply. Seven posts on the same system — one diagram at a time — with an engineering reference at the end.

  1. 01

    A quote follow-up system on AWS for a few dollars a month

    The whole system on one page — a quote intake, a timer, and a sender, plus the way a reply stops everything cleanly and hands the deal to a person.

  2. 02

    How a sent quote gets tracked

    Three lanes feed the open-quote list — the Drive sheet itself, an inbox lane that reads a sent-quote email and proposes a row for one-tap approval, and a webhook from your quoting tool.

  3. 03

    How a follow-up gets timed

    A daily check reads the open-quote list, computes days since you sent and days to expiry, compares against the cadence in the rules doc, and picks one of four moves: resting, first nudge, follow-up nudge, last call. No model on the check.

  4. 04

    How a quote nudge reaches the buyer

    Owner resolution per quote, quiet hours, weekends, a draft written in your voice for one-tap approval, email send, and the four guardrails between the chosen move and the actual message landing.

  5. 05

    How a reply stops the follow-ups

    Three outcomes when the customer replies: stop-and-hand-off (accept, decline, or question all go to the rep), defer (out-of-office pushes the next nudge), and the expiry close-out. Every step is logged.

  6. 06

    What the quote follow-up costs

    A couple of dollars a month at SMB volume. The check runs once a day, calls no model, and Bedrock only fires to read a reply and draft a nudge.

  7. 07

    Engineering reference: the quote follow-up architecture

    Same system, drawn purely for engineers. Service names, resource identifiers, region, Bedrock model IDs, Lambda inventory, IAM scopes, the SES inbound rule set, EventBridge Scheduler config, and the DynamoDB schemas.

What is a quote follow-up system?
A small serverless system that makes sure a sent quote never goes cold. After you send a quote, it follows up on a sensible cadence with a friendly nudge, watches for the customer’s reply, and stops the moment they accept, decline, or ask a question — handing those straight to you. It flags quotes about to expire and tells you which deals are still open. Never pushy; a person handles every real reply.
How much does it cost to run?
About $2.40/month at typical small-business volume (around 200 open quotes). The fixed cost is essentially zero. The variable cost is dominated by the daily check that reads every open quote and the small classify call that reads each incoming reply, so they’re small slivers. At 1,000 open quotes the bill lands around $9.
Which AWS services does it use?
Lambda (Python 3.14, arm64) with Function URLs for the reply button and webhooks, EventBridge Scheduler for the daily check and deferred one-offs, DynamoDB on-demand, S3 (with versioning), SES inbound + outbound, Secrets Manager, CloudWatch Logs (7-day retention), AWS Budgets, and Bedrock (Claude Haiku 4.5 via Global cross-Region inference) to read each reply and draft each nudge. No API Gateway, no NAT Gateway, no always-on compute, no Knowledge Base.
Where does the quote list live?
In a Google Sheet in a Drive folder. One row per sent quote with customer name, contact email, quote number, amount, the date you sent it, the date it expires, the owner, and a link to the quote PDF. A small drive-sync Lambda mirrors the sheet to S3 every 15 minutes; the system reads from S3 to keep Drive calls predictable and to get S3 versioning for free.
Does it use AI?
Only where it earns its place. The daily timing check uses no AI — it’s plain Python that reads dates and decides whether a nudge is due. Bedrock Haiku 4.5 fires in two places: it reads each incoming reply to sort it into accept, decline, question, or out-of-office, and it drafts the wording of each nudge in your voice for a person to approve.
How does it stay friendly and not pushy?
Each quote follows a gentle cadence set in the rules doc — for example a first nudge after 3 days, a second after 7, and a last one a few days before the quote expires. Nudges respect quiet hours and weekends. The chain is capped, so a customer never gets more than a few messages. And the moment the customer replies in any way, the chain stops and the reply goes to the rep.
What happens when the customer replies?
The reply lands in SES inbound and a small classify call sorts it into accept, decline, question, or out-of-office. Accept, decline, and question all stop the chain and notify the rep with the reply attached. Out-of-office is the one case that doesn’t stop the chain — it just defers the next nudge until after the away date. Every step is recorded in the qf-audit DynamoDB table with timestamp, quote, action, by-user, and a snapshot before and after, so the trail is auditable for years.
All posts