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:

  1. Create a Slack webhook URL in your Slack workspace
  2. Go to FormFlow Dashboard → Form Settings → Integrations
  3. 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:

  1. Create a Discord webhook in your server settings
  2. Add the webhook URL in FormFlow Dashboard
  3. 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:

  1. Create a Zap with "Webhooks by Zapier" trigger
  2. Select "Catch Hook"
  3. Copy the Zapier webhook URL
  4. Add it to FormFlow Dashboard
  5. Test with a submission
  6. 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

Related

Webhooks - FormFlow API | FormFlow