About this appointment reschedule flow
Reschedule requests are the messiest messages a front desk handles. Clients write "can we do next week instead?" without saying which appointment, which day or whether they mind seeing someone else, and the thread turns into a round of guesses. This flow turns the request into four clear answers your team can act on immediately.
Because the flow is sent in reply to a specific booking, the booking itself travels in the flow_token rather than in the form. Set the token to your appointment id when you send the message and the nfm_reply that comes back tells you exactly which booking to move, with no reference number for the client to look up or mistype.
The staff question matters more than it looks. Clients who say "keep the same person" are often loyal to that team member and will wait longer for them, while "anyone available" lets you offer the earliest slot. Capturing that preference up front means your first counter-offer is usually the one they accept.
Fields this flow returns
When the customer taps the final button, the complete action sends these keys back in response_json. Fields from earlier screens are pulled in with global references (${screen.SCREEN_ID.form.field}), so nothing is lost between screens.
| Key | Component | Screen | Required | Returns | Example |
|---|---|---|---|---|---|
new_date |
DatePicker | RESCHEDULE | Yes | YYYY-MM-DD | "2026-10-21" |
new_time_windowearly_morning, late_morning, early_afternoon, late_afternoon, evening |
RadioButtonsGroup | RESCHEDULE | Yes | item id | "late_afternoon" |
same_staffkeep_same, any_available, prefer_different |
RadioButtonsGroup | RESCHEDULE | Yes | item id | "keep_same" |
reschedule_reasonwork_conflict, feeling_unwell, travel, childcare, running_late, other_reason |
Dropdown | RESCHEDULE | No | item id | "work_conflict" |
reschedule_notes |
TextArea | RESCHEDULE | No | string | "Any time after 3pm on the 21st or 22nd works." |
Optional fields the customer leaves empty may be missing from response_json or arrive empty. Treat every optional key as nullable in your handler.
Send the Appointment Reschedule flow without touching code
You do not need to be technical to use WhatsApp Flows. Connect your WhatsApp number, set the flow up in our drag-and-drop editor and send it to customers in a few clicks. No JSON, no API calls, no WhatsApp Manager.
Connect your number
Log in with Facebook and connect your WhatsApp number in a few minutes. No API keys or servers to set up.
Set up the flow
Start from a ready-made form or import this one, then drag fields in, change the wording and try it on a live phone preview. Click Publish when it looks right.
Send it anywhere
Send it from any chat in the Team Inbox, on web or mobile, send it automatically from an automation, or broadcast it to a list.
Get the answers
Every answer is saved on the customer's profile and chat, and your team can be notified the moment a form comes in.
Sample webhook payload (nfm_reply)
This is what your webhook receives when a customer submits the flow. response_json is a JSON string: parse it, then match flow_token to the record you created when you sent the message. The customer's WhatsApp number is in messages[0].from.
{
"flow_token": "bk_8f2c41",
"new_date": "2026-10-21",
"new_time_window": "late_afternoon",
"same_staff": "keep_same",
"reschedule_reason": "work_conflict",
"reschedule_notes": "Any time after 3pm on the 21st or 22nd works."
}
{
"object": "whatsapp_business_account",
"entry": [
{
"id": "WHATSAPP_BUSINESS_ACCOUNT_ID",
"changes": [
{
"field": "messages",
"value": {
"messaging_product": "whatsapp",
"metadata": {
"display_phone_number": "15550001234",
"phone_number_id": "PHONE_NUMBER_ID"
},
"contacts": [
{
"profile": {
"name": "Alex Morgan"
},
"wa_id": "14155550123"
}
],
"messages": [
{
"context": {
"from": "15550001234",
"id": "wamid.SENT_FLOW_MESSAGE_ID"
},
"from": "14155550123",
"id": "wamid.INCOMING_MESSAGE_ID",
"timestamp": "1760000000",
"type": "interactive",
"interactive": {
"type": "nfm_reply",
"nfm_reply": {
"name": "flow",
"body": "Sent",
"response_json": "{\"flow_token\":\"bk_8f2c41\",\"new_date\":\"2026-10-21\",\"new_time_window\":\"late_afternoon\",\"same_staff\":\"keep_same\",\"reschedule_reason\":\"work_conflict\",\"reschedule_notes\":\"Any time after 3pm on the 21st or 22nd works.\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as appointment-reschedule.json and run these calls with a system user token that has whatsapp_business_management and whatsapp_business_messaging permissions.
1. Create the flow
curl -X POST 'https://graph.facebook.com/v23.0/{WABA_ID}/flows' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Content-Type: application/json' \
-d '{"name": "appointment_reschedule", "categories": ["APPOINTMENT_BOOKING"]}'
# => {"id": "{FLOW_ID}"}2. Upload the Flow JSON
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/assets' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-F '[email protected];type=application/json' \
-F 'name=flow.json' \
-F 'asset_type=FLOW_JSON'
# => {"success": true, "validation_errors": []}3. Publish it
curl -X POST 'https://graph.facebook.com/v23.0/{FLOW_ID}/publish' \
-H 'Authorization: Bearer {ACCESS_TOKEN}'Publishing is permanent: a published flow cannot be edited. To change it later, create a new flow (or clone it with clone_flow_id) and publish the new version.
4. Send it to a customer
Inside the 24-hour customer service window, send an interactive flow message. Outside it, create a message template with a Flow button that points to this flow, and send the template instead.
{
"messaging_product": "whatsapp",
"recipient_type": "individual",
"to": "14155550123",
"type": "interactive",
"interactive": {
"type": "flow",
"header": {
"type": "text",
"text": "Need to move your appointment?"
},
"body": {
"text": "No problem. Tell us a new day and time that works and we will find the closest free slot and confirm it here."
},
"footer": {
"text": "Your current booking stays until we confirm"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Choose a new time",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "RESCHEDULE"
}
}
}
}
}curl -X POST 'https://graph.facebook.com/v23.0/{PHONE_NUMBER_ID}/messages' \
-H 'Authorization: Bearer {ACCESS_TOKEN}' \
-H 'Content-Type: application/json' \
-d @send-appointment-reschedule.jsonWhen to send it
Client says "can I move it?"
Trigger it from a chatbot keyword such as "reschedule", "change time" or "move my appointment" so the reply is the form, not a question about which booking they mean.
Reminder replies
Pair it with your 24-hour reminder: when a client answers "I cannot make it", send this flow right away instead of cancelling and asking them to book again from scratch.
Staff sickness or closures
When you have to move a batch of bookings yourself, send it as a Flow-button template to each affected client so they choose the new time rather than waiting on hold.
After a no-show
A friendly "we missed you, pick another time" message with this flow recovers a surprising share of no-shows that would otherwise drift away.
How to customise this template
- Set flow_token to the appointment id (or a signed token that contains it) on every send. The form deliberately has no "booking reference" field, so the token is how your handler knows what to move.
- Match the time windows to your real opening hours. A dental practice closed at weekends should drop the evening option, while a salon with late nights might split evening into two windows.
- If you track reschedule reasons for reporting, keep the reason ids stable (running_late, work_conflict, feeling_unwell...) and add new ones rather than renaming, so historic data stays comparable.
- For single-person businesses, delete the staff question. For large teams, reword "Same team member" in the TextBody to use your own term, such as therapist, stylist or dentist.
Open this template in the Flow Builder to make these changes visually. The builder keeps field names unique and regenerates the completion payload for you.
Common mistakes to avoid
- Do not cancel the original booking when the flow is submitted. Keep it until the new slot is confirmed, otherwise a client who never hears back loses both times.
- A static flow has no idea which days are full. Avoid wording like "pick any available date": the DatePicker will happily accept a fully booked Saturday, so promise to confirm rather than to book.
- If you send the flow outside the 24-hour customer service window, it must be inside an approved template with a Flow button. A plain interactive flow message will be rejected.
- Cancellation fees and late-change rules belong in the TextBody or a TextCaption, not buried in a link. Clients who see the rule before submitting argue about it far less afterwards.
Let clients manage bookings themselves
Whautomate has a built-in customer portal flow. Clients see their upcoming appointments, classes, events or orders and can cancel within your cancellation window, without messaging your team. It is created and published for you and runs on live data.
- Upcoming bookings pulled live for the client
- Cancellation window enforced automatically
- Nothing to host or maintain
7-day free trial, no credit card required.