About this membership enquiry flow
Membership enquiries almost always start with "what are your prices?". Sending a price list PDF answers the question and ends the conversation. This flow answers it inside a form instead: each plan appears with its price in the radio metadata, so the prospect sees the cost and picks a plan in the same tap, then tells you why they want to join.
Screen one does the selling. The plan radio uses a description for what is included and the metadata slot for the price, like "$49/mo". The goals CheckboxGroup (limited to three picks) gives your sales team a conversation starter, the DatePicker tells you when the membership would begin, and the trial question flags who needs a guest pass before committing. Screen two collects name and email.
Gyms and coworking spaces live on conversion from trial to paid. Treating "yes, I want a trial" as a separate answer lets you run a different follow-up sequence for triallists, with a check-in after their first visit, while people who skip the trial go straight to a sign-up conversation.
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 |
|---|---|---|---|---|---|
plan_interestplan_off_peak, plan_unlimited, plan_premium, plan_annual, plan_not_sure |
RadioButtonsGroup | PLANS | Yes | item id | "plan_unlimited" |
membership_goalsgoal_lose_weight, goal_build_strength, goal_improve_fitness, goal_flexibility, goal_community, goal_stress |
CheckboxGroup | PLANS | No | array of ids | ["goal_build_strength","goal_community"] |
start_date |
DatePicker | PLANS | Yes | YYYY-MM-DD | "2026-11-02" |
trial_interesttrial_yes, trial_tour, trial_no |
RadioButtonsGroup | PLANS | Yes | item id | "trial_yes" |
full_name |
TextInput | MEMBER_DETAILS | Yes | string | "Marcus Webb" |
email |
TextInput (email) | MEMBER_DETAILS | Yes | string | "[email protected]" |
member_notes |
TextArea | MEMBER_DETAILS | No | string | "Mostly early mornings before work, interested in the lifting area." |
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 Membership Enquiry 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",
"plan_interest": "plan_unlimited",
"membership_goals": [
"goal_build_strength",
"goal_community"
],
"start_date": "2026-11-02",
"trial_interest": "trial_yes",
"full_name": "Marcus Webb",
"email": "[email protected]",
"member_notes": "Mostly early mornings before work, interested in the lifting area."
}
{
"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\",\"plan_interest\":\"plan_unlimited\",\"membership_goals\":[\"goal_build_strength\",\"goal_community\"],\"start_date\":\"2026-11-02\",\"trial_interest\":\"trial_yes\",\"full_name\":\"Marcus Webb\",\"email\":\"[email protected]\",\"member_notes\":\"Mostly early mornings before work, interested in the lifting area.\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as membership-enquiry.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": "membership_enquiry", "categories": ["LEAD_GENERATION"]}'
# => {"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": "Find the right membership"
},
"body": {
"text": "See our plans and prices, tell us what you are aiming for and when you want to start. We will send you the best option and a trial pass if you want one."
},
"footer": {
"text": "Reply STOP to opt out"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Explore memberships",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "PLANS"
}
}
}
}
}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-membership-enquiry.jsonWhen to send it
Price enquiries
When a contact messages "prices", "membership" or "how much per month", reply with the flow so the prices arrive alongside a way to act on them.
New Year and September peaks
January and back-to-school are the biggest joining seasons for gyms and studios. Broadcast a Flow-button template to past enquirers a week before.
Open days and tours
After someone tours the space, send the flow the same evening so they choose a plan while the visit is fresh.
Lapsed members
Former members whose plan ended a few months ago can be re-engaged with the flow and a comeback offer in the template text.
How to customise this template
- Put your real plans in the radio and keep the metadata to the headline price. Item metadata is capped at 20 characters, so "$49/mo" or "$390/yr" fits but "$49 per month + joining" does not.
- For coworking, replace the goals with needs such as a fixed desk, meeting room hours, a business address or 24/7 access.
- If you do not offer trials, change the trial question to "Would you like a tour first?" and keep the id pattern so your follow-up logic is unchanged.
- Mention joining fees, contracts or minimum terms in the plan description. Surprises at sign-up are the main reason membership leads go cold.
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
- Prices in a static flow are hardcoded. When you change pricing, update the Flow JSON and republish, or old prices will keep appearing in every send.
- Do not set max-selected-items lower than the number of goals people realistically have. Three is a good ceiling; one forces a choice that is not true for most members.
- Metadata displays next to the item title on the right. Test on a small phone: a long title plus price can wrap awkwardly.
- The preferred start date is not a contract start. Say so in your follow-up, and never auto-bill based on this date alone.
Sell memberships and packages in chat
When the enquiry turns into a purchase, Whautomate has a built-in buy-plan flow. Clients pick a plan, see a summary and subscribe inside WhatsApp. It is published in your account automatically and reads your live plans.
- Your real plans and pricing
- Subscription created on submit
- Single and multi-location versions
7-day free trial, no credit card required.