Ir para conteúdo principal

Como configurar e utilizar os Webhooks de fatura

Os webhooks de fatura permitem-te enviar automaticamente dados de faturas do bsport para outro sistema (como o teu software de contabilidade

O que é um webhook?

Um webhook é uma mensagem automática enviada pelo nosso sistema para outra aplicação sempre que acontece algo importante, como quando uma fatura é criada ou revertida. Recebes estas notificações instantaneamente, o que te permite reagir em tempo real.

Isto permite-te:

  • Sincronizar faturas com ferramentas de contabilidade

  • Acionar automações

  • Manter os sistemas externos atualizados em tempo real

Nota: os webhooks requerem uma configuração técnica e não são funcionalidades plug-and-play. Certifica-te de que tens conhecimentos de desenvolvimento de software antes de avançares até ao final deste guia.


Antes de começares

Para utilizar webhooks de fatura, precisas de um endpoint HTTPS seguro (URL) capaz de receber pedidos POST com dados JSON.

Guia passo a passo

  1. Depois de teres o teu endpoint pronto, acede a https://backoffice.bsport.io/settings/webhook.

  2. Clica no botão "Adicionar um webhook"

  3. Seleciona o evento ao qual queres subscrever (tipos de evento indicados aqui).

  4. Introduz o URL para o qual queres que o webhook envie a mensagem.

  5. Clica em confirmar.

  6. Agora podes ver o teu novo webhook a ser criado 🎉.

  7. (Opcional) Ao clicar no botão "Testar", podes simular um evento para confirmar que o teu webhook está a funcionar.


Tipos de eventos

Podes subscrever diferentes eventos relacionados com o ciclo de vida de uma fatura:

  • invoice-finalize – Acionado quando uma fatura é criada e aberta (finalizada).

  • invoice-revert – Acionado quando uma fatura é revertida (cancelada ou reembolsada)

  • invoice-pay – Acionado quando uma fatura é totalmente paga.

  • invoice-dispute – Acionado quando uma fatura é contestada.

Os seguintes eventos de fatura estão obsoletos e, por isso, não devem ser utilizados.

  • invoice-create

  • invoice-update

Payload do evento

Cada um destes eventos envia a mesma estrutura de payload, definida da seguinte forma.

Também podes encontrar aqui a descrição do JSON Schema do payload.

Descrição dos campos

Campo

Tipo

Descrição

Exemplo

event_type

string

"invoice-finalize"

date

número (timestamp)

Timestamp de quando o evento foi acionado

1762246989

data

Objeto

Detalhes sobre o evento e a fatura (ver abaixo).

-

data.date

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

data.object.id

string (uuid)

Identificador único da fatura

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

data.object.object

string

Tipo de objeto (sempre invoice).

"invoice"

data.object.status

string

Estado da fatura (open, paid, refunded, voided).

"open"

data.object.date_created

string (date-time)

Quando a fatura foi criada (UTC).

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

data.object.date_created

string (date-time)

Quando a fatura foi criada (UTC).

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

data.object.date_issued

string (date-time)

Quando a fatura foi emitida (UTC).

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

data.object.date_due

string (date-time)

Data de vencimento do pagamento (UTC).

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

data.object.date_cancelled

string (date-time) | null

Quando a fatura foi cancelada (se aplicável).

null

data.object.currency

string

Moeda da fatura (código ISO 4217).

"eur"

data.object.total

número (cêntimos)

Valor total da fatura na unidade mais pequena (por exemplo, cêntimos).

36665

data.object.amount_due

número (cêntimos)

Valor em dívida na unidade mais pequena (por exemplo, cêntimos).

36665

data.object.amount_paid

número (cêntimos)

Valor já pago na unidade mais pequena (por exemplo, cêntimos).

0

data.object.company

objeto

Empresa que emite a fatura.

{ ... }

data.object.company.id

número

ID único da empresa. Para saberes o ID da tua empresa, acede a esta página do backoffice página.

85329

data.object.company.name

string

Nome da empresa.

"SaudeViva Portugal"

data.object.company.country

string

Código do país.

"PT"

data.object.company.city

string

Cidade.

"Lisbon"

data.object.company.address

string

Morada.

"Rua do Ouro 115"

data.object.company.postal_code

string

Código postal.

"1100-062"

data.object.customer

objeto | null

Cliente a quem é emitida a fatura (pode ser null para faturas anónimas de Ponto de Venda).

{ ... }

data.object.customer.id

número

ID único do cliente/membro.

7644312

data.object.customer.type

string

Tipo de cliente (sempre individual neste caso).

"individual"

data.object.customer.name

string

Nome completo.

"Maria Oliveira"

data.object.customer.first_name

string

Primeiro nome.

"Maria"

data.object.customer.last_name

string

Apelido.

"Oliveira"

data.object.customer.email

string

E-mail de contacto.

"maria.oliveira77@example.com"

data.object.customer.phone

string

Número de telefone.

"+351 912 345 678"

data.object.customer.official_document_id

string

Documento oficial/nacional (pode ser o NIF).

"PT-19847765"

data.object.customer.address

objeto

Morada do cliente.

{ ... }

data.object.customer.address.line1

string

Morada (rua).

"Avenida da Liberdade 202"

data.object.customer.address.line2

string (opcional)

Informação adicional da morada.

"4º Esq."

data.object.customer.address.city

string

Cidade.

"Lisbon"

data.object.customer.address.postal_code

string

Código postal.

"1250-147"

data.object.customer.address.state

string

Estado/região.

"Lisboa"

data.object.customer.address.country

string

Código do país.

"PT"

data.object.line_items

objeto

Contentor das linhas de fatura.

{ ... }

data.object.line_items.line_count

número

Número de linhas de fatura.

6

data.object.line_items.data

array<objeto>

Array de linhas de fatura.

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

data.object.line_items.data[].id

número

Identificador único da linha de fatura.

2153

data.object.line_items.data[].description

string

Nome/etiqueta do produto ou serviço.

"£100 General Gift Voucher"

data.object.line_items.data[].quantity

número

Número de unidades adquiridas.

1

data.object.line_items.data[].tax_included_unit_amount

número (cêntimos)

Preço unitário com imposto incluído, em cêntimos.

10000

data.object.line_items.data[].tax_included_amount

número (cêntimos)

Preço total com imposto incluído antes do desconto (quantity * unit_amount).

10000

data.object.line_items.data[].voucher_applied

número (cêntimos)

Desconto/voucher aplicado a esta linha, em cêntimos.

0

data.object.line_items.data[].line_total

número (cêntimos)

Valor final da linha após o desconto, em cêntimos.

10000

data.object.line_items.data[].tax_breakdown

objeto

Detalhes do cálculo do imposto.

{ ... }

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

número (%)

Percentagem da taxa de imposto (por exemplo, 20 = 20%).

0

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

número (cêntimos)

Imposto total incluído nesta linha, em cêntimos.

0

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

número (cêntimos)

Imposto incluído por unidade, em cêntimos.

0

data.object.line_items.data[].item_type

string

Tipo de artigo bsport (shop-product, pass, private_pass, consumer_giftcard, refund).

"consumer_giftcard"

data.object.invoice_pdf

string (url)

Link para o PDF da fatura.

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

data.object.receipt_pdf

string (url) | null

Link para o PDF do recibo de pagamento (se aplicável).

null

data.object.invoice_type

número

Tipo de fatura: 0=normal, 1=reversão, 2=nota de crédito, 3=migração.

0

data.object.source_invoice_id

string (uuid) | null

UUID da fatura original cancelada através desta (se aplicável).

null

Exemplo

{
"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
}
}
}
Isto respondeu à sua pergunta?