Ir al contenido principal

Cómo configurar y usar webhooks de facturas

Los webhooks de facturas te permiten enviar automáticamente datos de facturas desde bsport a otro sistema (como tu software de contabilidad

¿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

  1. Una vez que tengas tu endpoint listo, visita https://backoffice.bsport.io/settings/webhook.

  2. Haz clic en el botón «Añadir un webhook»

  3. Selecciona el evento al que quieres suscribirte (tipos de evento listados aquí).

  4. Introduce la URL a la que quieres que el webhook envíe el mensaje.

  5. Haz clic en confirmar.

  6. Ya puedes ver tu nuevo webhook creado 🎉.

  7. (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-create

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

event_type

string

"invoice-finalize"

date

number (timestamp)

Marca de tiempo de cuándo se activó el evento

1762246989

data

Object

Detalles sobre el evento y la factura (ver a continuación).

-

data.date

"2025-11-04T09:03:11.653072Z"

data.object.id

string (uuid)

Identificador único de la factura

"923e2c97-8228-4d42-8a44-1783c70c50a1"

data.object.object

string

Tipo de objeto (siempre invoice).

"invoice"

data.object.status

string

Estado de la factura (open, paid, refunded, voided).

"open"

data.object.date_created

string (date-time)

Cuándo se creó la factura (UTC).

"2025-11-04T09:03:06.515219Z"

data.object.date_created

string (date-time)

Cuándo se creó la factura (UTC).

"2025-11-04T09:03:06.515219Z"

data.object.date_issued

string (date-time)

Cuándo se emitió la factura (UTC).

"2025-11-04T09:03:08.225042Z"

data.object.date_due

string (date-time)

Fecha de vencimiento del pago (UTC).

"2025-11-04T09:03:07.292000Z"

data.object.date_cancelled

string (date-time) | null

Cuándo se canceló la factura (si corresponde).

null

data.object.currency

string

Divisa de la factura (código ISO 4217).

"eur"

data.object.total

number (cents)

Importe total de la factura en la unidad más pequeña (p. ej., céntimos).

36665

data.object.amount_due

number (cents)

Importe pendiente en la unidad más pequeña (p. ej., céntimos).

36665

data.object.amount_paid

number (cents)

Importe ya pagado en la unidad más pequeña (p. ej., céntimos).

0

data.object.company

object

Empresa que emite la factura.

{ ... }

data.object.company.id

number

ID único de la empresa. Para conocer el ID de tu empresa, visita esta página del backoffice.

85329

data.object.company.name

string

Nombre de la empresa.

"SaudeViva Portugal"

data.object.company.country

string

Código de país.

"PT"

data.object.company.city

string

Ciudad.

"Lisbon"

data.object.company.address

string

Dirección.

"Rua do Ouro 115"

data.object.company.postal_code

string

Código postal.

"1100-062"

data.object.customer

object | null

Cliente al que se factura (puede ser null para facturas de punto de venta anónimas).

{ ... }

data.object.customer.id

number

ID único del cliente o miembro.

7644312

data.object.customer.type

string

Tipo de cliente (siempre individual aquí).

"individual"

data.object.customer.name

string

Nombre completo.

"Maria Oliveira"

data.object.customer.first_name

string

Nombre.

"Maria"

data.object.customer.last_name

string

Apellido.

"Oliveira"

data.object.customer.email

string

Correo de contacto.

"maria.oliveira77@example.com"

data.object.customer.phone

string

Número de teléfono.

"+351 912 345 678"

data.object.customer.official_document_id

string

Documento de identidad oficial o nacional (puede ser NIF o identificación fiscal).

"PT-19847765"

data.object.customer.address

object

Dirección del cliente.

{ ... }

data.object.customer.address.line1

string

Dirección postal.

"Avenida da Liberdade 202"

data.object.customer.address.line2

string (optional)

Información adicional de la dirección.

"4º Esq."

data.object.customer.address.city

string

Ciudad.

"Lisbon"

data.object.customer.address.postal_code

string

Código postal.

"1250-147"

data.object.customer.address.state

string

Provincia o región.

"Lisboa"

data.object.customer.address.country

string

Código de país.

"PT"

data.object.line_items

object

Contenedor de líneas de factura.

{ ... }

data.object.line_items.line_count

number

Número de líneas de factura.

6

data.object.line_items.data

array<object>

Array de líneas de factura.

[{ ... }, { ... }]

data.object.line_items.data[].id

number

Identificador único de la línea de factura.

2153

data.object.line_items.data[].description

string

Nombre o etiqueta del producto o servicio.

"£100 General Gift Voucher"

data.object.line_items.data[].quantity

number

Número de unidades compradas.

1

data.object.line_items.data[].tax_included_unit_amount

number (cents)

Precio unitario con impuestos incluidos, en céntimos.

10000

data.object.line_items.data[].tax_included_amount

number (cents)

Precio total con impuestos incluidos antes del descuento (quantity * unit_amount).

10000

data.object.line_items.data[].voucher_applied

number (cents)

Descuento o vale aplicado a esta línea, en céntimos.

0

data.object.line_items.data[].line_total

number (cents)

Importe final de la línea tras el descuento, en céntimos.

10000

data.object.line_items.data[].tax_breakdown

object

Detalles del cálculo de impuestos.

{ ... }

data.object.line_items.data[].tax_breakdown.rate

number (%)

Porcentaje del tipo impositivo (p. ej., 20 = 20%).

0

data.object.line_items.data[].tax_breakdown.total_tax

number (cents)

Total de impuestos incluidos en esta línea, en céntimos.

0

data.object.line_items.data[].tax_breakdown.unit_tax

number (cents)

Impuesto incluido por unidad, en céntimos.

0

data.object.line_items.data[].item_type

string

Tipo de artículo de bsport (shop-product, pass, private_pass, consumer_giftcard, refund).

"consumer_giftcard"

data.object.invoice_pdf

string (url)

Enlace al PDF de la factura.

"https://assets.staging.bsport.io/.../invoice-24092226.pdf"

data.object.receipt_pdf

string (url) | null

Enlace al PDF del recibo de pago (si corresponde).

null

data.object.invoice_type

number

Tipo de factura: 0=normal, 1=inversa, 2=nota de crédito, 3=migración.

0

data.object.source_invoice_id

string (uuid) | null

UUID de la factura original cancelada a través de esta (si corresponde).

null

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
}
}
}
¿Ha quedado contestada tu pregunta?