Webhook für Leads und Termine: Anfragen an Zapier, Make, n8n oder Ihr CRM senden

Webhook für Leads und Termine

Ein Webhook schickt jede neue Anfrage sofort an eine Adresse Ihrer Wahl. So landen Leads und Termine ohne Umweg in Zapier, Make, n8n oder Ihrem eigenen CRM, zum Beispiel um daraus ein Ticket zu machen oder eine E-Mail an Ihren Vertrieb zu schicken.

Der Webhook ist ab dem Standard-Tarif verfügbar, Details auf der Preisseite.

Einrichten

  1. Öffnen Sie Dashboard → Ihr Assistent → Funktionen.
  2. Wählen Sie in der Liste Automatisch weitergeben (Gruppe Kunden gewinnen). Dort finden Sie den Abschnitt Webhook.
  3. Tragen Sie die Adresse ein, zum Beispiel die „Catch Hook“-Adresse aus Zapier, und klicken Sie auf Speichern.
  4. Kopieren Sie den Geheimschlüssel. Er wird nur dieses eine Mal angezeigt. Mit Neuer Schlüssel erzeugen Sie bei Bedarf einen neuen.
  5. Wählen Sie, was weitergegeben wird: Neue Kontaktanfragen, Neue Termine oder beides.
  6. Mit Testen schicken wir eine Beispiel-Anfrage an Ihre Adresse.

Die Adresse muss mit https:// beginnen, öffentlich erreichbar sein und Port 443 oder 8443 nutzen. Adressen im eigenen Netzwerk (zum Beispiel localhost oder 192.168.…) lehnen wir ab.

Ereignisse

EreignisWann
lead.createdEin Lead wurde gespeichert, aus dem Chat, einem Telefonat oder einem Formular der Aktionsleiste.
booking.createdEin Termin wurde gebucht.

Beispiel: neuer 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": "Erika Muster",
    "email": "erika@example.com",
    "phone": "0521 123456",
    "interest": "Angebot für eine Wärmepumpe",
    "language": "de",
    "fields": { "Firma": "Muster AG" },
    "sessionId": "861f9c24-11ab-4352-b326-5670b0196fc0",
    "createdAt": "2026-10-23T15:11:28.742Z"
  }
}

source ist chat, phone oder form. Felder ohne Wert fehlen. fields enthält Ihre weiteren Angaben mit der Bezeichnung als Schlüssel. Bei einem Rückrufwunsch kommt callback mit day und time hinzu, bei Formularen formName.

Beispiel: neuer Termin

{
  "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": "beratung", "title": "Kostenloses Beratungsgespräch", "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/Berlin",
    "name": "Max Muster",
    "email": "max@example.com",
    "fields": { "Firma": "Muster Bau GmbH" },
    "createdAt": "2026-10-23T15:20:04.050Z"
  }
}

start und end sind Ortszeit in timezone, startUtc und endUtc dieselben Zeitpunkte in UTC. source ist card (Buchung über die Terminkarte im Chat), chat oder phone. Felder ohne Wert fehlen, das betrifft name (wenn der Name nicht abgefragt oder nicht angegeben wurde), email, phone, note (das Anliegen), meetingLink (Link zum Videoanruf, nur bei Google Kalender) und sessionId. fields enthält die Antworten auf die weiteren Angaben aus Termine buchen, mit der Bezeichnung als Schlüssel.

Kopfzeilen

KopfzeileInhalt
X-Webhook-IdEindeutige ID der Zustellung, gleich dem Feld id. Damit erkennen Sie doppelte Zustellungen.
X-Webhook-Eventlead.created oder booking.created
X-Webhook-TimestampZeitpunkt der Zustellung in Sekunden seit 1970
X-Webhook-Signaturesha256= plus HMAC-SHA256 über Zeitstempel.Rohdaten mit Ihrem Geheimschlüssel

Signatur prüfen

Prüfen Sie die Signatur, bevor Sie die Daten verwenden. Nutzen Sie dafür die unveränderten Rohdaten der Anfrage, nicht ein neu erzeugtes 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 oder Make können Sie die Signatur weglassen, wenn die Adresse geheim bleibt.

Antwort und Wiederholungen

  • Antworten Sie mit einem Status 2xx, sobald Sie die Daten angenommen haben. Den Inhalt Ihrer Antwort lesen wir nicht.
  • Wir warten höchstens 5 Sekunden.
  • Bei Zeitüberschreitung, Netzwerkfehlern, Status 429 oder 5xx versuchen wir es nach 1 und nach 5 Sekunden erneut, also höchstens dreimal.
  • Andere Fehler (zum Beispiel 404) wiederholen wir nicht. Weiterleitungen folgen wir nicht.
  • Das Ergebnis der letzten Zustellung sehen Sie im Dashboard unter Letzte Übertragung.

Ein Lead geht nie verloren, wenn Ihr System nicht antwortet: Er steht immer zuerst im Leads-Dashboard.