Webhooks

Connecting a webhook

A webhook is the simplest way to push every new lead straight into your own tools — a spreadsheet, your CRM, Slack, or anything else — the moment Formala captures it. No polling, no integrations to maintain.

The short version

  • • A webhook is just a URL you paste in. When a lead is captured, Formala sends the lead's details to that URL.
  • • Easiest path: use Zapier (or Make) to catch it and send it anywhere — Sheets, HubSpot, Slack, email, thousands of apps.
  • • Paste the URL, click Send test, finish the test step in your tool, and you're done.

What is a webhook, really?

When something happens (here: a new lead), Formala makes an HTTP POST request to a URL you provide, with the lead's data as JSON in the body. Your receiving tool reads that data and does whatever you set up — adds a row, creates a contact, posts a message.

It's “push” instead of “pull”: you don't have to check Formala for new leads — they arrive at your endpoint instantly.

Option 1 — Zapier (recommended, no code)

  1. In Zapier, create a Zap and pick Webhooks by Zapier as the trigger, event Catch Hook.
  2. Copy the custom webhook URL Zapier gives you.
  3. Paste it into the Webhook URL field in your Formala form and click Send test — Formala delivers a sample lead so Zapier can read the fields.
  4. Back in Zapier, finish the test step, then add an action to send the lead into any app (Google Sheets, your CRM, Slack, email…). Map the fields from the payload below.

Every new lead now fires this Zap automatically. Make (Integromat) works the same way with a “Custom webhook” trigger.

Option 2 — Slack

Create a Slack Incoming Webhook and paste its URL — or, for nicely formatted messages, catch the lead in Zapier/Make and use their Slack action. Either way, your team gets pinged the second a lead lands.

Option 3 — Your own endpoint (developers)

Point the webhook at any public HTTPS endpoint you control. It receives a POST with Content-Type: application/json and the body below. Respond with a 2xx status to acknowledge; any other status is treated as a failed delivery.

The exact payload

Every lead is delivered as a JSON object shaped like this:

{
  "type": "lead.created",
  "lead": {
    "id": "b1a2c3d4-…",
    "businessName": "Acme Plumbing",
    "name": "Jordan Sample",
    "email": "jordan@example.com",
    "phone": "+1 555 010 1234",
    "category": "Sales",
    "priority": "high",
    "sentiment": "positive",
    "summary": "Wants a quote and a callback this week.",
    "fields": {
      "company": "Sample Co.",
      "budget": "$5,000–$10,000",
      "timeline": "This week"
    },
    "messages": [
      { "role": "assistant", "content": "Hi! How can we help today?" },
      { "role": "user", "content": "I'd like a quote and someone to call me." }
    ]
  }
}

Notes: phone, category, priority, sentiment, and summary may be null if not captured. fields holds any extra/custom fields you configured (keys are your field keys). messages is the full transcript. The Send test button posts this same shape with an added "test": true flag.

One difference to handle: leads submitted through the simple contact form (the fallback, or the “prefer a form” option) carry "fallback": true and omit the AI-derived fields category, priority, sentiment, and summary won't be present. So treat those as optional in your integration.

Testing it

Use the Send test button next to the Webhook URL field. It delivers a realistic sample lead immediately — perfect for completing Zapier/Make's “test trigger” step, which needs a sample to map fields. You don't have to wait for a real visitor.

How delivery behaves

  • Fired once per new lead, the moment the conversation completes (or a fallback form is submitted).
  • It's fire-and-forget with a 5-second timeout, so a slow endpoint never holds up a visitor — and there are no automatic retries. If your endpoint is down, that delivery is skipped (the lead is still saved in your Formala dashboard, and any notification email still goes out).
  • Delivery runs independently of email — you can use either, both, or neither.

Security & requirements

  • The URL must be public and use http(s). For safety we block localhost and private/internal IP addresses — a webhook should point at a real service like Zapier, your CRM, or Slack.
  • Treat the payload as data from the internet: it contains whatever a visitor typed. Your receiving tool should handle it as untrusted input.

Set it up on your form

Add or change your webhook in the form builder or the form's settings — the Webhook URL field is under “Where leads go.”

Go to your forms