Zum Inhalt springen
Docs · Integration

Webhooks empfangen

Lass dich benachrichtigen, sobald ein Test gewinnt, startet oder pausiert — an Slack, Discord oder deinen eigenen Endpoint. Jedes Event ist mit einer HMAC-Signatur abgesichert.

1. Webhook anlegen

Im Dashboard unter deiner Website → Webhooks: Ziel-URL eintragen, Events auswählen, speichern. Du erhältst ein Signing-Secret — bewahre es sicher auf, damit kannst du jede Zustellung prüfen.

2. Event-Typen

test.startedEin Test wurde gestartet.
test.winner_foundEine Variante hat sich als Sieger durchgesetzt.
test.pausedEin Test wurde pausiert.
test.auto_rolled_backEin fehlerhafter Test wurde automatisch zurückgerollt.
account.first_winDer erste Conversion-Gewinn auf dem Account.
account.cancelledDas Abo wurde gekündigt.

3. Payload

Jedes Event kommt als POST mit diesem JSON-Body. Die id ist eindeutig — dedupliziere darüber, falls ein Event (selten) doppelt zugestellt wird.

POST-Body
{
  "id": "evt_…",            // eindeutige Event-ID (zum Deduplizieren)
  "event": "test.winner_found",
  "timestamp": "2026-05-21T10:00:00Z",
  "site_id": "…",
  "account_id": "…",
  "data": { /* event-spezifisch */ }
}

4. Signatur prüfen (Pflicht)

Jede Zustellung trägt zwei Header: X-Figgle-Signature (Format sha256=<hex>) und X-Figgle-Timestamp. Die Signatur ist der HMAC-SHA256 über <timestamp>.<roh-body> mit deinem Signing-Secret.

Node.js · Signatur verifizieren
import { createHmac, timingSafeEqual } from 'node:crypto'

// rawBody = der UNVERÄNDERTE Request-Body (nicht das geparste JSON!)
function verifyFiggle(headers, rawBody, secret) {
  const signature = headers['x-figgle-signature']   // "sha256=<hex>"
  const timestamp = headers['x-figgle-timestamp']
  if (!signature || !timestamp) return false

  // Replay-Schutz: Event darf höchstens 5 Minuten alt sein.
  // X-Figgle-Timestamp ist ISO-8601 → Date.parse (Number() gäbe NaN); fail-closed.
  const ts = Date.parse(timestamp) / 1000
  if (!Number.isFinite(ts) || Math.abs(Date.now() / 1000 - ts) > 300) return false

  const expected =
    'sha256=' +
    createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')

  const a = Buffer.from(signature)
  const b = Buffer.from(expected)
  return a.length === b.length && timingSafeEqual(a, b)
}
Wichtig: Signiere immer über den unveränderten Roh-Body — nicht über das neu serialisierte JSON. Validiere den Timestamp (±5 Minuten) als Replay-Schutz und vergleiche die Signatur timing-safe.

5. Zustellung & Retries

Antworte mit 2xx, sobald du das Event entgegengenommen hast. Bei Fehlern stellt Figgle mehrfach mit wachsendem Abstand erneut zu. Verarbeite Events idempotent (über die id), da ein Retry dasselbe Event erneut bringen kann.

Webhook einrichten — Benachrichtigung, sobald ein Test gewinnt.

Pläne ansehen

Nächster Schritt

Wähle einen Plan für Figgle und verbessere deine Conversion messbar.

Pläne ansehen