Belgium’s e-invoicing mandate: what a Peppol BIS 3.0 invoice must pass

Since 1 January 2026, invoices between Belgian businesses are structured e-invoices exchanged over Peppol, in the Peppol BIS Billing 3.0 format (SPF BOSA; who is in scope, and the exceptions, are on its page, linked below). Before an access point sends such a file, it has to pass three published layers of checks: the UBL 2.1 XML schema, the CEN EN 16931 business rules (release 1.3.16) and OpenPeppol’s PEPPOL-EN16931-UBL rules (release 3.0.21). Belgium adds no national rule set; the one Belgian rule in the release is PEPPOL-COMMON-R043, the enterprise number under scheme 0208. This guide says what each layer checks, which failures are common on Belgian files, and how to check the recipient before sending. The free validator runs all three layers on a file (4 checks a day without an account), in English, Dutch and French. Not tax advice.

What the mandate asks of the file

The mandate fixes the channel and the format: the invoice travels over the Peppol network, through access points, as a Peppol BIS Billing 3.0 document. Peppol BIS Billing 3.0 is a CIUS of the European norm EN 16931: the norm’s semantic model (BT-* business terms, BG-* groups) written in UBL 2.1, narrowed by OpenPeppol’s rules. A credit note is a UBL CreditNote under the same specification.

A Belgian business is addressed on Peppol by its enterprise number under scheme 0208; Belgian providers also register the VAT number under scheme 9925, and the participant lookup asks under both. POST https://veriport.io/api/v1/einvoice/create writes 0208 and the enterprise number as the electronic address of a Belgian party (BT-34, BT-49) when you give none.

Who must comply, from which date for which business, the exceptions and the penalties are legal questions this guide does not restate: the SPF BOSA page in the sources is the reference, and your accountant the adviser.

The three layers, in order

The report names the layer of each finding in its source field: schema, cen-ubl or peppol-ubl.

LayerPublished byReleaseWhat fails hereRule ids
XML schemaOASIS (UBL 2.1; the schemas the KoSIT configuration ships)UBL 2.1An element out of order, unknown or missing where the schema requires itXSD, with the line
EN 16931CEN/TC 434, with the European Commission1.3.16Mandatory terms, the totals arithmetic, the rules of each VAT category, decimals, code lists, UBL syntax restrictionsBR-*, BR-CO-*, BR-S-*, BR-AE-* …, BR-CL-*, UBL-CR-*
Peppol BIS Billing 3.0OpenPeppol3.0.21One note at most, a buyer or order reference, electronic addresses, Peppol code lists, identifier checks, national rule sets (none for Belgium)PEPPOL-EN16931-R*, -CL*, PEPPOL-COMMON-R*

The one Belgian rule: PEPPOL-COMMON-R043

PEPPOL-COMMON-R043 is a common rule: it applies to any identifier written under scheme 0208, typically the electronic address of a Belgian seller or buyer (BT-34, BT-49) and its legal registration identifier. The enterprise number has ten digits; the last two are a mod-97 key of the first eight. For 0202239951: 2022399 mod 97 = 46, 97 − 46 = 51, the last two digits. Dots and the BE prefix of the VAT number do not belong in a 0208 identifier.

A mistyped digit breaks the key, and the report points to the element by XPath:

curl — validate a file (no key: 4 checks a day per address)
curl -X POST "https://veriport.io/api/v1/einvoice/validate" \
  -H "Content-Type: application/xml" \
  --data-binary @invoice.xml
200 OK — a document breaking PEPPOL-COMMON-R043
{
  "valid": false,
  "profile": "peppol-bis",
  "format": "peppol-bis",
  "syntax": "ubl",
  "container": "xml",
  "errors": [
    {
      "rule": "PEPPOL-COMMON-R043",
      "severity": "fatal",
      "path": "/ubl:Invoice/cac:AccountingSupplierParty/cac:Party/cbc:EndpointID",
      "message": "Belgian enterprise number MUST be stated in the correct format.",
      "source": "peppol-ubl"
    }
  ],
  "warnings": []
}

Common failures on Belgian files

The failures the validator pages list, plus the missing buyer address. The four marked † are the broken documents of the evidence run (2026-10-28): the KoSIT validator and this one rejected each of them, naming the same rule.

RuleWhat it saysFix
PEPPOL-COMMON-R043 †A Belgian enterprise number under scheme 0208 whose mod-97 key failsCopy the number from the customer’s own invoice or Peppol ID: ten digits, no dots, no BE prefix.
PEPPOL-EN16931-R003Neither a buyer reference (BT-10) nor a purchase order reference (BT-13)Give one of them: the customer’s reference, or its order number.
PEPPOL-EN16931-R002 †More than one note at document levelJoin the notes into one.
PEPPOL-EN16931-CL008An electronic address scheme outside the Peppol listAn e-mail address is not a Peppol address: use 0208 with the enterprise number (or the identifier the customer is registered under).
PEPPOL-EN16931-R010No buyer electronic address (BT-49)Give the customer’s Peppol identifier (0208, 9925, 9944 …).
BR-CL-23 †A unit code outside UN/ECE Recommendation 20Use C62 (piece), HUR, DAY, KGM …; fatal in Peppol, where XRechnung only warns.
XSD †An element out of order or unknown to UBL 2.1Write the elements in the order of the UBL schema; the report gives the line.

Belgian practice, checked as warnings

The Peppol release does not check Belgian VAT practice. The validator adds its own checks, reported as warnings with source: "veriport" so they are never mistaken for a published rule:

  • VP-BE-004: a Belgian rate other than 21, 12 or 6 %.
  • VP-BE-002: a structured communication (+++123/4567/89002+++) whose mod-97 key fails: twelve digits, the last two the first ten modulo 97 (97 for 0).
  • VP-BE-012: a seller enterprise number under 0208 that differs from the digits of its Belgian VAT number.

Check the recipient before sending

A valid file arrives only if the customer is registered on Peppol and receives Billing 3.0 invoices. The Peppol participant lookup (in Dutch) asks the network the way an access point does: the SML (zone participant.sml.prod.tech.peppol.org, U-NAPTR, the lookup Peppol has required since 1 November 2025) for the registration and the provider, the provider’s SMP for the documents the customer receives, the Peppol Directory for its registered name. A registration made today can take up to a day to reach every DNS resolver.

Checked against the reference validator

The evidence run of 2026-10-28 wrote ten Belgian cases through the API (a 21 % invoice, the franchise scheme of article 56bis, a credit note naming the corrected invoice, 21, 12 and 6 % in one invoice, the EU reverse charge, an intra-Community supply, the domestic reverse charge on works on immovable property, an exempt operation of article 44, a document-level allowance and charge, order and contract references without a buyer reference) and ran them through the KoSIT validator configured with the UBL 2.1 schema, the CEN rules and PEPPOL-EN16931-UBL 3.0.21: 10 of 10 Peppol files accepted. The product page publishes the table and the tool versions.

What a file check does not do

It does not send: transmission needs a certified Peppol access point, which may also check the envelope (SBDH) and the recipient’s registration. It does not decide the content: the VAT category, the rate and the exemption reason are the seller’s decision. It does not keep the file: the check runs in memory.

Questions

Does Belgium add its own rules to Peppol BIS?
Not as a rule set: release 3.0.21 carries national rule sets for other countries (DE-R, NL-R, NO-R …) and none for Belgium. The Belgian specific is PEPPOL-COMMON-R043, a common rule that applies to every Peppol file carrying a 0208 identifier.
Is a valid file enough to comply?
It is necessary, not sufficient: the file must also travel over Peppol, through an access point, to a recipient registered for Billing 3.0 invoices, and its content (VAT category, rate, exemption reason) is your decision. Not tax advice.
Enterprise number or VAT number as the Peppol address?
Belgian providers register the enterprise number under 0208 and the VAT number under 9925; the API writes the 0208 form by default. Send to the identifier the customer is registered under: the lookup shows which.
Can I check a file without an account?
Yes: 4 checks a day per address on the free validator, also in Dutch and French; 5 calls a check by API with a key.

4 checks a day without an account: the three layers, every finding with its rule id and XPath.

Check a Belgian Peppol file

Sources