Booking webhook (Back Office legacy)¶
Back Office webhook (legacy)
This article applies only to the legacy registration configured in Settings > Webhook.
New Public API registrations use /api/v2/management/webhook-registrations/ and follow
the V2 payload reference.
Existing V1 registrations keep their historical contract.
Overview¶
The Booking webhook sends an event when a booking is created, updated, or deleted. It is typically used to keep attendance, cancellations, and class participation in sync with external systems.
Who It Is For¶
- Teams syncing booking activity to CRM or BI tools.
- Operators automating post-booking workflows.
- Support teams diagnosing booking lifecycle issues.
Supported Events¶
booking-create: sent when a booking is created.booking-update: sent when an existing booking is updated.booking-delete: sent when a booking is deleted.
For booking-update, common triggers include:
- Attendance status updates.
- Booking cancellation updates.
- No-show updates.
- Roll call validation updates.
Inspect an existing registration¶
- Open
https://backoffice.bsport.io/settings/webhook. - Locate the existing booking registration.
- Verify its event and destination before planning the migration.
Do not create a new Back Office registration. Use the Public API booking events for every new integration.
Payload Envelope¶
All booking events use the same envelope:
Data Fields¶
| Field | Type | Description | Example |
|---|---|---|---|
event_type |
string | Booking webhook event name. | "booking-update" |
date |
number | Unix timestamp when event was emitted. | 1721639575 |
data.booking.id |
number | Booking unique id. | 7440942 |
data.booking.member |
number | Member id linked to the booking. | 1440086 |
data.booking.consumer |
number | Consumer id linked to the booking. | 376819 |
data.booking.offer |
number | Offer id booked by the member. | 2217400 |
data.booking.name |
string | Offer name at booking level. | "Cycling" |
data.booking.booking_status_code |
number | Status code (0 active, 1 manager cancel, 2 member cancel, 3 offer cancel). | 0 |
data.booking.attendance |
boolean | Attendance state. | false |
data.booking.is_deleted |
boolean | Soft deletion flag on booking record. | false |
data.booking.offer_date_start |
string (date-time) | Offer start datetime. | "2021-09-21T15:15:37-04:00" |
data.booking.offer_duration_minute |
number | Offer duration in minutes. | 60 |
data.booking.date |
string (date-time) | Datetime when booking record was created. | "2021-09-21T06:53:23.646777-04:00" |
data.booking.date_canceled |
string or null | Cancellation datetime when applicable. | null |
data.booking.credit_consumed |
number | Credits consumed by this booking. | 1 |
data.booking.consumer_payment_pack |
number or null | Payment pack used for this booking. | 4003373 |
data.booking.is_no_show |
boolean | No-show indicator. | false |
data.booking.no_show_penalty_applied |
boolean | Whether no-show penalty was applied. | false |
data.booking.roll_call_needs_validation |
boolean | Whether roll call still needs validation. | true |
data.booking.has_spivi_error |
boolean or null | Spivi synchronization error state when relevant. | null |
Example Payload¶
{
"event_type": "booking-create",
"date": 1721305755,
"data": {
"booking": {
"name": "Cycling [edited]",
"recurrence_rule_booking": null,
"is_discardable": false,
"offer_date_start": "2021-09-21T15:15:37-04:00",
"offer_duration_minute": 60,
"attendance": false,
"booking_status_code": 0,
"consumer": 376819,
"consumer_payment_pack": 4003373,
"attendance_date_updated": null,
"date": "2021-09-21T06:53:23.646777-04:00",
"source_member": null,
"first_in_company": true,
"id": 7440942,
"is_deleted": false,
"offer": 2217400,
"source": 1,
"was_refunded": false,
"member": 1440086,
"credit_consumed": 1,
"establishment": 1506,
"coach": 11395,
"level": 1,
"custom_level": 1,
"coach_override": null,
"meta_activity": 16859,
"date_canceled": null,
"spot_id": null,
"staff_history": [],
"spot_information": {},
"is_no_show": false,
"no_show_penalty_applied": false,
"date_no_show_registered": null,
"roll_call_needs_validation": true,
"date_roll_call_last_modified": null,
"roll_call_attendance": null,
"roll_call_attendance_date_updated": null,
"has_spivi_error": null
}
}
}
Delivery, Reliability, And Security¶
- Your endpoint must accept
POSTover HTTPS. - A documented retry policy is not currently specified in this guide.
- Event ordering guarantees are not currently documented.
- Signature verification headers are not currently documented.
Implementation approach:
- Treat events as potentially duplicated.
- Use idempotent processing by booking id and relevant status fields.
- Log raw payloads and processing outcomes.
Troubleshooting¶
- No event received: verify webhook is enabled for the exact booking event type.
- Test fails in Back Office: confirm endpoint is public, HTTPS, and returns
2xxquickly. - Unexpected state transitions: compare
booking_status_code,attendance, and cancellation-related fields.
FAQ¶
Should I rely on one field only for booking lifecycle status?¶
No. Use a combination of fields such as booking_status_code, is_deleted, and attendance/no-show indicators.
Can updates come from multiple channels?¶
Yes. Booking create/update/delete events can be triggered from Back Office, Widget, or App flows.