Webhook-Ereignisse
Welche Ereignisse es gibt, wann sie ausgelöst werden und was in jeder Zustellung steht.
Für jeden Endpunkt wählst du, bei welchen Ereignissen er Bescheid bekommt. Jedes Ereignis bringt das betroffene Objekt mit, also die Bestellung, das Event oder den Gutschein, genau so, wie die API es liefert. Du musst danach also nichts mehr abfragen.
Ereignisse auswählen
Beim Anlegen oder Bearbeiten eines Endpunkts stehen die Ereignisse nach Bereichen sortiert, jeweils mit ihrem Typ darunter. Mit Alle Ereignisse bekommt der Endpunkt alle, auch solche, die wir später einführen. Wähl einzelne Ereignisse, wenn dein System nur einen Teil verarbeitet.

Alle Ereignisse
| Ereignis | Typ | Wann |
|---|---|---|
| Bestellung per Vorkasse aufgegeben | order.payment_pending | Jemand hat per Vorkasse bestellt. Die Bestellung wartet auf die Überweisung, die Tickets sind reserviert. |
| Bestellung bezahlt | order.paid | Eine Bestellung ist bezahlt oder war kostenlos, die Tickets sind ausgestellt. Bei Vorkasse kommt es, sobald du den Zahlungseingang bestätigst. |
| Vorkasse-Frist abgelaufen | order.payment_expired | Die Frist einer Vorkasse-Bestellung ist ohne Zahlung abgelaufen. Die Tickets sind wieder im Verkauf. |
| Bestellung geändert | order.updated | Eine Bestellung hat sich geändert: einzelne Tickets storniert, umgebucht, Käuferdaten oder ein Name auf einem Ticket geändert, Tickets zum Weiterverkauf angeboten oder zurückgenommen, eine Rückbuchung. |
| Bestellung storniert | order.cancelled | Eine Bestellung ist komplett storniert, auch eine unbezahlte Vorkasse-Bestellung, die du beendet hast. |
| Bestellung erstattet | order.refunded | Eine Erstattung ist abgeschlossen, auch eine teilweise: beim Zahlungsanbieter oder, bei Vorkasse, sobald du sie in der Bestellung abgehakt hast. |
| Ticket eingelassen oder Extra eingelöst | ticket.checked_in | Ein Ticket wurde am Einlass angenommen oder ein Extra eingelöst. Abgelehnte Scans lösen nichts aus. |
| Event veröffentlicht | event.published | Ein Event ist veröffentlicht und im Verkauf. |
| Event geändert | event.updated | Ein veröffentlichtes Event hat sich geändert, auch wenn ein Termin verschoben oder abgesagt wurde. |
| Event abgesagt | event.cancelled | Ein Event ist abgesagt. |
| Gutschein gekauft oder ausgestellt | voucher.created | Ein Gutschein wurde im Shop gekauft oder im Dashboard ausgestellt. |
| Gutschein eingelöst | voucher.redeemed | Jemand hat mit einem Gutschein bezahlt. |
| Auf die Warteliste eingetragen | waitlist.joined | Jemand hat seinen Platz auf einer Warteliste bestätigt. |
| Gast auf die Gästeliste gesetzt | guest.added | Jemand steht jetzt auf einer Gästeliste, die kostenlosen Tickets sind ausgestellt. |
| Rechnung oder Rechnungskorrektur ausgestellt | invoice.issued | Eine Rechnung oder Rechnungskorrektur an einen Firmenkunden ist ausgestellt (kind). PDF und XML stehen zum Download bereit. |
| Rechnung storniert | invoice.cancelled | Eine Rechnung ist mit einer Rechnungskorrektur storniert, die Korrektur steht in correctedBy. |
Dazu kommt webhook.test, das du auf der Seite des Endpunkts mit Test-Ereignis senden auslöst.
Was in einer Zustellung steht
Jede Zustellung ist eine POST-Anfrage mit JSON. Der Aufbau ist immer gleich, hier gekürzt:
{
"id": "f3d4b95c-b569-400d-87e9-d38044e27f8d",
"object": "event",
"type": "order.paid",
"createdAt": "2026-10-22T00:40:00.401Z",
"apiVersion": "v1",
"workspace": { "id": "8d59b98c-…", "slug": "kulturhaus-am-fluss" },
"data": {
"object": {
"object": "order",
"number": "W7NT-6U4X",
"status": "paid",
"total": 5800,
"currency": "EUR",
"customer": { "name": "Katharina Lehmann", … },
…
}
}
}
| Feld | Bedeutung |
|---|---|
id | Eindeutige Nummer des Ereignisses. Bei einer Wiederholung bleibt sie gleich, daran erkennst du doppelte Zustellungen. |
type | Das Ereignis, z. B. order.paid |
createdAt | Wann das Ereignis entstanden ist |
workspace | Der Workspace, aus dem es kommt. Praktisch, wenn ein Endpunkt Ereignisse aus mehreren Workspaces bekommt. |
data.object | Das Objekt, so wie die API es liefert, mit Namen und E-Mail-Adressen der Käufer |
Was in data.object steckt, hängt vom Ereignis ab:
| Ereignisse | Objekt (data.object.object) |
|---|---|
order.* | order: die Bestellung mit Positionen, Tickets, Beträgen und Käufer |
event.* | event: das Event mit Terminen und Ticketarten |
ticket.checked_in | check_in: der Scan mit Ticket, Bestellnummer, Bereich und Gerät |
voucher.* | voucher: der Gutschein |
waitlist.joined | waitlist_entry: der Eintrag auf der Warteliste |
guest.added | guest: der Gast auf der Gästeliste |
invoice.* | invoice: die Rechnung oder Rechnungskorrektur mit Empfänger, Positionen und Beträgen |
Alle Felder mit ihren Typen findest du in der API-Doku unter „Webhooks“.
Jede Anfrage hat außerdem diese Header:
| Header | Inhalt |
|---|---|
TickySmart-Signature | Die Signatur zum Prüfen, siehe Webhooks absichern |
TickySmart-Event-Id | Wie id im Inhalt |
TickySmart-Event-Type | Wie type im Inhalt |
TickySmart-Delivery-Id | Nummer dieser Zustellung, wie im Zustell-Log |
User-Agent | TickySmart-Webhooks/1.0 |
Gut zu wissen
- Reihenfolge: Ereignisse können in anderer Reihenfolge ankommen, als sie passiert sind, vor allem nach Wiederholungen. Vergleich bei Bedarf
createdAt. - Stand des Objekts:
data.objectzeigt den Stand von dem Moment, in dem wir das Ereignis verschickt haben, wenige Sekunden nach der Änderung. Eine Wiederholung bringt denselben Inhalt noch einmal. Brauchst du den neuesten Stand, frag das Objekt über die API ab. - Neue Felder: Wir ergänzen Felder und Ereignisse, ohne dass sich die Version ändert. Ignoriere, was dein System nicht kennt.
Häufige Fragen
Welches Ereignis brauche ich für neue Käufer in meinem CRM?
order.paid. Es kommt bei jeder abgeschlossenen Bestellung, auch bei kostenlosen, und bringt Namen und E-Mail-Adresse des Käufers mit. Ein eigenes Ereignis für Kunden gibt es nicht.
Warum kommt bei Vorkasse zuerst order.payment_pending und später order.paid?
Bei Vorkasse ist die Bestellung zuerst nur reserviert. order.paid kommt erst, wenn du den Zahlungseingang im Dashboard bestätigst. Kommt kein Geld, folgt nach Ablauf der Frist order.payment_expired.
Bekomme ich bei einer Teilerstattung order.refunded?
Ja. Storniert jemand einzelne Tickets, kommt zuerst order.updated. Sobald das Geld zurück ist, folgt order.refunded, bei jeder Erstattung einzeln. Was schon erstattet ist, steht in der Bestellung unter refunds und refunded.