About this free consultation booking flow
A free consultation is a sales meeting that has to feel like help. The fastest way to waste one is to spend the first fifteen minutes asking what the person wants. This flow collects the goal and the backstory in advance, so the coach, adviser or clinician opens the session already knowing whether it is a skin concern, a debt consolidation question or a child two grades behind in maths.
Screen one covers the consultation: a goal radio with descriptions that help the person put words to their situation, a TextArea for the current challenge, the meeting format and a preferred date and time of day. Screen two collects name and email and ends with an OptIn to receive prep material, such as a short questionnaire, a what-to-bring list or an intake guide.
The prep-material OptIn does double duty. It gives you explicit consent to send a pre-session message, and people who tick it show up far more reliably, because they have already engaged with you before the meeting. Treat unticked submissions as higher no-show risk and send a reminder closer to the day.
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 |
|---|---|---|---|---|---|
main_goalgoal_career_change, goal_skin_concern, goal_finances, goal_legal_matter, goal_exam_results |
RadioButtonsGroup | CONSULTATION | Yes | item id | "goal_career_change" |
current_challenge |
TextArea | CONSULTATION | Yes | string | "Eight years in retail management, want to move into HR but no formal qualifications yet." |
meeting_formatformat_in_person, format_video, format_phone |
RadioButtonsGroup | CONSULTATION | Yes | item id | "format_video" |
preferred_date |
DatePicker | CONSULTATION | Yes | YYYY-MM-DD | "2026-10-20" |
preferred_timetime_morning, time_afternoon, time_evening |
Dropdown | CONSULTATION | Yes | item id | "time_evening" |
full_name |
TextInput | YOUR_DETAILS | Yes | string | "Samira Haddad" |
email |
TextInput (email) | YOUR_DETAILS | Yes | string | "[email protected]" |
prep_material_optin |
OptIn | YOUR_DETAILS | No | boolean | true |
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 Free Consultation Booking 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",
"main_goal": "goal_career_change",
"current_challenge": "Eight years in retail management, want to move into HR but no formal qualifications yet.",
"meeting_format": "format_video",
"preferred_date": "2026-10-20",
"preferred_time": "time_evening",
"full_name": "Samira Haddad",
"email": "[email protected]",
"prep_material_optin": true
}
{
"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\",\"main_goal\":\"goal_career_change\",\"current_challenge\":\"Eight years in retail management, want to move into HR but no formal qualifications yet.\",\"meeting_format\":\"format_video\",\"preferred_date\":\"2026-10-20\",\"preferred_time\":\"time_evening\",\"full_name\":\"Samira Haddad\",\"email\":\"[email protected]\",\"prep_material_optin\":true}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as free-consultation.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": "free_consultation", "categories": ["APPOINTMENT_BOOKING"]}'
# => {"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": "Your free consultation"
},
"body": {
"text": "Tell us what you want to achieve and pick a time. We will come to the session prepared, so you get real advice from the first minute."
},
"footer": {
"text": "No cost, no obligation"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Book free consultation",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "CONSULTATION"
}
}
}
}
}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-free-consultation.jsonWhen to send it
Discovery-call CTA
Reply with the flow when someone messages from your "Book a free call" link or bio link, so the booking happens in the chat they opened.
After a lead magnet
Someone who downloaded your guide or checklist is warm. Send the flow a day later through a Flow-button template while the topic is fresh.
Undecided enquiries
When a prospect asks detailed questions but will not commit to a paid session, offer the consultation flow as a low-risk next step.
Seasonal intake
Tutors before exam season, financial advisers before tax deadlines and aesthetics clinics before the holidays can broadcast it to past enquirers.
How to customise this template
- Rewrite the goal options in your client's language, not your service names. "Clear my acne scars" converts better than "Fractional laser resurfacing".
- If you only meet online, remove the in-person option or the whole format radio, and put your video tool in the TextBody so there are no surprises.
- Link your privacy policy or consultation terms with an EmbeddedLink on the last screen if you work in a regulated field such as finance, legal or medical aesthetics.
- Tie the prep material to the goal id in your webhook: send a skin questionnaire for goal_skin_concern and a document checklist for goal_finances.
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 ask for sensitive details in the TextArea without saying how they are handled. For medical or financial cases, invite a summary and keep specifics for the session.
- OptIn labels allow 120 characters. Name exactly what you will send, because a vague "I agree to receive messages" weakens the consent record.
- Avoid calling the session a "consultation" in regulated industries where that word implies formal advice. "Intro call" may be the safer label for legal and finance.
- The preferred date is a wish, not a booking. Confirm the exact time by message and send a calendar invite, or the prospect may not treat it as fixed.
Need live availability instead of a "preferred time"?
A static flow can only collect a requested time, so your team still has to confirm it by hand. Whautomate ships a built-in appointment booking flow that reads your real services, staff and open slots, books the appointment directly and sends the confirmation. It is created and published in your WhatsApp account from an automation template, and it runs on an encrypted endpoint Whautomate hosts. There is no endpoint code for you to write.
- Live services, staff and time slots from your calendar
- Books directly, with no manual confirmation step
- Multi-location version picks the branch first
7-day free trial, no credit card required.