WhatsApp Membership Enquiry Flow Template

A two-screen flow for gyms, studios, clubs and coworking spaces. It shows your plans with the monthly price beside each one, asks about goals, a start date and whether the prospect wants a trial first, then collects their details for the membership team.

2 screens 7 fields returned Flow JSON 7.2 Lead generation Gyms, Fitness studios, Clubs, Coworking spaces

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

membership-enquiry.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "PLANS",
      "title": "Membership options",
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_plans",
            "children": [
              {
                "type": "TextHeading",
                "text": "Which membership interests you?"
              },
              {
                "type": "TextBody",
                "text": "All plans include the app, lockers and a free induction. No joining fee this month."
              },
              {
                "type": "RadioButtonsGroup",
                "name": "plan_interest",
                "label": "Plan",
                "data-source": [
                  {
                    "id": "plan_off_peak",
                    "title": "Off-peak",
                    "description": "Weekdays 10am - 4pm and weekends, gym floor only",
                    "metadata": "$29/mo"
                  },
                  {
                    "id": "plan_unlimited",
                    "title": "Unlimited",
                    "description": "Any time, gym floor plus all group classes",
                    "metadata": "$49/mo"
                  },
                  {
                    "id": "plan_premium",
                    "title": "Premium",
                    "description": "Unlimited plus sauna, towel service and 2 guest passes a month",
                    "metadata": "$79/mo"
                  },
                  {
                    "id": "plan_annual",
                    "title": "Unlimited annual",
                    "description": "Twelve months of Unlimited, paid upfront",
                    "metadata": "$490/yr"
                  },
                  {
                    "id": "plan_not_sure",
                    "title": "Not sure yet",
                    "description": "We will recommend one based on your goals"
                  }
                ],
                "required": true
              },
              {
                "type": "CheckboxGroup",
                "name": "membership_goals",
                "label": "Your goals",
                "data-source": [
                  {
                    "id": "goal_lose_weight",
                    "title": "Lose weight"
                  },
                  {
                    "id": "goal_build_strength",
                    "title": "Build strength"
                  },
                  {
                    "id": "goal_improve_fitness",
                    "title": "Improve fitness"
                  },
                  {
                    "id": "goal_flexibility",
                    "title": "Mobility and flexibility"
                  },
                  {
                    "id": "goal_community",
                    "title": "Train with others"
                  },
                  {
                    "id": "goal_stress",
                    "title": "Reduce stress"
                  }
                ],
                "max-selected-items": 3
              },
              {
                "type": "DatePicker",
                "name": "start_date",
                "label": "When would you like to start?",
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "trial_interest",
                "label": "Try before you join?",
                "data-source": [
                  {
                    "id": "trial_yes",
                    "title": "Yes, send me a trial pass"
                  },
                  {
                    "id": "trial_tour",
                    "title": "I would like a tour first"
                  },
                  {
                    "id": "trial_no",
                    "title": "No, I am ready to join"
                  }
                ],
                "required": true
              },
              {
                "type": "Footer",
                "label": "Continue",
                "on-click-action": {
                  "name": "navigate",
                  "next": {
                    "type": "screen",
                    "name": "MEMBER_DETAILS"
                  },
                  "payload": {}
                }
              }
            ]
          }
        ]
      }
    },
    {
      "id": "MEMBER_DETAILS",
      "title": "Your details",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_member_details",
            "children": [
              {
                "type": "TextSubheading",
                "text": "Where should we send your options?"
              },
              {
                "type": "TextInput",
                "name": "full_name",
                "label": "Full name",
                "input-type": "text",
                "required": true
              },
              {
                "type": "TextInput",
                "name": "email",
                "label": "Email",
                "input-type": "email",
                "required": true,
                "helper-text": "For your trial pass or membership summary"
              },
              {
                "type": "TextArea",
                "name": "member_notes",
                "label": "Anything else?",
                "helper-text": "Injuries, preferred training times or questions",
                "max-length": 300
              },
              {
                "type": "TextCaption",
                "text": "Our membership team will reply here with your next steps."
              },
              {
                "type": "Footer",
                "label": "Send enquiry",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "plan_interest": "${screen.PLANS.form.plan_interest}",
                    "membership_goals": "${screen.PLANS.form.membership_goals}",
                    "start_date": "${screen.PLANS.form.start_date}",
                    "trial_interest": "${screen.PLANS.form.trial_interest}",
                    "full_name": "${form.full_name}",
                    "email": "${form.email}",
                    "member_notes": "${form.member_notes}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

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

KeyComponentScreenRequiredReturnsExample
plan_interest
plan_off_peak, plan_unlimited, plan_premium, plan_annual, plan_not_sure
RadioButtonsGroup PLANS Yes item id "plan_unlimited"
membership_goals
goal_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_interest
trial_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.

No developer needed

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.

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

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_enquiry", "categories": ["LEAD_GENERATION"]}'
# => {"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-enquiry.json
{
  "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"
        }
      }
    }
  }
}
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-enquiry.json

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

Frequently asked questions

Each RadioButtonsGroup item has an optional metadata property of up to 20 characters. WhatsApp renders it alongside the item title, which makes it a good place for "$49/mo" style prices.
No, this static flow only records interest. Taking the purchase needs a flow backed by a data_exchange endpoint. Whautomate includes a built-in buy-plan flow that reads your live plans and creates the subscription when submitted.
membership_goals arrives in response_json as an array of item ids, for example ["goal_lose_weight", "goal_community"]. An empty array is possible if the field is optional and nothing is ticked.
Sort by plan_interest and trial_interest. Someone choosing the annual plan with no trial is ready to buy; someone choosing "Not sure yet" with a trial needs nurturing. Both item ids arrive in the nfm_reply webhook.

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.