Webhook voor leads en afspraken: aanvragen naar Zapier, Make, n8n of uw CRM sturen

Webhook voor leads en afspraken

Een webhook stuurt elke nieuwe aanvraag direct naar een adres naar keuze. Zo komen leads en afspraken zonder omweg in Zapier, Make, n8n of uw eigen CRM terecht, bijvoorbeeld om er een ticket van te maken of uw verkoopteam een e-mail te sturen.

De webhook is beschikbaar vanaf het Standard-pakket, zie de prijzenpagina.

Instellen

  1. Open Dashboard → uw assistent → Functies.
  2. Kies in de lijst Automatisch doorgeven (groep Klanten winnen). Daar vindt u het onderdeel Webhook.
  3. Vul het adres in, bijvoorbeeld de "Catch Hook"-URL uit Zapier, en klik op Opslaan.
  4. Kopieer de Geheime sleutel. Die wordt maar één keer getoond. Met Nieuwe sleutel maakt u zo nodig een nieuwe aan.
  5. Kies wat er wordt doorgegeven: Nieuwe contactaanvragen, Nieuwe afspraken of beide.
  6. Met Testen sturen we een voorbeeldaanvraag naar uw adres.

Het adres moet met https:// beginnen, openbaar bereikbaar zijn en poort 443 of 8443 gebruiken. Adressen binnen uw eigen netwerk (bijvoorbeeld localhost of 192.168.…) worden geweigerd.

Gebeurtenissen

GebeurtenisWanneer
lead.createdEr is een lead opgeslagen, uit de chat, een telefoongesprek of een Action Bar-formulier.
booking.createdEr is een afspraak geboekt.

Voorbeeld: nieuwe lead

{
  "id": "7a05fd6b-3b54-4235-b76e-7695c4ab13a3",
  "event": "lead.created",
  "createdAt": "2026-10-23T15:11:28.895Z",
  "data": {
    "leadId": "51f7f1e3-3e2f-471b-ade6-90959a5d3724",
    "source": "chat",
    "name": "Eva de Vries",
    "email": "eva@example.com",
    "phone": "+31 20 123 4567",
    "interest": "Offerte voor een warmtepomp",
    "language": "nl",
    "fields": { "Bedrijf": "Voorbeeld B.V." },
    "sessionId": "861f9c24-11ab-4352-b326-5670b0196fc0",
    "createdAt": "2026-10-23T15:11:28.742Z"
  }
}

source is chat, phone of form. Velden zonder waarde ontbreken. fields bevat uw extra gegevens, met de naam van het veld als sleutel. Bij een terugbelverzoek komt er callback bij met day en time, bij een formulier formName.

Voorbeeld: nieuwe afspraak

{
  "id": "0c8f2d0e-6f1a-4a43-9a0b-2f9a3c1d5e77",
  "event": "booking.created",
  "createdAt": "2026-10-23T15:20:04.112Z",
  "data": {
    "bookingId": "e3f82cb1-4f6a-4d6e-9c55-0d1a2b3c4d5e",
    "source": "card",
    "appointmentType": { "id": "adviesgesprek", "title": "Gratis adviesgesprek", "durationMinutes": 30 },
    "start": "2026-10-28T14:00",
    "end": "2026-10-28T14:30",
    "startUtc": "2026-10-28T13:00:00.000Z",
    "endUtc": "2026-10-28T13:30:00.000Z",
    "timezone": "Europe/Amsterdam",
    "name": "Jan Jansen",
    "email": "jan@example.com",
    "fields": { "Bedrijf": "Jansen Bouw B.V." },
    "createdAt": "2026-10-23T15:20:04.050Z"
  }
}

start en end zijn de lokale tijd in timezone, startUtc en endUtc dezelfde tijdstippen in UTC. source is card (geboekt via de afsprakenkaart in de chat), chat of phone. Velden zonder waarde ontbreken: name (als de naam niet is gevraagd of niet is opgegeven), email, phone, note (het onderwerp), meetingLink (link naar het videogesprek, alleen bij Google Calendar) en sessionId. fields bevat de antwoorden op de extra gegevens uit Afspraken boeken, met de naam van het veld als sleutel.

Headers

HeaderInhoud
X-Webhook-IdUnieke ID van de levering, gelijk aan het veld id. Hiermee herkent u dubbele leveringen.
X-Webhook-Eventlead.created of booking.created
X-Webhook-TimestampTijdstip van de levering in seconden sinds 1970
X-Webhook-Signaturesha256= plus HMAC-SHA256 over timestamp.rawBody met uw geheime sleutel

Handtekening controleren

Controleer de handtekening voordat u de gegevens gebruikt. Gebruik daarvoor de onveranderde ruwe inhoud van het verzoek, niet opnieuw opgebouwde JSON.

Node.js:

import { createHmac, timingSafeEqual } from 'node:crypto'

export function isValidWebhook(rawBody, headers, secret) {
  const timestamp = headers['x-webhook-timestamp']
  const expected = 'sha256=' + createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
  const received = String(headers['x-webhook-signature'] || '')
  const fresh = Math.abs(Date.now() / 1000 - Number(timestamp)) < 300
  return fresh && received.length === expected.length && timingSafeEqual(Buffer.from(received), Buffer.from(expected))
}

PHP:

$raw = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_WEBHOOK_TIMESTAMP'] ?? '';
$received = $_SERVER['HTTP_X_WEBHOOK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $raw, $secret);

if (!hash_equals($expected, $received) || abs(time() - (int) $timestamp) > 300) {
    http_response_code(401);
    exit;
}
$event = json_decode($raw, true);

In Zapier of Make kunt u de handtekeningcontrole overslaan, zolang het adres geheim blijft.

Antwoord en herhaalpogingen

  • Antwoord met een 2xx-status zodra u de gegevens hebt ontvangen. De inhoud van uw antwoord lezen we niet.
  • We wachten maximaal 5 seconden.
  • Bij een time-out, netwerkfout, status 429 of 5xx proberen we het na 1 en na 5 seconden opnieuw, dus maximaal drie keer.
  • Andere fouten (bijvoorbeeld 404) herhalen we niet. Doorverwijzingen volgen we niet.
  • Het resultaat van de laatste levering ziet u in het dashboard onder Laatste levering.

Er gaat geen lead verloren als uw systeem niet antwoordt: die staat altijd eerst in het Leads Dashboard.