PEPPOL BIS Billing 3.0 — the Belgian spec
Belgium's sole choice for its 1 January 2026 mandate, PEPPOL BIS Billing 3.0 is a superset of EN 16931 maintained by OpenPEPPOL AISBL. CIUS Belgium adds about a dozen BOSA-managed national BE-* rules without breaking European interoperability.
PEPPOL BIS Billing 3.0 specification
PEPPOL BIS Billing 3.0 is the evolution of PEPPOL BIS Billing 5A (generation 2.0, 2010-2018), redesigned in 2018 to align on the EN 16931 standard published by CEN in October 2017. For Belgium:
- Specification hierarchy (from broadest to most
restrictive):
- UBL 2.1 (XML syntax, OASIS)
- EN 16931 (European semantics, CEN)
- PEPPOL BIS Billing 3.0 (PEPPOL profile, OpenPEPPOL)
- CIUS Belgium (national rules, BOSA)
- Versioning: OpenPEPPOL releases twice a year (May and November). Belgium automatically adopts the latest version with no local freeze (difference from France, which adds FNFE-MPE validation steps).
- Schematron validation: three stacked layers — EN 16931 (BR-*), PEPPOL (PEPPOL-EN16931-*) and CIUS Belgium (BE-*). The OpenPEPPOL validator applies all three in cascade.
CIUS Belgium — BE-* rules
The CIUS (Core Invoice Usage Specification) Belgium is maintained by BOSA in consultation with the OpenPEPPOL Belgian Authority. It adds about ten national business rules without modifying the semantic model. Main rules:
| Rule | Description | Severity |
|---|---|---|
BE-001 | BT-29 (sender BCE) with schemeID 0208 mandatory if sender country = BE | fatal |
BE-002 | BT-49 (recipient BCE) with schemeID 0208 mandatory if recipient country = BE | fatal |
BE-003 | BT-83 (PaymentID structured communication) in +++NNN/NNNN/NNNNN+++ format if present | warning |
BE-004 | BT-84 (PayeeFinancialAccount/ID) in BE Belgian IBAN format (16 characters) mandatory for SEPA SCT | fatal |
BE-005 | BT-32 (national legal CompanyID) must point to BCE for BE taxable persons | warning |
BE-006 | VAT code AE (reverse charge) with motive art. 51 §2 VAT Code mandatory if sender country = BE and reverse charge | fatal |
BE-007 | BT-3 (InvoiceTypeCode) limited to 380 (commercial invoice), 381 (credit note), 389 (corrective invoice) | fatal |
BE-008 | BT-22 (invoice note) forbidden for B2G > 4 lines (Mercurius limit) | warning |
BE-009 | BT-7 (TaxPointDate) recommended for reverse charge and SDD | info |
BE-010 | BIC code mandatory if PaymentMeansCode = 30 (SEPA credit transfer) | warning |
Reinforced mandatory fields
Beyond the ~30 fields already mandatory in EN 16931, CIUS Belgium reinforces around ten more for the Belgian fiscal and commercial context. Quick dashboard for ERP vendors:
- BT-1 (Invoice number): sequential per VAT number — no gap allowed (recall art. 5 RD No. 1).
- BT-2 (Issue date): must be within 15 days following the operation (art. 4 RD No. 1).
- BT-9 (Due date): mandatory for B2G (Mercurius + Hermes), recommended for B2B.
- BT-83 (Structured communication): very strongly recommended to facilitate bank reconciliation via CODA.
- BT-90 (BIC): mandatory for international SEPA SCT payments (outside BE zone).
- BT-23 (Buyer reference): mandatory for B2G (often the Mercurius/Hermes order number).
- BT-44 (Buyer name): full trading name, matching the BCE/KBO extract.
AS4 transport and eDelivery
Transport is imposed in AS4 via PEPPOL eDelivery, with no legal alternative. Features:
- AS4 OASIS ebMS 3.0 + AS4 profile (Async Push,
Two-way Push), per
OASIS Standard ebms-v3-core-rels-os.zip - SBDH (Standard Business Document Header) UN/CEFACT 1.3 — wraps the UBL Invoice, contains Sender/Receiver PEPPOL ID, DocumentID, ProcessID
- Cipher: AES-128-GCM (recommended) or AES-256-GCM, compliant with PEPPOL eDelivery v4.x
- Signature: XMLDSig RSA-SHA256 (minimum) or RSA-SHA512 (recommended)
- Authentication: X.509 certificate issued by a PEPPOL Authority (PEPPOL CA)
- Receipt: AS4 Receipt RFC 5024, mandatory within 90 seconds of receipt
Full invoice sample
<?xml version="1.0" encoding="UTF-8"?>
<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#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>INV-2026-BE-000412</cbc:ID>
<cbc:IssueDate>2026-05-19</cbc:IssueDate>
<cbc:DueDate>2026-06-18</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
<cbc:BuyerReference>2026-CMD-9821</cbc:BuyerReference>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0473495177</cbc:EndpointID>
<cac:PartyName><cbc:Name>Acme Belgium SA</cbc:Name></cac:PartyName>
<cac:PostalAddress>
<cbc:StreetName>Rue de la Loi 16</cbc:StreetName>
<cbc:CityName>Brussels</cbc:CityName>
<cbc:PostalZone>1000</cbc:PostalZone>
<cac:Country><cbc:IdentificationCode>BE</cbc:IdentificationCode></cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>BE0473495177</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Acme Belgium SA</cbc:RegistrationName>
<cbc:CompanyID schemeID="0208">0473495177</cbc:CompanyID>
</cac:PartyLegalEntity>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0208">0316380841</cbc:EndpointID>
<cac:PartyName><cbc:Name>Bruxelles Economie et Emploi</cbc:Name></cac:PartyName>
<cac:PartyTaxScheme>
<cbc:CompanyID>BE0316380841</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:PaymentMeans>
<cbc:PaymentMeansCode>30</cbc:PaymentMeansCode>
<cbc:PaymentID>+++097/3300/57894+++</cbc:PaymentID>
<cac:PayeeFinancialAccount>
<cbc:ID>BE68539007547034</cbc:ID>
<cac:FinancialInstitutionBranch>
<cbc:ID>BBRUBEBB</cbc:ID>
</cac:FinancialInstitutionBranch>
</cac:PayeeFinancialAccount>
</cac:PaymentMeans>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="EUR">210.00</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="EUR">1000.00</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="EUR">210.00</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="EUR">1000.00</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="EUR">1210.00</cbc:TaxInclusiveAmount>
<cbc:PayableAmount currencyID="EUR">1210.00</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:InvoicedQuantity unitCode="C62">2</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="EUR">1000.00</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Consulting service - May 2026</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>21</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="EUR">500.00</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice> Schematron validation
Three sources of Schematron rules stacked in the official OpenPEPPOL validator:
- EN 16931-BR: 200+ common EU rules (cardinality, VAT sum, currency, date format).
- PEPPOL-EN16931-*: 40+ rules specific to the PEPPOL Billing profile (numbering, type codes, BIC format).
- BE-* (CIUS Belgium): 10 national rules (see table
above). Maintenance by BOSA, GitHub repository
OpenPEPPOL/peppol-bis-invoice-3branch BE.
The official validator is peppol-validation-cli
(Apache 2.0) or its web equivalent on peppol.helger.com.
The SVRL report produced flags the originating layer of each error.