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

Source: https://veriport.io/guides/belgium-peppol-e-invoicing-mandate (published 2026-11-09)

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](/tools/peppol-validator) runs all three layers on a file (4 checks a day without an account), in English, [Dutch](/nl/peppol-factuur-controleren) and [French](/fr/valider-facture-peppol). Not tax advice.

- The format: Peppol BIS Billing 3.0, a UBL 2.1 Invoice or CreditNote that follows EN 16931 and the Peppol rules. Structured e-invoicing between Belgian businesses through Peppol since 1 January 2026 (SPF BOSA).
- Three layers, all published: the UBL 2.1 schema, the EN 16931 rules (CEN/TC 434, release 1.3.16), the Peppol BIS rules (OpenPeppol, release 3.0.21). One fatal finding in any layer makes the file invalid, and an access point refuses it.
- The Belgian rule, PEPPOL-COMMON-R043: an identifier under scheme 0208 is a ten-digit enterprise number whose last two digits are 97 minus the first eight modulo 97 (0202239951: 97 − (2022399 mod 97) = 51).
- Belgian practice that no published rule checks (the rates 21, 12 and 6 %, the structured communication +++123/4567/89002+++, an enterprise number that differs from the VAT number) comes from Veriport as warnings, marked `source: "veriport"`, never as a published rule.

## 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](/tools/peppol-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`.

| Layer | Published by | Release | What fails here | Rule ids |
|---|---|---|---|---|
| XML schema | OASIS (UBL 2.1; the schemas the KoSIT configuration ships) | UBL 2.1 | An element out of order, unknown or missing where the schema requires it | `XSD`, with the line |
| EN 16931 | CEN/TC 434, with the European Commission | 1.3.16 | Mandatory terms, the totals arithmetic, the rules of each VAT category, decimals, code lists, UBL syntax restrictions | `BR-*`, `BR-CO-*`, `BR-S-*`, `BR-AE-*` …, `BR-CL-*`, `UBL-CR-*` |
| Peppol BIS Billing 3.0 | OpenPeppol | 3.0.21 | One 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:

```bash
curl -X POST "https://veriport.io/api/v1/einvoice/validate" \
  -H "Content-Type: application/xml" \
  --data-binary @invoice.xml
```

```json
{
  "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.

| Rule | What it says | Fix |
|---|---|---|
| PEPPOL-COMMON-R043 † | A Belgian enterprise number under scheme 0208 whose mod-97 key fails | Copy the number from the customer’s own invoice or Peppol ID: ten digits, no dots, no BE prefix. |
| PEPPOL-EN16931-R003 | Neither 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 level | Join the notes into one. |
| PEPPOL-EN16931-CL008 | An electronic address scheme outside the Peppol list | An e-mail address is not a Peppol address: use 0208 with the enterprise number (or the identifier the customer is registered under). |
| PEPPOL-EN16931-R010 | No buyer electronic address (BT-49) | Give the customer’s Peppol identifier (0208, 9925, 9944 …). |
| BR-CL-23 † | A unit code outside UN/ECE Recommendation 20 | Use C62 (piece), HUR, DAY, KGM …; fatal in Peppol, where XRechnung only warns. |
| XSD † | An element out of order or unknown to UBL 2.1 | Write 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](/tools/peppol-participant-lookup) ([in Dutch](/nl/peppol-id-opzoeken)) 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](/einvoice-api) 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](/tools/peppol-participant-lookup) shows which.

### Can I check a file without an account?

Yes: 4 checks a day per address on the [free validator](/tools/peppol-validator), also in [Dutch](/nl/peppol-factuur-controleren) and [French](/fr/valider-facture-peppol); 5 calls a check by API with a key.

## Read next

- [Free Peppol BIS validator](https://veriport.io/tools/peppol-validator)
- [Peppol participant lookup](https://veriport.io/tools/peppol-participant-lookup)
- [Peppol-factuur controleren (NL)](https://veriport.io/nl/peppol-factuur-controleren)
- [Valider une facture Peppol (FR)](https://veriport.io/fr/valider-facture-peppol)
- [Peppol BIS Billing 3.0 validator by API](https://veriport.io/guides/peppol-bis-billing-3-validator)
- [The e-invoice API](https://veriport.io/einvoice-api)

## Sources

- SPF BOSA — e-invoicing between Belgian businesses, structured (Peppol BIS) since 1 January 2026 — https://efacture.belgium.be/fr (2026-10-28)
- Peppol BIS Billing 3.0 — specification, identifiers, code lists and rules — https://docs.peppol.eu/poacc/billing/3.0/ (2026-10-28)
- Peppol BIS Billing 3.0 release 3.0.21: PEPPOL-EN16931-UBL.sch and the CEN files it ships — https://github.com/OpenPEPPOL/peppol-bis-invoice-3/tree/3.0.21/rules/sch (2026-10-28)
- EN 16931 validation artefacts 1.3.16 (UBL and CII schematron, the business rules BR-*) — https://github.com/ConnectingEurope/eInvoicing-EN16931/releases/tag/validation-1.3.16 (2026-10-28)
- KoSIT validator (the reference validator for XRechnung), release 1.6.3 — https://github.com/itplr-kosit/validator (2026-10-28)
- Peppol SML: participant discovery by U-NAPTR (SHA-256, base32) in the zone participant.sml.prod.tech.peppol.org; CNAME/MD5 names retired 1 February 2026 — https://docs.peppol.eu/edelivery/ (2026-11-08)
- Peppol SMP 1.x: the ServiceGroup of a participant, one ServiceMetadataReference per document type it receives — https://docs.peppol.eu/edelivery/ (2026-11-08)
- Peppol Directory: the business cards that providers publish (name, country, registration date); REST search /search/1.0/json — https://directory.peppol.eu/ (2026-11-08)
