Leadlevering

Het webhook-contract

LeadButton kan elke lead via HTTPS-webhooks naar je eigen infrastructuur sturen — Zapier, Make, n8n of elk endpoint dat je zelf draait. Webhook-levering zit in de Pro- en Agency-plannen (e-mail-levering zit in elk plan).

Instellen

  • Open je site → Bestemmingen.
  • Voeg een bestemming toe, zet het type op Webhook en vul je HTTPS-endpoint-URL in.
  • Bewaar — LeadButton genereert een signing secret voor de bestemming (zichtbaar op de bewaarde rij).
  • Klik Test-payload versturen om een voorbeeldverzoek te ontvangen en je field-mapping te wiren.

Elke actieve bestemming ontvangt elke lead, dus je kunt e-mail- en webhook-bestemmingen vrij combineren.

Het verzoek

Leads worden afgeleverd als een HTTP POST naar je URL:

POST
POST <your webhook url>
Content-Type: application/json
User-Agent: LeadButton-Webhook/1.0
X-LeadButton-Signature: sha256=<hmac-sha256-hex>

De payload is een platte JSON. fields is een plat object van de ingediende formuliervelden (alle waarden zijn strings); widget_key, page_url en referrer kunnen null zijn.

payload
{
  "lead_id": "3e9a4a1e-7a44-4a1e-9a63-1f2ab33c9d10",
  "space_code": "66a3ba5433a10",
  "widget_key": "contactbot",
  "fields": {
    "name": "Ada Lovelace",
    "email": "ada@example.com",
    "message": "I'd like more information."
  },
  "page_url": "https://example.com/contact",
  "referrer": "https://www.google.com/",
  "created_at": "2026-07-07T12:00:00.000Z"
}

Test-payloads (van de knop Test-payload versturen) dragen één extra sleutel, "test": true. Echte leads bevatten die nooit — filter erop als je ontvanger tests moet negeren.

De handtekening verifiëren

Elk verzoek is ondertekend. De X-LeadButton-Signature-header is sha256= gevolgd door de hex HMAC-SHA256 van de ruwe request-body-bytes, met het signing secret van de bestemming. Verifieer altijd tegen de ruwe body — parsen en opnieuw serialiseren kan de bytes veranderen.

node.js
const { createHmac, timingSafeEqual } = require('node:crypto');

function verify(rawBody /* Buffer or string */, signatureHeader, secret) {
  const expected = 'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex');
  return (
    signatureHeader.length === expected.length &&
    timingSafeEqual(Buffer.from(signatureHeader), Buffer.from(expected))
  );
}

Uitgewerkt voorbeeld (ook vastgezet als de cross-runtime testvector in de LeadButton-codebase):

testvector
secret:    lb_test_secret
body:      {"id":"7f9c24e5-2c31-4a4b-99d6-99d09d4c8a3b","space":"testspace","widget_key":"contactbot","fields":{"name":"Ada"},"page_url":"https://example.com/","referrer":null,"created_at":"2026-01-01T00:00:00.000Z"}
signature: sha256=b6d180e7fc6a11bae18b2e806465548e3b9d8480553aac0b16338566d767955d

Levering-semantiek

  • Time-out: 5 seconden per poging.
  • Retries: één retry (na ~1 s) bij time-out, netwerkfouten, 429 en 5xx. Andere 4xx worden als permanente afwijzing behandeld en niet opnieuw geprobeerd.
  • At-least-once: door de retry kan je endpoint dezelfde lead twee keer ontvangen — dedupliceer op lead_id als dat uitmaakt.
  • Bevestig snel: elke 2xx telt als afgeleverd; antwoord vóór je trage werk doet. Redirects worden niet gevolgd en de response-body wordt genegeerd.
  • URL-eisen: alleen https://; private hosts/adressen (localhost, RFC1918, .local/.internal, link-local) worden geweigerd.

Zapier / Make

  • Zapier: gebruik de Webhooks by Zapier-trigger met Catch Hook; plak de gegenereerde Catch Hook-URL als je bestemmings-URL en klik dan Test-payload versturen.
  • Make (Integromat): voeg een Webhooks → Custom webhook-module toe, kopieer het adres als bestemmings-URL, klik Redetermine data structure en dan Test-payload versturen.

Geen van beide platforms verifieert standaard handtekeningen; de payload draagt er wel één als je die in een code-stap wilt checken.

Lever je leads waar jij ze wilt

Bouw je flow vanaf een template en plak één snippet. Gratis tot 20 leads/maand, geen creditcard.