WhatsApp Appointment Reschedule Flow Template

A single-screen flow for clients who need to move an existing appointment. It asks for a new date, a time window, whether to keep the same team member and, optionally, why the change is needed, so your front desk can rebook in one step instead of a long chat.

1 screen 5 fields returned Flow JSON 7.2 Appointment booking Clinics, Dental, Salons, Spas, Physio, Consultants

Use Try it to fill the flow and see the exact response_json it returns.

appointment-reschedule.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "RESCHEDULE",
      "title": "Reschedule appointment",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_reschedule",
            "children": [
              {
                "type": "TextHeading",
                "text": "Pick a new time"
              },
              {
                "type": "TextBody",
                "text": "Tell us when suits you better. Your current appointment stays booked until we confirm the new one by message."
              },
              {
                "type": "DatePicker",
                "name": "new_date",
                "label": "New preferred date",
                "required": true,
                "helper-text": "We will offer the closest free slot"
              },
              {
                "type": "RadioButtonsGroup",
                "name": "new_time_window",
                "label": "Preferred time of day",
                "data-source": [
                  {
                    "id": "early_morning",
                    "title": "Early morning (8am - 10am)"
                  },
                  {
                    "id": "late_morning",
                    "title": "Late morning (10am - 12pm)"
                  },
                  {
                    "id": "early_afternoon",
                    "title": "Early afternoon (12pm - 3pm)"
                  },
                  {
                    "id": "late_afternoon",
                    "title": "Late afternoon (3pm - 6pm)"
                  },
                  {
                    "id": "evening",
                    "title": "Evening (6pm - 8pm)"
                  }
                ],
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "same_staff",
                "label": "Same team member?",
                "data-source": [
                  {
                    "id": "keep_same",
                    "title": "Yes, keep the same person",
                    "description": "We may need a later date to match their diary"
                  },
                  {
                    "id": "any_available",
                    "title": "Anyone available",
                    "description": "Usually the earliest option"
                  },
                  {
                    "id": "prefer_different",
                    "title": "Someone different please"
                  }
                ],
                "required": true
              },
              {
                "type": "Dropdown",
                "name": "reschedule_reason",
                "label": "Reason (optional)",
                "data-source": [
                  {
                    "id": "work_conflict",
                    "title": "Work or study clash"
                  },
                  {
                    "id": "feeling_unwell",
                    "title": "Feeling unwell"
                  },
                  {
                    "id": "travel",
                    "title": "Travelling"
                  },
                  {
                    "id": "childcare",
                    "title": "Childcare or family"
                  },
                  {
                    "id": "running_late",
                    "title": "Running late today"
                  },
                  {
                    "id": "other_reason",
                    "title": "Something else"
                  }
                ]
              },
              {
                "type": "TextArea",
                "name": "reschedule_notes",
                "label": "Anything else?",
                "helper-text": "Other days or times that also work for you"
              },
              {
                "type": "TextCaption",
                "text": "Changes made less than 24 hours before your appointment may be subject to our late-change policy."
              },
              {
                "type": "Footer",
                "label": "Request new time",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "new_date": "${form.new_date}",
                    "new_time_window": "${form.new_time_window}",
                    "same_staff": "${form.same_staff}",
                    "reschedule_reason": "${form.reschedule_reason}",
                    "reschedule_notes": "${form.reschedule_notes}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/appointment-reschedule.json

Import in 60 seconds
  1. Copy the JSON above (or edit it first in the Flow Builder).
  2. In WhatsApp Manager, open Account tools > Flows, create a flow and choose Appointment booking as the category.
  3. Paste into the JSON editor, check the preview, then Publish.
  4. Send it with the Flow ID, as an interactive message or through a template's Flow button.

Not technical? Skip the JSON and send it from Whautomate with a drag-and-drop editor.

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.

KeyComponentScreenRequiredReturnsExample
new_date DatePicker RESCHEDULE Yes YYYY-MM-DD "2026-10-21"
new_time_window
early_morning, late_morning, early_afternoon, late_afternoon, evening
RadioButtonsGroup RESCHEDULE Yes item id "late_afternoon"
same_staff
keep_same, any_available, prefer_different
RadioButtonsGroup RESCHEDULE Yes item id "keep_same"
reschedule_reason
work_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.

No developer needed

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.

1

Connect your number

Log in with Facebook and connect your WhatsApp number in a few minutes. No API keys or servers to set up.

2

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.

3

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.

4

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.

7-day free trial, no credit card required.

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.

response_json (parsed)
{
  "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."
}
POST your-webhook (full event)
{
  "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

bash
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

bash
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

bash
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.

send-appointment-reschedule.json
{
  "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"
        }
      }
    }
  }
}
bash
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.json

When 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.

Frequently asked questions

Put the appointment id in the flow_token when you send the message. The token comes back inside response_json with every answer, so your webhook can look up the booking without the client typing a reference.
It is a RadioButtonsGroup, so it returns one item id: keep_same, any_available or prefer_different. Map those ids in your handler rather than the titles, which you may want to reword later.
Not as a static flow. Moving a booking needs a live availability check, which requires a data_exchange endpoint. This template collects the request; your team or your own code picks the actual slot and confirms it by message.
Whautomate has a built-in customer portal flow where clients see their upcoming bookings and cancel within your cancellation window. It is created and published for you and runs on live data, so it complements a reschedule request like this one.

The Complete Omnichannel Customer Engagement Platform

Go beyond free tools. Automate conversations, build AI chatbots, send broadcast campaigns, book appointments, sell products, and manage every messaging channel from one powerful platform. Trusted by thousands of businesses worldwide.

  • WhatsApp, Instagram, Messenger, Telegram & Live Chat
  • AI chatbots & no-code automation
  • Broadcast campaigns & analytics
  • Appointment & class booking
  • E-commerce, Shopify & WooCommerce integration
  • CRM, invoicing & payment collection

No credit card required. Free 7-day trial. Visit our pricing page for plans.