WhatsApp Home Visit Request Flow Template

A two-screen request form for businesses that go to the customer: mobile massage and physio, cleaners, mobile groomers, handymen and appliance repair. It captures the job, the date and arrival window, then the address, postcode, access instructions and whether pets will be at home.

2 screens 8 fields returned Flow JSON 7.2 Appointment booking Mobile therapists, Home cleaning, Pet grooming, Repairs, Home services

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

home-visit-request.json Open in Flow Builder
{
  "version": "7.2",
  "screens": [
    {
      "id": "VISIT_DETAILS",
      "title": "Home visit",
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_visit_details",
            "children": [
              {
                "type": "TextHeading",
                "text": "What do you need?"
              },
              {
                "type": "TextBody",
                "text": "Choose a service and when you would like us to come. We plan routes each morning and confirm your arrival window by message."
              },
              {
                "type": "RadioButtonsGroup",
                "name": "visit_service",
                "label": "Service",
                "data-source": [
                  {
                    "id": "regular_clean",
                    "title": "Regular clean",
                    "description": "2 - 3 hrs for a standard home"
                  },
                  {
                    "id": "deep_clean",
                    "title": "Deep clean",
                    "description": "4 - 6 hrs, includes kitchen and bathrooms in detail"
                  },
                  {
                    "id": "mobile_massage",
                    "title": "Mobile massage",
                    "description": "60 or 90 min, we bring the table"
                  },
                  {
                    "id": "pet_grooming",
                    "title": "Mobile pet grooming",
                    "description": "60 - 90 min in our van outside your home"
                  },
                  {
                    "id": "repair_visit",
                    "title": "Repair or installation",
                    "description": "Diagnosis visit, about 1 hr"
                  }
                ],
                "required": true
              },
              {
                "type": "DatePicker",
                "name": "visit_date",
                "label": "Preferred date",
                "required": true
              },
              {
                "type": "RadioButtonsGroup",
                "name": "visit_time_window",
                "label": "Arrival window",
                "data-source": [
                  {
                    "id": "morning",
                    "title": "Morning (8am - 11am)"
                  },
                  {
                    "id": "midday",
                    "title": "Midday (11am - 2pm)"
                  },
                  {
                    "id": "afternoon",
                    "title": "Afternoon (2pm - 5pm)"
                  }
                ],
                "required": true
              },
              {
                "type": "Footer",
                "label": "Continue",
                "on-click-action": {
                  "name": "navigate",
                  "next": {
                    "type": "screen",
                    "name": "VISIT_ADDRESS"
                  },
                  "payload": {}
                }
              }
            ]
          }
        ]
      }
    },
    {
      "id": "VISIT_ADDRESS",
      "title": "Visit address",
      "terminal": true,
      "data": {},
      "layout": {
        "type": "SingleColumnLayout",
        "children": [
          {
            "type": "Form",
            "name": "form_visit_address",
            "children": [
              {
                "type": "TextSubheading",
                "text": "Where should we go?"
              },
              {
                "type": "TextInput",
                "name": "visit_contact_name",
                "label": "Name",
                "input-type": "text",
                "required": true
              },
              {
                "type": "TextArea",
                "name": "visit_address",
                "label": "Address",
                "required": true,
                "helper-text": "House or flat number, building name and street"
              },
              {
                "type": "TextInput",
                "name": "visit_postcode",
                "label": "Postcode / ZIP",
                "input-type": "text",
                "required": true,
                "helper-text": "We use this to check we cover your area"
              },
              {
                "type": "TextArea",
                "name": "access_notes",
                "label": "Access and parking",
                "helper-text": "Buzzer, gate code, parking, stairs or lifts"
              },
              {
                "type": "RadioButtonsGroup",
                "name": "pets_on_site",
                "label": "Pets at home?",
                "data-source": [
                  {
                    "id": "no_pets",
                    "title": "No pets"
                  },
                  {
                    "id": "dog",
                    "title": "Dog"
                  },
                  {
                    "id": "cat",
                    "title": "Cat"
                  },
                  {
                    "id": "other_pets",
                    "title": "Other or several pets",
                    "description": "Tell us more in the access notes"
                  }
                ],
                "required": true
              },
              {
                "type": "TextCaption",
                "text": "We will message you to confirm the arrival window and the price before the visit."
              },
              {
                "type": "Footer",
                "label": "Request visit",
                "on-click-action": {
                  "name": "complete",
                  "payload": {
                    "visit_service": "${screen.VISIT_DETAILS.form.visit_service}",
                    "visit_date": "${screen.VISIT_DETAILS.form.visit_date}",
                    "visit_time_window": "${screen.VISIT_DETAILS.form.visit_time_window}",
                    "visit_contact_name": "${form.visit_contact_name}",
                    "visit_address": "${form.visit_address}",
                    "visit_postcode": "${form.visit_postcode}",
                    "access_notes": "${form.access_notes}",
                    "pets_on_site": "${form.pets_on_site}"
                  }
                }
              }
            ]
          }
        ]
      }
    }
  ]
}

Raw JSON for scripts: curl -s https://whautomate.com/whatsapp-flow-templates/home-visit-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 Appointment booking 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 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.

KeyComponentScreenRequiredReturnsExample
visit_service
regular_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_window
morning, 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_site
no_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.

No developer needed

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.

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

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": "home_visit_request", "categories": ["APPOINTMENT_BOOKING"]}'
# => {"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-home-visit-request.json
{
  "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"
        }
      }
    }
  }
}
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-home-visit-request.json

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

Frequently asked questions

Not as a static flow. Checking a postcode against your coverage while the client is typing needs a data_exchange endpoint. This template accepts any postcode and your team or webhook handler replies if the area is not covered.
One item id: morning, midday or afternoon. The titles show the hours to the client, but your handler should map the id to your own window definitions so you can change the hours without breaking anything.
Flows do not include a location picker. Clients can send a WhatsApp location pin in the chat after submitting, and many mobile teams ask for one in their confirmation message for tricky addresses.
Match on the sender's phone number from the webhook, or set flow_token to your customer id when you send the flow. Either lets you pre-fill the job with their past address notes on your side.

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.