Every empty chair in an appointment book is money walking out the door. Missed appointments cost US healthcare an estimated ~$150B a year (WriteUpp, 2026) — and for a dental clinic, salon, or home-service business, the math is just as brutal at a smaller scale. Most no-shows never rebook on their own.
So I built a fix: an n8n workflow that watches the appointment book around the clock and rescues no-shows over SMS. It's now live as a ready-to-import workflow, and I'm an n8n Verified Creator — here are 3 of my approved templates: https://n8n.io/workflows/20250, https://n8n.io/workflows/20580, https://n8n.io/workflows/20743.
How it works
Three flows, one Google Sheet as the brain:
1. No-show detection (every 30 minutes). The workflow reads today's Appointments sheet and flags anyone whose time passed 15+ minutes ago without a check-in. Appointment times are interpreted in your business timezone (a timezone field in the CONFIG node) — not the server's — so a Vancouver clinic on n8n Cloud doesn't get false flags.
2. AI rescue SMS. For each no-show, it pulls up to 3 open slots from an OpenSlots sheet, and an AI agent drafts a personal text: "Hi Sarah, we missed you at 2pm — want Thu 10am or Fri 3pm instead?" Sent via Twilio, logged to a RescueLog sheet. The model is selectable — defaults to gpt-4o-mini, one CONFIG field switches it.
3. Reply handling + one gentle nudge. A Twilio webhook parses replies: YES (+ slot number) books the slot automatically, NO is logged as lost, anything unclear goes to human review. No reply after 2 hours gets exactly one nudge — then silence. The nudge is self-limiting by design: once a nudged row is logged, that number is never nudged again.
The details that matter
- Reply parsing is defensive. "NO 2" is a no, not a yes-with-slot-2. Bare "2" counts as yes-with-slot-2. "STOP" is treated as lost (no more messages — correct behavior for an opt-out).
-
Phone matching strips formatting.
+1 (555) 123-4567and15551234567match the same rescue. - Zero slots doesn't hallucinate. If OpenSlots is empty, the AI is instructed never to invent times — it just asks the customer to reply YES and the owner finds a time.
- Event-sourced log. RescueLog is append-only; the latest row per phone is always the current state. Simple to audit, impossible to corrupt with an edit.
What I learned
The timezone bug was the nasty one. My first version compared appointment times against the server clock — fine on a self-hosted box in the same city, completely broken on n8n Cloud (UTC) for a US/Canada business. A 2pm appointment would look 7 hours late. Always compute "now" in the business's timezone.
The second lesson: no-show detection is only half the product. The other half is restraint — one nudge, clear stop conditions, and every ambiguous reply routed to a human instead of guessed at. That's what makes it something you'd actually let text your customers.
Get it
The complete workflow (JSON + setup guide) is here: https://automateplaybook.gumroad.com/l/hhisyc
And if you want to poke at n8n first, my free starter pack is here: http://automateplaybook.gumroad.com/l/hhnxv
I'm documenting the build in public — follow for more n8n automation breakdowns. Questions about the workflow logic? Drop them in the comments.
Top comments (0)