WhatsApp Appointment Reminder API: Templates and Timing
An empty chair at 3 pm costs a clinic, salon or tutor the whole slot. Most no-shows are not malicious. People forget, or they meant to cancel and never got round to it. A text reminder helps a little. A reminder they can answer in the app they already have open helps a lot more, because "can we do Thursday instead?" turns a lost slot into a moved one.
A WhatsApp appointment reminder API lets your booking system send those messages automatically and hear the answers. This guide covers the template wording Meta will approve as utility, when to send each touch, how to handle confirm and reschedule replies in code, and when your existing number plus a linked-number API is the simpler option.
Write a reminder Meta will approve as utility
On the official platform, a reminder sent to someone who has not messaged you in the last 24 hours must be an approved template. Reminders belong in the utility category: they relate to something the customer booked, and they contain nothing promotional. On Meta's rate cards utility is usually cheaper than marketing, and only utility gets volume tiers of the two.
Meta's categorization rules say a utility template must be non-promotional and specific to the user. Mix in an offer and it becomes marketing. Compare:
Marketing (will be recategorized):
Hi {{1}}, see you tomorrow at {{2}}! Add a hair spa to your visit and get 20% off.
Utility:
Hi {{1}}, this is a reminder of your {{2}} appointment with {{3}} on {{4}} at {{5}}.
Please confirm below, or choose Reschedule if the time no longer works.
A few details make reminders more useful:
- Quick reply buttons. Add Confirm, Reschedule and Cancel. Meta allows up to 10 quick replies per template, with button text up to 25 characters.
- A location header. Utility templates can carry a location header, which gives a tappable map pin for the clinic or studio.
- Every variable means something. Name, service, staff member, date and time. Meta treats templates with unclear content, such as a body that is mostly variables, as marketing.
For more on placeholders and sample values, see WhatsApp template variables.
When to send each reminder
One reminder the day before does most of the work. A second, shorter one helps for long-lead bookings or appointments people tend to forget. Do not send five.
| Touch | When | Job | Buttons |
|---|---|---|---|
| Booking confirmation | Right after booking | Confirm date, time, place, prep | None, or "Add to calendar" URL |
| Main reminder | About 24 hours before | Get a yes, or a reschedule while the slot can still be refilled | Confirm, Reschedule, Cancel |
| Same-day nudge | 2 to 3 hours before, only if unconfirmed | Last chance to move it | Reschedule |
| Missed appointment | Same day, after the slot | Offer to rebook | Rebook |
Send in the customer's local time and avoid late evenings. Keep the missed-appointment message about their booking. "We missed you, tap to rebook" is about their appointment; "We missed you, here's 10% off" is marketing.
Set a time-to-live on every reminder
Utility templates default to a 30-day time-to-live, meaning WhatsApp keeps trying to deliver for a month if the phone is off. A reminder that arrives after the appointment is noise. Per Meta's time-to-live docs, utility templates accept a custom value from 30 seconds to 12 hours. Set message_send_ttl_seconds on the template so undeliverable reminders are dropped rather than delivered late. Since Meta bills on delivery, dropped messages are not charged.
Send the reminder from your booking system
Your scheduler (a cron job, a queue with delayed jobs, or your booking platform's webhook) picks up appointments due for a reminder and calls Cloud API. Attach a payload to each quick reply button so the answer maps straight back to the booking. Use the current Graph API version from Meta's changelog in place of v23.0.
curl https://graph.facebook.com/v23.0/PHONE_NUMBER_ID/messages \
-H "Authorization: Bearer $WHATSAPP_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "919811122233",
"type": "template",
"template": {
"name": "appointment_reminder",
"language": { "code": "en" },
"components": [
{ "type": "body", "parameters": [
{ "type": "text", "text": "Priya" },
{ "type": "text", "text": "dental cleaning" },
{ "type": "text", "text": "Dr. Mehta" },
{ "type": "text", "text": "Thursday 6 November" },
{ "type": "text", "text": "5:00 pm" }
] },
{ "type": "button", "sub_type": "quick_reply", "index": "0",
"parameters": [ { "type": "payload", "payload": "confirm:4821" } ] },
{ "type": "button", "sub_type": "quick_reply", "index": "1",
"parameters": [ { "type": "payload", "payload": "reschedule:4821" } ] },
{ "type": "button", "sub_type": "quick_reply", "index": "2",
"parameters": [ { "type": "payload", "payload": "cancel:4821" } ] }
]
}
}'
Save the returned message id against the booking, and record that this reminder was sent so a retry or a second scheduler run does not send it twice. Our post on avoiding duplicate WhatsApp API messages covers the patterns.
Handle confirm, reschedule and cancel replies
When a customer taps a quick reply on a template, your webhook receives a message of type button. It carries the payload you set and a context.id pointing at the reminder they answered.
// Inside your Cloud API webhook handler, after verifying X-Hub-Signature-256
for (const entry of body.entry ?? []) {
for (const change of entry.changes ?? []) {
for (const msg of change.value.messages ?? []) {
if (msg.type !== "button") continue;
const [action, bookingId] = msg.button.payload.split(":");
if (action === "confirm") await markConfirmed(bookingId);
if (action === "cancel") await cancelAndReleaseSlot(bookingId);
if (action === "reschedule") await sendOpenSlots(msg.from, bookingId);
}
}
}
The tap also opens a 24-hour customer service window, so you can reply with free-form messages, such as a list of open slots, without another template. Our guide to the WhatsApp 24-hour window explains the rules.
Two things to plan for:
- People type instead of tapping. "Running 10 minutes late" or "can I bring my son too?" arrive as ordinary text. Route those to a person, not a parser that guesses.
- Replies now cost money past a point. From October 1, 2026, each business number gets 1,000 free service messages a month, then service messages are billed, and utility templates sent inside an open window are billed too. Details in our explainer on service message pricing.
Turn reminders into fewer no-shows
The reminder is half the system. The other half is what your team does with the answers.
- Give the front desk a confirmed list. Unconfirmed bookings at the 2-hour mark get a call or the same-day nudge.
- Refill cancelled slots fast. A cancellation 24 hours out is only useful if someone on a waitlist hears about it.
- Make rescheduling one exchange. Offer two or three concrete slots rather than "when works for you?"
- Honour opt-outs. If someone replies STOP, remove them from reminders and keep the record of when they asked.
- Measure by channel. Compare no-show rates for WhatsApp-reminded and unreminded bookings in your own data before changing the cadence.
Official API or your existing number?
The official route suits practices sending hundreds of reminders a day, with buttons and automated handling. Many small clinics, studios and tutors already talk to clients on one WhatsApp number, and those clients have chatted with them before.
| Cloud API | Linked-number API (Tenashi) | |
|---|---|---|
| Number | A number registered on the platform | Your existing WhatsApp or Business number |
| Message | Approved utility template, buttons | Plain text or media, no buttons |
| Cost | Per delivered utility message | Flat plan, no per-message fees |
| Volume | High, after messaging limits scale | Paced: about 100 reminders in 10 minutes |
| Replies | Your webhook, your code | The team inbox, plus webhooks |
Where Tenashi fits
If your clients already message your number, Tenashi lets your booking system send reminders from it. Call POST /api/v1/messages with the client's phone and the reminder text. An Idempotency-Key per booking makes retries safe.
curl https://usetenashi.com/api/v1/messages \
-H "Authorization: Bearer $TENASHI_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: booking-4821-reminder" \
-d '{"to": "+919811122233", "text": "Hi Priya, a reminder of your cleaning with Dr. Mehta on Thursday at 5 pm. Reply 1 to confirm or 2 to move it."}'
The reminder appears in the shared inbox like any reply, so whoever picks up "can we do 6 instead?" sees the whole history and the contact's CRM record. The honest limits: no buttons or templates, sends are paced (one every 4 to 12 seconds per number, so queue reminders early), and only 50 new chats a day per number through the API. That is fine for clients who already chat with you, and wrong for a hospital chain. The complete guide to the WhatsApp API covers the official route in depth.
Read the API docs · Get started
FAQ
Is an appointment reminder a utility or marketing template?
Utility, as long as it is about a booking the customer made and contains no promotion. Add an upsell, a discount or a "book your next visit and save" line and Meta will treat it as marketing, which costs more. Meta can recategorize a template after approval, so keep reminder copy plain and specific.
How far in advance should I send a WhatsApp appointment reminder?
About 24 hours before works for most bookings, because it leaves time to refill the slot if someone cancels. Add a short same-day nudge two to three hours before for unconfirmed bookings. Send in the customer's local time, avoid late evenings, and set a time-to-live so late deliveries are dropped.
Can customers reply to a WhatsApp appointment reminder?
Yes. Quick reply buttons send your payload back to your webhook, and any reply opens a 24-hour window in which you can answer freely. Many people type instead of tapping, so make sure a person sees free-text replies like "running late" rather than leaving them to an automated parser.
What happens if the reminder isn't delivered before the appointment?
By default WhatsApp keeps trying for up to 30 days, which could deliver the reminder after the visit. Set a custom time-to-live on the utility template, anywhere from 30 seconds to 12 hours, so stale reminders are dropped. Dropped messages are not delivered, so Meta does not bill them.
Do I need opt-in to send appointment reminders on WhatsApp?
Yes. Meta requires opt-in before business-initiated messages, and that includes reminders. Collect it at booking with a clear checkbox or statement naming WhatsApp, store when and how it was given, and honour opt-outs. A customer booking through a WhatsApp chat with you is a natural point to ask.
Reminders work when someone handles the answers. If your bookings already run through one WhatsApp number, read the Tenashi API docs and send reminders from it today.