Send an instant WhatsApp message when someone completes your Typeform: a confirmation to the respondent, an alert to your team, or both. Typeform fires native webhooks on every submission, so no code or third-party tools are required.
Typeform posts the full form response to a URL you choose the moment it is submitted. Paste your WA.Expert webhook URL in Typeform's Connect panel and toggle the webhook on. That is the entire setup.
Each answer in the payload has a type field. The value is in a key that matches the type: type: text → read .text; type: email → read .email; type: phone_number → read .phone_number; type: choice → read .choice.label. Always check the type before reading the value.
In WA.Expert, create a new automation and set the trigger to Inbound Webhook. Copy the unique webhook URL shown in the trigger settings. This is where Typeform will POST responses.
Typeform webhooks are disabled by default after you add them. You must explicitly toggle the webhook to ON. If responses are not reaching WA.Expert, the most common cause is a webhook that was saved but never toggled on.
Typeform Webhooks: typeform.com/developers
When a Typeform is submitted, WA.Expert receives a payload like this:
{{
"event_id": "LtWXD3crgy",
"event_type": "form_response",
"form_response": {{
"form_id": "lT4Z3j",
"token": "a3a12ec67a1365927098a606107fac15",
"submitted_at": "2026-06-23T08:30:00Z",
"answers": [
{{
"type": "short_text",
"text": "Priya Sharma",
"field": {{"id":"JwWg","ref":"name_field","type":"short_text"}}
}},
{{
"type": "phone_number",
"phone_number": "+919820000001",
"field": {{"id":"SMEb","ref":"phone_field","type":"phone_number"}}
}},
{{
"type": "email",
"email": "priya@example.com",
"field": {{"id":"AbCd","ref":"email_field","type":"email"}}
}},
{{
"type": "choice",
"choice": {{"label": "Product Demo"}},
"field": {{"id":"EfGh","ref":"enquiry_field","type":"multiple_choice"}}
}}
]
}}
}}
Map using field.ref to find each answer:
ref "name_field" -> answers[N].text -> customer_name
ref "phone_field" -> answers[N].phone_number -> customer_phone
ref "email_field" -> answers[N].email -> customer_email
ref "enquiry_field" -> answers[N].choice.label -> enquiry_typeThe value field name changes with the question type. Use this table to find the right key for each answer:
| Question type in Typeform | answers[N].type | Value field to read |
|---|---|---|
| Short text / Long text | short_text / long_text | answers[N].text |
| answers[N].email | ||
| Phone number | phone_number | answers[N].phone_number |
| Number | number | answers[N].number |
| Yes / No | boolean | answers[N].boolean (true or false) |
| Multiple choice (single) | choice | answers[N].choice.label |
| Multiple choice (multi) | choices | answers[N].choices.labels (array) |
| Rating / Opinion scale | number | answers[N].number |
| Date | date | answers[N].date (YYYY-MM-DD) |
| File upload | file_url | answers[N].file_url |
Always read the type field first, then look up the value in the matching key above.
Skipped optional questions are absent from the answers array. This means answers[0] is not always the first question in your form. If a respondent skipped an early optional question, everything shifts. Use answers[N].field.ref to identify each answer reliably. Set readable refs in Typeform under Logic → Field references (e.g. name_field, phone_field) and match on them in WA.Expert.
1. Priya completes your Typeform lead form:
Name: Priya Sharma
WhatsApp: +919820000001
Email: priya@example.com
Enquiry: Product Demo
2. Typeform POSTs the form_response payload to WA.Expert.
3. WA.Expert maps from field.ref:
customer_name = 'Priya Sharma' (ref: name_field, type: short_text -> .text)
customer_phone = '+919820000001' (ref: phone_field, type: phone_number -> .phone_number)
customer_email = 'priya@example.com' (ref: email_field, type: email -> .email)
enquiry_type = 'Product Demo' (ref: enquiry_field, type: choice -> .choice.label)
4. WA.Expert sends your team:
'New Typeform lead: Priya Sharma (+919820000001)
Enquiry: Product Demo | priya@example.com'
5. WA.Expert sends Priya:
'Hi Priya, thanks for your interest in a Product Demo.
Our team will reach you on this number within 2 hours.'If WA.Expert does not return a 2xx response, Typeform retries
delivery. To avoid sending duplicate WhatsApp messages, track processed
event_id values. If you receive the same
event_id again, discard it.
| Symptom | Likely cause | Fix |
|---|---|---|
| No webhook firing | Webhook toggled off | In Typeform Connect → Webhooks, check the webhook toggle is ON. Webhooks are off by default even after saving. |
| Wrong value read from answers | Using array index instead of field.ref | Match answers using answers[N].field.ref, not position. Optional questions that were skipped shift all subsequent indexes. |
| Type error reading value | Reading wrong value key for the type | Check answers[N].type first. Then use the matching key: .text for short_text, .email for email, .phone_number for phone_number, .choice.label for choice. |
| Duplicate WhatsApp messages | Typeform retry on failed delivery | Check WA.Expert is returning 2xx. Store processed event_id values and discard duplicates. |
| Phone number empty | Used email field for phone | Typeform has a dedicated Phone Number field type. Use that for WhatsApp numbers; the value lands in .phone_number. |
| WA.Expert not receiving payload | Automation not published | Ensure the WA.Expert automation is published (not in draft). Use Typeform's Test webhook button to send a sample and verify receipt. |
Jotform native webhooks: similar to Typeform, simpler payload structure.
Read guide →Google Forms via Apps Script: onSubmit trigger posts to WA.Expert.
Read guide →Free trial, no credit card. If you get stuck, we answer live on WhatsApp.