HTTP Webhook
Send submission data to any URL the moment a form is submitted. Use this to trigger backend workflows, update a CRM, write to a database, or connect to services not natively supported.
Setup
- In Formboost, open your form → Integrations tab → Webhook
- Enter your endpoint URL
- Choose the HTTP method:
POST,GET,PUT, orPATCH - Optionally add custom headers (JSON format — see below)
- Save
Custom Headers
Add headers as a JSON object. Useful for authentication or content-type requirements:
1{
2 "Authorization": "Bearer YOUR_TOKEN",
3 "X-API-Key": "YOUR_API_KEY"
4}Example Payload
Formboost sends a JSON body (for POST, PUT, PATCH) or query parameters (for GET):
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, I'd like to learn more.",
13 "submittedAt": "2026-08-24T12:00:00.000Z"
14 }
15}This is the same envelope the Zapier and n8n destinations send. A consumer written against one works against all three.
| Field | Meaning |
|---|---|
event | form.submission, or form.submission.test for a test delivery |
eventId | sub_<submission id>, stable across retries — use it as an idempotency key to drop duplicates. A test delivery gets a test_<uuid> id instead |
sentAt | When this attempt left Formboost. Changes on every retry |
form.name / form.alias | The form's display name and its endpoint alias |
submission.submittedAt | When the form was actually filled in. Unchanged by retries, so it can be much earlier than sentAt |
submission.* | Your own form fields, exactly as submitted — not renamed or reordered |
Changed in August 2026
The body used to be flat, with your fields at the top level alongside fb_formId, fb_formName and fb_dashboardUrl. Those keys are gone and your fields now live under submission.
If your endpoint reads req.body.email, it must now read req.body.submission.email. fb_dashboardUrl has no replacement — use form.alias plus eventId to identify a submission.
Reserved Keys
Only one name is reserved: submittedAt. A form field with that name is dropped in favour of the real timestamp, because consumers rely on it being a date.
Everything Formboost adds lives under event, eventId, sentAt and form, so a field of your own called name, id or event cannot collide with ours — yours is inside submission.
Testing
Use a service like webhook.site to inspect the exact payload Formboost sends before wiring it to your production endpoint:
- Open webhook.site and copy the unique URL
- Paste it into the webhook URL field in Formboost and save
- Submit your form (or click Send Test in the Integrations tab)
- Inspect the full request — headers, body, and all field values — on webhook.site
Retry Behavior
Formboost delivers each submission once. If your endpoint returns a non-2xx status code or times out, the delivery is not retried — the failure is recorded, with the status code and error, in your dashboard under Integrations → Delivery Logs.
Because there is no retry, your endpoint should accept the payload quickly and do any slow work asynchronously. If you need at-least-once delivery, queue the payload on your side as soon as you receive it.
Troubleshooting
| Problem | Fix |
|---|---|
| No request received | Confirm the URL is publicly accessible (not localhost) |
| 401 / 403 errors | Check the Authorization header value in your custom headers |
| Payload missing fields | Ensure field name attributes in your HTML form are set correctly |
Fields suddenly undefined | The body changed in August 2026 — your fields are under submission now, not at the top level |
| Timeout | Your endpoint must respond within 10 seconds; offload heavy work asynchronously |
| Reserved key conflict | Only submittedAt is reserved — rename a form field of that name |
Notes
- Webhook URLs must be publicly accessible. Local development servers (
localhost,127.0.0.1) will not work. - Formboost sends
Content-Type: application/jsonfor all non-GET requests. - Delivery logs showing all attempts and response codes are available in your dashboard under Integrations → Delivery Logs.