Tutorial
How to build an appointment booking and reminder chatbot
Let customers book, confirm and reschedule appointments on WhatsApp or SMS, with live availability from your calendar and automatic reminders.
Phone calls to book appointments tie up your front desk, and missed appointments cost you slots that someone else could have used. A booking flow on WhatsApp or SMS solves both: customers book in a few taps, and automatic reminders let them confirm or reschedule before the day.
This guide builds two connected pieces in On-chat's flow builder:
- a booking flow that offers real available slots, and
- a reminder campaign that runs automatically before each appointment.
How the pieces fit together
The booking flow and the reminder campaign are connected by one contact field that holds the appointment date. The flow writes the date when a customer books, and the campaign reads it to schedule reminders.
Booking flow: Choose service → Get free slots (webhook) → Pick a slot → Confirm (webhook) → Save date to contact
Reminder campaign: 1 day before appointment → Confirm / Reschedule / Cancel
2 hours before → Short reminder
The key link is a contact field holding the appointment date. The booking flow writes it, and the campaign reads it.
Step 1: Create the appointment date field
Create a contact field of type date, for example appointment_date. A campaign can only schedule events relative to a date field, so this is essential.
You may also want appointment_service (text) and appointment_id (text) to store details from your booking system.
Step 2: Ask which service
Start the booking flow with Send the contact a message:
Hi @contact.first_name! What would you like to book?
Quick replies: Consultation, Follow-up, Cleaning. Then Wait for the contact to respond and save the result as service.
Step 3: Fetch real availability with a webhook
Add Call a webhook to ask your calendar or booking system for open slots:
- Method:
GET - URL:
https://api.your-clinic.com/slots?service=@results.service.category
Return a short list your flow can show directly, for example:
{
"slots": [
{ "id": "s1", "label": "Tue 4 Nov, 10:00", "start": "2026-11-04T10:00:00+02:00" },
{ "id": "s2", "label": "Tue 4 Nov, 15:30", "start": "2026-11-04T15:30:00+02:00" },
{ "id": "s3", "label": "Wed 5 Nov, 11:00", "start": "2026-11-05T11:00:00+02:00" }
]
}
Then send the options, using the response in the quick replies:
Here are the next available times:
Quick replies: @(webhook.slots[0].label), @(webhook.slots[1].label), @(webhook.slots[2].label)
Keep it to three options. If none suit, add a fourth quick reply, Other time, that opens a ticket so the front desk can help.
Don't have a booking API? Start simpler: offer fixed choices like
Morning/Afternoonand open a ticket for staff to confirm the exact time. You can add the webhook later without changing the rest of the flow.
Step 4: Confirm the booking
After the customer picks a slot, Call a webhook again with POST to reserve it in your system:
{
"phone": "@contact.urn",
"name": "@contact.name",
"service": "@results.service.category",
"slot": "@results.slot"
}
Have your API return the confirmed start time and a booking ID. On Success:
- Update the contact: set
appointment_dateto the returned start time andappointment_idto the booking ID. - Send a confirmation:
You're booked for @results.slot ✅ Reply CHANGE any time if you need to reschedule.
On Failure (for example, someone else took the slot a second earlier), apologise and loop back to fetch fresh availability.
Step 5: Set up the reminder campaign
Now the part that cuts no-shows. Go to Campaigns:
- Create a campaign based on a group, for example
Patients(make sure the booking flow adds contacts to this group). - Add an event 1 day before
appointment_datethat starts a short reminder flow. - Add a second event 2 hours before that sends a brief message.
Because events are relative to each contact's own date, every customer gets reminders at the right time, and if the date changes the reminders move with it.
Step 6: Build the reminder flow
The 1-day reminder should make the next action one tap away:
Reminder: your @fields.appointment_service is tomorrow at @(format_datetime(fields.appointment_date, "tt:mm")). Can you make it?
Quick replies: Yes, see you, Reschedule, Cancel.
- Yes: thank them, and optionally Call a webhook to mark the appointment confirmed.
- Reschedule: Enter another flow and send them back into the booking flow, starting at the availability step.
- Cancel: call your API to free the slot, then ask (optionally) why. That data is gold.
On WhatsApp, a reminder sent more than 24 hours after the customer's last message must use an approved message template. Create a utility template for reminders and use it for the first message of the reminder flow.
Step 7: Reach everyone
Not every customer uses WhatsApp. Flows run on any channel, so:
- send the same reminder over SMS to contacts without WhatsApp,
- or use a voice flow that calls and asks the customer to press 1 to confirm or 2 to reschedule.
Test before launch
Test the booking flow, the saved date and the reminder campaign together before real customers use them.
- Book through the Simulator and check the date lands in
appointment_date. - Set a test appointment for tomorrow and confirm the campaign event is scheduled.
- Try Reschedule and Cancel to make sure your booking system updates.
What to track
Track how many customers confirm, reschedule or cancel, and compare no-shows before and after launch.
- Confirmation rate from the reminder flow results.
- Reschedules versus cancellations: a reschedule is a saved appointment.
- No-shows before and after launch, from your own booking system.
For clinics, see how this fits into patient messaging for healthcare. To go deeper on live data, read making your chatbot dynamic with webhooks, or start building for free.