Part 1 of 7 · Quote follow-up series ~5 min read

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

A small business sends more quotes than anyone keeps in their head. The kitchen remodel quote you emailed on a Tuesday and never heard back about. The catering proposal the customer loved on the call and then went quiet on. The annual service plan that’s a yes if you just remind them once more. Most of those deals don’t die because the price was wrong. They die because nobody followed up, or somebody followed up too hard. This post walks through the design of a small system that follows up on every sent quote on a sensible cadence, stops the second the customer replies, and hands every real reply to a person.

Key takeaways

  • Three sources for tracked quotes: a Drive sheet, an inbox lane that reads sent-quote emails, and a webhook lane.
  • Every quote ends in one of four moves on each check: resting, first nudge, follow-up nudge, or last call.
  • A friendly cadence set in the rules doc — for example a nudge at 3 days, 7 days, and a few days before expiry.
  • Nudges respect quiet hours and weekends. The moment a customer replies, the chain stops and a person takes over.
  • Designed on AWS for about $2 a month at typical small-business volume.

The whole system on one page

Before any code, here’s the shape of what we’re designing.

System architecture: three sources, three pieces inside AWS At the top, three external boxes in a row. Far left, "Sent quotes" — a Google Drive sheet listing each quote you've sent, plus an inbox lane that reads sent-quote emails and a webhook lane from your quoting tool that add new quotes to the list. Centre, "Rules and voice" — a Drive folder with a rules doc covering the follow-up cadence, owners, and quiet hours, plus a voice doc with the nudge message templates. Far right, "Owners" — the rep who sent each quote; replies and approvals land in their email or inbox. Each connects via an arrow to the AWS account container below. Sent quotes have an outgoing arrow into AWS. Rules and voice feed in to ground every nudge. Owners receive the customer's reply with the original quote, the days since you sent it, the amount, a link to the quote PDF, and a one-tap approve on each draft nudge. Inside the AWS account are three components in a row, mirroring the layout above. On the left, the Quote intake — receives quotes from each source, reads a sent-quote email via Bedrock, and writes the cleaned quote into the list. In the middle, the Timer — runs daily; reads the list; computes days since sent and days to expiry per quote; picks one of four moves: resting, first nudge, follow-up nudge, or last call. On the right, the Sender — drafts the nudge in your voice, gets one-tap approval, sends the email, watches for the reply, and stops the chain on any reply. Internal arrows flow left to right. A note at the bottom reads: a reply always stops the chain — the system never keeps nudging someone who has answered. Sent quotes sheet, inbox, webhook Rules and voice cadence, owners, templates Owners where replies land quotes in grounds reply to the rep AWS account Quote intake read, normalize, add to list Timer picks one of four: rest, nudge, follow-up, last call Sender draft, approve, send, stops on any reply quote move A reply always stops the chain — the system never keeps nudging someone who has answered.
Fig 1. Three sources outside, three pieces inside AWS. Quotes flow in from a Drive sheet, an inbox lane, and a webhook lane. The Timer runs daily and picks one of four moves. The Sender drafts the right nudge, gets it approved, sends it, and stops the chain the moment the customer replies.

What you set up once (the outside)

  • Sent quotes. A Google Sheet in a Drive folder, one row per quote: customer name, contact email, quote number, amount, the date you sent it, the date it expires, the owner (the rep who sent it), and a link to the quote PDF. You can fill it in once and forget it; new quotes can also enter via two other lanes covered in Part 2 — an inbox lane (forward or BCC the sent-quote email to a dedicated address and the system reads it and proposes a row for one-tap approval) and a webhook lane (your quoting tool posts a small message when you mark a quote as sent).
  • A rules folder. Two short Google Docs in a Drive folder. The rules doc covers the follow-up cadence — how many days after sending the system should nudge, and how many times. A common cadence is a first nudge after 3 days, a second after 7, and a last call a few days before the quote expires. The doc also lists the owner per quote (or a default per rep), the quiet hours, whether to skip weekends, and the cap on how many nudges a single quote can get. The voice doc holds one nudge template per stage — the tone and wording the email actually uses.
  • Owners. The rep who sent each quote. Each reply the customer sends, and each draft nudge waiting for approval, lands in that rep’s inbox. Replies come with the quote name, days since you sent it, the amount, a link to the quote PDF, and the customer’s message in full, so the rep can pick it up without digging.

What runs on every check (the inside)

  • The quote intake. Three sources feed the list. The Drive sheet itself is the canonical store. New quotes can also be added via the inbox lane (BCC the sent quote to quotes@your-company.com, the system reads the email with Bedrock Haiku 4.5 to pull out customer, amount, and quote number, then drops a one-tap approval in the rep’s inbox before the row is added) and the webhook lane (your quoting tool posts to a Function URL when a quote is marked sent).
  • The timer. Runs once a day at 9am local. Reads the list. For each quote, computes days since you sent it and days until it expires. Compares against the cadence in the rules doc. Picks one of four moves. Resting: not yet due for a nudge, or already replied — do nothing. First nudge: just crossed the first cadence step — draft a friendly check-in. Follow-up nudge: crossed a later step with no reply — draft a short, warmer follow-up. Last call: the quote is about to expire with no reply — draft a gentle “this is set to expire” note. The timer itself doesn’t call a model — the move logic is plain Python.
  • The sender. Reads the voice doc, drafts the nudge for the chosen move in your voice with Bedrock, and shows it to the rep for one-tap approval before anything goes out. On approve, it sends the email via SES outbound, honoring quiet hours and weekends. Then it watches for the customer’s reply via SES inbound. Any reply — accept, decline, or a question — stops the chain and forwards the reply to the rep. A weekly digest lists every open quote and which ones are about to expire. A monthly summary writes a short paragraph: quotes still open, total amount in play, oldest open quote.

In plain words

You email a $6,400 landscaping quote to a customer named Dave on a Monday. The quote expires in 30 days. The owner is you. The system rests for three days, then on Thursday it drafts a short, friendly check-in in your voice: “Hi Dave — just making sure the landscaping quote reached you. Happy to walk through any of it. [link to quote PDF]” You glance at it, tap approve, and it sends. Dave’s busy, doesn’t reply. A week later the system drafts a one-line follow-up; you approve that too. The morning after, Dave replies: “Looks good — can we start the week of the 20th?” The system reads that as an accept, stops every future nudge, and drops the reply straight in your inbox marked “Dave replied — looks like a yes.” You take it from there. Dave never got a third message, and you never had to remember to send the first two.

The cost of running this is about $2 a month at SMB volume. The cost of not running it is the quote that sat unread for a week, the deal that went to a competitor who simply followed up once, or the customer who would have said yes if anyone had asked again.

Design rules that shaped every decision

  • A reply always stops the chain. The customer never gets nudged after they’ve answered — in any way.
  • Four moves, always. Resting, first nudge, follow-up nudge, last call. There is no fifth.
  • Nudges are capped and gentle. Quiet hours and weekends are respected; nobody gets a fourth message.
  • A person approves every nudge before it sends, and a person handles every real reply. Nothing irreversible auto-sends.
  • The quote list lives in Drive. Adding a quote, changing an owner, or shifting an expiry doesn’t need a deploy.
  • Every send and every reply is logged. Review a deal next quarter and you can see every message that went out.

Why this shape

Most teams follow up on quotes in one of three places: a spreadsheet that nobody opens, a calendar reminder that gets dismissed, or somebody’s memory. The spreadsheet works until it doesn’t — one busy week and three quotes go cold. The calendar reminder is the worst kind of false comfort: it pings on the day, with no context, and you still have to write the email yourself. And memory, of course, fails the moment a rep is on the road or juggling ten live deals.

The setup above keeps the source of truth in a sheet the team already edits, but adds a small system that looks at that sheet every day and acts only when a quote is going quiet. Nudges are drafted for you, in your voice, so approving one takes a second. They’re gentle and capped, so you never become the company that pesters. They stop the instant the customer says anything. And every real reply lands with a person, because closing a deal is not something you want a robot doing on its own.

The next four posts walk through each piece in turn: how a sent quote gets tracked, how a follow-up gets timed, how a quote nudge reaches the buyer, and how a reply stops the follow-ups and hands the deal to a person. One diagram per post. A cost breakdown and a final engineering reference at the end.

All posts