Webhooks
Send form submissions to Slack, Discord, Zapier, or any HTTP endpoint in real-time. Configure webhooks in your dashboard or programmatically.
Supported Integrations
- Slack - Post to any channel
- Discord - Post to any channel
- Custom Webhook - Any HTTP endpoint
- Zapier - Connect to 5,000+ apps
- Make (Integromat) - Advanced automations
Webhook Payload
Every webhook receives a JSON payload with this structure:
{
"event": "submission.created",
"timestamp": "2024-01-15T10:30:00Z",
"submission": {
"id": "sub_abc123",
"data": {
"name": "John Doe",
"email": "john@example.com",
"message": "Hello!"
},
"createdAt": "2024-01-15T10:30:00Z"
},
"form": {
"id": "form_xyz789",
"name": "Contact Form"
}
}Slack Integration
To send submissions to Slack:
- Create a Slack webhook URL in your Slack workspace
- Go to FormFlow Dashboard → Form Settings → Integrations
- Paste your Slack webhook URL
Submissions will be formatted as rich Slack messages:
┌─────────────────────────────────┐
│ New submission: Contact Form │
├─────────────────────────────────┤
│ Name: John Doe │
│ Email: john@example.com │
│ Message: Hello! │
└─────────────────────────────────┘Discord Integration
Similar to Slack, but uses Discord embeds:
- Create a Discord webhook in your server settings
- Add the webhook URL in FormFlow Dashboard
- Submissions appear as rich embeds
Custom Webhooks
Send to any HTTP endpoint. FormFlow will POST the payload:
POST https://your-api.com/webhook
Content-Type: application/json
X-FormFlow-Signature: sha256=abc123...
{
"event": "submission.created",
"submission": { ... }
}Signature Verification
Verify webhooks are from FormFlow using the signature header:
import crypto from 'crypto';
function verifyWebhook(payload: string, signature: string, secret: string) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return `sha256=${expected}` === signature;
}
// In your webhook handler
app.post('/webhook', (req, res) => {
const signature = req.headers['x-formflow-signature'];
const isValid = verifyWebhook(
JSON.stringify(req.body),
signature,
process.env.FORMFLOW_WEBHOOK_SECRET
);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// Process the webhook
console.log('New submission:', req.body.submission);
res.status(200).send('OK');
});Zapier Integration
Connect FormFlow to 5,000+ apps using Zapier:
- Create a Zap with "Webhooks by Zapier" trigger
- Select "Catch Hook"
- Copy the Zapier webhook URL
- Add it to FormFlow Dashboard
- Test with a submission
- Map fields to your destination app
Retry Policy
Failed webhooks are retried with exponential backoff:
- 1st retry: 1 minute
- 2nd retry: 5 minutes
- 3rd retry: 30 minutes
- 4th retry: 2 hours
- 5th retry: 24 hours