The follow-up you meant to send three days ago
You finished the job and meant to check in. The customer no-showed and you meant to reschedule. You sent a quote a week ago and meant to nudge. Someone went quiet and you meant to circle back. Every one of those is money or goodwill on the table, and every one slips because the day gets away from you.
This bot watches for those moments (a trigger) and, the second one happens, drafts the exact follow-up you would have written, in your voice, with the customer's name and the job details filled in. Then it queues it for your okay. You read it, tweak it if you want, and approve. It never reaches a customer until you say so.
New here? This kit pairs naturally with Lead Catcher (catch the lead) and Reminders (never drop the ball). Follow-up Bot is the part that actually writes the message.
Give it a brain: connect Claude
- Go to console.anthropic.com and sign in.
- Open API Keys, then Create Key.
- Copy the key (it starts with
sk-ant-).
claude-opus-4-8 (warmest, sharpest). High volume? Set claude-haiku-4-5 to cut cost.
New to API keys? The Lead Catcher lesson walks the same step in more detail.
Tell it where the triggers come from
Out of the box the kit ships four trigger types. You enable the ones that fit your business and ignore the rest:
| Trigger | Fires when | Default behavior |
|---|---|---|
| job_done | A job is marked complete | draft first |
| no_show | An appointment passes with no check-in | draft first |
| quote_sent | A quote was sent N days ago, no reply | draft first |
| quiet_lead | No contact in X days | auto-send eligible |
config/follow-up.json, per type, on purpose. Quiet hours
and unsubscribes are honored before anything is even drafted.Give it your voice and your own store
config/voice.md file you own: your business
name, how you sign off, the tone you use, a couple of example messages you actually sent.
Claude matches that voice. Every contact and every logged touch lives in
your own data store (data/contacts.json or a database you control),
never on someone else's server.# config/voice.md (you own and edit this) business: Summit Trade Co. sign_off: "Thanks, Jordan" tone: warm, plain-spoken, never pushy rules: - use the customer's first name - one clear ask per message - never invent a discount or a price
โข Draft-first. Nothing reaches a customer without your explicit okay, unless you deliberately enable auto-send for a low-risk type.
โข Respectful. Unsubscribes and quiet hours are checked before a draft is even made.
โข Yours. Contacts, voice, and the touch log stay in your store.
Try it: see a real follow-up drafted, send nothing
Tap a trigger to draft its follow-up, or describe your own below:
Approve, then it sends and logs the touch
quiet_lead, you can set "auto_send": true in
config/follow-up.json. When you do, that type still respects quiet hours and
unsubscribes, still logs every touch, and the README spells out exactly what changes. It
is off by default, and the higher-stakes types (a no-show, a quote nudge) stay draft-first
no matter what.Every channel is opt-in. The kit will not text a customer who only gave an email, and it will not email one who unsubscribed. Cmd/Ctrl-Z on a queued draft just discards it: nothing was sent.
Bonus: a polite cadence that knows when to stop
npm run dryrun # draft follow-ups for pending triggers, nothing sends npm run queue # show the approval queue (drafts waiting for your okay) npm run send # send only the drafts you have approved npm start # watch triggers live and draft as they happen
Run it yourself: it's free and it's the real thing
The kit is a complete, runnable repo: triggers in, Claude brain, your voice file, an
approval queue, send on your okay, and a touch log that prevents double-nudges.
MIT-licensed, runs on your machine, nothing crippled. Run npm run setup and
you're queuing follow-ups in minutes.
Go live
With the kit downloaded and the checklist green:
npm install npm run setup # Claude key, trigger source, voice file saved on YOUR machine npm start
The bot watches your trigger source. When a job finishes or a quote goes quiet, it drafts
the follow-up and drops it in your queue. You skim, approve, and it sends, then logs the
touch. Prefer the command line? npm run dryrun drafts from a sample of
triggers without sending. Want to drive it from Claude itself? It also runs as an
MCP server (npm run mcp), the same idea from
the MCP lesson.
Want it wired to your real CRM and calendar, hands-off?
This kit is the DIY taste. We connect it to your CRM and your calendar so triggers fire from the tools you already use, tune the drafts to your brand voice, and run hands-off, on-brand follow-up for your whole team.
Work with us โ โณ Next: Reminders