Outbound webhooks
React to platform events.
Build for retries from day one.
- HMAC-SHA256 signatures
- Delivery logs
- Exponential backoff
Event surface
A broad catalog without a wall of names
Choose only the events your integration owns. The full catalog is grouped in the venue webhook configuration; the preview below shows common business domains.
Bookings6 examples
booking.createdA new booking was created
booking.cancelledA booking was cancelled
booking.checked_inA member checked in to a class
booking.no_showA member was marked as no-show
booking.attendance_correctedA committed attendance correction or reversal was recorded with stable operation identity
booking.waitlist_promotedA member was promoted from the waitlist
Members3 examples
member.createdA new member signed up or joined an additional venue. Payload includes membership_origin: "new_signup" | "existing_user_joined" and marketing_consent {status: "granted" | "withdrawn" | "none", brand_id, basis, recorded_at} for the marketing decision recorded in that flow.
member.updatedA member profile was updated
member.deletedA member was removed
Passes6 examples
pass.activatedA pass was activated
pass.expiredA pass expired
pass.pausedA pass was paused
pass.resumedA pass was resumed from a pause/freeze window
pass.cancelledA pass/subscription was cancelled
pass.upgradedA membership was upgraded to a higher plan (immediate, prorated)
Payments6 examples
payment.succeededA payment was completed
payment.failedA payment failed
payment.refundedA payment was refunded
payment.dunning_reminderA dunning reminder was sent for a past_due subscription pass
payment.settled_externallyA failed membership renewal was recorded as paid through another channel (cash / bank transfer / MobilePay / external card)
payment.renewal_waivedA failed membership renewal was waived (comped) by the venue
Courses6 examples
course.enrolledA student successfully enrolled + paid (full, deposit, or installments; carries the chosen plan)
course.enrollment_createdA student enrolled in a course
course.enrollment_withdrawnA student withdrew from a course
course.enrollment_completedA student completed a course (met attendance threshold)
course.waitlist_promotedA waitlisted enrollment was promoted to enrolled
course.certificate_issuedA completion certificate was issued to a student
Delivery contract
Small envelope, explicit headers
The event-specific payload lives under data. Identity and routing facts remain stable at the envelope and header level.
{
"id": "evt_a1b2c3d4",
"type": "booking.created",
"created_at": "2026-07-28T07:15:00.000Z",
"organization_id": "org_xxxx",
"data": {
"booking_id": "bk_xxxx",
"user_id": "usr_xxxx",
"class_instance_id": "ci_xxxx"
}
}| Header | Purpose |
|---|---|
| X-Webhook-Signature | sha256=<HMAC of raw body> |
| X-Webhook-Event | Catalog event key |
| X-Webhook-Id | Stable event identity |
| X-Webhook-Timestamp | Envelope creation time |
Receiver design
The safe path is the straightforward path
Preserve the raw request bytes, authenticate first, claim the event identity, acknowledge, then process asynchronously.
Verify the raw body
Compute HMAC-SHA256 with the endpoint secret and compare it with X-Webhook-Signature using a constant-time function.
Deduplicate by event ID
Use X-Webhook-Id or the envelope id as your durable idempotency key. Delivery is at least once, so repeats are expected.
Acknowledge promptly
Return a 2xx response before doing heavy work. Booking Bible applies a ten-second request timeout.
Expect bounded retries
Non-2xx responses and timeouts enter an exponential-backoff retry path. Repeated endpoint failures are visible in delivery logs and can disable the endpoint.
import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyBookingBibleWebhook(
rawBody: Buffer,
signature: string,
secret: string,
) {
const expected =
'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex');
const suppliedBytes = Buffer.from(signature);
const expectedBytes = Buffer.from(expected);
return suppliedBytes.length === expectedBytes.length &&
timingSafeEqual(suppliedBytes, expectedBytes);
}Integration path
Start with one event and one replay-safe handler
Venue administrators create scoped endpoints and inspect recent deliveries in developer settings. Partners can bring a broader event contract to the integrations team.
Need the complete catalog? It is available in the authenticated webhook configuration.