n8n Integration
n8n is a destination in Formboost, alongside Slack, Discord and Telegram. Point it at a Webhook node and every submission starts that workflow automatically.
This works with self-hosted n8n as well as n8n.cloud. Formboost does not publish a node in n8n's catalogue — the connection is made with n8n's built-in Webhook trigger node.
n8n is available on the Starter plan and above.
Setup
- In n8n, open the workflow you want to trigger and add a Webhook node as its trigger
- Set HTTP Method to
POST; leave the generated path as it is - Copy the Production URL shown on the node
- In Formboost, open your form → Integrations tab → n8n → Connect
- Paste the Production URL, optionally name it, and save
- Click Send test — Formboost delivers a sample payload immediately
- In n8n, switch the workflow to Active
- Add your downstream nodes and save
Production URL, not Test URL
The Webhook node shows two URLs. The Test URL (/webhook-test/…) only listens while you have the canvas open and are clicking Listen for test event; it stops responding the moment you navigate away. The Production URL (/webhook/…) is the one to give Formboost.
Formboost accepts either, because both are legitimate during setup — but a delivery log filling with 404s almost always means a Test URL was saved, or the workflow was never switched to Active.
What n8n Receives
Every delivery is a POST with a JSON body in this shape:
1{
2 "event": "form.submission",
3 "eventId": "sub_3b241101-e2bb-4255-8caf-4136c566a962",
4 "sentAt": "2026-08-24T12:00:00.120Z",
5 "form": {
6 "name": "Contact Form",
7 "alias": "contact"
8 },
9 "submission": {
10 "name": "John Doe",
11 "email": "[email protected]",
12 "message": "Hello",
13 "submittedAt": "2026-08-24T12:00:00.000Z"
14 }
15}The same envelope goes to the Zapier and HTTP Webhook destinations, so a workflow built against it can be moved between them without remapping.
| Field | Meaning |
|---|---|
event | form.submission, or form.submission.test for a test delivery |
eventId | sub_<submission id>, stable across retries — use it to make the workflow idempotent. Tests get a test_<uuid> id |
sentAt | When this attempt left Formboost. Changes on every retry |
form.name / form.alias | The form's display name and endpoint alias |
submission.submittedAt | When the form was filled in — unchanged by retries, so it can be much earlier than sentAt |
submission.* | Your own form fields, exactly as submitted |
In later nodes, reference values as {{ $json.body.submission.email }}. Formboost's metadata stays at the top level, so a field of your own called event or name cannot shadow it.
Only submittedAt is reserved: a form field of that name is dropped in favour of the real timestamp.
To ignore test deliveries, add an IF node on {{ $json.body.event }}.
Example Workflows
| Workflow | What it does |
|---|---|
| Formboost → Postgres | Insert every submission into your own database |
| Formboost → OpenAI → Slack | Summarise the enquiry, then post it to a channel |
| Formboost → HubSpot | Create or update a contact from the email field |
| Formboost → Google Sheets | Append a row per submission |
| Formboost → IF → Email | Route high-value enquiries to a different inbox |
Delivery and Retries
Deliveries are asynchronous. Formboost accepts the submission first and delivers to n8n in the background, so a slow or unreachable instance never delays or fails the form submission itself.
Formboost waits up to 15 seconds for a response. A long-running workflow should respond to the webhook immediately and continue in the background — in the Webhook node set Respond to Immediately rather than When Last Node Finishes.
Every attempt is recorded in the delivery log with the response status, duration, and error if it failed. Failed deliveries are not retried automatically — open the delivery log and click Retry to resend one from its stored submission.
Self-Hosted Instances
Your instance must be reachable from the public internet over HTTPS. Formboost refuses:
- plain
http://URLs - URLs containing credentials (
https://user:pass@…) - private, loopback, and link-local addresses —
localhost,10.x,192.168.x,169.254.xand the like
The address is re-checked when the connection is made, not only when you save, so a hostname that later resolves to a private address is still refused. An instance on a private network needs to be exposed through a public hostname before Formboost can reach it.
Troubleshooting
| Problem | Fix |
|---|---|
404 in the delivery log | The workflow is not Active, or a Test URL was saved. Switch it to Active and re-copy the Production URL |
| URL rejected when saving | It must be https:// and contain /webhook/. Copy the URL from the Webhook node, not your instance's address bar |
| "must point at a public address" | The hostname resolves to a private IP. A local instance has to be publicly reachable first |
| Timeouts in the log | Set the Webhook node's Respond option to Immediately so a slow workflow does not hold the request open |
500 in the delivery log | The workflow itself errored — check its execution list in n8n |
| Fields are empty downstream | Values live under body, e.g. {{ $json.body.submission.email }}, not at the top level |
Notes
- One n8n destination per form. To drive several workflows from one form, use one workflow that branches, or n8n's Execute Workflow node.
- The webhook URL is treated as a credential: anyone holding it can run your workflow. Formboost masks it after saving and never logs it in full.
- If your Webhook node has authentication enabled, Formboost cannot satisfy it — the destination sends no auth header. Leave the node's authentication set to None and rely on the URL's secrecy, or use the generic HTTP Webhook destination, which supports custom headers.