DEV Community

AI Automation Playbook
AI Automation Playbook

Posted on

I built an n8n workflow that rebooks no-shows automatically — here's how it works

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-4567 and 15551234567 match 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)