Qu’est-ce qu’un webhook ?
Un webhook est un message automatique envoyé par notre système à une autre application lorsqu’un événement important se produit, par exemple lorsqu’une facture est créée ou annulée.
Vous recevez ces notifications instantanément, ce qui vous permet de réagir en temps réel.
Cela vous permet de :
Synchroniser les factures avec des outils comptables
Déclencher des automatisations
Maintenir des systèmes externes à jour en temps réel
Remarque : Les webhooks nécessitent une configuration technique et ne sont pas des fonctionnalités prêtes à l’emploi. Assurez-vous de disposer de compétences en développement logiciel avant de suivre l’intégralité de ce guide.
Remarque : Les webhooks nécessitent une configuration technique et ne sont pas des fonctionnalités prêtes à l’emploi. Assurez-vous de disposer de compétences en développement logiciel avant de poursuivre ce guide.
Avant de commencer
Pour utiliser les webhooks de factures, vous devez disposer d’un endpoint HTTPS sécurisé (URL) capable de recevoir des requêtes POST contenant des données au format JSON.
Guide étape par étape
Une fois votre endpoint prêt, rendez-vous sur :
https://backoffice.bsport.io/settings/webhookCliquez sur le bouton "Ajouter un Webhook"
Sélectionnez l’événement auquel vous souhaitez vous abonner (types d’événements listés ci-dessous)
Saisissez l’URL vers laquelle le webhook doit envoyer le message
Cliquez sur "Valider"
Votre nouveau webhook est maintenant créé 🎉
(Optionnel) En cliquant sur le bouton "Tester", vous pouvez simuler un événement afin de vérifier que votre webhook fonctionne correctement.
Types d’événements
Vous pouvez vous abonner à différents événements liés au cycle de vie d’une facture:
invoice-finalize– Déclenché lorsqu’une facture est créée et ouverte (finalisée)invoice-revert– Déclenché lorsqu’une facture est annulée (annulation ou remboursement)invoice-pay– Déclenché lorsqu’une facture est entièrement payéeinvoice-dispute– Déclenché lorsqu’une facture fait l’objet d’un litige
Les événements suivants sont obsolètes et ne doivent plus être utilisés :
invoice-createinvoice-update
Payload de l’événement
Chacun de ces événements envoie une payload ayant la même structure, définie ci-dessous.
Vous pouvez également consulter ici la description du JSON Schema de la payload.
Description
Field | Type | Description | Example |
| string |
| |
| number (timestamp) | Horodatage du déclenchement de l’événement |
|
| Object | Détails concernant l’événement et la facture (voir ci-dessous) | - |
|
| Date de l’événement (UTC) | "2025-11-04T09:03:11.653072Z" |
| string (uuid) | Identifiant unique de la facture | "923e2c97-8228-4d42-8a44-1783c70c50a1" |
| string | Statut de la facture ( |
|
| string (date-time) | Date de création de la facture (UTC) |
|
| string (date-time) | Date d’émission de la facture (UTC) |
|
| string (date-time) | Date d’échéance du paiement (UTC) |
|
| string (date-time) | null | Date d’annulation (si annulée) |
|
| string | Devise (ISO 4217 code). |
|
| number (cents) | Montant total de la facture (plus petite unité monétaire) |
|
| number (cents) | Montant restant dû |
|
| number (cents) | Montant déjà payé |
|
| object | Société émettrice |
|
| number | Identifiant unique de la société |
|
| string | Nom de la société |
|
| string | Code pays |
|
| string | Ville |
|
| string | Adresse |
|
| string | Code postal/ZIP |
|
| object | null | Client (Peut être |
|
| number | Identifiant unique du client/membre |
|
| string | Type de client (toujours |
|
| string | Nom complet |
|
| string | Prénom |
|
| string | Nom |
|
| string | Email de contact |
|
| string | Numéro de téléphone |
|
| string | Identifiant officiel (ex : NIF) |
|
| object | Adresse du client |
|
| string | Adresse principale |
|
| string (optional) | Complément d’adresse |
|
| string | Ville |
|
| string | Code Postal |
|
| string | Région |
|
| string | Code pays |
|
| object | Lignes de facture |
|
| number | Nombre de lignes |
|
| array<object> | Liste des lignes de facture |
|
| number | Identifiant unique de la ligne |
|
| string | Nom/description du produit ou service |
|
| number | Quantité achetée |
|
| number (cents) | Prix unitaire TTC |
|
| number (cents) | Prix total TTC avant remise |
|
| number (cents) | Remise appliquée |
|
| number (cents) | Montant final après remise |
|
| object | Détail des taxes |
|
| number (%) | Taux de TVA (ex : 20 = 20 %) |
|
| number (cents) | Montant total de taxe inclus |
|
| number (cents) | Taxe incluse par unité |
|
| string | Type d’élément bsport ( |
|
| string (url) | Lien vers le PDF de la facture |
|
| string (url) | null | Lien vers le reçu de paiement (le cas échéant) |
|
| number | Type de facture : 0=normale, 1=annulation (reverse), 2=avoir, 3=migration |
|
| string (uuid) | null | UUID de la facture originale annulée via celle-ci (le cas échéant) |
|
Exemple
{
"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
}
}
}




