Offer 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 Offer webhook sends an event when a session offer is created or updated. It is used to synchronize schedule and capacity changes with external systems.
Who It Is For¶
- Teams synchronizing class schedules to partner systems.
- Operators monitoring capacity and booking availability changes.
- Support teams investigating schedule propagation issues.
Supported Events¶
offer-create: sent when an offer is created.offer-update: sent when an offer is updated.
Inspect an existing registration¶
- Open
https://backoffice.bsport.io/settings/webhook. - Locate the existing offer registration.
- Verify its event and destination before planning the migration.
Do not create a new Back Office registration. Use the Public API class events for every new integration.
Payload Envelope¶
Data Fields¶
| Field | Type | Description | Example |
|---|---|---|---|
event_type |
string | Offer webhook event name. | "offer-update" |
date |
number | Unix timestamp when event was emitted. | 1721639855 |
data.offer.id |
number | Offer unique id. | 24205 |
data.offer.activity |
number | Activity id linked to the offer. | 492 |
data.offer.activity_name |
string | Activity name shown to staff and members. | "Pilates" |
data.offer.date_start |
string (date-time) | Offer start datetime. | "2025-12-18T12:36:58+01:00" |
data.offer.duration_minute |
number | Session duration in minutes. | 30 |
data.offer.effectif |
number | Maximum capacity. | 10 |
data.offer.available |
boolean | Whether booking is currently available. | false |
data.offer.coach |
number | Main coach id. | 4 |
data.offer.establishment |
number | Establishment id. | 29 |
data.offer.credit_price_override |
number | Credit cost configured for this offer. | 1 |
data.offer.waiting_list_max_size |
number | Waiting list maximum size. | 0 |
data.offer.waiting_list_disabled |
boolean | Whether waiting list is disabled. | false |
data.offer.validated_booking_count |
number | Number of validated bookings. | 0 |
data.offer.full |
boolean | Whether offer is full. | false |
data.offer.is_waiting_list_full |
boolean | Whether waiting list is full. | true |
data.offer.manager_only |
boolean | Whether offer is manager-only. | false |
data.offer.allow_guest_offer |
boolean | Whether guests can be booked. | false |
data.offer.broadcast_link |
string | Broadcast link when applicable. | "" |
Example Payload¶
{
"event_type": "offer-update",
"date": 1721639855,
"data": {
"offer": {
"company": 2,
"activity": 492,
"level": 1,
"custom_level": 1,
"available": false,
"coach_override": null,
"coach": 4,
"additional_coaches": [],
"partner_max_booking_count": 0,
"establishment": 29,
"meta_activity": 15,
"credit_price_override": 1,
"credit_price": 1,
"date_start": "2025-12-18T12:36:58+01:00",
"duration_minute": 30,
"effectif": 10,
"establishment_override": null,
"id": 24205,
"recurrence_id": "beb1adc4-a332-4d21-a56f-b9bd57d18b15",
"waiting_list_max_size": 0,
"waiting_list_disabled": false,
"bookings": [],
"booking_options": [],
"meta_activity_color": "",
"tot_slots": 0,
"validated_booking_count": 0,
"full": false,
"is_waiting_list_full": true,
"timezone_name": "Europe/Paris",
"room_blueprint": null,
"coach_payment_rule_id": null,
"available_on_partnership": false,
"manager_only": false,
"whitelist_tags": [],
"blacklist_tags": [],
"group": 177,
"allow_guest_offer": false,
"roll_call_needs_validation": true,
"date_roll_call_last_modified": null,
"name_override": null,
"description_override": null,
"internal_note": null,
"broadcast_link": ""
}
}
}
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:
- Process idempotently by offer id.
- Keep latest state snapshots for offer availability and capacity fields.
Troubleshooting¶
- Event not received: check selected event type and endpoint configuration.
- Capacity mismatch downstream: verify mapping of
effectif,full, and waiting list fields. - Update flood: queue updates asynchronously and apply last-write-wins logic where appropriate.
FAQ¶
Should I rebuild my full schedule from these events?¶
Use these events for incremental sync, and run periodic reconciliation jobs if your business process requires strict consistency.
Is timezone included in payload?¶
Yes. The example includes timezone_name in the offer object.
Notes¶
For formal guarantees on retries, ordering, and signing details, confirm with bsport support before production deployment.