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.waitlist_promotedA member was promoted from the waitlist
booking.waitlist_addedA member was added to a waitlist by staff
Members3 examples
member.createdA new member signed up or joined an additional venue. Payload includes membership_origin: "new_signup" | "existing_user_joined".
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.