Every dental practice has a list of 1,000+ patients who have not been back in 18 months. Staff mean to call them. They never do. Here is how to automate the entire campaign so it runs while the front desk handles the phones.
What this automation actually does
The system exports a segmented lapsed-patient list from your practice management software, ranks it by recency and visit value, then runs an outbound voice agent (Vapi or Retell AI) that calls each patient with a warm, consent-first script. If the patient does not pick up, n8n branches to a conversational SMS thread that mimics a real front-desk message — no blasts, no generic templates. When a patient says yes, the agent checks live calendar availability, locks a slot, and writes the booking confirmation back to the PMS. Clinical edge cases get flagged for a human to handle.
The key distinction from inbound missed-call automation is the motion: this is database mining, not phone answering. You start with a finite list of people who already trust the practice, run a time-boxed outreach sprint against it, and measure the campaign exactly like a revenue recovery exercise. Arini, a funded dental AI platform, reported over $56,000 in booked appointments in the first month of deployment. Funded reactivation tools have published case studies pointing to strong rebooking rates from dormant patient lists. The ROI math is unusually clean because the cost basis (list size, contact rate, average procedure value) is knowable before the campaign launches.
Who needs this (and who doesn't)
The right fit is an owner-dentist or office manager at a 1-8 chair practice that has been open more than three years and has never run a systematic recall campaign. The tell is a practice that chases new patients through ads while sitting on a PMS database with 1,000+ patients who have not returned since 2023 or earlier. These are people who completed treatment, were satisfied enough to pay their bill, and simply drifted. Recovering them costs a fraction of acquiring a new patient and converts at far higher rates.
This system is not for practices with a hygienist-driven recall already in motion, or for practices under two years old with insufficient lapsed volume. It is also not a substitute for same-day scheduling software or inbound answering — those are different problems. The clearest signal that reactivation is the right move: your schedule has open hygiene slots most weeks while your patient database shows 18-month-overdue records in the hundreds.
- Good fit: Practice open 3+ years with a PMS database of 2,000+ active or historical patients.
- Good fit: Front desk has no capacity for manual recall calling — they are already handling phones, check-in, and billing.
- Good fit: Owner wants to fill hygiene and restorative slots without increasing the Google Ads budget.
- Good fit: Office manager can export a CSV from Dentrix, Eaglesoft, or Open Dental.
- Skip if: Practice is under 2 years old with fewer than 500 lapsed patients — campaign math does not work at small list sizes.
- Skip if: Jurisdiction requires explicit prior written consent for automated calls and practice has no record of patient phone consent — check state regulations first.
How to build it
Step 1 — Export and clean the lapsed list
Pull a patient export from your PMS filtered to last visit before 18 months ago. Required columns: patient name, mobile number, last visit date, last procedure code, hygiene due date. Remove duplicates, strip landlines (Twilio Lookup API will do this in bulk for roughly $0.005 per number), and tag each record with a recall tier: Hygiene-Only, Hygiene+Restorative, or Restorative-Only. This segmentation drives which script the AI uses on the call.
Step 2 — Stand up your Vapi or Retell AI agent
Create an outbound agent in Vapi or Retell AI. Set the voice to a neutral, warm tone (not a robotic read). Load the practice name, dentist name, and clinic phone number as variables so the agent references them dynamically. Set max call duration to 90 seconds — longer than that and answer rates on recalls drop sharply. Configure a webhook to fire on call-end with the outcome (booked, declined, no-answer, voicemail, opted-out) back to n8n.
Step 3 — Build the n8n orchestration workflow
The workflow reads rows from your lapsed-patient Google Sheet on a scheduled trigger (throttled to 20-30 calls per hour to stay within TCPA safe-call windows: 8am-8pm local time). It fires the Vapi outbound call via API. On the webhook return, it routes: booked rows to calendar write-back, no-answer/voicemail rows to a 4-hour wait then Twilio SMS, declined/opted-out rows to a DNC sub-sheet. Every outcome gets a timestamp log.
Step 4 — Write the SMS conversation layer
The SMS branch uses GPT-4o to handle patient replies conversationally. The opening message is fixed (short, warm, references the practice by name, includes STOP to opt out). Patient replies route back through an n8n webhook; GPT-4o reads the patient's message, the available slots from your calendar API, and generates a reply. Keep the system prompt tight: the agent's only job is to offer two slots and confirm one. It does not answer clinical questions — those get flagged to a human.
Step 5 — Wire calendar availability and booking write-back
Connect to Google Calendar (or your PMS API if it supports it) to fetch available hygiene and restorative slots. Pass the next 3 open slots as context to both the voice agent and the SMS GPT-4o layer. When a patient confirms, the workflow books the slot, marks it as held, and fires a confirmation SMS with date, time, and a cancel link. Write the booked record back to your Google Sheet with a 'Booked' status for campaign reporting.
Step 6 — Build the human-escalation and opt-out handling
Any message containing clinical keywords (pain, bleeding, swelling, medication, allergic) bypasses GPT-4o and triggers a Slack or Gmail alert to the dentist or hygienist with the patient name and message text. Opt-out handling is non-negotiable: STOP on SMS immediately adds the number to your DNC sheet and the Twilio opt-out registry. Do not re-contact opted-out numbers in subsequent campaigns.
Step 7 — Set the quarterly cadence and measure
Run the campaign as a finite sprint: 200-300 contacts per week for 3-4 weeks, then close. Track four numbers: contacts attempted, contacts reached, booked rate on contacts reached, and revenue booked (procedure type times average fee). At 30% book-rate on contacts reached and a $300 average hygiene value, a 500-contact campaign reaching 200 patients yields 60 appointments and roughly $18,000 in scheduled revenue. Let the no-contact list age 90 days and re-attempt in the next quarter.
Approach | Estimated Cost | Build Time | Best For |
|---|---|---|---|
| Vapi + n8n + Twilio (custom build) | $300-600/mo platform costs + one-time build | 15-25 hours to build and test | Practices wanting full control, white-label agency deployments |
| Retell AI + n8n + Twilio (custom build) | $200-500/mo platform costs + one-time build | 15-25 hours to build and test | Same as Vapi; Retell has slightly simpler pricing for high call volume |
| GoHighLevel (all-in-one, lower customization) | $297-497/mo GHL subscription | 3-8 hours to configure | Practices that want a packaged tool and can accept GHL's voice quality limits |
| Purpose-built SaaS (Arini, DentiVoice) | $500-1,500/mo depending on list size | 1-2 hours onboarding | Practices that want zero build work and are willing to pay per-platform pricing |
Get the Free Reactivation Build Kit
The teardown above shows you what to build. The free kit gives you the exact n8n workflow map, the Vapi/Retell agent prompt, the SMS conversation script, the ROI calculator, and the compliance checklist — everything you need to run your first campaign without starting from scratch.
You are a friendly front-desk assistant for {{PRACTICE_NAME}}, a dental practice.
Your only job is to help the patient book an appointment from the available slots below.
Available slots:
{{SLOT_1}} — {{SLOT_2}} — {{SLOT_3}}
Rules:
- Offer the two earliest slots first. If the patient declines both, offer the third.
- Confirm the patient's full name and date of birth before locking a slot.
- If the patient asks any clinical question (pain, symptoms, medications, insurance, cost), reply:
"Great question — let me have someone from our team call you directly about that."
Then set escalation_flag = true in your JSON response.
- Always include opt-out: "Reply STOP at any time to stop hearing from us."
- Keep every reply under 3 sentences.
- Return your response as JSON: {"message": "...", "booked": true/false, "slot_confirmed": "...", "escalation_flag": true/false}
Patient name: {{PATIENT_NAME}}
Last visit: {{LAST_VISIT_DATE}}
Recall type: {{RECALL_TYPE}}Want NoFluff to Build and Run It For You?
We scope the campaign, export and scrub your list, build the voice and SMS stack, run the first sprint, and hand you the bookings report. One flat project fee, no monthly retainer until you see results. If your practice has 500+ lapsed patients, the build pays for itself in the first campaign.
