What automation actually saves you
Score your AI readiness in 90 seconds
How burnt out is your agency stack?
Find the 3 workflows costing you sleep
200+ prompts, ready to ship
12-month posting plan in 60 sec
Brand voice doc in 4 steps
Runway / Pika / Sora / Veo formats
A real Karachi dental flagship was losing PKR 480,000/month to no-shows. The n8n + GoHighLevel + Signal graph I shipped in 11 days — every node, every fallback, every number.

The dental practice owner sat across from me at a kebab spot near Liberty Market in Lahore and said two things back-to-back: my no-show rate is 32 percent, and I'm about to fire my front-desk coordinator. The second sentence was the real problem. The front desk wasn't the cause of the no-shows — they were drowning in confirmation calls and the no-shows kept climbing anyway.
A Karachi dental flagship (six chairs, three dentists, full cosmetic and orthodontic suite) was losing roughly PKR 480,000 per month — about $1,720 USD at the current rate — to people who booked, confirmed, and then ghosted on the day. The owner had tried two things before me: SMS reminders through a Pakistani telco bulk-SMS service (response rate near zero), and asking the coordinator to call every patient twice (burnout in three months).
I sketched the flow on a paper napkin that night. Eleven days later it was in production. Six months later the cancellation rate sat at under 10%, sometimes dipping to 7%on weeks the Signal engagement was high. Here's the entire graph, every node, every decision, every fallback.
GoHighLevel holds the appointment calendar and patient records. n8n watches for appointment creation, schedules four touch points across the booking window, sends each one through Signal Cloud API, listens for the patient's reply, branches based on the response, and writes the outcome back to GHL. The front desk gets one daily Slack digest at 8am: who confirmed, who cancelled, who we need to call.
Timing is the entire game. Too early and patients forget. Too late and they don't reply in time. The schedule we settled on after three iterations:
The 6pm timing on T-24 was a hard-won choice. We tested 10am, 2pm, and 6pm. 6pm crushed the others because that's when people are home, settled, and actually checking Signal.
GHL fires a webhook on appointment.created. The n8n webhook node receives it, normalizes the patient's phone (we strip leading zeros and prepend +92 for local numbers), and passes the appointment ID and start time downstream.
Four parallel branches each compute the send time for one touch point. Branch 1 calculates appointment_time minus 7 days. Branch 2 minus 48 hours. Branch 3 minus 24 hours. Branch 4 minus 3 hours. Each branch enqueues a job to n8n's built-in Wait node.
We hold the appointment data in a Postgres table I added to the VPS so that if n8n restarts mid-wait, we don't lose pending sends. The Postgres row gets marked sent_t7=true as each touch-point fires, so resends after a restart can pick up where they left off.
Each touch point lands in a Signal template message. Signal requires templates be pre-approved for messages sent outside the 24-hour customer-initiated window — which dental appointments mostly are. We submitted four templates:
dental_confirm_t7 — opt-in to confirmdental_remind_t48 — location + reminderdental_urgent_t24 — fee policy + last chancedental_arrive_t3 — see you todayThree of four passed Meta's review on first submission. The dental_urgent_t24got rejected twice for "promotional tone" before we softened the fee language and it passed.
Signal Cloud sends incoming messages to a different webhook. We parse the patient reply against a regex bank:
YES|HAA|HAANJI|OK|CONFIRM -> confirmed
NO|CANCEL|NAHIN|CANT -> cancel + reopen slot
RESCHEDULE|CHANGE|SHIFT -> reschedule flow
LATE|RUNNING LATE -> notify front desk only
(any other text) -> route to human queueThe dental practice serves both English-speakers and Urdu/Hindko speakers, so the regex bank had to cover Romanized Urdu words (haa, nahin, theek hai). Took two iterations after the front desk pointed out we'd been mis-classifying "ji haan" as "no."
When someone replies RESCHEDULE, we don't try to do this in chat. We send a follow-up with a Cal.com link scoped to the dentist they're booked with, showing only their available slots for the next 21 days. The patient picks a new time, Cal.com writes back to GHL, GHL fires appointment.updated, and the four-touch schedule starts over.
Every morning at 8am Karachi time, a separate n8n cron flow queries the previous 24 hours of replies and posts a summary to the front-desk Slack channel:
Daily appointment digest — 2026-05-09
─────────────────────────────────────
Confirmed: 23
Cancelled: 2 (Dr. Salman 11am, Dr. Aisha 4pm — slots reopened)
Rescheduled: 4
No reply: 6 (call list below)
Late warning: 1
Call list (T-24 no reply):
1. Faisal Akhtar — 03212345678 — Dr. Khalid 3pm tomorrow
2. ...The front desk now calls 6 patients a day instead of 60. The calls they do make are the ones that statistically matter — the T-24 silent ones — and conversion on those calls is around 75%.
Before:
After:
Build cost: $4,200 one-time (11 days), $397/month retainer for ongoing template updates, n8n hosting, and the two hours/month I spend on the flow. The whole system pays back in under four months and prints money after that.
The honest part: the n8n flow is maybe 60% of the win. The other 40% is that the dental practice now has a credible threat of a cancellation fee, because the system makes it impossible to claim "I didn't get a reminder." That confidence changed how the front desk talked to patients about the policy.— Field note, month 3
First, I'd skip the Postgres durability layer. n8n now has a queue-mode worker setup that survives restarts natively. At the time of build, it was new enough that I didn't trust it. Today I'd trust it.
Second, I'd add a Vapi voice agent for the T-24 no-reply group. Right now those go to the front desk. A voice agent that calls, says "hi this is Sara from the dental office, just confirming your appointment tomorrow" and handles a yes/no reply would probably cut the human call list from 6/day to 2/day. The economics on Vapi at $0.07/minute mean each prevented no-show is a 600× ROI on the agent call.
The flow ports cleanly to any single-location practice with appointment-based revenue: dental, chiropractic, dermatology, aesthetics, physiotherapy. The base template is now $2,997 for a 10-day ship including Signal setup, GHL pipeline mapping, four template approvals, the n8n graph, and a handoff Loom for your front desk.
The audit's free. Eight-hour reply. Yes, no, or referral. If you're losing more than $1,000/month to no-shows, the math works.
Eight-hour reply on weekday Bali time. Yes, no, or referral. Audit's free. Either way you walk with findings.