About this fitness trial class sign-up flow
Trial classes are where studios win or lose members, and most of the losing happens before the class. A beginner put into an advanced vinyasa flow, or a nervous newcomer dropped into a sparring session, rarely comes back. This flow asks the two questions coaches care about most, the class type and the experience level, so you can place the person in a session where they will have a good first experience.
The goals checklist is for your sales follow-up, not for scheduling. Someone who ticks "lose weight" and "build strength" responds to a different membership pitch than someone who ticks "flexibility" and "stress relief". Preferred days tell you which timetable slots to offer and which membership tier (off-peak or full) fits them best.
Screen two ends with a health declaration. Physical activity carries risk, and most studios need a record that the participant disclosed injuries and confirmed they are fit to train. The OptIn returns a boolean you can store, and the injuries box gives the instructor something useful to read before the class starts.
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 |
|---|---|---|---|---|---|
class_typeyoga_flow, reformer_pilates, hiit, strength, martial_arts |
RadioButtonsGroup | TRIAL_CLASS | Yes | item id | "yoga_flow" |
experience_levelcomplete_beginner, some_experience, regular, returning |
RadioButtonsGroup | TRIAL_CLASS | Yes | item id | "some_experience" |
fitness_goalslose_weight, build_strength, flexibility, stress_relief, fitness_event, self_defence, rehab |
CheckboxGroup | TRIAL_CLASS | No | array of ids | ["flexibility","stress_relief"] |
preferred_daysmon, tue, wed, thu, fri, sat, sun |
CheckboxGroup | TRIAL_CLASS | Yes | array of ids | ["tue","thu","sat"] |
member_name |
TextInput | TRIAL_DETAILS | Yes | string | "Daniel Okafor" |
member_email |
TextInput (email) | TRIAL_DETAILS | No | string | "[email protected]" |
injuries |
TextArea | TRIAL_DETAILS | No | string | "Old left knee injury, fine for most movements but I avoid deep lunges." |
health_declaration |
OptIn | TRIAL_DETAILS | Yes | boolean | true |
marketing_opt_in |
OptIn | TRIAL_DETAILS | No | boolean | false |
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 Fitness Trial Class 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",
"class_type": "yoga_flow",
"experience_level": "some_experience",
"fitness_goals": [
"flexibility",
"stress_relief"
],
"preferred_days": [
"tue",
"thu",
"sat"
],
"member_name": "Daniel Okafor",
"member_email": "[email protected]",
"injuries": "Old left knee injury, fine for most movements but I avoid deep lunges.",
"health_declaration": true,
"marketing_opt_in": false
}
{
"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\",\"class_type\":\"yoga_flow\",\"experience_level\":\"some_experience\",\"fitness_goals\":[\"flexibility\",\"stress_relief\"],\"preferred_days\":[\"tue\",\"thu\",\"sat\"],\"member_name\":\"Daniel Okafor\",\"member_email\":\"[email protected]\",\"injuries\":\"Old left knee injury, fine for most movements but I avoid deep lunges.\",\"health_declaration\":true,\"marketing_opt_in\":false}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as fitness-trial-class.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": "fitness_trial_class", "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": "Try a class on us"
},
"body": {
"text": "Tell us what you would like to try and when suits you. We will match you to the right class and level and send your trial details."
},
"footer": {
"text": "No experience needed"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Book a trial class",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "TRIAL_CLASS"
}
}
}
}
}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-fitness-trial-class.jsonWhen to send it
Instagram and Facebook ads
Send it as the first reply to click-to-WhatsApp ads promoting a free or discounted trial, so ad clicks become placed trial bookings, not "hi, how much?" chats.
Walk-in and front desk
Put a QR code at reception that opens a WhatsApp chat with a "trial" keyword. The chatbot sends the flow and the prospect signs up before they leave.
New year and September pushes
Broadcast a Flow-button template to past enquirers and lapsed leads during the two big fitness sign-up seasons.
Referral from a member
When a member brings a friend, send the friend the flow so their waiver and experience level are on file before they arrive.
How to customise this template
- Replace the class types with your real formats and write descriptions that set expectations: intensity, what to wear, whether equipment is provided.
- Keep three to four experience levels. More than that and prospects over- or under-rate themselves; fewer and a complete beginner cannot tell where they fit.
- Rewrite the health declaration with your own wording and have it checked for your jurisdiction. The OptIn label allows 120 characters, so link to the full terms with an EmbeddedLink if you need more.
- For martial arts clubs with junior classes, add a guardian name field and a separate OptIn for parental consent, and keep adult and junior classes as different ids.
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 tell prospects they are booked into a specific class unless you actually reserve the spot. A static flow cannot see capacity, so a full 7am class will still accept the request.
- The health declaration is not a medical assessment. If someone lists a serious injury or condition, have a coach reply before the class, not after they arrive.
- preferred_days returns an array of ids such as ["mon", "wed"]. Handle an empty array if you make it optional, and avoid inferring "no availability" from it.
- Follow up quickly. Trial sign-ups go cold within a day or two, so reply with a specific class time the same day, ideally from a coach rather than a generic account.
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.