Typeform is the go-to form builder for lead gen, surveys, onboarding, and event registration — but form data sitting in Typeform is wasted potential. The n8n Typeform node (specifically the Typeform Trigger) lets you act on every submission the moment it arrives: push the lead to HubSpot, log it to Google Sheets, send a Slack alert, or kick off a multi-step onboarding sequence.
This guide covers everything you need to build reliable Typeform-to-anything pipelines in n8n, including field mapping quirks, answer type handling, and three production-ready workflow patterns with free JSON downloads.
What the Typeform Node Does (and Doesn't Do)
The n8n Typeform node is a trigger-only integration. It fires when a new response is submitted to a selected form — there is no read, list, or update operation. For pulling historical responses or managing forms programmatically, you'd use the HTTP Request node against the Typeform API directly.
The trigger uses a Typeform webhook under the hood: n8n registers a webhook URL with Typeform when you activate the workflow, and Typeform posts each new response to it in real time.
What it does:
- Fires on every new Typeform submission
- Outputs all response answers as structured JSON
- Maps questions by field ID and readable reference
What it doesn't do:
- Read existing/historical responses
- Create, update, or delete forms
- Trigger on partial submissions or form opens
Setting Up the Typeform Node
1. Typeform API Credentials
You need a Typeform Personal Access Token:
- Log in to Typeform → Account → Developer Apps
- Click Generate a personal access token
- Copy the token and store it in n8n: Credentials → New → search "Typeform" → paste token
n8n uses this token to register the webhook automatically when you activate your workflow.
2. Node Configuration
Add a Typeform Trigger node (it's under "Trigger" nodes, not "Action"):
- Credential: select your Typeform API credential
- Form: pick the form from the dropdown (n8n lists all your forms)
- That's it — no additional configuration needed
Activate the workflow (the toggle in the top bar). n8n registers the webhook with Typeform immediately. Submit a test response and check Executions to see the raw output.
Understanding the Output Structure
Each Typeform submission arrives as a single item. The key fields:
\json
{
"event_id": "abc123",
"event_type": "form_response",
"form_response": {
"form_id": "FORM_ID",
"token": "response_token",
"submitted_at": "2026-07-16T13:00:00Z",
"answers": [
{
"field": {
"id": "field_abc",
"type": "short_text",
"ref": "name_field"
},
"type": "text",
"text": "Jane Smith"
},
{
"field": {
"id": "field_def",
"type": "email",
"ref": "email_field"
},
"type": "email",
"email": "jane@example.com"
},
{
"field": {
"id": "field_ghi",
"type": "multiple_choice",
"ref": "plan_field"
},
"type": "choice",
"choice": {
"label": "Pro",
"other": null
}
}
],
"hidden": {
"user_id": "u_789"
}
}
}
\\
The answers array contains one object per question. Each answer's value is nested under a type-specific key: text\, email\, number\, boolean\, choice\, choices\, date\, file_url\, payment\, or url\.
Mapping Answer Fields
Because answer values live under different keys per type, you need to reference the right key for each field:
| Question type | Value path |
|---|---|
| Short text / Long text | {{ \$json.form_response.answers[0].text }}\ |
{{ \$json.form_response.answers[1].email }}\ |
|
| Number | {{ \$json.form_response.answers[2].number }}\ |
| Yes/No | {{ \$json.form_response.answers[3].boolean }}\ |
| Multiple choice (single) | {{ \$json.form_response.answers[4].choice.label }}\ |
| Multiple choice (multi) | {{ \$json.form_response.answers[5].choices.labels }}\ |
| Date | {{ \$json.form_response.answers[6].date }}\ |
| File upload | {{ \$json.form_response.answers[7].file_url }}\ |
| Hidden field | {{ \$json.form_response.hidden.your_key }}\ |
Pro tip: Rather than referencing answers by index (which breaks if you reorder questions), use a Code node to build a key-value map by field ref\:
\javascript
const answers = \$input.item.json.form_response.answers;
const mapped = {};
for (const a of answers) {
const key = a.field.ref;
mapped[key] = a[a.type] ?? a.text ?? null;
}
return [{ json: { ...mapped, submitted_at: \$input.item.json.form_response.submitted_at } }];
\\
Now you can reference {{ \$json.email_field }}\ instead of fragile index paths.
6 Gotchas to Avoid
1. Webhook only activates on workflow activation — not on node enable
The Typeform webhook registers when you flip the workflow's active toggle. Toggling a node on/off does nothing. Always use the workflow-level toggle.
2. Testing with the built-in test trigger
Click Test step in the Typeform node — it opens a listening window. Then submit a real test response in Typeform. The test button does not generate mock data; you need an actual form submission.
3. Multiple choice "other" responses
If a respondent selects "Other" and types a custom answer, the value is in choice.other\, not choice.label\. Your mapping logic must check both: answer.choice?.label ?? answer.choice?.other\.
4. File upload fields return a temporary URL
The file_url\ value is a short-lived signed URL (expires in hours). If you need the file long-term, download it immediately with an HTTP Request node and store it to S3, Drive, or Dropbox before the URL expires.
5. Hidden fields require URL encoding
Hidden field values are passed as query parameters in the Typeform embed URL (?your_key=value\). They arrive under form_response.hidden\ — but only if you've configured the hidden field in the Typeform builder AND passed the value at embed time.
6. One webhook per form
n8n creates one webhook per workflow-form pair. If you have two n8n workflows listening to the same form, only the most recently registered webhook fires reliably. Typeform supports multiple webhooks per form, but n8n's credential model doesn't distinguish them — use one canonical workflow per form and branch within it.
Pattern 1: Lead Capture → HubSpot + Slack Alert
New Typeform submission → map fields → create HubSpot contact → post Slack notification.
Use case: Marketing lead gen forms that need to sync to CRM and alert the sales team immediately.
Nodes: Typeform Trigger → Code (map fields) → HubSpot (Create Contact) → Slack (Send Message)
Key config:
- Code node: extract email, name, company from the answers array by
ref\ - HubSpot node: set
email\,firstname\,lastname\,company\from Code output - Slack:
New lead: {{ \$('Code').item.json.name }} ({{ \$('Code').item.json.email }}) — {{ \$('Code').item.json.company }}\
\json
[workflow JSON — see Gumroad download below]
\\
Pattern 2: Survey → Google Sheets Log + Conditional Follow-Up
Form submission → append row to Sheets → IF score < 7 (NPS detractor) → send follow-up email via Gmail.
Use case: NPS surveys or satisfaction scores that need logging and immediate recovery flows for unhappy respondents.
Nodes: Typeform Trigger → Code (map + calculate score) → Google Sheets (Append Row) → IF → Gmail (Send)
Key config:
- Code node: parse rating field (type
number\), compute detractor flag (rating < 7\) - Sheets: log timestamp, email, score, verbatim comment
- IF:
{{ \$json.is_detractor }}\equalstrue\ - Gmail: personal follow-up email from support address with respondent's first name
Pattern 3: Event Registration → Confirmation Email + Calendar Invite
Event registration form → send branded confirmation email → generate .ics file → email as attachment.
Use case: Webinar or workshop registrations where attendees need a calendar invite with a Zoom/Meet link.
Nodes: Typeform Trigger → Code (map fields) → Gmail (confirmation) → iCalendar (Create Event File) → Gmail (send .ics attachment)
Key config:
- Code: extract name, email, selected session time (from dropdown
choice.label\) - Gmail 1: HTML confirmation with event details and Zoom link
- iCalendar node: set
DTSTART\/DTEND\from chosen session,SUMMARY\= event name,DESCRIPTION\= Zoom link,ORGANIZER\= your email - Gmail 2: attach the binary output from iCalendar node
👉 Free Workflow JSON + Interactive n8n Integration Guide
Get three ready-to-import Typeform workflow patterns (Lead Capture, NPS Survey, Event Registration) + Gumroad product comparison + lead magnet checklist:
👉 n8n Workflow Starter Pack ($29) — 28 ready-to-import workflows for Stripe, Airtable, Notion, HubSpot, Slack, Google Sheets, Shopify, Jira, Zendesk, Twilio, Teams, Gmail, WooCommerce, and more. All include detailed n8n JSON + production tips.
Or if you want a done-for-you solution:
👉 Done-for-You n8n Workflow Build ($99) — Describe your Typeform automation need, and I'll design, test, and deliver a custom n8n workflow JSON (or connect it end-to-end if you're self-hosting).
Totally free: Grab the 20-question n8n Integration Checklist to assess your automation stack. Unsubscribe anytime.
Related Articles
- n8n Google Sheets Node: Read, Write, and Sync Spreadsheet Data
- n8n HubSpot Node: Sync Contacts, Deals, and Companies
- n8n Slack Node: Send Messages, Create Channels, and Automate Notifications
Typeform Trigger vs. HTTP Request Polling
If Typeform webhooks aren't an option (self-hosted Typeform on a private network, or you need historical data), use the HTTP Request node to poll the Typeform Responses API:
\
GET https://api.typeform.com/forms/{form_id}/responses
Authorization: Bearer YOUR_TOKEN
\\
Combine with a Schedule Trigger and a filter on submitted_at\ to process only new responses since your last poll. This is slower than webhooks but works without a public n8n URL.
Summary
The n8n Typeform Trigger is simple to configure but has one sharp edge: answer values are nested under type-specific keys. Use a Code node to flatten the answers array into a stable key-value object indexed by field ref\ — this makes every downstream node cleaner and survives form restructuring.
From there, Typeform becomes a clean entry point into any automation: CRM sync, Sheets logging, conditional follow-ups, calendar invites, or Slack alerts. The three patterns above cover the most common production use cases.
What's your Typeform automation? Drop a comment below — especially if you're doing anything with file uploads or hidden fields. I read and reply to every comment.
🔥 More n8n Integration Guides at dev.to/pirateprentice — 100+ articles on workflow automation.
Top comments (0)