Billing plan 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 Billing Plan webhook sends an event when a subscription billing plan is created or updated. It is used to synchronize subscription state, billing schedule changes, and payment configuration with external systems.
Who It Is For¶
- Teams syncing subscription lifecycle into finance or CRM tools.
- Operations teams managing pauses, renewals, and payment method changes.
- Support teams troubleshooting recurring billing behavior.
Supported Events¶
billing_plan-create: sent when a member subscribes to a contract.billing_plan-update: sent when an existing billing plan changes.
Common billing_plan-update triggers include:
- Pause or resume actions.
- Cancellation updates.
- Payment method changes.
- Plan-level billing schedule updates.
Inspect an existing registration¶
- Open
https://backoffice.bsport.io/settings/webhook. - Locate the existing billing plan registration.
- Verify its event and destination before planning the migration.
Do not create a new Back Office registration. New integrations must use the Public API event catalogue; billing plan events are not yet available there.
Payload Envelope¶
Data Fields¶
| Field | Type | Description | Example |
|---|---|---|---|
event_type |
string | Billing plan webhook event name. | "billing_plan-update" |
date |
number | Unix timestamp when event was emitted. | 1721640025 |
data.billing_plan.id |
number | Billing plan unique id. | 1 |
data.billing_plan.member |
number | Member id owning the billing plan. | 32 |
data.billing_plan.contract |
number or null | Contract template id used for subscription. | null |
data.billing_plan.name |
string | Billing plan display name. | "Suscripcion ilimitada - 5 meses : Kiko Femenia" |
data.billing_plan.status |
number | Current plan status code. | 1 |
data.billing_plan.payment_method |
number or string | Payment method code used for billing. | 0 |
data.billing_plan.payment_method_identifier |
number | Payment method identifier in payment layer. | 1 |
data.billing_plan.recurrent_price |
string | Recurring amount configured. | "40.00" |
data.billing_plan.first_billing_date |
string (date-time) | First billing datetime. | "2020-08-17T08:36:22.879330Z" |
data.billing_plan.next_billing_date |
string (date-time) | Next planned billing datetime. | "2020-08-17T08:36:22.879330Z" |
data.billing_plan.auto_renewal |
boolean | Whether plan auto renews. | false |
data.billing_plan.planned_invoices |
array | Planned invoice schedule details. | [{...}] |
data.billing_plan.pauses |
array | Pause periods configured on plan. | [] |
data.billing_plan.has_discount |
boolean | Whether a discount is active on the plan. | false |
data.billing_plan.month_billing_day |
number or null | Fixed monthly billing day when applicable. | null |
data.billing_plan.memberArchived |
boolean | Whether related member is archived. | false |
Common nested fields:
planned_invoices[]:uuid,id,date,status,price,billing_plan,name,contract,payment_method,member,is_last_invoice_before_scheduled_stop,amount_due_cts,reverted,invoice_legal_identifierpauses[]:date_created,date_ended,id,days,name,first_paused_planned_invoice,billing_plan,creator_staff_name,from_date,until_date,version,contract_pause
Example Payload¶
{
"event_type": "billing_plan-update",
"date": 1721640025,
"data": {
"billing_plan": {
"id": 1,
"name": "Suscripcion ilimitada - 5 meses : Jane Doe",
"name_without_member_name": "Suscripcion ilimitada",
"member": 32,
"memberName": "Jane Doe",
"legal_contract": "",
"contract": null,
"description": "Nueva oferta ilimitada",
"interval": "month",
"recurrence_basis": 1,
"nb_interval": 5,
"recurrent_price": "40.00",
"payment_method": 0,
"payment_method_identifier": 1,
"payment_engine": 1,
"stripe_payment_method_id": "",
"canceled_at": null,
"date_created": "2020-08-17T10:36:23.379794+02:00",
"first_billing_date": "2020-08-17T08:36:22.879330Z",
"next_billing_date": "2020-08-17T08:36:22.879330Z",
"has_ended": false,
"editable": true,
"planned_invoices": [
{
"uuid": "b09bcd48-f030-4aa0-af96-50dc9d729447",
"id": 1,
"date": "2020-08-17T10:36:22.879330+02:00",
"status": 2,
"price": 40,
"billing_plan": 1,
"name": "Suscripcion ilimitada - 5 meses : Jane Doe",
"contract": null,
"payment_method": "0",
"member": 32,
"is_last_invoice_before_scheduled_stop": false,
"amount_due_cts": "0.00",
"reverted": false,
"invoice_legal_identifier": ""
}
],
"pauses": [
{
"date_created": "2022-10-05T06:10:38.431051-04:00",
"date_ended": "2022-10-20T06:10:38.428676-04:00",
"id": 21751,
"days": 15,
"name": "Pause",
"first_paused_planned_invoice": null,
"billing_plan": 24200,
"creator_staff_name": "Stadd",
"from_date": "2022-12-09",
"until_date": "2022-12-23",
"version": "v2",
"contract_pause": 146
}
],
"auto_renewal": false,
"payment_pack": 4,
"is_v2": true,
"private_pass": null,
"payment_combo": null,
"flat_fee": "0.00",
"started_at": "2020-08-17T10:36:27.117989+02:00",
"status": 1,
"note": "",
"stop_note": "",
"memberArchived": false,
"contract_terms_date_accepted": null,
"contract_terms_pdf_link": null,
"month_billing_day": null,
"has_discount": false,
"member_relation_auto_share": false,
"has_changed_after_renewal": false,
"nb_interval_after_auto_renewal": 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:
- Handle events idempotently by billing plan id.
- Keep historical snapshots for state transitions and pause windows.
- Reconcile planned invoices periodically if your finance process is strict.
Troubleshooting¶
- Missing event: verify exact event type selection in Back Office.
- Unexpected status changes: review pause and planned invoice nested arrays.
- Payment method mismatch: validate both
payment_methodandpayment_method_identifiermappings.
FAQ¶
Does one update event represent many business changes?¶
Yes. billing_plan-update can represent multiple kinds of changes, including pauses, cancellation, and payment-related updates.
Should I depend only on one status field?¶
No. Use status together with billing dates, pause windows, and planned invoices to interpret billing lifecycle accurately.