About this membership cancellation survey flow
Members rarely explain why they leave unless you ask at the moment they cancel. This exit survey captures a single main reason, so churn can be counted by cause, plus a checklist of changes that might have kept them. Over a quarter, that tells a gym whether it is losing people to price, to timetable clashes or to simply not showing up.
The second screen is a gentle save attempt, not a barrier. Two opt-ins let the member choose to pause for a month instead of cancelling, or to receive an offer to return later. Many people who cancel because of travel, exams or a short injury would rather pause if the option is in front of them, and a pause keeps their history and their spot on the books.
Send the survey after the cancellation request is logged, and process the cancellation whatever the answers say. Consumer rules in many markets require cancelling to be as easy as signing up, and a survey that looks like a condition of cancelling damages trust. The flow collects reasons and preferences; your team acts on the pause request only if the member ticks it.
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 |
|---|---|---|---|---|---|
cancel_reasonprice, moved_away, schedule_clash, injury_health, not_using, switching_provider, goals_met, facilities, other |
RadioButtonsGroup | REASON | Yes | item id | "schedule_clash" |
keep_factorslower_price, freeze_option, more_class_times, personal_support, different_plan, better_equipment, nothing_would |
CheckboxGroup | REASON | No | array of ids | ["more_class_times","freeze_option"] |
pause_instead |
OptIn | OPTIONS | No | boolean | true |
comeback_offer |
OptIn | OPTIONS | No | boolean | false |
cancel_comment |
TextArea | OPTIONS | No | string | "New job means I cannot make evening classes until January." |
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 Cancellation Survey 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",
"cancel_reason": "schedule_clash",
"keep_factors": [
"more_class_times",
"freeze_option"
],
"pause_instead": true,
"comeback_offer": false,
"cancel_comment": "New job means I cannot make evening classes until January."
}
{
"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\",\"cancel_reason\":\"schedule_clash\",\"keep_factors\":[\"more_class_times\",\"freeze_option\"],\"pause_instead\":true,\"comeback_offer\":false,\"cancel_comment\":\"New job means I cannot make evening classes until January.\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as membership-cancellation-survey.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_cancellation_survey", "categories": ["SURVEY"]}'
# => {"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": "Sorry to see you go"
},
"body": {
"text": "Your cancellation request has been received. Would you tell us why you are leaving? It takes a minute and helps us improve for everyone."
},
"footer": {
"text": "Your cancellation is not affected by this survey"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Tell us why",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "REASON"
}
}
}
}
}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-cancellation-survey.jsonWhen to send it
Right after a cancellation request
When a member asks to cancel in chat or at the desk, send the flow as the acknowledgement so the reason is captured while it is on their mind.
When auto-renew is switched off
Turning off renewal is an early signal of leaving. The survey at that point gives you weeks, not hours, to act on a pause request.
After a lapsed payment
If a membership lapses without a word, the survey helps you separate people who left on purpose from those whose card simply expired.
End of a fixed term
For 3 or 6 month packages that are not renewed, it records why, which is often a scheduling or goal change rather than dissatisfaction.
How to customise this template
- Match the reasons to your business. A tutoring service might use "Exams finished" and "Child lost interest"; a spa might use "Visit less often now".
- Change the pause length in the OptIn label to whatever your system can actually do (two weeks, one month, until a date). Do not offer a pause you cannot apply.
- If you have a cheaper off-peak or class-pack option, add "A cheaper plan" to the keep_factors list and follow up with ticked members about it.
- Keep the reason field required and everything on screen two optional, so members who only want to leave can finish in two taps.
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
- Never make the survey a condition of cancelling. Confirm the cancellation separately, in writing, regardless of whether the flow is submitted.
- Act on pause_instead quickly. If a member ticks it and still gets charged or cancelled, you lose them and their goodwill.
- Only send the come-back offer to people who ticked comeback_offer, and respect marketing consent rules for that later message.
- Watch for "not_using" as the top reason. It usually points to onboarding and habit problems, which a discount will not fix.
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.