senduler

Webhooks

Add a webhook under a form's Webhooks tab. Every accepted submission is POSTed to your URL as JSON, with automatic retries.

Payload

{
  "formId": "…",
  "submissionId": "…",
  "createdAt": "2026-01-01T12:00:00Z",
  "spamVerdict": "Clean",
  "data": { "email": "ada@example.com", "message": "Hello" }
}

Headers

Header Value
X-Senduler-Event submission.created
X-Senduler-Delivery Unique id for this delivery attempt
X-Senduler-Signature sha256=<hmac> of the raw body

Verifying the signature

We sign the raw request body with your webhook's secret using HMAC-SHA256. Verify it before trusting the payload:

import crypto from "node:crypto";

function verify(rawBody, header, secret) {
  const expected = "sha256=" + crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return crypto.timingSafeEqual(Buffer.from(header), Buffer.from(expected));
}

Zapier & automation tools

Point a Zapier "Catch Hook" (or any automation tool) at a generic webhook URL — the payload above is exactly what it receives.

Requirements

Webhook URLs must be https and must not point at private or internal addresses.