About this home visit request flow
Mobile businesses have questions a studio never asks: where exactly is the job, can we park, is there a gate code, will the dog be loose? Missing any one of them costs a wasted trip or a late arrival for every job after it. This flow collects the booking details and the logistics together, so the person planning routes has everything in one message.
The postcode is a separate field from the address on purpose. It lets you check coverage and cluster jobs by area before you read the full address, and it is the easiest value to validate automatically. The address itself is a TextArea, because flats, building names and rural addresses rarely fit a single-line field.
Arrival windows replace exact times. Travel between jobs is unpredictable, so the form offers morning, midday and afternoon windows that match how mobile teams actually schedule. Your confirmation then narrows it to a specific slot once the day's route is planned.
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 |
|---|---|---|---|---|---|
visit_serviceregular_clean, deep_clean, mobile_massage, pet_grooming, repair_visit |
RadioButtonsGroup | VISIT_DETAILS | Yes | item id | "deep_clean" |
visit_date |
DatePicker | VISIT_DETAILS | Yes | YYYY-MM-DD | "2026-11-12" |
visit_time_windowmorning, midday, afternoon |
RadioButtonsGroup | VISIT_DETAILS | Yes | item id | "morning" |
visit_contact_name |
TextInput | VISIT_ADDRESS | Yes | string | "Priya Shah" |
visit_address |
TextArea | VISIT_ADDRESS | Yes | string | "Flat 4, Harbour View, 22 Quay Street" |
visit_postcode |
TextInput | VISIT_ADDRESS | Yes | string | "BS1 4DJ" |
access_notes |
TextArea | VISIT_ADDRESS | No | string | "Buzz flat 4. Visitor parking in bay 12 behind the building." |
pets_on_siteno_pets, dog, cat, other_pets |
RadioButtonsGroup | VISIT_ADDRESS | Yes | item id | "dog" |
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 Home Visit 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",
"visit_service": "deep_clean",
"visit_date": "2026-11-12",
"visit_time_window": "morning",
"visit_contact_name": "Priya Shah",
"visit_address": "Flat 4, Harbour View, 22 Quay Street",
"visit_postcode": "BS1 4DJ",
"access_notes": "Buzz flat 4. Visitor parking in bay 12 behind the building.",
"pets_on_site": "dog"
}
{
"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\",\"visit_service\":\"deep_clean\",\"visit_date\":\"2026-11-12\",\"visit_time_window\":\"morning\",\"visit_contact_name\":\"Priya Shah\",\"visit_address\":\"Flat 4, Harbour View, 22 Quay Street\",\"visit_postcode\":\"BS1 4DJ\",\"access_notes\":\"Buzz flat 4. Visitor parking in bay 12 behind the building.\",\"pets_on_site\":\"dog\"}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as home-visit-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": "home_visit_request", "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": "Book a visit at your place"
},
"body": {
"text": "Tell us what you need, when, and where. We will check the route and confirm your arrival window on WhatsApp."
},
"footer": {
"text": "We cover selected areas only"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Request a home visit",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "VISIT_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-home-visit-request.jsonWhen to send it
Quote-to-booking step
After you send a price for a clean, repair or grooming session, follow with this flow so an accepted quote turns into a scheduled visit in one step.
Local search and ads
Home service enquiries from maps listings and local ads often start with "do you cover my area?". Reply with the flow and let the postcode answer it.
Recurring services
For regular cleans or monthly grooming, send the flow when a client wants to change the usual day, so address and access notes are re-confirmed too.
Emergency call-outs
For plumbers and locksmiths, the flow gathers the address and access details while the technician is on the way to the previous job.
How to customise this template
- Replace the services with your own and put typical job length in each description. Route planners need duration as much as address.
- If you only cover specific areas, say so in the TextBody and list them. Clients from outside the area then self-select out instead of submitting a request you have to decline.
- Rename the pets question for your trade. A mobile groomer needs breed and size in the notes; a cleaner mainly needs to know if animals will be loose or shut away.
- Add a property_type style question (house, flat, office) if it changes pricing or equipment, for example stairs for heavy appliance repair.
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
- Address details are personal data. Keep access codes and key safe numbers out of general chat views where possible, and delete them from your records once the job is done.
- A static flow cannot check coverage or travel time. Do not say "your visit is booked"; say "we will confirm your arrival window", and handle out-of-area postcodes with a polite reply.
- Postcodes arrive exactly as typed. Normalise case and spacing (for example "sw1a1aa" to "SW1A 1AA") before matching them against your coverage list.
- Do not ask for the phone number. It already arrives with the nfm_reply message, and it is the number your technician should call when they are outside.
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.