Skip to content

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

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

{
  "event_type": "offer-update",
  "date": 1721639855,
  "data": {
    "offer": {}
  }
}

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 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:

  • 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.