About this lead qualification flow
Inbound WhatsApp enquiries for high-ticket services usually open with "how much does it cost?". Answering that well depends on scope, budget, urgency and who is asking, and a sales rep can spend a day of back-and-forth finding out that the lead is a student researching for a class project. This flow asks the four BANT-style questions up front, so every conversation your team picks up already has context.
The first screen is the qualification: the need as a radio list with plain-language descriptions, a budget band, a timeline and the person's role in the buying decision. Every answer returns a stable item id, which makes it trivial to score leads in your webhook, for example budget_25k_plus plus timeline_this_month plus role_decision_maker goes straight to a senior closer. The second screen captures name, work email, an optional company and a preferred contact method.
Budget ranges are phrased as bands rather than an open number field on purpose. People skip or fudge an exact figure, but most will tap a band, and bands map cleanly onto your pricing tiers. Adjust the currency and thresholds to your market before you publish.
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 |
|---|---|---|---|---|---|
needwebsite_build, paid_ads, seo_content, automation, other_need |
RadioButtonsGroup | QUALIFY | Yes | item id | "paid_ads" |
budget_rangebudget_under_2k, budget_2k_10k, budget_10k_25k, budget_25k_plus, budget_unsure |
RadioButtonsGroup | QUALIFY | Yes | item id | "budget_10k_25k" |
timelinetimeline_this_month, timeline_1_3_months, timeline_later, timeline_researching |
RadioButtonsGroup | QUALIFY | Yes | item id | "timeline_this_month" |
decision_rolerole_decision_maker, role_influencer, role_researcher |
Dropdown | QUALIFY | Yes | item id | "role_decision_maker" |
full_name |
TextInput | CONTACT | Yes | string | "Jordan Reyes" |
work_email |
TextInput (email) | CONTACT | Yes | string | "[email protected]" |
company_name |
TextInput | CONTACT | No | string | "Brightlane Outdoor" |
contact_methodcontact_whatsapp, contact_phone_call, contact_video_call, contact_email |
RadioButtonsGroup | CONTACT | Yes | item id | "contact_video_call" |
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 Lead Qualification 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",
"need": "paid_ads",
"budget_range": "budget_10k_25k",
"timeline": "timeline_this_month",
"decision_role": "role_decision_maker",
"full_name": "Jordan Reyes",
"work_email": "[email protected]",
"company_name": "Brightlane Outdoor",
"contact_method": "contact_video_call"
}
{
"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\",\"need\":\"paid_ads\",\"budget_range\":\"budget_10k_25k\",\"timeline\":\"timeline_this_month\",\"decision_role\":\"role_decision_maker\",\"full_name\":\"Jordan Reyes\",\"work_email\":\"[email protected]\",\"company_name\":\"Brightlane Outdoor\",\"contact_method\":\"contact_video_call\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as lead-qualification.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": "lead_qualification", "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": "Let us point you to the right person"
},
"body": {
"text": "Four quick questions about your project help us send you to the right specialist with a relevant proposal. It takes about a minute."
},
"footer": {
"text": "Your answers go only to our team"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Tell us about your project",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "QUALIFY"
}
}
}
}
}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-lead-qualification.jsonWhen to send it
Pricing questions
When a new contact asks "price?", "rates" or "how much", reply with this flow first. You can then answer with the tier that actually fits their budget band instead of a generic price list.
Click-to-WhatsApp campaigns
Paid traffic from B2B or aesthetics ads is expensive. Sending the qualifier as the first reply separates ready buyers from browsers before a rep spends time on them.
Webinar or event follow-up
Send it through a Flow-button template to attendees the day after a webinar, while intent is high, so reps know who wants a call this month.
Reviving cold leads
Broadcast it to contacts who enquired more than 90 days ago. Anyone who answers "within a month" is worth a same-day call.
How to customise this template
- Rename the need ids (website_build, paid_ads, seo_content, automation, other_need) to match your service lines. Your scoring logic keys on these ids, so version them rather than renaming them after launch.
- Set budget bands around your real price tiers. If your cheapest package is $5k, a "Under $2k" band still helps: it tells you to send a self-serve option instead of booking a call.
- For aesthetics clinics, swap the decision-role question for "Have you had this treatment before?" and the need list for treatment families such as injectables, laser or body contouring.
- Keep company optional for consumer-facing businesses. Making it required on a B2C lead form causes drop-offs from people who have no company to enter.
- Add an EmbeddedLink to your case studies page on the first screen if prospects often ask for examples before sharing a budget.
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 add a phone number field. The submission arrives from the prospect's WhatsApp number (wa_id), and a second phone field just creates mismatched records.
- Budget labels are shown to the prospect, so avoid wording that sounds like a filter such as "Too small". Neutral bands keep completion high.
- Radio item titles are capped at 30 characters. "$10,000 - $25,000 per project" is 29 characters; adding "USD" pushes it over and Meta rejects the upload.
- Score on item ids, never on titles. Titles get translated or reworded, ids stay fixed, and a renamed title silently breaks string matching in your CRM sync.
Turn submissions into conversations your team can close
In Whautomate, import this flow into the built-in flow editor, adjust it with drag and drop and click Publish. Send it from any open chat in the Team Inbox, from an automation, or as a broadcast with a Flow-button template. Each submission is saved as a response, creates or updates the client, and can trigger an automation that tags the lead, assigns the chat and notifies the right person.
- Build and publish in the app, no JSON or API calls
- Send from the Team Inbox, automations or broadcasts
- Submissions notify, tag and assign automatically
7-day free trial, no credit card required.