UBL — Universal Business Language — est le standard OASIS qui sous-tend Peppol BIS, EN 16931, ZATCA Phase 2, le profil PINT des EAU, le schema IRP/e-invoice de l'Inde (avec extensions) et plusieurs régimes LATAM. Si votre stratégie e-invoicing ne fait pas la paix avec UBL 2.1, vous allez réimplémenter le même XML encore et encore.
La forme d'une facture UBL
Une facture UBL est un document XML avec trois namespaces principaux : cbc (Common Basic Components — types primitifs comme ID et Amount), cac (Common Aggregate Components — types complexes comme Party et TaxTotal), et le namespace du document lui-même. Chaque document UBL suit le même pattern :
<Invoice
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017</cbc:CustomizationID>
<cbc:ID>INV-2026-0001</cbc:ID>
<cbc:IssueDate>2026-01-15</cbc:IssueDate>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cac:AccountingSupplierParty>...</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>...</cac:AccountingCustomerParty>
<cac:TaxTotal>...</cac:TaxTotal>
<cac:LegalMonetaryTotal>...</cac:LegalMonetaryTotal>
<cac:InvoiceLine>...</cac:InvoiceLine>
</Invoice>Cinq concepts presque toujours mal compris
- TaxTotal vs. LegalMonetaryTotal. Le premier décompose la taxe par taux. Le second est le montant total à payer consolidé. Ne les confondez pas.
- AllowanceCharge peut être une remise ou une majoration — contrôlé par ChargeIndicator (false = remise, true = majoration). Mauvais indicateur → mauvais total.
- Les Endpoint IDs ont besoin d'un attribut scheme (schemeID="0088" etc.). Sans lui, les validateurs renvoient des erreurs cryptiques sur des identifiants manquants.
- Les quantités utilisent un code unité d'UN/CEFACT (EA = chaque, KGM = kilogramme, HUR = heure). "piece" n'est pas une valeur valide.
- Les codes TaxCategory sont UNCL5305 : S = taux standard, Z = taux zéro, E = exonéré, AE = autoliquidation. N'inventez pas de codes.
L'EUStrategy d'Invocie émet du UBL 2.1 conforme à BIS Billing 3.0 — le même XML fonctionne pour les APs Peppol, le profil UAE PINT et tout système qui consomme EN 16931.