Skip to content

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

  1. Open https://backoffice.bsport.io/settings/webhook.
  2. Locate the existing booking registration.
  3. 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:

{
  "event_type": "booking-update",
  "date": 1721639575,
  "data": {
    "booking": {}
  }
}

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 POST over 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 2xx quickly.
  • 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.