Home / Dental Practices / Missed-call text-back for dental offices, with no patient details in the text (Open Dental + Twilio)

Dental Practices problem 1: Calls to the front desk go unanswered

Missed-call text-back for dental offices, with no patient details in the text (Open Dental + Twilio)

Verified with mocksLast tested 2026-10-28 · pricing checked October 2026

When a call to the practice is missed, the caller gets one short text within seconds: sorry we missed you, we'll call back, here is the online booking link (after hours: we're closed, here is the emergency line). The text never contains a name, appointment or treatment. Front-desk staff get a callback row in a Google Sheet, the call is logged on the patient's chart in Open Dental, and STOP replies are written back to Open Dental so no recipe texts that number again.

The problem

Every unanswered new-patient call is a chair that may stay empty. The numbers below come from vendors that sell phone tools, so read them as indications, not industry statistics.

Who it's for

US general and family dental offices (1-3 locations) on Open Dental where the front desk is often with a patient when the phone rings.

Tools and monthly cost

ToolOfficial price
Twilio US local phone number$1.15 / month pricing page
Twilio US SMS, sent or received$0.0083 per 160-character segment, plus carrier fees of about $0.0035-$0.005 per segment pricing page
A2P 10DLC registration (required to text US customers from a local number)One-time: $4.50 brand + $15 campaign vetting (Standard brands add $41.50 vetting). Monthly campaign fee: $1.50 (low-volume mixed) to $10 (Standard) pricing page
Open Dental API (per location, paid by whoever holds the developer key)Free: Read All only (1 request per 5 s). $15 / month: Comm, InsuranceSimple and others. $30 / month: all except Payments, PayPlans and Special. This recipe writes opt-outs to the patient record (Patients PUT), so it needs the $30 tier pricing page
Google Workspace with the HIPAA BAA accepted (call lists and logs live in Google Sheets)Any paid Workspace edition (not the legacy free edition) can accept Google's BAA in the Admin console; Sheets is covered. You probably already pay for Workspace pricing page
n8n, self-hostedCommunity Edition is free; you pay for the server. n8n Cloud is not an option here: n8n staff said in January 2026 that n8n does not offer a BAA for Cloud pricing page
Twilio HIPAA account (only if any text could contain PHI)Requires Twilio Security Edition or Enterprise Edition plus a signed Business Associate Addendum; priced by Twilio Sales (no public price) pricing page

Example month: Illustrative arithmetic, not a measured result. Assume 120 missed calls a month from 100 different numbers: 100 one-segment texts and about 30 replies = 130 segments x $0.0083 = $1.08, plus carrier fees of about $0.45-$0.65. Twilio number $1.15 and A2P 10DLC $1.50-$10 a month. Open Dental API $30 per location (the opt-out write needs the Patients permission). About $34-$43 a month, plus your n8n server and Google Workspace, which you probably already pay for. If your compliance officer decides you need Twilio's HIPAA offering, add a sales-quoted Security or Enterprise Edition.

Setup

  1. Read the 'HIPAA, TCPA and BAAs' section on the dental hub first, and get your compliance officer to sign off on the texts' wording and where the data lives.
  2. Buy a Twilio local number and complete A2P 10DLC brand + campaign registration (texts to US numbers are blocked until it is approved). Route your office line through it: an incoming call <Dial>s the front desk, and the Dial action URL points at the 'mss-d1-call' webhook. No-answer, busy, failed and canceled count as missed; the webhook answers with an empty TwiML <Response></Response>.
  3. Point the number's incoming-SMS webhook at 'mss-d1-sms'. Set TWILIO_AUTH_TOKEN and PUBLIC_WEBHOOK_BASE (the exact public base URL Twilio calls, no trailing slash): every request's X-Twilio-Signature is checked against it and forged requests are dropped.
  4. In Open Dental, ask your API developer (or Open Dental's API program) for a developer key and enable the API for your office with the customer key (see Open Dental's API setup guide). The workflow reads patients by phone, writes phone commlogs and sets TxtMsgOk = No on STOP, so the key needs the $30 tier. Put it in OD_AUTH as 'ODFHIR developerKey/customerKey'. Open Dental throttles keys (1 request per second on paid tiers); OD_REQUEST_INTERVAL_MS paces calls, and 429 replies are retried after Retry-After.
  5. Create the callback and replies Sheets in a Google Workspace account whose super admin has accepted Google's HIPAA BAA, share them only with front-desk staff, and swap the mock sheet URL for n8n's Google Sheets node.
  6. Set PRACTICE_SHORT (shown at the start of every text), PRACTICE_TZ, OFFICE_OPEN_HOUR / OFFICE_CLOSE_HOUR, WEB_SCHED_URL, EMERGENCY_PHONE and FRONT_DESK_PHONE from .env.example. Then call the office from a staff cell after hours and let it ring out.

Download

Download dental-missed-call-text-back.zip

Contains the n8n workflow, the mock data, the test runner with its last results, and the mock server we tested against. All keys in .env.example are fake.

Test result

Every workflow was imported into n8n 2.45.4 and run end to end on our test machine. Open Dental's API, Twilio, Stedi, Google Sheets and the email sender (Resend) were replaced by a local mock server built from their official API docs: it checks the same request shapes and required fields, enforces Open Dental's request throttle (HTTP 429) and records every call. We also compared the mock's field names with Open Dental's public test database (read-only GET requests with the test key Open Dental publishes, no writes). These recipes use no AI model; every decision is a written rule. Patients, plans and phone numbers are invented. Verified with mocks; no real patient data used, and nothing was sent to a real phone, patient, payer or account.

10/10 scenarios passed (run 2026-10-28)

PASST1New caller, office hours: generic text with booking link, callback row, no Open Dental write
PASST2Family number after hours (mom's cell, kids' home phone): same generic text, emergency line, no names; commlog on guarantor
PASST3Same caller again 1 h later: no second text (one per 12 h)
PASST4Patient who opted out of texts (TxtMsgOk = No): no text, call-only callback row, phone commlog
PASST5Answered call: nothing happens
PASST6STOP keyword: TxtMsgOk = No on every chart with that number (3 family members); no extra confirmation (Twilio sends it)
PASST7Plain-English opt-out: Open Dental updated and one confirmation text
PASST8Ordinary reply: stored in the replies sheet; staff ping carries no message content
PASST9Forged webhook (bad X-Twilio-Signature): ignored, nothing sent or read
PASST10Open Dental rate limit (429 + Retry-After) during lookup: waits and finishes

Actual output from the test run

Texts sent in scenarios T1 (office hours) and T2 (after hours). Phone numbers left out; every number in the test is invented. Names and numbers are invented.

T1: Maple Grove Dental: sorry we missed your call. We'll call you back shortly, or book online: https://example.com/maple-grove/book Reply STOP to opt out.

T2: Maple Grove Dental: sorry we missed your call. We're closed and will call you next business day. Dental emergency? Call +15555550198. Reply STOP to opt out.

Verified with mocks

  • New caller in office hours: one generic text (under 160 characters, ends 'Reply STOP to opt out') with the booking link, a callback row for staff, and no Open Dental write.
  • After hours: the same generic wording plus the emergency line. A family number on several charts (a parent's cell on the kids' charts) gets one text with no names; the commlog goes on the guarantor's chart.
  • Answered calls are ignored; a second missed call from the same number within 12 hours gets no second text.
  • Patients with TxtMsgOk = No in Open Dental get no text, only a call-back row and a commlog.
  • STOP sets TxtMsgOk = No on every chart with that number (3 family members in the test), with no extra text because Twilio confirms STOP itself. A plain-English opt-out ('please stop texting me') does the same and sends one confirmation.
  • Any other reply is saved to the replies Sheet; the staff ping says only 'new text reply', never the message content.
  • Forged requests (bad X-Twilio-Signature) are ignored: nothing is sent or read. Open Dental 429 replies are retried after Retry-After and the run finishes.
  • Verified with mocks; no real patient data used.

Documented from official API docs only

Built to the vendor's documentation but not run against a live account. Check these on yours.

  • Twilio Dial action / call-status and inbound-SMS webhook fields, request signing and the Messages API (from Twilio's docs; not run against a live Twilio account).
  • Open Dental API v1 patients (Simple list, phone fields, TxtMsgOk), commlogs POST and patients PUT, and the API permission tiers (from Open Dental's API docs). Field names were also compared with Open Dental's public test database using read-only GETs.
  • Google Sheets: tested against a mock sheet endpoint; the n8n Google Sheets node is not wired in.

Limitations

  • The text never says who the practice thinks called. If staff want to call back, they look the number up in Open Dental themselves.
  • Opt-out phrases are matched from a list; unusual wordings can slip through, so skim the replies Sheet. Twilio's own keyword handling (STOP, END, CANCEL...) always applies.
  • Built for Open Dental only. Dentrix, Eaglesoft, Curve and NexHealth versions are not built, and we make no claim that this works with them.
  • Business associate agreements are your job: self-host n8n on infrastructure covered by a BAA (n8n does not offer one for n8n Cloud), accept Google's Workspace BAA before any patient name goes into a Sheet, and ask your compliance officer whether your texting setup needs Twilio's HIPAA offering (Security or Enterprise Edition plus a BAA, sales-quoted). Patient replies can contain health details even when our texts do not.
  • Not a compliance guarantee. We designed around HIPAA and the TCPA (generic texts with no treatment, fee or name; consent from Open Dental; staff lists kept in BAA-covered Google Workspace), but whether your setup is compliant depends on your contracts, your server and how your staff use it. Check with your compliance officer or counsel and your state dental board before you turn it on.