About this waitlist sign-up flow
Most waitlists are a list of names with no context, so filling a cancellation means messaging five people and waiting for the one who happens to be free. This flow collects the availability up front: which days, which parts of the day, and how short notice they can handle. When a 6pm Thursday spot opens at 2pm, you can filter straight to the people who said Thursday evenings and same-day notice are fine.
The notice question is the one most waitlists miss. Some clients can drop everything for a slot in two hours; others need a day to arrange childcare or time off. Knowing this stops you offering last-minute cancellations to people who could never take them, which is frustrating for both sides and makes them ignore future offers.
The earliest date field covers clients who are not available yet, for example someone joining a course waitlist after a holiday, or a patient who cannot start until post-surgery clearance. Your handler can skip them until that date rather than offering slots they have to decline.
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 |
|---|---|---|---|---|---|
waitlist_itemreformer_evening, reformer_morning, hot_yoga, beginner_course, massage_90, any_session |
Dropdown | JOIN_WAITLIST | Yes | item id | "reformer_evening" |
earliest_date |
DatePicker | JOIN_WAITLIST | Yes | YYYY-MM-DD | "2026-10-19" |
available_daysmon, tue, wed, thu, fri, sat, sun |
CheckboxGroup | JOIN_WAITLIST | Yes | array of ids | ["mon","wed","thu"] |
available_timesearly_morning, daytime, evening |
CheckboxGroup | JOIN_WAITLIST | Yes | array of ids | ["evening"] |
notice_neededtwo_hours, same_day, day_before, two_days |
RadioButtonsGroup | JOIN_WAITLIST | Yes | item id | "same_day" |
waitlist_notes |
TextArea | JOIN_WAITLIST | No | string | "Happy to take any reformer class, not just the evening one." |
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 Waitlist Sign-up 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",
"waitlist_item": "reformer_evening",
"earliest_date": "2026-10-19",
"available_days": [
"mon",
"wed",
"thu"
],
"available_times": [
"evening"
],
"notice_needed": "same_day",
"waitlist_notes": "Happy to take any reformer class, not just the evening one."
}
{
"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\",\"waitlist_item\":\"reformer_evening\",\"earliest_date\":\"2026-10-19\",\"available_days\":[\"mon\",\"wed\",\"thu\"],\"available_times\":[\"evening\"],\"notice_needed\":\"same_day\",\"waitlist_notes\":\"Happy to take any reformer class, not just the evening one.\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as waitlist-signup.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": "waitlist_signup", "categories": ["SIGN_UP"]}'
# => {"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": "This one is fully booked"
},
"body": {
"text": "Join the waitlist and we will message you as soon as a spot opens that matches your availability."
},
"footer": {
"text": "You can leave the waitlist at any time"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Join the waitlist",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "JOIN_WAITLIST"
}
}
}
}
}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-waitlist-signup.jsonWhen to send it
Class or course is full
When a client asks about a class that has no space, reply with this flow instead of "sorry, it is full". A waitlist entry keeps the lead instead of losing it.
No slots with a popular team member
Clients who insist on one therapist or stylist can join the waitlist for that person while you offer an alternative booking in the meantime.
Before a new timetable launches
Collect interest for a new class or location before bookings open, and use the answers to decide which days and times to schedule.
After a cancellation reply
When someone tries to rebook after cancelling and nothing fits, offer the waitlist so their intent does not go to waste.
How to customise this template
- List the classes or services that genuinely fill up in the dropdown. Leaving quiet sessions out avoids waitlist entries for things you could book immediately.
- Match the time windows to your timetable. A studio with 6am and 7pm classes needs "early morning" and "evening" windows; a clinic might use morning, lunchtime and afternoon.
- Change the notice options to reflect how you actually release spots. If cancellations only reach you the day before, drop the "within 2 hours" option.
- Add a spots_needed style question if families or friends often join together, so you do not offer a single spot to a group of three.
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
- Messaging a waitlisted client more than 24 hours after their last message needs an approved template. Prepare a utility template such as "A spot opened for {{1}} on {{2}}" in advance so you can send offers instantly.
- Offer the freed slot to one or a few people at a time, with a clear reply deadline. Offering it to everyone at once creates disappointed clients who replied "yes" too late.
- available_days and available_times are arrays. A client who ticks Monday and evenings has not necessarily said Monday evening works, so treat them as broad filters and confirm the specific slot.
- Keep the waitlist clean. Remove entries once the client is booked or after a set period, and tell them, otherwise old entries clog your filter and clients get offers they no longer want.
Book real class spots, not just interest
Whautomate includes a built-in class booking flow that shows your live class schedule and books the spot inside WhatsApp. It is published in your account automatically and runs on an endpoint Whautomate hosts, so capacity and dates always match your timetable.
- Live class schedule and dates
- Books the participant directly
- Single and multi-location versions
7-day free trial, no credit card required.