Integrations
Trigger n8n workflows from form submissions
Add a Webhook node to an n8n workflow, publish the workflow, and paste its production URL into your form in Formward as a Generic JSON webhook with a signing secret. Every processed submission then starts the workflow with the full submission as JSON, ready for any node that follows.
Webhooks need the Professional plan. Run n8n yourself in the EU and the whole chain, form to automation, can stay inside the EU.
Set it up
- In n8n, add a Webhook node as the trigger, set HTTP Method to POST and copy its Production URL. Your n8n instance must be reachable on a public https address.
- Publish the workflow so the production URL is registered.
- In Formward, open the form, go to its Settings tab and scroll to the Connections panel. Choose Webhooks.
- Keep the type on Generic JSON, paste the production URL, enter a long random signing secret and click Add webhook.
- Click Test next to the webhook, then open the Executions tab in n8n to see the test delivery.
- To check that requests really come from Formward, turn on the Webhook node's Raw Body option, compute an HMAC-SHA256 over v1:<t>:<raw body> with your secret (the Crypto node's Hmac action, SHA256, hex) and compare it with the v1 value in the X-Formward-Signature header. Reject requests whose t is more than a few minutes old.
What the Webhook node receives
Formward's generic JSON arrives as the node's body, with the signature in the headers (abridged):
json
{
"headers": {
"content-type": "application/json",
"x-formward-signature": "t=1791366600,v1=9b1f0c...e4"
},
"body": {
"formId": "<formId>",
"formName": "Contact form",
"submissionId": "<submissionId>",
"createdAt": "2026-10-07T09:30:00.000Z",
"status": "processed",
"fields": {
"name": "Ada Lovelace",
"email": "ada@example.com",
"message": "Do you ship to Norway?"
},
"ai": { "spamScore": 3, "summary": "Shipping question about Norway", "leadScore": 64, "routingCategory": "sales" }
}
}Use submissionId to skip duplicates, since a retried delivery can arrive twice.
A Formward community node for n8n exists in our repository but is not published to npm yet, so it cannot be installed from n8n's community nodes screen today. The built-in Webhook node covers the same ground.
Prefer polling? A Schedule Trigger plus an HTTP Request node against the REST API, using since= with the time of the last run, works too.
Plan and limits
- Generic webhooks need the Professional plan or above.
- The n8n URL must be https on a public address. Formward refuses localhost, private networks and redirects, at save time and again at delivery.
- n8n must answer 2xx within 10 seconds. Leave the Webhook node's Respond setting on Immediately so a slow workflow does not cause a timeout and a retry.
- Failed deliveries are retried up to three more times with increasing delays, and can be replayed from the form's Webhooks settings tab.
Where the data goes
The data goes wherever your n8n instance runs. Self-hosted n8n on EU infrastructure keeps the chain in the EU; if you use n8n's hosted service, check where your instance is located.
Whatever the workflow does next, such as writing to a CRM or sending a message, is another destination to record.
Your data-flow page lists every destination each of your forms uses right now.
Troubleshooting
- "Webhook URL must use https" or a private address error
- A local n8n on http://localhost cannot be reached from Formward. Put it behind a public https address, or use the instance's public URL rather than an internal one.
- The test URL worked, the real one does not
- n8n's test URL only listens while the editor is waiting for a test event. Use the production URL in Formward and make sure the workflow is published.
- Signature never matches
- The HMAC must be computed over the raw bytes, before any JSON parsing. Turn on Raw Body in the Webhook node and hash that, not a re-serialised object.
Other integrations
Connect n8n to your first form
Create a form, point your HTML at it and set up n8n in a few minutes. Submissions are stored and processed in the EU.