WhatsApp Membership Cancellation Survey Flow Template

A two-screen exit survey for members who are leaving: the main reason, what might have kept them, then two save options (pause for a month, or receive a come-back offer later) and a comment.

2 screens 5 fields returned Flow JSON 7.2 Survey Gyms, Studios, Spas, Tutors

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

membership-cancellation-survey.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "REASON",
      "title": "Why are you leaving?",
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_reason",
            "children": [
              {
                "type": "TextHeading",
                "text": "Help us understand"
              },
              {
                "type": "TextBody",
                "text": "Your cancellation request has been received. These questions do not change it."
              },
              {
                "type": "RadioButtonsGroup",
                "name": "cancel_reason",
                "label": "Main reason for cancelling",
                "data-source": [
                  {
                    "id": "price",
                    "title": "Too expensive"
                  },
                  {
                    "id": "moved_away",
                    "title": "Moving or moved away"
                  },
                  {
                    "id": "schedule_clash",
                    "title": "Times do not suit me"
                  },
                  {
                    "id": "injury_health",
                    "title": "Injury or health reasons"
                  },
                  {
                    "id": "not_using",
                    "title": "Not using it enough"
                  },
                  {
                    "id": "switching_provider",
                    "title": "Switching elsewhere"
                  },
                  {
                    "id": "goals_met",
                    "title": "Reached my goal"
                  },
                  {
                    "id": "facilities",
                    "title": "Facilities or equipment"
                  },
                  {
                    "id": "other",
                    "title": "Another reason"
                  }
                ],
                "required": true
              },
              {
                "type": "CheckboxGroup",
                "name": "keep_factors",
                "label": "What could have kept you?",
                "data-source": [
                  {
                    "id": "lower_price",
                    "title": "A lower price"
                  },
                  {
                    "id": "freeze_option",
                    "title": "Option to pause"
                  },
                  {
                    "id": "more_class_times",
                    "title": "More class times"
                  },
                  {
                    "id": "personal_support",
                    "title": "More personal support"
                  },
                  {
                    "id": "different_plan",
                    "title": "A different plan"
                  },
                  {
                    "id": "better_equipment",
                    "title": "Better equipment"
                  },
                  {
                    "id": "nothing_would",
                    "title": "Nothing, my mind is made up"
                  }
                ]
              },
              {
                "type": "Footer",
                "label": "Continue",
                "on-click-action": {
                  "name": "navigate",
                  "next": {
                    "type": "screen",
                    "name": "OPTIONS"
                  },
                  "payload": {}
                }
              }
            ]
          }
        ]
      }
    },
    {
      "id": "OPTIONS",
      "title": "Before you go",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_options",
            "children": [
              {
                "type": "TextSubheading",
                "text": "Would any of these help?"
              },
              {
                "type": "TextBody",
                "text": "Only tick what you want. Leave both unticked and we will simply complete your cancellation."
              },
              {
                "type": "OptIn",
                "name": "pause_instead",
                "label": "Pause my membership for a month instead of cancelling"
              },
              {
                "type": "OptIn",
                "name": "comeback_offer",
                "label": "Send me an offer to come back later"
              },
              {
                "type": "TextArea",
                "name": "cancel_comment",
                "label": "Anything else?",
                "helper-text": "Optional",
                "max-length": 600
              },
              {
                "type": "Footer",
                "label": "Submit",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "cancel_reason": "${screen.REASON.form.cancel_reason}",
                    "keep_factors": "${screen.REASON.form.keep_factors}",
                    "pause_instead": "${form.pause_instead}",
                    "comeback_offer": "${form.comeback_offer}",
                    "cancel_comment": "${form.cancel_comment}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/membership-cancellation-survey.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 Survey 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 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.

KeyComponentScreenRequiredReturnsExample
cancel_reason
price, moved_away, schedule_clash, injury_health, not_using, switching_provider, goals_met, facilities, other
RadioButtonsGroup REASON Yes item id "schedule_clash"
keep_factors
lower_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.

No developer needed

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.

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

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": "membership_cancellation_survey", "categories": ["SURVEY"]}'
# => {"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-membership-cancellation-survey.json
{
  "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"
        }
      }
    }
  }
}
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-membership-cancellation-survey.json

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

Frequently asked questions

After the request is recorded. Asking questions before accepting the cancellation feels like a retention trap. Tell the member their request is received, then ask for feedback.
Check pause_instead in the response_json. If it is true, have your team confirm the pause dates in the same chat and hold the cancellation. The reply lands inside the 24-hour window the submission opens, so a normal message works.
An nfm_reply webhook with response_json containing the flow_token, cancel_reason (an item id such as moved_away), keep_factors (an array of ids), pause_instead and comeback_offer (booleans) and cancel_comment (a string).
Encode the membership or subscription id in the flow_token when you send the flow, for example "cancel_mbr_20931". The token is returned untouched with the answers.

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.