Webhooks · Last updated April 23, 2026
Webhooks overview
Webhooks forward every (non-spam) submission to one or more HTTPS endpoints — Slack channels, Discord servers, Zapier or n8n workflows, your own backend, or any service that accepts a JSON POST. Webhooks are configured per form from the dashboard, no code changes required.
How it works
When a visitor submits a form, SaveForm stores the submission and fans it out to every webhook you have configured for that form. Each delivery is independent — one failing receiver cannot block another.
- Triggered on every non-spam submission by default. Test fires are available at any time from the webhook card.
- Each webhook picks a destination preset (Slack, Slack Workflow, Discord, Zapier, n8n, generic JSON, or custom template) with sensible defaults.
- The editor shows a live preview of the exact HTTP request that will be sent — headers, method, body — so you can tweak the JSON template before you save.
- Every delivery is logged with status code, response body, and timing — visible on the submission row in the dashboard.
Set one up
- Open your form in the dashboard and click Settings on the form card.
- Switch to the Webhooks tab.
- Click New Webhook and pick a preset (Slack, Slack Workflow, Discord, Zapier, n8n, generic JSON, or custom template).
- Paste the destination URL. The right pane shows the live preview — adjust the JSON template, field rename map, or auth until it looks right.
- Save, then click Test on the webhook card to fire a sample payload and confirm the receiver accepts it.
Dive deeper
Slack, Discord, Zapier, n8n — plus generic JSON and a fully custom template.
Raw vs. template mode, placeholder syntax, and the built-in helpers.
Bearer, API key header, Basic auth, and extra custom headers.
Failures, manual retries, and the Test button.
Spam & plan limits
Webhooks never auto-fire on submissions flagged as spam. If a submission was misclassified, open it in the submissions table and click Send anyway — the webhook will fire as a manual delivery. If you genuinely want spam to flow through (for example to a quarantine endpoint), toggle “Also forward submissions flagged as spam” on the webhook.
For more context on where the _isSpam flag comes from, see Spam protection.