๐Ÿ‡ Rabbithole โ† All lessons Work with us โ†’
Step 0 of 6
Day 20 of 30
Rabbithole ยท Learn ยท ~12 min read

Customer Follow-up Bot

The follow-ups you always mean to send, drafted and queued for your okay.

ContractorsSalons & spasDentists Real estateAuto shopsCoachesAny service business
โ˜…

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.

Plain-English glossary, once: A trigger is just a condition worth acting on (job marked done, appointment no-showed, quote sent 7 days ago, no reply in X days). Claude is the AI that reads what happened and writes the message. A draft is a message waiting in a queue, not sent. Auto-send is an optional switch you turn on, per trigger type, only for the low-risk ones, and only on purpose.

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.

1

Give it a brain: connect Claude

What's happening: Something has to read "job done for Dana Reyes, bathroom remodel" and turn it into a warm, on-brand message. That brain is Claude. The kit uses Anthropic's official toolkit and asks Claude for a structured draft (a subject line, a body, and a short reason it chose that tone), never a loose blob it might send by accident.
  1. Go to console.anthropic.com and sign in.
  2. Open API Keys, then Create Key.
  3. Copy the key (it starts with sk-ant-).
Default brain: 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.

2

Tell it where the triggers come from

What's happening: The bot needs to know when something happened. The setup wizard asks for your trigger source: a webhook from your scheduling or CRM tool, a shared spreadsheet, a folder of job records, or the kit's built-in poller that checks your calendar. You point it at one source and it watches.

Out of the box the kit ships four trigger types. You enable the ones that fit your business and ignore the rest:

TriggerFires whenDefault behavior
job_doneA job is marked completedraft first
no_showAn appointment passes with no check-indraft first
quote_sentA quote was sent N days ago, no replydraft first
quiet_leadNo contact in X daysauto-send eligible
Why this keeps you safe: every trigger is draft-first by default. The auto-send eligible tag means a type is allowed to be auto-sent, not that it will be. Auto-send is off until you flip a documented switch in config/follow-up.json, per type, on purpose. Quiet hours and unsubscribes are honored before anything is even drafted.
3

Give it your voice and your own store

What's happening: A generic "just following up!" sounds like a robot. The kit reads a small 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
Three promises baked in:
โ€ข 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.
4

Try it: see a real follow-up drafted, send nothing

What's happening: Below are four sample triggers, the same four the kit ships. Tap one (or write your own situation) and watch the bot draft the matching follow-up: it picks the right tone for the trigger, fills in the name and job, and shows you the draft. Then it waits. This is confirm-before-send: it drafts, you approve. This queue runs entirely in your browser. Nothing is sent anywhere. No API call, no message, no charge.
Follow-up Bot ยท your approval queue

Tap a trigger to draft its follow-up, or describe your own below:

Pure in-browser dry run: this runs entirely in your browser, nothing is sent anywhere.
5

Approve, then it sends and logs the touch

What's happening: Only after you tap Approve does the kit actually send the message through your email or text channel and then log the touch (who, when, which trigger, what was said) to your store, so the same customer is not nudged twice. Tap Edit to reword; tap Decline and the draft is discarded. The draft above is wired to exactly this. Try the buttons.
The auto-send switch, documented honestly: for a low-risk type like 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.

6

Bonus: a polite cadence that knows when to stop

What's happening: One nudge is good; nagging is not. The kit reads the touch log before drafting anything, so it knows how many times you have already reached out and backs off on a schedule you set (for example: day 0, day 3, day 7, then stop). A reply, a booking, or an unsubscribe ends the cadence immediately. You never have to remember where you left off.
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.

Get the free kit on GitHub โ†’
โ–ถ

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