n8n webhook form builder
FormNode can act as a production n8n webhook form builder: users submit the managed FormNode form, and FormNode posts a stable JSON payload to the n8n webhook that fulfills the request.
Submission payload
The n8n Webhook node receives the full FormNode payload as JSON. Form answers live under data. Tenant and organization context live beside the data so the workflow does not have to infer it.
{
"eventType": "form.submitted",
"formId": "5a8b3c2d-1e4f-4a9b-8c7d-6e5f4a3b2c1d",
"organizationId": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
"slug": "acme",
"integrationMappings": {
"cw.companyId": "192837"
},
"submissionId": "8f2a4e1c-6b7d-4f3a-9e8d-1c2b3a4d5e6f",
"submittedAt": "2026-05-14T18:42:11.337Z",
"data": {
"request_type": "ticket_intake",
"site_id": "site_1001",
"priority": "medium",
"summary": "VPN access request"
}
}n8n expressions
In n8n, read values from $json. Keep side effects idempotent by using submissionId as a processed-request key.
{
"companyId": "{{ $json.integrationMappings['cw.companyId'] }}",
"siteId": "{{ $json.data.site_id }}",
"summary": "{{ $json.data.summary }}",
"idempotencyKey": "{{ $json.submissionId }}"
}Endpoint behavior
- FormNode sends JSON with
Content-Type: application/json. - Any non-2xx response is treated as a failed delivery.
- Retries replay the same body with the same
submissionId. - Use the delivery log to inspect response status and body.
Webhook form architecture
Keep read-only field option webhooks separate from the final submission webhook. Option webhooks should return dropdown choices. Submission webhooks should create tickets, provision users, update records, or start approval-aware fulfillment.
Where to put the webhook URL
In the FormNode builder, open the form's webhook or actions settings and paste the production n8n webhook URL as the submission destination. For dropdown option lookups, paste each read-only n8n webhook URL on the specific dynamic field instead.
Comparison
| Approach | Best fit | Tradeoff |
|---|---|---|
| n8n Form Trigger | Simple workflow-starting forms inside n8n | Less fit for portal, tenant, approval, and delivery visibility needs |
| Custom HTML + n8n webhook | One-off simple POST controlled by a developer | You own validation, hosting, branding, retries, and future changes |
| Typeform/Jotform/Gravity + webhook | General forms that send a payload after submission | Workflow context and live n8n field data are not the core model |
| FormNode + n8n | Workflow-heavy forms with dynamic data, approvals, portals, and delivery logs | Use n8n for automation logic, not as the visible form product |
Troubleshooting
n8n received duplicate submissions
Treat submissionId as the idempotency key. If n8n times out or returns a non-2xx response after partially completing work, FormNode will retry the same payload.
n8n cannot find a customer ID
Store the customer ID as a FormNode organization integration mapping and read it from $json.integrationMappings. Do not rely on a user-entered hidden field for trusted tenant routing.
Webhook delivery fails
Check the FormNode delivery log first, then the n8n execution. Common causes are expired webhook URLs, non-production n8n test URLs, auth failures, or workflows that time out before returning 2xx.