Kadens logoKadens logoKadens
  • Entdecken
  • Preise
AnmeldenAnfangen
Kadens logoKadens logoKadens

Unterricht

  1. Erste Schritte
  2. Akademie
  3. Zertifikate
  4. Lernen
  5. Kurse

Geld

  1. Abonnements
  2. Finanzen
  3. Tickets

Terminplanung

  1. Veranstaltungen
  2. Arbeit

Personen

  1. Gemeinschaft
  2. Mailing
  3. Formulare
  4. Bewerbungen
  5. Gemeinschaften

Plattform

  1. Website
  2. Entdecken
  3. Konto

Entwickler

  1. Überblick
  2. API-Schlüssel und Berechtigungen
  3. Website-Widgets
  4. Webhooks
  5. KI-Assistenten (MCP)
  6. REST-API
Nicht gefunden, wonach du suchst?Such noch einmal··Sprich mit uns
Kadens logoKadens logoKadens

Wo Tänzer sich verbinden, lernen und wachsen

Produkt

  • Entdecken
  • Kurse
  • Veranstaltungen
  • Communitys
  • Mentoring

Für Unternehmen

  • Kadens für den Unterricht
  • Kadens für Veranstaltungen
  • Kadens für Formulare
  • Kadens für Zertifikate
  • Erstelle deine Website
  • Preise
  • Buche eine Live-Demo

Ressourcen

  • Hilfecenter
  • Neuigkeiten
  • Entwickler
  • Support

Unternehmen

  • Kontakt
  • Instagram
  • Datenschutzrichtlinie
  • Nutzungsbedingungen
  • Cookie-Richtlinie
HilfecenterKontakt
Dokumentation durchsuchen · Webhooks

Unterricht

  1. Erste Schritte
  2. Akademie
  3. Zertifikate
  4. Lernen
  5. Kurse

Geld

  1. Abonnements
  2. Finanzen
  3. Tickets

Terminplanung

  1. Veranstaltungen
  2. Arbeit

Personen

  1. Gemeinschaft
  2. Mailing
  3. Formulare
  4. Bewerbungen
  5. Gemeinschaften

Plattform

  1. Website
  2. Entdecken
  3. Konto

Entwickler

  1. Überblick
  2. API-Schlüssel und Berechtigungen
  3. Website-Widgets
  4. Webhooks
  5. KI-Assistenten (MCP)
  6. REST-API
  1. Hilfecenter
  2. Entwickler
  3. Webhooks für Entwickler

Webhooks für Entwickler

Kadens sendet jedes Mal eine HTTPS-Anfrage an deinen Endpunkt, wenn in deinem Konto etwas passiert. Jede Anfrage ist signiert, wird bis zum Erfolg wiederholt und erscheint in deinem Zustellungsprotokoll.

·9 Min.
Auf dieser Seite
  1. Was ein Webhook ist
  2. Schnellstart
  3. Testen ohne eigenen Server
  4. Anfragetext
  5. Signaturen prüfen
  6. Ereignisse sicher verarbeiten
  7. Wiederholungen und Grenzen
  8. Personenbezogene Daten
  9. Endpunkte verwalten
  10. Ereigniskatalog
  11. Fehlerbehebung
  12. Und jetzt?

Was ein Webhook ist

Ein Webhook ist eine Nachricht, die Kadens an eine von dir gewählte Webadresse sendet, sobald in deinem Konto etwas passiert: eine Bestellung wird bezahlt, ein Ticket wird ausgestellt, jemand checkt ein. Dein System empfängt sie und erledigt den Rest, zum Beispiel indem es die käufende Person zu deiner Mailingliste hinzufügt oder eine Tabelle aktualisiert.

Was du brauchst

  • Eine öffentliche HTTPS-Adresse, die POST-Anfragen akzeptiert. Noch keinen Server? Der Test-Empfänger stellt dir mit einem Klick eine bereit.
  • Zugriff auf Integrationen in deinem Kadens-Dashboard.

Nutzt du Zapier, Make, n8n oder eigenen Code? Diese können über einen API-Schlüssel per REST-API Endpunkte für dich erstellen und entfernen.

Mehr über REST-Hooks

Schnellstart

  1. 1

    Einen Endpunkt hinzufügen

    Öffne Webhooks in deinem Dashboard, wähle Endpunkt hinzufügen, füge deine HTTPS-Adresse ein und wähle die Ereignisse aus, die er empfangen soll. Kopiere das Signaturgeheimnis: Es wird nur einmal angezeigt.
  2. 2

    Ein Testereignis senden

    Wähle auf der Seite des Endpunkts Testereignis senden. Kadens sendet ein Beispielereignis, signiert wie ein echtes, mit livemode auf false gesetzt und jeder Id als Test-Id markiert.
  3. 3

    Die Signatur prüfen

    Bevor du dem Inhalt vertraust, prüfe seine Signatur auf deinem Server mit dem Signaturgeheimnis. Kopiere den Code für deine Sprache aus Signaturen prüfen.
  4. 4

    Mit einem 2xx-Status antworten

    Antworte mit einem beliebigen 2xx-Status, sobald das Ereignis gespeichert ist. Jede andere Antwort, oder keine, zählt als Fehlschlag und die Zustellung wird wiederholt.
Jetzt einrichten
Melde dich an und öffne Webhooks, um deinen ersten Endpunkt hinzuzufügen.
Webhooks öffnen

Testen ohne eigenen Server

Kadens kann für dich einen Test-Empfänger hosten. Wähle auf der Webhooks-Seite Mit Test-Empfänger ausprobieren: Kadens erstellt eine private Testadresse, verbindet einen Endpunkt, der jedes Ereignis empfängt, und sendet ihm ein Testereignis. Jede Anfrage erscheint innerhalb von Sekunden auf der Seite dieses Endpunkts, mit ihren Headern, ihrem Inhalt und ob die Signatur übereinstimmte.

Der Test-Empfänger behält die letzten 50 Anfragen 7 Tage lang, sowie die ersten 64 KB jedes Inhalts.

Einen signierten Webhook live sehen
Melde dich an, öffne Webhooks und wähle Mit Test-Empfänger ausprobieren.
Webhooks öffnen

Anfragetext

Jedes Ereignis kommt im selben JSON-Umschlag, Version 2026-10-01. Das Ereignis selbst steht in data.

FeldTypBeschreibung
idstringEindeutige Id des Ereignisses, beginnend mit evt_. Derselbe Wert erscheint im Header webhook-id und bleibt bei jeder Wiederholung, jedem erneuten Senden und jeder Wiedergabe gleich.
typestringDer Ereignistyp, zum Beispiel order.paid. Der Ereigniskatalog listet sie alle auf.
versionstringDie Vertragsversion, der der Inhalt folgt. Aktuell ist es 2026-10-01.
occurred_atstringWann es geschah, als ISO-8601-Datum und -Uhrzeit.
account{ id, name }Das Kadens-Konto, zu dem das Ereignis gehört: seine Id und sein Name.
subject.typestringDie Art des Datensatzes, um den es im Ereignis geht, zum Beispiel order, booking oder subscription.
subject.idstringDie Id dieses Datensatzes. Jedes Ereignis zu demselben Datensatz trägt dieselbe Id.
subject.sequenceinteger | nullEine Zahl, die mit jeder Änderung an demselben Datensatz wächst, damit du erkennst, welches Ereignis neuer ist. null, wenn der Datensatz keine Änderungsreihenfolge hat.
correlation_idstring | nullVerknüpft Ereignisse aus derselben Aktion, sofern vorhanden. Sonst null.
livemodebooleantrue für echte Aktivität. false für Testereignisse, deren Ids ebenfalls als Test-Ids markiert sind.
dataobjectDas Ereignis selbst. Seine Felder hängen vom Typ ab: Öffne ein Beispiel im Ereigniskatalog.
Ein vollständiger Anfragekörper
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
  "id": "evt_2f8a1c7e9b3d4e5fa6c7d8e9f0a1b2c3",
  "type": "order.paid",
  "version": "2026-10-01",
  "occurred_at": "2026-10-01T10:00:00Z",
  "account": {
    "id": "ent_1a0f",
    "name": "Barcelona Salsa Studio"
  },
  "subject": {
    "type": "order",
    "id": "ord_91ac04",
    "sequence": 2
  },
  "correlation_id": null,
  "livemode": true,
  "data": {
    "order": {
      "id": "ord_91ac04",
      "status": "paid",
      "created_at": "2026-10-01T09:58:02Z",
      "paid_at": "2026-10-01T10:00:00Z",
      "event": {
        "id": "evt_7f3c2a",
        "name": "Salsa Congress Barcelona 2026"
      },
      "totals": {
        "gross": {
          "amount": 12000,
          "currency": "EUR"
        },
        "fees": {
          "amount": 600,
          "currency": "EUR"
        },
        "net": {
          "amount": 11400,
          "currency": "EUR"
        },
        "tax": {
          "amount": 2083,
          "currency": "EUR"
        }
      },
      "buyer": {
        "entity_id": "ent_5b21",
        "name": "Lucia Martin",
        "email": "lucia@example.com"
      },
      "lines": [
        {
          "ticket_type_id": "tt_full_pass",
          "name": "Full pass",
          "quantity": 1,
          "unit_price": {
            "amount": 12000,
            "currency": "EUR"
          }
        }
      ]
    }
  }
}

Signaturen prüfen

Anfragen folgen der Spezifikation Standard Webhooks, daher prüfen die offiziellen Bibliotheken sie ohne Kadens-spezifischen Code. Prüfe immer den unveränderten Rohtext.

HeaderBeschreibung
webhook-idEindeutig pro Ereignis. Nutze ihn, um eine bereits verarbeitete Anfrage zu ignorieren.
webhook-timestampUnix-Sekunden, zu denen die Anfrage signiert wurde. Lehne Anfragen ab, die älter als 300 Sekunden sind.
webhook-signatureEine oder mehrere v1-Signaturen, durch Leerzeichen getrennt. 24 Stunden nach dem Erneuern eines Geheimnisses signieren das alte und das neue.
Halte das Signaturgeheimnis geheim
Jeder Endpunkt hat sein eigenes Signaturgeheimnis, beginnend mit whsec_. Speichere es in einer Umgebungsvariable, niemals in deinem Code oder in einem Repository.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// npm install standardwebhooks
import { Webhook } from 'standardwebhooks';

const wh = new Webhook(process.env.KADENS_WEBHOOK_SECRET);

// Use the RAW request body, exactly as received (not re-serialized JSON).
app.post('/webhooks/kadens', express.raw({ type: 'application/json' }), (req, res) => {
    try {
        const event = wh.verify(req.body.toString('utf8'), req.headers);
        // event.type, event.data
        res.sendStatus(200);
    } catch {
        res.sendStatus(400);
    }
});

Ereignisse sicher verarbeiten

Dasselbe Ereignis kann doppelt, verspätet oder in falscher Reihenfolge ankommen. Drei Gewohnheiten machen deinen Empfänger sicher.

Jedes Ereignis nur einmal verarbeiten

Speichere den webhook-id jedes Ereignisses, das du verarbeitest. Kommt dasselbe nach einer Wiederholung, einem erneuten Senden oder einer Wiedergabe erneut an, antworte mit 2xx und überspringe es.

Ereignisse in die richtige Reihenfolge bringen

Eine Wiederholung kann dazu führen, dass ein älteres Ereignis nach einem neueren ankommt. Wenn subject.sequence gesetzt ist, behalte für jede subject.id die höchste verarbeitete Nummer und ignoriere alles Niedrigere.

Erst antworten, dann arbeiten

Antworte mit 2xx, sobald das Ereignis sicher gespeichert ist, und erledige die langsame Arbeit danach im Hintergrund. Eine Antwort, die länger als 10 Sekunden dauert, zählt als Fehlschlag und wird wiederholt.

Wiederholungen und Grenzen

Antworte mit einem beliebigen 2xx-Status, um eine Zustellung zu bestätigen. Jeder andere Status oder keine Antwort gilt als Fehler.

Eine fehlgeschlagene Zustellung wird noch 10 Mal mit wachsenden Abständen wiederholt, über etwa 3 Tage. Du kannst sie auch über dein Dashboard erneut senden oder einen Zeitraum wiederholen.

Antwortet dein Endpunkt mit 410 Gone, wird er sofort deaktiviert und erhält nichts mehr, bis du ihn wieder aktivierst.

Ein Endpunkt, der 5 Tage lang ohne einen einzigen Erfolg fehlschlägt, wird deaktiviert, und du wirst benachrichtigt.

Ereignisse und Zustellungen werden 30 Tage lang aufbewahrt.

Jedes Konto kann bis zu 10 eigene Endpunkte haben. Endpunkte, die Zapier, Make oder n8n anlegen, zählen nicht zu dieser Grenze und haben eine eigene Obergrenze von 50.

Wann jede Wiederholung stattfindet

WiederholungWann
Wiederholung 130 Sekunden nach dem vorherigen Versuch
Wiederholung 22 Minuten nach dem vorherigen Versuch
Wiederholung 310 Minuten nach dem vorherigen Versuch
Wiederholung 430 Minuten nach dem vorherigen Versuch
Wiederholung 51 Stunde nach dem vorherigen Versuch
Wiederholung 63 Stunden nach dem vorherigen Versuch
Wiederholung 76 Stunden nach dem vorherigen Versuch
Wiederholung 812 Stunden nach dem vorherigen Versuch
Wiederholung 924 Stunden nach dem vorherigen Versuch
Wiederholung 1024 Stunden nach dem vorherigen Versuch

Personenbezogene Daten

Namen und E-Mail-Adressen von Käufern, Ticketinhabern und Teilnehmenden sind personenbezogene Daten. Standardmäßig entfernt Kadens diese Felder vor dem Senden, sodass der Endpunkt das Ereignis ohne sie erhält.

Um sie zu erhalten, bearbeite den Endpunkt und aktiviere Personenbezogene Daten einschließen. Sobald die Daten Kadens verlassen, liegt ihr Schutz in deiner Verantwortung.

Endpunkte verwalten

AktionBeschreibung
Geheimnis erneuernErstellt ein neues Signaturgeheimnis. Das alte signiert noch 24 Stunden lang weiter, sodass du deinen Server aktualisieren kannst, ohne ein Ereignis zu verpassen.
Erneut sendenSendet jedes Ereignis aus einem Zeitraum erneut, das der Endpunkt verpasst hat oder nicht empfangen konnte, bis zu 30 Tage zurück.
Erneut sendenSendet eine Zustellung aus dem Zustellprotokoll des Endpunkts erneut.
Testereignis sendenSendet ein Beispiel eines beliebigen Ereignistyps nur an diesen Endpunkt, markiert als Test.
Deaktivieren / AktivierenStoppt Zustellungen, bis du den Endpunkt wieder aktivierst. Wiederhole nach dem Aktivieren den Zeitraum, den er verpasst hat.

Ein Endpunkt, der 5 Tage lang ohne einen einzigen Erfolg fehlschlägt, wird automatisch deaktiviert, und du wirst benachrichtigt.

Ereigniskatalog

Abonniere für einen Endpunkt die Ereignisse, die er braucht. Zu jedem siehst du die Daten, die es enthält.

Bestellungen

order.paid

Eine Bestellung wurde bezahlt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
{
  "order": {
    "id": "ord_91ac04",
    "status": "paid",
    "created_at": "2026-10-01T09:58:02Z",
    "paid_at": "2026-10-01T10:00:00Z",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "totals": {
      "gross": {
        "amount": 12000,
        "currency": "EUR"
      },
      "fees": {
        "amount": 600,
        "currency": "EUR"
      },
      "net": {
        "amount": 11400,
        "currency": "EUR"
      },
      "tax": {
        "amount": 2083,
        "currency": "EUR"
      }
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "lines": [
      {
        "ticket_type_id": "tt_full_pass",
        "name": "Full pass",
        "quantity": 1,
        "unit_price": {
          "amount": 12000,
          "currency": "EUR"
        }
      }
    ]
  }
}
order.refunded

Eine Bestellung wurde ganz oder teilweise erstattet.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
{
  "order": {
    "id": "ord_91ac04",
    "status": "refunded",
    "created_at": "2026-10-01T09:58:02Z",
    "paid_at": "2026-10-01T10:00:00Z",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "totals": {
      "gross": {
        "amount": 12000,
        "currency": "EUR"
      },
      "fees": {
        "amount": 600,
        "currency": "EUR"
      },
      "net": {
        "amount": 11400,
        "currency": "EUR"
      },
      "tax": {
        "amount": 2083,
        "currency": "EUR"
      }
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "lines": [
      {
        "ticket_type_id": "tt_full_pass",
        "name": "Full pass",
        "quantity": 1,
        "unit_price": {
          "amount": 12000,
          "currency": "EUR"
        }
      }
    ]
  },
  "refund": {
    "id": "ref_0c7d",
    "amount": {
      "amount": 12000,
      "currency": "EUR"
    },
    "refunded_at": "2026-10-03T08:12:40Z"
  }
}
checkout.abandoned

Ein Käufer hat einen Checkout begonnen und ohne Bezahlung verlassen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "checkout": {
    "id": "pin_3c8e21",
    "item": {
      "kind": "course",
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "buyer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "amount": {
      "amount": 9900,
      "currency": "EUR"
    },
    "started_at": "2026-10-01T09:40:00Z"
  },
  "abandoned_at": "2026-10-01T10:40:00Z"
}

Tickets

ticket.issued

Ein Ticket wurde für seinen Inhaber ausgestellt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "active",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  }
}
ticket.reassigned

Ein Ticket wurde an einen anderen Inhaber übertragen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "active",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_8e40",
      "name": "Marco Rossi",
      "email": "marco@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  },
  "previous_holder": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "reassigned_at": "2026-10-02T17:30:00Z"
}
ticket.canceled

Ein Ticket wurde storniert.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "ticket": {
    "id": "tkt_33d0e1",
    "order_id": "ord_91ac04",
    "status": "canceled",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    },
    "ticket_type": {
      "id": "tt_full_pass",
      "name": "Full pass"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:01Z"
  },
  "canceled_at": "2026-10-04T12:00:00Z"
}

Teilnehmer

attendee.registered

Ein Teilnehmer wurde für eine Veranstaltung angemeldet.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "registered_at": "2026-10-01T10:05:00Z"
}
attendee.checked_in

Ein Teilnehmer wurde am Einlass eingecheckt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "checked_in_at": "2026-10-10T19:02:11Z"
}
attendee.check_in_reverted

Ein Check-in wurde rückgängig gemacht.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "reverted_at": "2026-10-10T19:04:30Z"
}
attendee.no_show

Ein Ticketinhaber hat vor Ende des Termins nicht eingecheckt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "attendee": {
    "ticket_id": "tkt_33d0e1",
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona 2026"
    }
  },
  "finalized_at": "2026-10-10T23:30:00Z"
}

Ereignisse

event.ended

Eine deiner Veranstaltungen ist beendet.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
  "edition": {
    "id": "eed_2b71",
    "name": "Salsa Congress Barcelona 2026",
    "event": {
      "id": "evt_7f3c2a",
      "name": "Salsa Congress Barcelona"
    },
    "starts_at": "2026-10-09T16:00:00Z",
    "ends_at": "2026-10-11T22:00:00Z",
    "timezone": "Europe/Madrid"
  },
  "ended_at": "2026-10-11T22:00:00Z"
}

Buchungen

booking.confirmed

Eine Buchung für eine Sitzung wurde bestätigt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "confirmed_at": "2026-10-01T10:00:00Z"
}
booking.declined

Eine Buchungsanfrage wurde abgelehnt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "cancelled",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "declined_at": "2026-10-01T10:00:00Z"
}
booking.canceled

Eine Buchung wurde storniert oder ist abgelaufen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "cancelled",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reason": "canceled",
  "canceled_at": "2026-10-03T09:12:00Z"
}
booking.moved

Eine Buchung wurde in eine andere Sitzung verschoben.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_7b90d2",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-15T17:00:00Z",
      "ends_at": "2026-10-15T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "previous_session": {
    "id": "ses_62f1a8",
    "status": "scheduled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T17:00:00Z",
    "ends_at": "2026-10-08T18:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "moved_at": "2026-10-04T11:40:00Z"
}
booking.no_show

Ein gebuchter Teilnehmer hat vor Ende der Einheit nicht eingecheckt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "booking": {
    "id": "reg_8e17c3",
    "status": "reserved",
    "session": {
      "id": "ses_62f1a8",
      "status": "scheduled",
      "program": {
        "id": "prg_0c4e",
        "name": "Contemporary Technique, Level 2"
      },
      "starts_at": "2026-10-08T17:00:00Z",
      "ends_at": "2026-10-08T18:30:00Z",
      "timezone": "Europe/Madrid",
      "location": {
        "delivery_mode": "in_person",
        "room": {
          "id": "room_a1",
          "name": "Studio A"
        }
      }
    },
    "attendee": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "finalized_at": "2026-10-08T19:30:00Z"
}
session.canceled

Eine geplante Sitzung wurde abgesagt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "session": {
    "id": "ses_62f1a8",
    "status": "cancelled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T17:00:00Z",
    "ends_at": "2026-10-08T18:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "cancellation_reason": "Teacher unwell",
  "canceled_at": "2026-10-07T08:00:00Z"
}
session.rescheduled

Eine geplante Sitzung wurde auf eine andere Zeit verlegt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "session": {
    "id": "ses_62f1a8",
    "status": "scheduled",
    "program": {
      "id": "prg_0c4e",
      "name": "Contemporary Technique, Level 2"
    },
    "starts_at": "2026-10-08T18:00:00Z",
    "ends_at": "2026-10-08T19:30:00Z",
    "timezone": "Europe/Madrid",
    "location": {
      "delivery_mode": "in_person",
      "room": {
        "id": "room_a1",
        "name": "Studio A"
      }
    }
  },
  "previous_starts_at": "2026-10-08T17:00:00Z",
  "previous_ends_at": "2026-10-08T18:30:00Z",
  "rescheduled_at": "2026-10-06T15:20:00Z"
}
pack.credits_low

Ein Kurspaket hat seinen niedrigen Guthaben-Schwellenwert erreicht.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
  "pack": {
    "id": "pkp_1e90",
    "product": {
      "id": "pck_10cls",
      "name": "10 class pack"
    },
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "credits_remaining": 2,
    "credits_total": 10,
    "expires_at": "2027-01-31T23:59:59Z"
  },
  "threshold": 2,
  "crossed_at": "2026-10-08T17:00:05Z"
}

Einschreibungen

enrollment.created

Ein Teilnehmer wurde in einen Kurs eingeschrieben.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "enrolled_at": "2026-12-02T10:15:00Z"
}
enrollment.ended

Die Kurseinschreibung eines Teilnehmers wurde beendet.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "ended_at": "2027-02-02T10:15:00Z"
}
enrollment.moved

Ein Teilnehmer wurde in eine andere Ausgabe des Kurses verschoben.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_7d02",
      "name": "April 2027",
      "starts_at": "2027-04-12T17:00:00Z",
      "ends_at": "2027-06-28T19:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "previous_edition": {
    "id": "ced_4b1e",
    "name": "January 2027",
    "starts_at": "2027-01-11T18:00:00Z",
    "ends_at": "2027-03-29T20:00:00Z",
    "timezone": "Europe/Madrid"
  },
  "moved_at": "2026-12-20T09:00:00Z"
}
lesson.completed

Ein Schüler hat eine Lektion deines Kurses abgeschlossen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "lesson": {
    "id": "itm_2f81",
    "name": "Basic step and timing"
  },
  "completed_at": "2026-12-05T19:40:00Z"
}
course.completed

Ein Schüler hat deinen Kurs abgeschlossen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "enrollment": {
    "id": "crs_9a20:ent_31c7",
    "course": {
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "edition": {
      "id": "ced_4b1e",
      "name": "January 2027",
      "starts_at": "2027-01-11T18:00:00Z",
      "ends_at": "2027-03-29T20:00:00Z",
      "timezone": "Europe/Madrid"
    },
    "student": {
      "entity_id": "ent_31c7",
      "name": "Lucia Fernandez",
      "email": "lucia@example.com"
    },
    "source": "subscription"
  },
  "completed_at": "2027-03-29T20:10:00Z"
}

Abonnements

subscription.created

Ein Kunde hat einen Plan abonniert.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  }
}
subscription.renewed

Ein Abonnement wurde verlängert und die Zahlung ist eingegangen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-11-01T00:00:00Z",
    "current_period_end": "2026-12-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "invoice": {
    "id": "in_1Q2w3E",
    "amount": {
      "amount": 4900,
      "currency": "EUR"
    }
  },
  "renewed_at": "2026-11-01T00:04:12Z"
}
subscription.payment_failed

Die Zahlung für ein Abonnement ist fehlgeschlagen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "past_due",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "access_ends_at": "2026-11-08T00:04:12Z",
  "failure_code": "card_declined",
  "failed_at": "2026-11-01T00:04:12Z"
}
subscription.canceled

Ein Abonnement wurde gekündigt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": true,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "cancel_at_period_end": true,
  "ends_at": "2026-11-01T00:00:00Z",
  "canceled_at": "2026-10-15T09:30:00Z"
}
subscription.reactivated

Ein gekündigtes Abonnement wurde reaktiviert.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "active",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reactivated_at": "2026-10-20T18:00:00Z"
}
subscription.plan_changed

Ein Kunde hat zu einem anderen Plan gewechselt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "subscription": {
    "id": "sub_8f01bc",
    "status": "active",
    "plan": {
      "id": "plan_9b22",
      "name": "Full bundle"
    },
    "price": {
      "id": "price_5d6e",
      "amount": {
        "amount": 8900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "previous_subscription_ids": [
    "sub_4d2e9a"
  ],
  "credit_applied": {
    "amount": 2450,
    "currency": "EUR"
  },
  "next_billing_at": "2026-11-15T00:00:00Z",
  "changed_at": "2026-10-15T12:00:00Z"
}
subscription.ended

Ein Abonnement ist beendet und der Zugang wurde gestoppt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "canceled",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": "2026-11-01T00:00:00Z",
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "reason": "cancellation_requested",
  "ended_at": "2026-11-01T00:00:00Z"
}
subscription.trial_ending

Die kostenlose Testphase eines Abonnenten endet in wenigen Tagen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
{
  "subscription": {
    "id": "sub_4d2e9a",
    "status": "trialing",
    "plan": {
      "id": "plan_7a10",
      "name": "Monthly membership"
    },
    "price": {
      "id": "price_2c3b",
      "amount": {
        "amount": 4900,
        "currency": "EUR"
      },
      "interval": "month",
      "interval_count": 1
    },
    "current_period_start": "2026-10-01T00:00:00Z",
    "current_period_end": "2026-11-01T00:00:00Z",
    "cancel_at_period_end": false,
    "canceled_at": null,
    "customer": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "trial_ends_at": "2026-10-15T00:00:00Z"
}

Zertifikate

certificate.issued

Ein Zertifikat wurde an seinen Inhaber ausgestellt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
{
  "certificate": {
    "id": "icrt_4d19b2",
    "number": "KD-2026-000142",
    "status": "active",
    "certificate": {
      "id": "crt_7a02",
      "name": "Contemporary Foundations"
    },
    "template": {
      "id": "tpl_31c8",
      "name": "2026 cohort"
    },
    "recipient": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:00Z",
    "expires_at": null,
    "revoked_at": null,
    "verification_url": "https://kadens.io/verify-certificate/KD-2026-000142"
  }
}
certificate.revoked

Ein Zertifikat wurde widerrufen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
  "certificate": {
    "id": "icrt_4d19b2",
    "number": "KD-2026-000142",
    "status": "revoked",
    "certificate": {
      "id": "crt_7a02",
      "name": "Contemporary Foundations"
    },
    "template": {
      "id": "tpl_31c8",
      "name": "2026 cohort"
    },
    "recipient": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "issued_at": "2026-10-01T10:00:00Z",
    "expires_at": null,
    "revoked_at": "2026-11-12T08:30:00Z",
    "verification_url": "https://kadens.io/verify-certificate/KD-2026-000142"
  },
  "reason": "Issued to the wrong student",
  "revoked_at": "2026-11-12T08:30:00Z"
}

Auszahlungen

payout.paid

Eine Auszahlung ist auf deinem Bankkonto eingegangen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
{
  "payout": {
    "id": "po_1Q2w3E4r",
    "status": "paid",
    "amount": {
      "amount": 113400,
      "currency": "EUR"
    },
    "arrival_date": "2026-10-06T00:00:00Z"
  },
  "paid_at": "2026-10-06T06:14:09Z"
}
payout.failed

Eine Auszahlung ist fehlgeschlagen und das Geld wurde nicht überwiesen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "payout": {
    "id": "po_1Q2w3E4r",
    "status": "failed",
    "amount": {
      "amount": 113400,
      "currency": "EUR"
    },
    "arrival_date": "2026-10-06T00:00:00Z"
  },
  "failure": {
    "code": "account_closed",
    "message": "The bank account has been closed."
  },
  "failed_at": "2026-10-06T06:14:09Z"
}

Kontakte

lead.captured

Ein neuer Lead wurde erfasst.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
  "lead": {
    "id": "lead_4a90",
    "audience_id": "aud_12f0",
    "email": "lucia@example.com",
    "first_name": "Lucia",
    "last_name": "Martin",
    "consent_at": "2026-10-01T09:12:00Z",
    "source": {
      "site_id": "site_77a1",
      "page_id": "page_home",
      "block_id": "blk_newsletter",
      "url": "https://salsa.example.com/"
    }
  },
  "captured_at": "2026-10-01T09:12:00Z"
}
form.submitted

Ein Formular wurde abgeschickt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "application"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "answers": [
      {
        "field_id": "b2c1e8f0-3a4d-4c5e-9f60-1a2b3c4d5e6f",
        "label": "Dance experience",
        "type": "textarea",
        "value": "Five years of salsa",
        "display": "Five years of salsa"
      },
      {
        "field_id": "c3d2f9a1-4b5e-4d6f-8a71-2b3c4d5e6f70",
        "label": "Preferred role",
        "type": "select",
        "value": "follower",
        "display": "Follower"
      }
    ],
    "submitted_at": "2026-10-02T11:40:00Z"
  }
}
application.decided

Du hast eine Bewerbung angenommen, abgelehnt oder auf die Warteliste gesetzt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "application"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "submitted_at": "2026-10-02T11:40:00Z"
  },
  "decision": "approved",
  "decided_at": "2026-10-06T09:00:00Z"
}
exam.results_released

Ein Kandidat kann jetzt seine Prüfungsergebnisse sehen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
{
  "submission": {
    "id": "sub_61c2",
    "form": {
      "id": "frm_0d3e",
      "title": "Audition application",
      "type": "exam"
    },
    "target": {
      "scope": "course",
      "id": "crs_19ab"
    },
    "submitter": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "submitted_at": "2026-10-02T11:40:00Z"
  },
  "result": {
    "passed": true,
    "score_percent": 86
  },
  "released_at": "2026-10-09T12:00:00Z"
}
follower.added

Jemand folgt dir jetzt.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
{
  "follower": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "followed_at": "2026-10-01T08:00:00Z"
}
community.member.joined

Ein Mitglied ist einer deiner Communitys beigetreten.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
{
  "membership": {
    "member": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "source": "ticket_holder"
  },
  "joined_at": "2026-10-01T10:00:02Z"
}
community.member.left

Ein Mitglied hat eine deiner Communitys verlassen.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
{
  "membership": {
    "member": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "source": "ticket_holder"
  },
  "reason": "ticket_released",
  "left_at": "2026-10-05T08:00:00Z"
}
channel_automation.webhook

Eine Automatisierung hat für einen Kontakt einen Webhook-Sendeschritt erreicht.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "automation": {
    "id": "aut_2c81f0",
    "step_id": "step_send_webhook",
    "run_id": "run_8e41d7"
  },
  "contact": {
    "id": "con_51a9e2",
    "entity_id": null,
    "username": "lucia.dances",
    "email": "lucia@example.com",
    "tag_ids": [
      "tag_vip"
    ]
  },
  "channel": {
    "type": "instagram",
    "account_id": "cha_7d02b1"
  },
  "fired_at": "2026-10-01T10:00:00Z"
}

Feedback

review.submitted

Jemand hat eine Bewertung abgegeben.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "review": {
    "id": "rev_8d02",
    "rating": 5,
    "comment": "Clear, patient and fun.",
    "target": {
      "kind": "course",
      "id": "crs_9a20",
      "name": "Bachata Foundations"
    },
    "author": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "submitted_at": "2026-10-12T20:15:00Z"
}
feedback.completed

Du hast die Feedback-Anfrage eines Schülers beantwortet.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "request": {
    "id": "fbr_51a7",
    "offering": {
      "id": "mnt_33c0",
      "name": "Video feedback on your solo"
    },
    "student": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    }
  },
  "completed_at": "2026-10-14T10:30:00Z"
}

Belohnungen

reward.expiring

Eine Belohnung, die du jemandem gegeben hast, läuft bald ab.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "reward": {
    "id": "grw_0a4f",
    "name": "Free drop-in class",
    "kind": "free_class",
    "holder": {
      "entity_id": "ent_5b21",
      "name": "Lucia Martin",
      "email": "lucia@example.com"
    },
    "expires_at": "2026-11-01T00:00:00Z"
  }
}

Automatisierungen

automation.step_reached

Eine Sequenz hat für eine Person einen Webhook-Schritt erreicht.

Beispieldaten
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "automation": {
    "id": "aut_3c81"
  },
  "run": {
    "id": "run_9d42"
  },
  "step": {
    "id": "s_hotlead",
    "key": "hot_lead"
  },
  "person": {
    "entity_id": "ent_5b21",
    "name": "Lucia Martin",
    "email": "lucia@example.com"
  },
  "reached_at": "2026-10-03T08:15:00Z"
}

Webhooks

webhook.test

Ein Testereignis, das du aus Kadens gesendet hast.

Beispieldaten
JSON
1
2
3
{
  "message": "This is a test event sent from Kadens."
}

Fehlerbehebung

Es kommt nichts an

Prüfe, ob der Endpunkt aktiviert und für das Ereignis abonniert ist und ob seine Adresse öffentlich ist und HTTPS verwendet. Sende dann ein Testereignis und öffne die Zustellung, um zu sehen, was dein Server geantwortet hat.

Die Signatur stimmt nie überein

Prüfe gegen den rohen Anfragekörper, vor jeder JSON-Auswertung. Verwende das Geheimnis dieses Endpunkts und prüfe die Uhr deines Servers: Anfragen, die älter als 300 Sekunden sind, werden abgelehnt.

Dasselbe Ereignis kommt zweimal an

Das ist nach einer Wiederholung, einem erneuten Senden oder einer Wiedergabe zu erwarten. Überspringe jede webhook-id, die du bereits verarbeitet hast.

Der Endpunkt wurde deaktiviert

Er ist 5 Tage lang ohne Erfolg fehlgeschlagen, hat mit 410 Gone geantwortet, oder jemand hat ihn deaktiviert. Behebe den Server, aktiviere den Endpunkt und wiederhole den verpassten Zeitraum.

Namen oder E-Mail-Adressen fehlen

Personenbezogene Daten werden entfernt, sofern der Endpunkt sie nicht einschließt. Siehe Personenbezogene Daten oben.

Und jetzt?

Im Dashboard öffnen

War das hilfreich?

Zurück
Website-Widgets
Weiter
KI-Assistenten (MCP)

Auf dieser Seite

  1. Was ein Webhook ist
  2. Schnellstart
  3. Testen ohne eigenen Server
  4. Anfragetext
  5. Signaturen prüfen
  6. Ereignisse sicher verarbeiten
  7. Wiederholungen und Grenzen
  8. Personenbezogene Daten
  9. Endpunkte verwalten
  10. Ereigniskatalog
  11. Fehlerbehebung
  12. Und jetzt?