WhatsApp Waitlist Sign-up Flow Template

A one-screen waitlist form for fully booked classes and appointments. It records what the client is waiting for, the earliest date they can start, the days and times they are free, and how much notice they need, so you can fill cancellations with someone who will actually say yes.

1 screen 6 fields returned Flow JSON 7.2 Sign up Fitness studios, Clinics, Salons, Tutors, Workshops

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

waitlist-signup.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "JOIN_WAITLIST",
      "title": "Join the waitlist",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_join_waitlist",
            "children": [
              {
                "type": "TextHeading",
                "text": "Get the next free spot"
              },
              {
                "type": "TextBody",
                "text": "Tell us what you are waiting for and when you are free. We will only message you about spots that match."
              },
              {
                "type": "Dropdown",
                "name": "waitlist_item",
                "label": "Waiting for",
                "data-source": [
                  {
                    "id": "reformer_evening",
                    "title": "Reformer Pilates (evening)"
                  },
                  {
                    "id": "reformer_morning",
                    "title": "Reformer Pilates (morning)"
                  },
                  {
                    "id": "hot_yoga",
                    "title": "Hot yoga"
                  },
                  {
                    "id": "beginner_course",
                    "title": "6-week beginner course"
                  },
                  {
                    "id": "massage_90",
                    "title": "90-minute massage"
                  },
                  {
                    "id": "any_session",
                    "title": "Any available session"
                  }
                ],
                "required": true
              },
              {
                "type": "DatePicker",
                "name": "earliest_date",
                "label": "Earliest date you can start",
                "required": true
              },
              {
                "type": "CheckboxGroup",
                "name": "available_days",
                "label": "Days you are free",
                "data-source": [
                  {
                    "id": "mon",
                    "title": "Monday"
                  },
                  {
                    "id": "tue",
                    "title": "Tuesday"
                  },
                  {
                    "id": "wed",
                    "title": "Wednesday"
                  },
                  {
                    "id": "thu",
                    "title": "Thursday"
                  },
                  {
                    "id": "fri",
                    "title": "Friday"
                  },
                  {
                    "id": "sat",
                    "title": "Saturday"
                  },
                  {
                    "id": "sun",
                    "title": "Sunday"
                  }
                ],
                "required": true
              },
              {
                "type": "CheckboxGroup",
                "name": "available_times",
                "label": "Times you are free",
                "data-source": [
                  {
                    "id": "early_morning",
                    "title": "Early morning",
                    "description": "Before 9am"
                  },
                  {
                    "id": "daytime",
                    "title": "Daytime",
                    "description": "9am - 4pm"
                  },
                  {
                    "id": "evening",
                    "title": "Evening",
                    "description": "After 4pm"
                  }
                ],
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "notice_needed",
                "label": "Notice you need",
                "data-source": [
                  {
                    "id": "two_hours",
                    "title": "Within 2 hours is fine"
                  },
                  {
                    "id": "same_day",
                    "title": "Same day, a few hours ahead"
                  },
                  {
                    "id": "day_before",
                    "title": "At least a day before"
                  },
                  {
                    "id": "two_days",
                    "title": "Two days or more"
                  }
                ],
                "required": true
              },
              {
                "type": "TextArea",
                "name": "waitlist_notes",
                "label": "Anything else?",
                "helper-text": "Alternatives you would accept, or dates to avoid"
              },
              {
                "type": "Footer",
                "label": "Join waitlist",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "waitlist_item": "${form.waitlist_item}",
                    "earliest_date": "${form.earliest_date}",
                    "available_days": "${form.available_days}",
                    "available_times": "${form.available_times}",
                    "notice_needed": "${form.notice_needed}",
                    "waitlist_notes": "${form.waitlist_notes}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/waitlist-signup.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 Sign up 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 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.

KeyComponentScreenRequiredReturnsExample
waitlist_item
reformer_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_days
mon, tue, wed, thu, fri, sat, sun
CheckboxGroup JOIN_WAITLIST Yes array of ids ["mon","wed","thu"]
available_times
early_morning, daytime, evening
CheckboxGroup JOIN_WAITLIST Yes array of ids ["evening"]
notice_needed
two_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.

No developer needed

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.

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",
  "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."
}
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\",\"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

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": "waitlist_signup", "categories": ["SIGN_UP"]}'
# => {"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-waitlist-signup.json
{
  "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"
        }
      }
    }
  }
}
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-waitlist-signup.json

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

Frequently asked questions

No. A flow only collects answers. Your system stores the waitlist entry and, when a cancellation happens, sends the offer as a message: a free-form reply inside the 24-hour window, or an approved template outside it.
A string in YYYY-MM-DD format, such as "2026-11-02". Compare it as a plain date against the slot date, with no time zone conversion, so a client is never offered a slot the day before they are available.
Only with a data_exchange endpoint that returns the current list of full sessions when the flow opens. This static template uses a fixed list you update whenever your timetable changes.
A waitlist records intent for something with no space; a booking reserves a spot. Whautomate's built-in class booking flow handles direct bookings on your live schedule, and a waitlist flow like this one covers the sessions that are already full.

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.