AI Booking Automation for a Dental Practice
Self-serve booking + reminders + after-hours triage + recall workflows. Representative engagement.
- Sector
- Dental practice, Cambridgeshire (NHS + private mix)
- Duration
- 4 weeks build + 2 weeks pilot before full rollout
- Budget band
- £5,500 fixed-price build + £200/month run + maintenance
1. The problem
A multi-chair Cambridgeshire dental practice — NHS + private mix — was drowning reception in routine bookings, reminders, and recalls. Reception spent 60-70% of their day on phone bookings. Patients increasingly expected to book online (they do everything else online), but the practice management system (Dentally) had a basic booking widget that didn't handle the practice's capacity rules. No-show rate was ~11%. Recall outreach was inconsistent — done when reception had time, often months late. After-hours email enquiries went unanswered until Monday.
2. Stack
3. Architecture
System topology — what runs where, what talks to what:
+-------------------+
| Patient on phone |
| or computer |
+---------+---------+
|
v
+-------------------+ +----------------------+
| Next.js booking | | Vercel serverless |
| app | ------> | function |
| Mobile-first | | - Verify identity |
+-------------------+ +----------+-----------+
|
+----------------+----------------+
| |
v v
+-------------------------+ +---------------------------+
| Dentally API | | Local booking cache |
| - Live slot avail. | <--> | (Postgres, 5-min TTL) |
| - Book/reschedule | | Avoids hammering Dentally|
| - Patient lookup | +---------------------------+
+-------------------------+
|
v
+-------------------------+ +---------------------------+
| SMS reminders | | Recall workflow |
| (Twilio) | | 6-month check-up due -> |
| - 24h + 2h before | | auto SMS w/ booking link |
| - Reschedule link | | - tracked in Postgres |
+-------------------------+ +---------------------------+
+------------------------------------------------------------------+
| After-hours triage chatbot (GPT-4o-mini, grounded in FAQ) |
| - Books routine appointments online |
| - Triages emergencies (toothache, swelling) -> emergency contact |
| - Answers admin Qs (hours, prices, services, what to bring) |
| - Auto-escalates uncertain cases to "we'll call you back" queue |
+------------------------------------------------------------------+
4. Automation flow
End-to-end runtime flow — what happens when a real input arrives:
- Routine booking. Patient visits practice website, picks service + practitioner + time. Real-time slot availability via Dentally API. Confirmed in 30 seconds. SMS + email confirmation sent.
- Reminders. Lambda runs hourly. For each appointment <24h away, send SMS reminder with reschedule link. Same again 2h before. Confirmation request: "Reply Y to confirm".
- No-show prevention. Patients who don't confirm 2h before get a follow-up call from reception (now only ~3% of bookings vs ~30% pre-automation). Confirmed-but-no-show rate drops from 11% to ~3%.
- Recall workflow. Daily Lambda checks Dentally for patients whose last check-up was 5.5 months ago. Auto-SMS sent with one-tap booking link. Tracked in Postgres for follow-up at 6, 7, 9 months if no engagement.
- After-hours triage. Chatbot embedded on website. Available 24/7. For routine queries → books or answers. For potential emergencies → routes to emergency dental line + creates ticket for morning reception review. Uncertain cases → "we'll call you back" queue.
- Audit trail. Every booking, reminder sent, recall outreach, chatbot interaction logged to Postgres. Compliance-grade retention.
5. What success looked like
- Reduce reception phone time on routine bookings by 60%+
- Cut no-show rate from ~11% to under 5%
- Restore consistent recall outreach (was sporadic)
- Provide after-hours response without staffing it
- No disruption to existing Dentally workflow — practice continues using their familiar system
6. Outcomes
| Online bookings | 0% → 58% of total bookings within 4 months |
| Reception phone time on bookings | Down ~65% — reception now handles complex cases, upselling private, recall conversations |
| No-show rate | 11% → 3.2% over 3 months |
| Recall booking rate (6-month check-ups) | Sporadic → ~80% of due recalls re-booked within 30 days |
| After-hours emergency triage | ~8/week handled by chatbot routing — including 2 genuine emergencies routed correctly |
| Patient satisfaction (Google reviews) | Up materially over first quarter (multiple reviews mentioned "easy booking") |
7. Speed improvements
- Booking time. Phone booking: avg 4 minutes (waiting on hold + reception time). Online booking: ~30 seconds.
- Reception availability. Reduced inbound routine calls = more reception time for higher-value calls (complex private consultations, emergency triage).
- After-hours response. Was: nothing until next morning. Now: instant (chatbot) or "we'll call you back" queue created.
- Recall outreach latency. Was: weeks/months late. Now: same-day on the 5.5-month anniversary.
SEO & visibility growth
- Google reviews. +19 reviews in first 3 months (vs ~2/month historical baseline) — driven by automated post-appointment review request
- GBP impressions. +41% (higher review count + faster GBP response time improves local ranking)
- "dental practice [town]" rank. Moved from page 2 to top of page 1 in primary catchment over 6 months
9. ROI math
10. Maintenance model
See care plan tiers for full structure.
11. Honest gotchas — what we'd do differently
- Dentally's API has appointment-type complexity (NHS band 1 vs band 2 vs band 3 vs private vs hygienist) — needed careful schema mapping. Documented thoroughly because the practice may want to extend later.
- After-hours emergency triage requires extreme care — chatbot has hard rules for "swelling", "trauma", "facial swelling" → immediate escalation to emergency dental line, never tries to book. Got this wrong in week 2 (system booked an emergency for a Tuesday), retuned with explicit hard-block keywords.
- GDPR / clinical data: implemented data minimisation aggressively. Patient identifier (NHS number) only used for booking, not stored in long-term cache. Conversation transcripts retained 30 days.
- SMS deliverability for older patients on PAYG carriers was 88% (vs 99% on contracts) — added email fallback for confirmed no-deliveries.
- Self-serve adoption was slower than expected for under-30s (they'd still phone — possibly because dental anxiety drives toward voice contact). Adoption only hit 58% after we added a clear visual difference between "for a routine check-up" (online) and "for something urgent" (phone).
- Recall workflow needed practice-manager approval mechanism — auto-sending recall SMS to bereaved family members was a real concern. Built in a "do not contact" tag with full-team training.
Have a workflow that looks like this?
30 minutes, no pitch. We'll tell you honestly whether automation will pay back for your specific case.