Blog /
Why Appointment Reminders Aren't Appointment Confirmations
Every healthcare organization sends appointment reminders. They have been sending them for twenty years. Text messages, robocalls, email blasts, postcards, app notifications. The volume of reminders goes up every year, and yet no-show rates in 2024 are nearly back to their 2019 baseline, around 7% nationally, with many specialties much higher.
The industry has spent two decades optimizing the wrong thing. The problem was never sending more messages. The problem is that most of those messages are reminders, when what patients and providers actually need are confirmations. These are different things, and confusing them is the reason operations teams still spend half their day calling patients to ask "are you still coming tomorrow?"
What a Reminder Does
A reminder is a one-way push notification:
Reminder: You have an appointment with Dr. Chen tomorrow at 2:00 PM. Call (555) 123-4567 to reschedule.
The message gets sent. The system logs that it was sent. And then — nothing. The EHR has no idea whether the patient read it, plans to come, or needs to reschedule. Staff compensates by calling high-value appointments manually, which is really just a second reminder delivered by a human. The workflow is a dead end:
EHR → reminder sent → (silence) → appointment time → patient shows up or doesn't
What a Confirmation Workflow Does
A confirmation workflow is two-way. It asks the patient a question, waits for an answer, and does something with the answer. Then it writes that something back into the EHR, so the next time staff looks at the schedule, they see the current state of the world, not a day-old guess.
The simplest version looks like this:
EHR → outbound SMS → patient replies YES → status updated in EHR
↓
→ patient replies NO / "can't make it"
→ offer new slots
→ patient picks one
→ new appointment created
→ old appointment marked rescheduled
↓
→ patient asks a question
→ escalate to staff task in EHR
↓
→ no response after 3 attempts
→ voice call fallback
→ still no response
→ escalate to staff task in EHR
Every branch ends with a state change in the EHR. Staff no longer calls patients to ask "are you still coming," and only handles the 5-10% of conversations that genuinely need a human.
A reminder is an event. A confirmation is a workflow.
The schedule reflects reality because every outcome writes back to the EHR. When a patient says "I can't make it," the system offers new slots immediately instead of losing the appointment. Every recovered appointment is revenue that would have otherwise gone to a no-show.
The calendar invite is a quietly important piece here too. An .ics file
with real RSVP tracking turns the patient's own calendar app into a third
confirmation channel. If they tap "accept," the EHR knows. If they tap
"decline," the workflow starts offering new slots. And if they do nothing,
that is a signal too: most patients glance at a calendar invite without
tapping anything, so the workflow treats non-response as still unconfirmed
and escalates to SMS.
The Technical Difference
On the surface, a reminder and a confirmation both involve sending a message. The difference is what the system has to track underneath.
A reminder system is one function call:
send_sms(to=patient_phone, body="Your appointment is tomorrow at 2pm.")
That is it. Fire, log, forget.
A confirmation system needs, at minimum, a state machine tracking where each engagement is in the lifecycle (pending, active, confirmed, rescheduled, escalated, completed). Every inbound message has to look up the current state, decide what to do next, and transition cleanly. If the state machine is sloppy, you get duplicate messages, missed follow-ups, and race conditions when the patient replies mid-reminder.
It also needs bidirectional EHR integration. Reading appointments is easy. Writing back status updates, communication logs, and escalation tasks is where the integration becomes useful, and where most teams stop because it is harder.
It needs retry and backoff logic for every channel. SMS can bounce. Voice calls can fail to connect. Email can land in spam.
It needs natural language handling. Patients do not reply "1" or "YES". They reply "thursday would be better actually" or "who is this" or "can I reschedule". A regex covers 50% of replies; an LLM with a tight system prompt and access to scheduling tools covers the rest.
It needs quiet hours, consent, and compliance handling. No texts at 2am. No messages to patients who opted out. TCPA-compliant disclosures on the first message. HIPAA-compliant channels when PHI is involved.
And it needs idempotency across the whole flow. The patient taps a link twice, the EHR fires a Subscription twice, a network retry causes a duplicate webhook. Your system has to handle all of these without sending the same patient the same message twice.
Each of these is solvable. None of them is solved by adding another "reminder" template to your existing notification system. This is the iceberg: the message you see on the patient's phone is one function call.
Building It on FHIR
If you are building on a FHIR R4 EHR (Medplum, Healthie, most Epic and
Cerner deployments), the primitives are already in place. A FHIR
Subscription on Appointment changes gives you the trigger. Three
write-back resources give you the closed loop: Appointment status
updates as the workflow progresses, Communication entries for the
audit trail, and Task resources when a conversation needs to escalate
to staff. All three are standard FHIR R4, so staff sees the confirmation
workflow inside the EHR UI they already use. No separate dashboard, no
context switching.
For a Medplum-specific walkthrough with Bot code, Subscription setup, and OAuth2 credentials, see our Medplum integration guide.
What's Left After the FHIR Plumbing
All of that is bounded work. You can spec it and ship it.
What teams rarely budget for is making the conversation feel like one. The reply to a patient who said "I have no ride" two messages ago is different from the first reminder to someone who just booked. An appointment in eighteen hours gets a different tone than one in three days. A patient who prefers Spanish gets Spanish. A rules engine approximates this and grows into a tangle; an LLM agent that reads the engagement's full history, prompted and guardrailed, handles it naturally.
That is what VisitConfirmed does. Your patients get messages that fit their situation and history. Your EHR reflects every confirmation, cancellation, or reschedule the moment it lands. Your staff only sees the engagements that actually need a human. We integrate with Medplum today via the Bot pattern, and the same architecture extends to any FHIR R4 server.