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.

Direct answerUse FormNode instead of a custom HTML form when the n8n webhook form needs validation, dynamic dropdowns, approvals, customer portal context, branding, submission history, delivery tracking, and retry behavior.

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.
Use the production n8n webhook URLn8n test webhook URLs are for editor sessions and can expire or stop listening. Public FormNode forms should use the production webhook URL for final submissions.

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

ApproachBest fitTradeoff
n8n Form TriggerSimple workflow-starting forms inside n8nLess fit for portal, tenant, approval, and delivery visibility needs
Custom HTML + n8n webhookOne-off simple POST controlled by a developerYou own validation, hosting, branding, retries, and future changes
Typeform/Jotform/Gravity + webhookGeneral forms that send a payload after submissionWorkflow context and live n8n field data are not the core model
FormNode + n8nWorkflow-heavy forms with dynamic data, approvals, portals, and delivery logsUse 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.