La structure complète d'une facture UBL expliquée étape par étape : de l'en-tête et des parties aux lignes de facture et aux totaux de TVA.
Une facture UBL est composée d'un ensemble fixe de blocs constitutifs. Que vous envoyiez des factures via la plateforme eConnect, via l'API PSB, ou que vous construisiez votre propre intégration : il est très utile de savoir quels éléments contient une facture UBL et dans quel ordre ils se trouvent. Cet article parcourt la structure du début à la fin.
Une UBL Invoice (version 2.1) se compose de quatre zones principales, toujours dans cet ordre :
Au sein de chaque zone principale, les éléments suivent un ordre XML fixe. Cet ordre est prescrit par la norme UBL. Si vous inversez l'ordre, la facture sera rejetée lors de la validation.
Chaque facture commence par une poignée d'éléments obligatoires qui identifient la facture dans son ensemble :
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>F-2026-00042</cbc:ID>
<cbc:IssueDate>2026-03-08</cbc:IssueDate>
<cbc:DueDate>2026-04-07</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
Le CustomizationID indique au destinataire quel profil la facture suit (par exemple NLCIUS ou BIS Billing V3). Le ProfileID identifie le processus métier. Le InvoiceTypeCode indique s'il s'agit d'une facture régulière (380), d'une variante de note de crédit (381) ou d'une facture d'autofacturation (389).
Conseil : eConnect reconnaît automatiquement le profil sur la base du CustomizationID. Vous n'avez rien à configurer de votre côté.
Après l'identification viennent les références optionnelles. La plus courante est le numéro de commande (OrderReference), mais vous pouvez également faire référence à un contrat, un projet ou une facture précédemment envoyée :
<cac:OrderReference>
<cbc:ID>PO-2026-1234</cbc:ID>
</cac:OrderReference>
<cac:ContractDocumentReference>
<cbc:ID>CT-2025-5678</cbc:ID>
</cac:ContractDocumentReference>
Pour les organisations destinataires qui traitent automatiquement les factures (pensez aux grandes entreprises et aux organismes publics), le numéro de commande est souvent obligatoire. Sans numéro de commande, la facture n'est pas acceptée.
De nombreuses factures contiennent un PDF comme pièce jointe visuelle. Celui-ci est intégré sous forme de fichier encodé en base64 dans l'élément AdditionalDocumentReference (EmbeddedDocumentBinaryObject). eConnect peut ajouter automatiquement cette pièce jointe lors de l'envoi.
Qu'un PDF intégré soit affiché dans la plateforme eConnect comme PDF de facture (la vue facture dans le tableau de bord) dépend de la valeur de détection exacte dans ce bloc :
cbc:DocumentDescription = CommercialInvoice (camelCase, sans espace), ouDocumentType = PrimaryImageLe texte « Commercial Invoice » signifie la même chose, mais la détection de la plateforme suit exclusivement le littéral exact ci-dessus. Sans cette balise, le PDF compte comme une pièce jointe ordinaire au lieu de la vue facture. Voir Statuts — facture entrante uniquement XML ou aussi PDF ?.
Une facture UBL comprend au minimum deux parties, et éventuellement une troisième et une quatrième.
L'expéditeur de la facture. Les données obligatoires sont le nom, l'adresse et au minimum un numéro d'identification fiscale (numéro de TVA ou numéro KvK). Aux Pays-Bas, le numéro KvK est l'identifiant Peppol principal :
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0106">12345678</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Kerkstraat 1</cbc:StreetName>
<cbc:CityName>Woerden</cbc:CityName>
<cbc:PostalZone>3441 AB</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>NL</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>NL123456789B01</cbc:CompanyID>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Voorbeeldbedrijf B.V.</cbc:RegistrationName>
<cbc:CompanyID schemeID="0106">12345678</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
Le destinataire de la facture. La structure est identique à celle du fournisseur. Le EndpointID est l'adresse Peppol vers laquelle la facture est routée.
Dans certains cas, il y a des parties supplémentaires :
Ce bloc décrit comment la facture doit être payée. Il contient le mode de paiement (virement, prélèvement), le numéro de compte bancaire et éventuellement une référence de paiement :
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>RF71 2348 2367</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>NL91ABNA0417164300</cbc:ID>
<cbc:Name>Voorbeeldbedrijf B.V.</cbc:Name>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
Le code 30 correspond au virement, 49 au prélèvement automatique, 58 au prélèvement SEPA. La liste de codes complète est définie dans UNCL4461.
Un champ de texte libre dans lequel les conditions de paiement sont décrites. Certains systèmes utilisent également ce champ pour l'escompte (skonto).
Optionnel. Contient la date de livraison et l'adresse de livraison, pertinent pour les livraisons de marchandises.
Avant les totaux de TVA viennent les éventuelles remises ou majorations de facture. Chaque élément a un indicateur (true = majoration, false = remise), un montant et une catégorie de TVA :
<cac:AllowanceCharge>
<cbc:ChargeIndicator>false</cbc:ChargeIndicator>
<cbc:AllowanceChargeReasonCode>95</cbc:AllowanceChargeReasonCode>
<cbc:AllowanceChargeReason>Korting</cbc:AllowanceChargeReason>
<cbc:Amount currencyID="EUR">50.00</cbc:Amount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:AllowanceCharge>
AllowanceCharge peut également apparaître dans l'élément Price d'une ligne de facture, pour montrer la différence entre le prix brut et le prix unitaire net. À ce niveau de prix, une restriction s'applique : seules les remises (ChargeIndicator=false) sont autorisées, pas les majorations. De plus, la règle de validation BR-28 prescrit que le prix brut ne peut pas être négatif. Plus de détails dans l'article sur les majorations et remises.
La TVA est résumée par taux. Chaque taux obtient son propre TaxSubtotal avec la base imposable et le montant de TVA calculé :
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">200.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">42.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
La catégorie de TVA S désigne le taux normal. D'autres codes fréquemment utilisés sont Z (taux zéro), E (exonéré), AE (autoliquidation nationale), K (intracommunautaire) et G (exportation).
La pièce finale de la facture. Ici figurent tous les montants qui constituent ensemble le montant à payer :
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">200.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">242.00</cbc:TaxInclusiveAmount>
<cbc:AllowanceTotalAmount currencyID="EUR">50.00</cbc:AllowanceTotalAmount>
<cbc:PayableAmount currencyID="EUR">242.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
Le calcul est : LineExtensionAmount (somme de tous les montants de ligne) moins AllowanceTotalAmount (remises) plus ChargeTotalAmount (majorations) = TaxExclusiveAmount. Plus la TVA = TaxInclusiveAmount. Moins le montant éventuellement prépayé (PrepaidAmount) = PayableAmount. Ce calcul doit être exactement correct, sinon la validation échoue.
Chaque facture comporte au minimum une ligne. Une ligne contient un numéro de séquence, la quantité facturée, le montant de la ligne, une description de l'article et des informations de TVA :
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="EA">10</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">250.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consultancy-uren maart 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21.00</cbc:Percent>
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID>
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">25.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
Une ligne de facture peut également contenir une remise ou une majoration (via un élément AllowanceCharge imbriqué), faire référence à une ligne de commande, et contenir des informations supplémentaires sur l'article telles que des numéros d'article ou des informations comptables.
Technique : le champ
AccountingCostsur la ligne de facture est souvent utilisé pour transmettre un centre de coûts ou une dimension. Les systèmes destinataires comme AFAS, Unit4 et SAP peuvent lire ce champ pour la comptabilisation automatique. Une application particulière est le Referentiegrootboekschema (RGS) : en incluant un numéro de référence RGS dansAccountingCost, le logiciel comptable du destinataire peut automatiquement comptabiliser le montant sur le compte approprié. Le PSB transporte l'élémentAccountingCostsans modification dans l'UBL.
La force d'une facture UBL réside dans sa cohérence interne. Les totaux de TVA doivent correspondre exactement à la TVA par ligne. Les totaux de facture doivent être exactement la somme des montants de ligne moins les remises plus les majorations. Si un centime est décalé, la facture est rejetée lors de la validation.
eConnect valide automatiquement chaque facture lors de la soumission et fournit un message d'erreur clair en cas d'écarts. Lorsque c'est possible, les petits écarts (comme un champ manquant qui peut être déduit du contexte) sont automatiquement corrigés.
eConnect fournit un message d'erreur clair indiquant quel élément est incorrect. Les causes fréquentes sont des erreurs de calcul dans les totaux de TVA, des champs obligatoires manquants ou des codes invalides. Les petits écarts (comme un champ manquant déductible) sont automatiquement corrigés lorsque c'est possible.
Cela dépend de la façon dont vous facturez. Si vous créez des factures dans la plateforme eConnect, tous les éléments obligatoires sont remplis automatiquement. Lors de la soumission via l'API, vous devez fournir les champs requis vous-même, mais eConnect valide tout et donne un retour clair sur les données manquantes ou incorrectes.
Oui. Chaque ligne de facture a sa propre catégorie de TVA et son propre pourcentage. Dans le bloc TaxTotal, les taux sont automatiquement regroupés en TaxSubtotals séparés. Vous pouvez ainsi combiner sur une seule facture des lignes à 21%, 9%, 0% ou avec une TVA exonérée.
Vous souhaitez mieux comprendre une partie spécifique de la facture ? Les articles ci-dessous approfondissent les scénarios les plus courants.
Conseil : utilisez le validateur eConnect gratuit pour vérifier votre facture avant de l'envoyer. Le validateur vérifie non seulement la structure du schéma, mais aussi toutes les règles de calcul et les listes de codes.
Validez votre facture