¿Qué es un webhook?
Un webhook es un mensaje automático que nuestro sistema envía a otra aplicación cada vez que ocurre algo importante, como cuando se crea o revierte una factura. Recibes estas notificaciones al instante, lo que te permite reaccionar en tiempo real.
Esto te permite:
Sincronizar facturas con herramientas de contabilidad
Activar automatizaciones
Mantener los sistemas externos actualizados en tiempo real
Nota: Los webhooks requieren configuración técnica y no son funciones listas para usar. Asegúrate de tener conocimientos de desarrollo de software antes de seguir esta guía hasta el final.
Antes de empezar
Para usar webhooks de facturas, debes tener un endpoint HTTPS seguro (URL) capaz de recibir solicitudes POST con datos JSON.
Guía paso a paso
Una vez que tengas tu endpoint listo, visita https://backoffice.bsport.io/settings/webhook.
Haz clic en el botón «Añadir un webhook»
Selecciona el evento al que quieres suscribirte (tipos de evento listados aquí).
Introduce la URL a la que quieres que el webhook envíe el mensaje.
Haz clic en confirmar.
Ya puedes ver tu nuevo webhook creado 🎉.
(Opcional) Al hacer clic en el botón «Probar», puedes simular un evento para comprobar que tu webhook funciona correctamente.
Tipos de eventos
Puedes suscribirte a distintos eventos relacionados con el ciclo de vida de una factura:
invoice-finalize– Se activa cuando se crea y abre una factura (finalizada).invoice-revert– Se activa cuando se revierte una factura (cancelada o reembolsada)invoice-pay– Se activa cuando una factura se paga por completo.invoice-dispute– Se activa cuando una factura es objeto de disputa.
Los siguientes eventos de factura están obsoletos y no deben usarse.
invoice-createinvoice-update
Payload del evento
Cada uno de estos eventos envía la misma estructura de payload, definida a continuación.
También puedes encontrar aquí la descripción del esquema JSON del payload.
Descripción de los campos
Campo | Tipo | Descripción | Ejemplo |
| string |
| |
| number (timestamp) | Marca de tiempo de cuándo se activó el evento |
|
| Object | Detalles sobre el evento y la factura (ver a continuación). | - |
|
|
| "2025-11-04T09:03:11.653072Z" |
| string (uuid) | Identificador único de la factura | "923e2c97-8228-4d42-8a44-1783c70c50a1" |
| string | Tipo de objeto (siempre |
|
| string | Estado de la factura ( |
|
| string (date-time) | Cuándo se creó la factura (UTC). |
|
| string (date-time) | Cuándo se creó la factura (UTC). |
|
| string (date-time) | Cuándo se emitió la factura (UTC). |
|
| string (date-time) | Fecha de vencimiento del pago (UTC). |
|
| string (date-time) | null | Cuándo se canceló la factura (si corresponde). |
|
| string | Divisa de la factura (código ISO 4217). |
|
| number (cents) | Importe total de la factura en la unidad más pequeña (p. ej., céntimos). |
|
| number (cents) | Importe pendiente en la unidad más pequeña (p. ej., céntimos). |
|
| number (cents) | Importe ya pagado en la unidad más pequeña (p. ej., céntimos). |
|
| object | Empresa que emite la factura. |
|
| number | ID único de la empresa. Para conocer el ID de tu empresa, visita esta página del backoffice. |
|
| string | Nombre de la empresa. |
|
| string | Código de país. |
|
| string | Ciudad. |
|
| string | Dirección. |
|
| string | Código postal. |
|
| object | null | Cliente al que se factura (puede ser |
|
| number | ID único del cliente o miembro. |
|
| string | Tipo de cliente (siempre |
|
| string | Nombre completo. |
|
| string | Nombre. |
|
| string | Apellido. |
|
| string | Correo de contacto. |
|
| string | Número de teléfono. |
|
| string | Documento de identidad oficial o nacional (puede ser NIF o identificación fiscal). |
|
| object | Dirección del cliente. |
|
| string | Dirección postal. |
|
| string (optional) | Información adicional de la dirección. |
|
| string | Ciudad. |
|
| string | Código postal. |
|
| string | Provincia o región. |
|
| string | Código de país. |
|
| object | Contenedor de líneas de factura. |
|
| number | Número de líneas de factura. |
|
| array<object> | Array de líneas de factura. |
|
| number | Identificador único de la línea de factura. |
|
| string | Nombre o etiqueta del producto o servicio. |
|
| number | Número de unidades compradas. |
|
| number (cents) | Precio unitario con impuestos incluidos, en céntimos. |
|
| number (cents) | Precio total con impuestos incluidos antes del descuento ( |
|
| number (cents) | Descuento o vale aplicado a esta línea, en céntimos. |
|
| number (cents) | Importe final de la línea tras el descuento, en céntimos. |
|
| object | Detalles del cálculo de impuestos. |
|
| number (%) | Porcentaje del tipo impositivo (p. ej., 20 = 20%). |
|
| number (cents) | Total de impuestos incluidos en esta línea, en céntimos. |
|
| number (cents) | Impuesto incluido por unidad, en céntimos. |
|
| string | Tipo de artículo de bsport ( |
|
| string (url) | Enlace al PDF de la factura. |
|
| string (url) | null | Enlace al PDF del recibo de pago (si corresponde). |
|
| number | Tipo de factura: 0=normal, 1=inversa, 2=nota de crédito, 3=migración. |
|
| string (uuid) | null | UUID de la factura original cancelada a través de esta (si corresponde). |
|
Ejemplo
{
"event_type": "invoice-finalize",
"date": 1762246989,
"data": {
"date": "2025-11-04T09:03:11.653072Z",
"object": {
"id": "923e2c97-8228-4d42-8a44-1783c70c50a1",
"object": "invoice",
"status": "open",
"date_created": "2025-11-04T09:03:06.515219Z",
"date_issued": "2025-11-04T09:03:08.225042Z",
"date_due": "2025-11-04T09:03:07.292000Z",
"date_cancelled": null,
"currency": "eur",
"total": 36665,
"amount_due": 36665,
"amount_paid": 0,
"company": {
"id": 85329,
"name": "SaudeViva Portugal",
"country": "PT",
"city": "Lisbon",
"address": "Rua do Ouro 115",
"postal_code": "1100-062"
},
"customer": {
"id": 7644312,
"type": "individual",
"name": "Maria Oliveira",
"first_name": "Maria",
"last_name": "Oliveira",
"email": "maria.oliveira77@example.com",
"phone": "+351 912 345 678",
"official_document_id": "PT-19847765",
"address": {
"line1": "Avenida da Liberdade 202",
"line2": "4º Esq.",
"city": "Lisbon",
"postal_code": "1250-147",
"state": "Lisboa",
"country": "PT"
}
},
"line_items": {
"line_count": 6,
"data": [
{
"id": 2153,
"description": "£100 General Gift Voucher",
"quantity": 1,
"tax_included_unit_amount": 10000,
"tax_included_amount": 10000,
"voucher_applied": 0,
"line_total": 10000,
"tax_breakdown": {
"rate": 0,
"total_tax": 0,
"unit_tax": 0
},
"item_type": "consumer_giftcard"
},
{
"id": 249955,
"description": "Classic Jumper - Peacoat Navy",
"quantity": 2,
"tax_included_unit_amount": 4500,
"tax_included_amount": 9000,
"voucher_applied": 964,
"line_total": 8036,
"tax_breakdown": {
"rate": 20,
"total_tax": 1339,
"unit_tax": 670
},
"item_type": "shop-product"
},
{
"id": 15305,
"description": "Single 60 Minute Reiki Treatment",
"quantity": 1,
"tax_included_unit_amount": 7500,
"tax_included_amount": 7500,
"voucher_applied": 1384,
"line_total": 6116,
"tax_breakdown": {
"rate": 20,
"total_tax": 1019,
"unit_tax": 1019
},
"item_type": "private_pass"
},
{
"id": 15301,
"description": "Single 60 Minute Session",
"quantity": 1,
"tax_included_unit_amount": 7500,
"tax_included_amount": 7500,
"voucher_applied": 1383,
"line_total": 6117,
"tax_breakdown": {
"rate": 20,
"total_tax": 1019,
"unit_tax": 1019
},
"item_type": "private_pass"
},
{
"id": 427448,
"description": "Newbies",
"quantity": 1,
"tax_included_unit_amount": 4900,
"tax_included_amount": 4900,
"voucher_applied": 904,
"line_total": 3996,
"tax_breakdown": {
"rate": 20,
"total_tax": 666,
"unit_tax": 666
},
"item_type": "pass"
},
{
"id": 427451,
"description": "1 Session",
"quantity": 1,
"tax_included_unit_amount": 2500,
"tax_included_amount": 2500,
"voucher_applied": 100,
"line_total": 2400,
"tax_breakdown": {
"rate": 20,
"total_tax": 400,
"unit_tax": 400
},
"item_type": "pass"
}
]
},
"invoice_pdf": "https://assets.staging.bsport.io/invoices/2025-11-04/5cab7c93-cd01-4d15-9362-46b0a89919b5/invoice-24092226.pdf",
"receipt_pdf": null,
"invoice_type": 0,
"source_invoice_id": null
}
}
}




