Appointment Reminders via WhatsApp
Overview
No-shows cost healthcare, hospitality, and professional services an estimated 20-30% of revenue. WhatsApp reminders dramatically reduce no-shows because:
- 98% open rate — vs. 20% for email reminders
- Quick reply buttons — patients tap "Confirm" or "Reschedule" with one tap
- 2-way conversation — patients can ask questions or request changes in the same thread
- Read receipts — you know the patient saw the reminder
Reminder Flow
- Appointment booked → schedule 2 reminders (24h before + 2h before)
- 24h reminder sent → patient receives WhatsApp with Confirm/Reschedule buttons
- Patient replies → your webhook receives the response
- Auto-update booking → mark confirmed, or open reschedule flow
- 2h reminder sent → final reminder with location/time details
Step 1 — Create a Reminder Template
In Meta Business Manager → Message Templates, create a utility template:
Hi 1, This is a reminder for your appointment: Date: 2 Time: 3 Location: 4 Provider: 5 Please confirm or reschedule below.
Add two quick reply buttons:
- Button 1:
Confirm - Button 2:
Reschedule
button.text field with the button label.
Step 2 — Send the Reminder
async function sendReminder(appointment) {
const response = await fetch('https://didfarm.com/api/v1/whatsapp/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
account_id: 1,
to: appointment.patientPhone,
type: 'template',
template: {
name: 'appointment_reminder',
language: { code: 'en' },
components: [{
type: 'body',
parameters: [
{ type: 'text', text: appointment.patientName },
{ type: 'text', text: appointment.date },
{ type: 'text', text: appointment.time },
{ type: 'text', text: appointment.location },
{ type: 'text', text: appointment.providerName },
]
}]
}
}),
});
return response.json();
}Step 3 — Handle Replies
app.post('/webhooks/whatsapp-inbound', (req, res) => {
const { from, body, button } = req.body;
// Quick reply buttons send the button text
const reply = (button?.text || body || '').toLowerCase().trim();
switch (reply) {
case 'confirm':
markAppointmentConfirmed(from);
// Send confirmation in the open 24h session (no template needed)
sendFreeformReply(from, 'Your appointment is confirmed. See you then!');
break;
case 'reschedule':
markAppointmentPendingReschedule(from);
sendFreeformReply(from,
'No problem. Please reply with your preferred date and time, ' +
'or call us at +31 20 123 4567.'
);
break;
default:
// Free-text reply within 24h session window
forwardToStaff(from, body);
sendFreeformReply(from,
'Thanks for your message. Our team will get back to you shortly.'
);
}
res.sendStatus(200);
});Quick Reply Buttons
Quick reply buttons are the most effective way to get patient confirmations. Key benefits:
- One-tap response — no typing required
- Higher response rate — 60-70% of patients respond to button prompts vs. 20-30% for text-only
- Structured data — you receive the exact button text, making automated processing reliable
- Maximum 3 buttons per template (e.g., Confirm / Reschedule / Cancel)
Scheduling Logic
Use your application's job scheduler to send reminders at the right time.
// When appointment is booked
function onAppointmentBooked(appointment) {
const appointmentTime = new Date(appointment.datetime);
// Schedule 24-hour reminder
scheduler.schedule({
job: 'send-reminder',
data: { appointmentId: appointment.id, type: '24h' },
runAt: new Date(appointmentTime - 24 * 60 * 60 * 1000),
});
// Schedule 2-hour reminder
scheduler.schedule({
job: 'send-reminder',
data: { appointmentId: appointment.id, type: '2h' },
runAt: new Date(appointmentTime - 2 * 60 * 60 * 1000),
});
}
// Job handler
async function handleSendReminder({ appointmentId, type }) {
const appt = await getAppointment(appointmentId);
// Skip if already cancelled or rescheduled
if (appt.status !== 'scheduled') return;
await sendReminder(appt);
}Best Practices
- Send two reminders: 24 hours and 2 hours before the appointment
- Include location, date, time, and provider name in every reminder
- Use quick reply buttons (Confirm / Reschedule) for highest response rates
- Respect quiet hours — don't send reminders between 9 PM and 8 AM local time
- Skip confirmed — if the patient confirmed after the 24h reminder, don't send the 2h reminder
- Add a "Cancel" button if your business allows last-minute cancellations
- Track read receipts — if a reminder is read but not confirmed, flag it for staff follow-up
- Keep an SMS fallback for patients who don't have WhatsApp
FAQ
What if the patient doesn't respond?
If no response after the 24h reminder, the 2h reminder still sends. If still no response, flag the appointment for manual follow-up (phone call). Consider sending an SMS fallback if WhatsApp delivery failed.
Can patients reschedule via WhatsApp?
Yes. When they tap "Reschedule", the 24-hour session window opens. You can send free-form messages asking for their preferred time, or direct them to an online booking link. Your webhook handler processes the conversation.
How many reminders can I send per appointment?
There's no hard limit, but each template message outside the 24-hour window costs a conversation fee. The standard pattern is 2 reminders (24h + 2h). More than that can feel spammy.
Start reducing no-shows
Connect your WhatsApp account and create your first reminder template.