WhatsApp Quote Request Flow Template

A two-screen flow for service businesses that price per job. It captures the service, job size, target date, budget and a free-text brief, then the customer's name, email, postcode and how they want the quote delivered.

2 screens 10 fields returned Flow JSON 7.2 Lead generation Event services, Cleaning, Printing, Renovation, Catering

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

quote-request.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "JOB_DETAILS",
      "title": "Request a quote",
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_job_details",
            "children": [
              {
                "type": "TextHeading",
                "text": "Tell us about the job"
              },
              {
                "type": "TextBody",
                "text": "The more detail you give, the more accurate your quote. Prices are confirmed in writing before any work is booked."
              },
              {
                "type": "RadioButtonsGroup",
                "name": "service_type",
                "label": "Service",
                "data-source": [
                  {
                    "id": "deep_cleaning",
                    "title": "Deep cleaning",
                    "description": "Homes, offices and end-of-tenancy cleans"
                  },
                  {
                    "id": "event_catering",
                    "title": "Event catering",
                    "description": "Buffets, plated dinners and canapes"
                  },
                  {
                    "id": "print_production",
                    "title": "Printing",
                    "description": "Flyers, banners, signage and merchandise"
                  },
                  {
                    "id": "renovation",
                    "title": "Renovation",
                    "description": "Kitchens, bathrooms, painting and repairs"
                  },
                  {
                    "id": "event_setup",
                    "title": "Event setup",
                    "description": "Staging, lighting, furniture hire and decor"
                  }
                ],
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "job_size",
                "label": "Size of the job",
                "data-source": [
                  {
                    "id": "size_small",
                    "title": "Small",
                    "description": "Up to 2 rooms, 30 guests or 250 printed items"
                  },
                  {
                    "id": "size_medium",
                    "title": "Medium",
                    "description": "3 to 5 rooms, 31 to 80 guests or up to 1,000 items"
                  },
                  {
                    "id": "size_large",
                    "title": "Large",
                    "description": "6+ rooms, 81 to 200 guests or up to 5,000 items"
                  },
                  {
                    "id": "size_very_large",
                    "title": "Very large",
                    "description": "Whole building, 200+ guests or bulk runs"
                  }
                ],
                "required": true
              },
              {
                "type": "DatePicker",
                "name": "target_date",
                "label": "Target date",
                "required": true,
                "helper-text": "The day you need the work done or delivered"
              },
              {
                "type": "Dropdown",
                "name": "date_flexibility",
                "label": "Is the date flexible?",
                "data-source": [
                  {
                    "id": "date_fixed",
                    "title": "Fixed date"
                  },
                  {
                    "id": "date_few_days",
                    "title": "Flexible by a few days"
                  },
                  {
                    "id": "date_open",
                    "title": "Fully flexible"
                  }
                ],
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "budget_band",
                "label": "Budget",
                "data-source": [
                  {
                    "id": "budget_under_500",
                    "title": "Under $500"
                  },
                  {
                    "id": "budget_500_3k",
                    "title": "$500 - $3,000"
                  },
                  {
                    "id": "budget_3k_8k",
                    "title": "$3,000 - $8,000"
                  },
                  {
                    "id": "budget_8k_plus",
                    "title": "$8,000 or more"
                  },
                  {
                    "id": "budget_unsure",
                    "title": "Not sure"
                  }
                ]
              },
              {
                "type": "TextArea",
                "name": "job_description",
                "label": "Describe the job",
                "required": true,
                "helper-text": "Rooms or guests, access, materials, anything unusual",
                "max-length": 600
              },
              {
                "type": "Footer",
                "label": "Next",
                "on-click-action": {
                  "name": "navigate",
                  "next": {
                    "type": "screen",
                    "name": "QUOTE_CONTACT"
                  },
                  "payload": {}
                }
              }
            ]
          }
        ]
      }
    },
    {
      "id": "QUOTE_CONTACT",
      "title": "Where to send it",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_quote_contact",
            "children": [
              {
                "type": "TextSubheading",
                "text": "Your contact details"
              },
              {
                "type": "TextInput",
                "name": "full_name",
                "label": "Full name",
                "input-type": "text",
                "required": true
              },
              {
                "type": "TextInput",
                "name": "email",
                "label": "Email",
                "input-type": "email",
                "helper-text": "For a written copy of the quote"
              },
              {
                "type": "TextInput",
                "name": "postcode",
                "label": "Job postcode",
                "input-type": "text",
                "required": true,
                "helper-text": "So we can confirm we cover your area"
              },
              {
                "type": "RadioButtonsGroup",
                "name": "quote_delivery",
                "label": "How should we send the quote?",
                "data-source": [
                  {
                    "id": "delivery_whatsapp",
                    "title": "WhatsApp message"
                  },
                  {
                    "id": "delivery_email",
                    "title": "Email"
                  },
                  {
                    "id": "delivery_site_visit",
                    "title": "After a site visit",
                    "description": "For renovation and large jobs"
                  }
                ],
                "required": true
              },
              {
                "type": "TextCaption",
                "text": "Have photos? Send them in this chat after you submit."
              },
              {
                "type": "Footer",
                "label": "Request quote",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "service_type": "${screen.JOB_DETAILS.form.service_type}",
                    "job_size": "${screen.JOB_DETAILS.form.job_size}",
                    "target_date": "${screen.JOB_DETAILS.form.target_date}",
                    "date_flexibility": "${screen.JOB_DETAILS.form.date_flexibility}",
                    "budget_band": "${screen.JOB_DETAILS.form.budget_band}",
                    "job_description": "${screen.JOB_DETAILS.form.job_description}",
                    "full_name": "${form.full_name}",
                    "email": "${form.email}",
                    "postcode": "${form.postcode}",
                    "quote_delivery": "${form.quote_delivery}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/quote-request.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 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.

KeyComponentScreenRequiredReturnsExample
service_type
deep_cleaning, event_catering, print_production, renovation, event_setup
RadioButtonsGroup JOB_DETAILS Yes item id "event_catering"
job_size
size_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_flexibility
date_fixed, date_few_days, date_open
Dropdown JOB_DETAILS Yes item id "date_fixed"
budget_band
budget_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_delivery
delivery_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.

No developer needed

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.

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

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": "quote_request", "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-quote-request.json
{
  "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"
        }
      }
    }
  }
}
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-quote-request.json

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

Frequently asked questions

A static flow cannot. For instant pricing, the flow needs a data_exchange endpoint that receives service and job_size and returns a price to display on a summary screen. This template leaves pricing to your team, which suits jobs that need judgement.
This template does not include media upload. Ask customers to send photos in the chat after submitting; they land in the same conversation as the flow answers, so your team sees both together.
The nfm_reply response_json contains flow_token, service_type, job_size, target_date (YYYY-MM-DD), date_flexibility, budget_band, job_description, full_name, email, postcode and quote_delivery. Choice fields return item ids such as size_large.
Use a unique flow_token per send and record it when the reply arrives. If the same token submits twice, update the existing quote request instead of creating a new one.

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.