About this new patient intake flow
First appointments at clinics, dental practices and physio rooms routinely start ten minutes late because the patient is filling in a paper form in reception. Sending the intake form over WhatsApp a day or two before the visit moves that work to the patient's sofa, and gives the clinician time to read the history before the patient walks in.
The flow is split into three screens so that each one feels short. Screen one is identity: name, date of birth, contact email and an emergency contact. Screen two is the clinical part: a checklist of common conditions plus free-text boxes for allergies and medications, which are too varied for a fixed list. Screen three is consent, with a link to your privacy notice and separate tick boxes for treatment consent, data processing and reminders.
Keeping consent items separate is deliberate. Treatment consent, privacy consent and reminder messages are different permissions, and bundling them into one box makes it hard to prove which one the patient agreed to. Each OptIn returns its own boolean, which is exactly what you want to store alongside the record.
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 |
|---|---|---|---|---|---|
first_name |
TextInput | PERSONAL_DETAILS | Yes | string | "Maria" |
last_name |
TextInput | PERSONAL_DETAILS | Yes | string | "Santos" |
date_of_birth |
DatePicker | PERSONAL_DETAILS | Yes | YYYY-MM-DD | "1988-03-17" |
genderfemale, male, non_binary, self_describe, prefer_not_to_say |
Dropdown | PERSONAL_DETAILS | No | item id | "female" |
patient_email |
TextInput (email) | PERSONAL_DETAILS | Yes | string | "[email protected]" |
emergency_contact |
TextInput | PERSONAL_DETAILS | No | string | "Jo Santos, +44 7700 900123" |
medical_conditionsnone_known, high_blood_pressure, heart_condition, diabetes, asthma, epilepsy, blood_thinners, pacemaker, pregnant, recent_surgery, other_condition |
CheckboxGroup | MEDICAL_HISTORY | Yes | array of ids | ["asthma","high_blood_pressure"] |
allergies |
TextArea | MEDICAL_HISTORY | No | string | "Penicillin (rash). Latex (mild)." |
current_medications |
TextArea | MEDICAL_HISTORY | No | string | "Amlodipine 5mg daily, salbutamol inhaler as needed." |
treatment_consent |
OptIn | CONSENT | Yes | boolean | true |
privacy_consent |
OptIn | CONSENT | Yes | boolean | true |
reminder_opt_in |
OptIn | CONSENT | 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 New Patient Intake 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",
"first_name": "Maria",
"last_name": "Santos",
"date_of_birth": "1988-03-17",
"gender": "female",
"patient_email": "[email protected]",
"emergency_contact": "Jo Santos, +44 7700 900123",
"medical_conditions": [
"asthma",
"high_blood_pressure"
],
"allergies": "Penicillin (rash). Latex (mild).",
"current_medications": "Amlodipine 5mg daily, salbutamol inhaler as needed.",
"treatment_consent": true,
"privacy_consent": true,
"reminder_opt_in": 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\",\"first_name\":\"Maria\",\"last_name\":\"Santos\",\"date_of_birth\":\"1988-03-17\",\"gender\":\"female\",\"patient_email\":\"[email protected]\",\"emergency_contact\":\"Jo Santos, +44 7700 900123\",\"medical_conditions\":[\"asthma\",\"high_blood_pressure\"],\"allergies\":\"Penicillin (rash). Latex (mild).\",\"current_medications\":\"Amlodipine 5mg daily, salbutamol inhaler as needed.\",\"treatment_consent\":true,\"privacy_consent\":true,\"reminder_opt_in\":true}"
}
}
}
]
}
}
]
}
]
}
Deploy with the WhatsApp Cloud API
Prefer code over WhatsApp Manager? Save the template as new-patient-intake.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": "new_patient_intake", "categories": ["SIGN_UP"]}'
# => {"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": "Before your first visit"
},
"body": {
"text": "Please complete your new patient form. It takes about three minutes and means we can spend your appointment on you, not on paperwork."
},
"footer": {
"text": "Your answers are shared only with your care team"
},
"action": {
"name": "flow",
"parameters": {
"flow_message_version": "3",
"flow_token": "bk_8f2c41",
"flow_id": "YOUR_FLOW_ID",
"flow_cta": "Complete intake form",
"flow_action": "navigate",
"flow_action_payload": {
"screen": "PERSONAL_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-new-patient-intake.jsonWhen to send it
Right after a first booking
Send it as soon as a new patient books, while they are still engaged. Completion rates drop sharply if the form arrives the morning of the appointment.
Two days before the visit
For patients who have not completed it yet, send a template reminder with a Flow button 48 hours before, so there is time to review red flags such as blood thinners.
Referral arrivals
When a GP or specialist refers a patient to you, send the intake form with your welcome message so the referral and history arrive together.
Annual history update
Existing patients' medications and conditions change. Re-send the flow once a year, or before a new course of treatment such as injectables or surgery.
How to customise this template
- Trim the conditions list to what changes your clinical decisions. A dental practice cares about blood thinners, heart valves and bisphosphonates; an aesthetics clinic cares about pregnancy, autoimmune conditions and recent isotretinoin use.
- Replace https://example.com/privacy with your real privacy notice. It must explain what you store, why, who sees it and how long you keep it.
- If you already hold the patient's name from the booking, you can remove the name fields and rely on the flow_token to link the submission to the patient record.
- Add a reason_for_visit style question on screen two if your clinicians triage before the appointment, but keep it optional so patients do not feel forced to self-diagnose.
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
- Health data is special-category data. HIPAA in the US, GDPR in Europe and similar local rules apply to how you collect, store and access it, and Meta's WhatsApp Business policies restrict what sensitive information you should request in chat. Check both before going live.
- Collect only what the clinician will actually use. Every extra field is more sensitive data to secure and more reason for a patient to abandon the form halfway through.
- Do not leave flow submissions sitting in a general chat inbox that non-clinical staff can read. Move the answers into your clinical system and restrict who can see the raw messages.
- DatePicker returns date_of_birth as YYYY-MM-DD. Store it as a plain date, not a timestamp, or time zone conversion can shift a birthday by one day and break identity checks.
- Required OptIns block submission until ticked. Make treatment and privacy consent required, but keep reminder messages optional so consent to marketing-style messages is freely given.
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.