About this quote request flow
Quoting over chat breaks down in a familiar way: the customer sends "how much for a clean?", you ask how many rooms, they reply two hours later, you ask about the date, and by the time you have enough to price it they have booked someone who answered faster. This flow gathers everything a quote depends on in one pass, so the first reply you send can be the price.
Screen one is the job itself: a service type radio, a size band, the target date, a budget band and a TextArea for the brief. Size is expressed as bands (small, medium, large, very large) with descriptions per band, so a caterer can mean guest counts and a cleaner can mean rooms without changing the structure. Screen two collects name, email, postcode and whether the customer wants the quote by WhatsApp, email or after a site visit.
Because the quote is priced by a person, this works as a static flow with no endpoint. If you later want instant pricing for standard jobs, the same field names can feed a data_exchange endpoint that returns a price on a third screen.
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 |
|---|---|---|---|---|---|
service_typedeep_cleaning, event_catering, print_production, renovation, event_setup |
RadioButtonsGroup | JOB_DETAILS | Yes | item id | "event_catering" |
job_sizesize_small, size_medium, size_large, size_very_large |
RadioButtonsGroup | JOB_DETAILS | Yes | item id | "size_large" |
target_date |
DatePicker | JOB_DETAILS | Yes | YYYY-MM-DD | "2026-11-21" |
date_flexibilitydate_fixed, date_few_days, date_open |
Dropdown | JOB_DETAILS | Yes | item id | "date_fixed" |
budget_bandbudget_under_500, budget_500_3k, budget_3k_8k, budget_8k_plus, budget_unsure |
RadioButtonsGroup | JOB_DETAILS | No | item id | "budget_3k_8k" |
job_description |
TextArea | JOB_DETAILS | Yes | string | "Engagement party for about 90 guests, buffet with two vegetarian mains, venue has a kitchen but no staff." |
full_name |
TextInput | QUOTE_CONTACT | Yes | string | "Priya Nair" |
email |
TextInput (email) | QUOTE_CONTACT | No | string | "[email protected]" |
postcode |
TextInput | QUOTE_CONTACT | Yes | string | "SW11 4NP" |
quote_deliverydelivery_whatsapp, delivery_email, delivery_site_visit |
RadioButtonsGroup | QUOTE_CONTACT | Yes | item id | "delivery_whatsapp" |
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 Quote Request 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",
"service_type": "event_catering",
"job_size": "size_large",
"target_date": "2026-11-21",
"date_flexibility": "date_fixed",
"budget_band": "budget_3k_8k",
"job_description": "Engagement party for about 90 guests, buffet with two vegetarian mains, venue has a kitchen but no staff.",
"full_name": "Priya Nair",
"email": "[email protected]",
"postcode": "SW11 4NP",
"quote_delivery": "delivery_whatsapp"
}
{
"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\",\"service_type\":\"event_catering\",\"job_size\":\"size_large\",\"target_date\":\"2026-11-21\",\"date_flexibility\":\"date_fixed\",\"budget_band\":\"budget_3k_8k\",\"job_description\":\"Engagement party for about 90 guests, buffet with two vegetarian mains, venue has a kitchen but no staff.\",\"full_name\":\"Priya Nair\",\"email\":\"[email protected]\",\"postcode\":\"SW11 4NP\",\"quote_delivery\":\"delivery_whatsapp\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as quote-request.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": "quote_request", "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": "Get your quote"
},
"body": {
"text": "Tell us what you need, how big the job is and when you need it done. We will send a written quote, usually the same day."
},
"footer": {
"text": "No obligation"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Get a quote",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "JOB_DETAILS"
}
}
}
}
}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-quote-request.jsonWhen to send it
First reply to "how much?"
Trigger the flow on keywords like "quote", "price" or "estimate", so the customer describes the job before you are asked to name a figure.
Seasonal campaigns
Before peak season (spring cleans, wedding season, year-end printing) broadcast a Flow-button template to past customers and fill the calendar early.
Website chat handover
When a site visitor clicks your WhatsApp button from a service page, reply with the flow so the lead arrives already scoped.
Stale quotes
If a customer let an old quote expire, send the flow again with a short note. The job may have changed size since the first request.
How to customise this template
- Replace the service ids with the jobs you actually price. Keep the list under 8 options, and send separate flows per division if you run very different services.
- Rewrite the size band descriptions in your unit: guests for catering, square metres for renovation, copies for printing, bedrooms for cleaning.
- Remove the postcode field if you only serve one area, or turn it into a Dropdown of the zones you cover so out-of-area jobs are obvious.
- If photos matter for pricing (renovation, damage repair), add a TextCaption on the last screen asking the customer to send photos in the chat after submitting.
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 use a number TextInput for the budget. People leave it blank or type "cheap". A band radio with a "Not sure" option gives you usable data.
- The TextArea label is limited to 20 characters. Put the guidance ("rooms, access, parking") in helper-text, which allows 80.
- A target date alone can mislead: an event date is fixed, a cleaning date is flexible. The date_flexibility field tells you which one you are dealing with.
- Static flows cannot validate that the target date is a day you operate. Check it in your webhook and mention alternatives in the quote.
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.