Docs · Results

Integrations & webhooks

Send each new response to your own server, Zapier, Make or Slack.

Plan: Business

A webhook sends each new response to a URL you choose the moment it's submitted. In the builder, open Settings → Webhook and enter your endpoint URL.

The Webhook setting with an endpoint URL and a signing secret
A webhook URL and signing secret, under Settings.

What Formz sends

Each response is sent as a JSON POST like this:

{
  "event": "form.submission",
  "formId": "5b7c…",
  "formTitle": "Mint allowlist",
  "submissionId": "9e21…",
  "submittedAt": "2026-10-01T14:03:22.114Z",
  "respondentEmail": "ada@example.com",
  "responses": [
    {
      "blockId": "block_1727…",
      "question": "What's your email?",
      "type": "email",
      "answer": "ada@example.com"
    }
  ]
}

Wallet and social blocks appear in responses like any other answer, with the verified details as the answer. respondentEmail is null if the form doesn't collect an email.

Check that a request came from Formz

Add a Signing secret and Formz signs every request. The X-Formz-Signature header holds sha256= followed by an HMAC-SHA256 of the raw request body, made with your secret. Compute the same value on your server and reject any request where it doesn't match. In Node.js:

import { createHmac, timingSafeEqual } from "node:crypto";

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

Use the raw body exactly as received. If your framework parses the JSON first, the signature won't match.

Zapier, Make and Slack

Point your webhook at a Zapier "Catch Hook" trigger, a Make custom webhook, or a Slack incoming webhook URL. From Zapier or Make you can send responses on to spreadsheets, CRMs, email tools and thousands of other apps.

Delivery

Formz sends each webhook once, straight after the response is saved. If your endpoint is down, that request isn't retried, but the response is always kept in Formz, so you can export it any time.