Webhooks
Ereignisse aus dem Verein automatisch an andere Systeme senden, etwa an Zapier, n8n oder eure eigene Software.
Ein Webhook meldet Buchungen, Mitgliederwechsel oder Platzsperren sofort an eine Adresse deiner Wahl. So kann zum Beispiel n8n bei jeder neuen Buchung das Hallenlicht planen, oder eure Vereinssoftware erfährt, wenn ein Mitglied beitritt.
Webhooks findest du unter Admin → Automatisierungen im Bereich Webhooks. Auf derselben Seite verwaltest du auch die API-Schlüssel des Vereins, siehe Automatisierungen.
Freischaltung durch den Support
Webhooks sind ein Zusatzfeature und standardmäßig aus. Wenn ihr sie nutzen möchtet, schreib an den Support. Erst danach erscheint unter Admin der Eintrag Automatisierungen mit dem Bereich Webhooks.
Wer darf was?
| Recht | Was es erlaubt |
|---|---|
Webhooks sehen (webhooks:read) | Endpunkte und Zustellprotokoll einsehen |
Webhooks verwalten (webhooks:manage) | Endpunkte anlegen, ändern, löschen, Test-Ereignisse senden und Zustellungen erneut senden |
Beide Rechte vergibst du unter Admin → Rollen und Gruppen. Die Rolle Administrator hat sie automatisch. Wer Webhooks verwaltet, kann nur Ereignisse abonnieren, die er selbst sehen darf: Für Buchungsereignisse braucht es Belegung sehen, für Mitgliederereignisse Mitspieler suchen, für Platzsperren Plätze sehen.
Endpunkt anlegen
Dialog öffnen
Öffne Admin → Automatisierungen und klicke im Bereich Webhooks auf Endpunkt anlegen. Es öffnet sich der Dialog Webhook-Endpunkt anlegen.
Adresse und Beschreibung eintragen
Trage die URL ein, an die CheckCourt die Ereignisse schicken soll. Erlaubt sind nur
https://-Adressen. Die Beschreibung (optional) ist nur für euch, etwa
„Zapier: neue Mitglieder in die Newsletter-Liste“.
Ereignisse auswählen
Hake unter Ereignisse an, was gemeldet werden soll. Die Ereignisse sind nach Buchungen, Mitglieder und Plätze gruppiert, mit Alle wählst du eine ganze Gruppe, mit Keine hebst du die Auswahl wieder auf. Mindestens ein Ereignis ist nötig.
Geheimnis sichern
Nach Anlegen zeigt CheckCourt das Geheimnis des Endpunkts, es beginnt mit whsec_.
Damit prüft euer Empfänger, dass eine Anfrage wirklich von CheckCourt kommt. Kopiere es und
hinterlege es beim Empfänger.
Das Geheimnis wird nur dieses eine Mal angezeigt. Bestätige mit Ich habe das Geheimnis gespeichert. Geht es verloren, erzeugst du ein neues.
Ein Verein kann bis zu 10 Endpunkte anlegen.
Welche Ereignisse gibt es?
| Ereignis | Wann es gemeldet wird |
|---|---|
booking.created | Eine Buchung wurde angelegt |
booking.updated | Eine Buchung wurde geändert: Platz, Datum, Uhrzeit oder Mitspieler |
booking.cancelled | Eine Buchung wurde storniert |
booking.checked_in | Für eine Buchung wurde eingecheckt |
member.joined | Ein Mitglied ist dem Verein beigetreten |
member.updated | Die Daten eines Mitglieds wurden geändert |
member.left | Ein Mitglied hat den Verein verlassen |
court.locked | Ein Platz wurde gesperrt, ganz oder für einen Zeitraum |
court.unlocked | Eine Platzsperrung wurde aufgehoben |
Ein Ereignis enthält nur IDs und Zeiten, keine Namen oder Kontaktdaten. Wer mehr braucht, holt es über die REST-API. Ereignisse aus der Zeit, bevor es den Endpunkt gab, werden nicht nachgeliefert.
So prüft dein Empfänger die Signatur
Jede Anfrage ist ein POST mit JSON-Body, zum Beispiel:
{
"id": "evt_…",
"type": "booking.created",
"created_at": "2026-05-04T08:15:00.000Z",
"tenant_id": "…",
"object": { "type": "booking", "id": "…" },
"data": { "booking_id": "…", "court_id": 3, "date": "2026-05-04", … }
}Dazu kommt der Header CheckCourt-Signature: t=…,v1=…:
tist der Zeitpunkt in Unix-Sekunden.v1ist ein HMAC-SHA256 (hex) über<t>.<Body>.- Schlüssel ist das komplette Geheimnis einschließlich
whsec_. - Verwirf Anfragen, deren Zeitpunkt mehr als fünf Minuten abweicht.
Prüfung in Node.js:
import crypto from "node:crypto";
// rawBody: der unveränderte Body als String, nicht neu serialisiert
function isFromCheckCourt(secret, rawBody, header) {
const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
const t = Number(parts.t);
if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;
const expected = crypto
.createHmac("sha256", secret)
.update(`${parts.t}.${rawBody}`)
.digest("hex");
const given = String(parts.v1 ?? "");
return (
given.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected))
);
}Antworte innerhalb von 10 Sekunden mit einem 2xx-Status. Sonst versucht CheckCourt es noch
zweimal: nach 5 Minuten und nach einer weiteren Stunde. Dasselbe Ereignis kann dabei mehrfach
ankommen: CheckCourt-Event-Id ist pro Ereignis eindeutig, damit erkennt dein Empfänger
Doppelte.
Ein Beispiel in Python, alle Felder und Header, die Wartezeiten zwischen den Versuchen und Tipps gegen doppelte Verarbeitung findest du in der Entwicklerdokumentation zu Webhooks.
Testen
Klicke beim Endpunkt in der Liste oder auf seiner Seite auf Test senden. CheckCourt
schickt dann das Ereignis
webhook.test nur an diesen Endpunkt. Es geht in der nächsten Minute raus und erscheint
danach im Zustellprotokoll. Tests funktionieren nur bei aktiven Endpunkten.
Zustellprotokoll
Ein Klick auf einen Endpunkt öffnet seine Seite mit den Abonnierten Ereignissen und dem Zustellprotokoll. Dort siehst du jede Zustellung, neueste zuerst, mit Zeitpunkt, Ereignis, Status, Zahl der Versuche, HTTP-Status und dem nächsten geplanten Versuch. Mit Mehr laden siehst du ältere Einträge. Über Alle Webhooks kehrst du zurück.
| Status | Bedeutung |
|---|---|
| Ausstehend | Wird gleich verschickt |
| Neuer Versuch geplant | Ein Versuch ist fehlgeschlagen, der nächste kommt automatisch |
| Zugestellt | Der Empfänger hat die Anfrage angenommen |
| Fehlgeschlagen | Alle Versuche sind gescheitert, oder der Endpunkt wurde deaktiviert |
Über Details anzeigen siehst du Ereignis-ID, HTTP-Status, die Antwort des Empfängers und die Fehlermeldung. Mit Erneut senden schickst du eine Zustellung noch einmal, sie geht in der nächsten Minute raus. Einträge werden nach 30 Tagen gelöscht.
Endpunkt bearbeiten, deaktivieren, löschen
- Bearbeiten: URL, Beschreibung und Ereignisse ändern. Mit dem Schalter Aktiv deaktivierst du den Endpunkt vorübergehend. Abonnierte Ereignisse, die du mit deinen eigenen Rechten nicht sehen darfst, kannst du nicht ändern. Offene Zustellungen werden dabei abgebrochen, und während er aus ist, sammelt CheckCourt keine Ereignisse für ihn.
- Geheimnis neu erzeugen (Menü Weitere Aktionen mit den drei Punkten): Das bisherige Geheimnis gilt sofort nicht mehr. Bis du das neue beim Empfänger hinterlegst, schlägt dort die Signaturprüfung fehl.
- Löschen (ebenfalls unter Weitere Aktionen): Der Endpunkt bekommt keine Ereignisse mehr, und sein Zustellprotokoll wird gelöscht. Das lässt sich nicht rückgängig machen.
Alle Änderungen stehen im Aktivitätsprotokoll.
Automatisch deaktiviert
Schlagen die Zustellungen an einen Endpunkt fünf Tage lang fehl und ist der letzte Fehlschlag nicht älter als einen Tag, deaktiviert CheckCourt ihn automatisch. Der Endpunkt zeigt dann Automatisch deaktiviert, und wer ihn angelegt hat, bekommt eine E-Mail. Hat die Person das Recht Webhooks verwalten nicht mehr, geht die E-Mail an alle, die es haben.
Schon vorher warnt der Endpunkt mit „Zustellungen schlagen seit … fehl“. Prüfe dann im Zustellprotokoll die Fehlermeldung, behebe das Problem beim Empfänger und schalte den Endpunkt unter Bearbeiten → Aktiv wieder ein. Beim Einschalten beginnt die Zählung der Fehlschläge von vorn.
Webhooks und Apps
Webhooks hier sind für eure eigenen Anbindungen. Apps bekommen ihre Ereignisse unabhängig davon über ihre Installation und brauchen keinen Endpunkt.