---
title: "Belgium · Peppol BIS compliance"
description: "Belgian e-invoicing on Peppol BIS Billing 3.0: B2B mandate live since 1 January 2026, Mercurius public-sector hub, BE-CIUS profile, error codes. HERMES was decommissioned on 2025-12-31 — Belgium is now pure Peppol."
canonical: "https://docs.get-flowie.com/compliance/be"
source: "https://docs.get-flowie.com/compliance/be.html"
---

# Belgium · Peppol BIS compliance

Compliance · 🇧🇪 Belgium

# Belgium — pure Peppol since 2026-01-01

Belgium runs no central regulator hub for B2B e-invoicing. The Peppol delivery **is** the compliance event. Flowie is a registered Peppol Access Point (national ID `be:flowie`) — directly, or via a specialized local partner where in-country presence is required — and your stack does not need a separate reporting integration.

⚠️ What changed — HERMES decommissioned 2025-12-31

If you previously wired Flowie's `HERMES` compliance reporter or filtered `compliance.reported` webhooks on `platform == "HERMES"`, that path is gone. The Belgian Federal Public Service Finance (FPS Finance / SPF Finances) shut HERMES down on **2025-12-31** after the July 2024 Business Experts Group review concluded the private Peppol Access Point market was mature enough to make the temporary government bridge unnecessary. Consultation-only access expired **2026-03-31**.

Going forward: send Belgian invoices over Peppol with the BE-CIUS profile, full stop. No `compliance.reported` events fire for BE. See [Migration](<#migration>) below for the exact code changes.

## TL;DR

  * Belgium uses the **4-corner Peppol model** — no central hub for B2B.
  * **B2B mandate live since 2026-01-01** : structured invoices in Peppol BIS Billing 3.0 with the BE-CIUS profile, exchanged corner-to-corner over Peppol.
  * **B2G** still routes through **Mercurius** (the federal public-sector hub), mandatory since 2017.
  * **HERMES is gone** (decommissioned 2025-12-31). Belgian invoices have **no platform-side compliance report** — the Peppol exchange is the compliance.
  * Flowie auto-publishes Belgian companies to the Peppol SMP. Set `settings.autoCompliance.BE = false` to opt out.



## What changed — the HERMES retirement

HERMES was a free, government-operated bridge run by FPS Finance that let small businesses send structured invoices to public-sector buyers (and, in its later iteration, was scheduled to act as a B2B reporting hub). It was always positioned as a _temporary_ bridge until the private Peppol Access Point market matured.

Date| Event| Source  
---|---|---  
2024-02-06| Belgium adopts the B2B e-invoicing law (Loi du 6 février 2024).| [Loi du 6 février 2024 (Moniteur belge)](<https://etaamb.openjustice.be/fr/loi-du-06-fevrier-2024_n2024001635.html>)  
2024-07| Business Experts Group reassesses HERMES and recommends decommissioning — private Peppol AP market deemed mature.| [efacture.belgium.be (FPS Finance)](<https://efacture.belgium.be/fr/article/pour-qui-la-facturation-electronique-deviendra-t-elle-obligatoire>)  
**2026-01-01**|  B2B mandate goes live: all domestic B2B taxable transactions must use structured e-invoicing over Peppol.| [OpenPeppol · Belgium](<https://peppol.org/learn-more/country-profiles/belgium/>)  
**End of 2025** (per FPS Finance)| HERMES **send** path decommissioned.| [HERMES portal · official notice](<https://hermes-belgium.be/hermeslogin?lang=fr>)  
**2026-03-31**|  HERMES consultation-only window closes. Platform fully offline.| [HERMES portal · official notice](<https://hermes-belgium.be/hermeslogin?lang=fr>)  
  
## Timeline 2017 → 2028

Date| Who| What  
---|---|---  
2017-01-01| All BE businesses| Federal B2G via Mercurius (live, still in force).  
2024-02-06| Legislators| Loi du 6 février 2024 enacted (B2B mandate).  
2025-12-31| FPS Finance| HERMES send-path decommissioned.  
**2026-01-01**|  Domestic B2B taxable transactions| Mandatory structured e-invoicing over Peppol BIS 3.0 (BE-CIUS).  
2026-03-31| FPS Finance| HERMES consultation window closes.  
2028-01-01 indicative| All B2B| Continuous transaction control (CTC) under EU ViDA timeline. Final Belgian implementation TBD; expect near-real-time reporting of invoice header data to FPS Finance.  
  
## The 4-corner Peppol model

Unlike France's PPF or Italy's SDI, Belgium does **not** route invoices through a central regulator. Every business connects to a Peppol Access Point (Flowie is one), and invoices flow corner-to-corner:
[code] 
    ┌─────────────┐     ┌────────────┐    ┌──────────────┐    ┌────────────────┐
    │  Sender ERP │ →→→ │ Sender AP  │ →→ │ Recipient AP │ →→ │ Recipient ERP  │
    │             │     │  (Flowie)  │    │ (any Peppol) │    │                │
    └─────────────┘     └────────────┘    └──────────────┘    └────────────────┘
                              ↓
                  [discovers recipient via SMP]
[/code]

There's no parallel leg to a regulator hub. The compliance trail you keep is your own: the Peppol Message Level Status (MLS) you receive back from the recipient AP, the lifecycle events you record in Flowie, and your accounting system. That's the audit trail if you're ever audited by FPS Finance.

## BE-CIUS profile — what's specific to Belgium

Belgium uses Peppol BIS Billing 3.0 with a Core Invoice Usage Specification (CIUS) that adds these constraints on top of the European core (EN 16931):

  * **BTW number is mandatory** on both seller and buyer for all B2B (BE BIS rule `BR-BE-01`).
  * **OGM-VCS structured communication** on payments must follow the format `+++NNN/NNNN/NNNNN+++` when present, with valid mod-97 checksum.
  * **Embedded human-readable PDF** allowed via `document.attachments[]` for accounts-payable workflows. Optional, but widely expected.
  * **VAT exempt categories** must reference the BTW article (e.g. category code `"E"` with `"Article 39 BTW"` in the exemption reason).
  * **VAT category`K`** (intra-Community supply) is rejected when both seller and buyer are Belgian — the transaction is domestic, not intra-EU.



## Required fields for Belgian invoices

  * seller.vatNumberrequired

Format `BE0123456789` (10 digits after `BE`). Flowie validates against the [KBO/BCE registry](<https://kbopub.economie.fgov.be/>) on company creation.

  * buyer.vatNumberrequired for B2B

Same format. For B2C, omit `buyer.vatNumber` and Flowie skips the BE-BIS B2B rules.

  * payment.referencestringoptional, validated when present

If used, must be OGM-VCS format. Flowie validates the mod-97 check-digit and rejects with `BR-BE-02` on bad checksum.

  * document.lines[].vatCategoryrequired

Standard Peppol categories (`S`, `Z`, `E`, `AE`, `K`, `G`, `O`, `L`, `M`); BE rejects `K` if both parties are BE.

  * document.noteoptional

For B2G, set the public-sector contract reference here.




## Mercurius — federal B2G hub

Mercurius is the only Belgian regulator-side hub still in scope. For Belgian federal, regional, and local public buyers, the recipient is **always** Mercurius. The Peppol ID looks like:
[code] 
    9925:BE-mercurius-<OVO-number>
[/code]

Look up the OVO number for any public entity in the [Mercurius portal](<https://mercurius.bosa.be>), or query Flowie's directory:
[code] 
    curl https://back.p2p-flowie.com/exchange/v1/directory/search?country=BE&naceCodes=8411 \
      -H "Authorization: Bearer $FLOWIE_KEY"
[/code]

## Sending a Belgian invoice — end-to-end

The same `POST /v1/documents/send` works for BE; nothing extra to wire compared to a generic Peppol send. Flowie applies the BE-CIUS validation when both VAT numbers start with `BE`:
[code] 
    curl -X POST https://back.p2p-flowie.com/exchange/v1/documents/send \
      -H "Authorization: Bearer $FLOWIE_KEY" \
      -H "Content-Type: application/json" \
      -H "Idempotency-Key: inv-be-2026-0451" \
      -d '{
        "type": "invoice",
        "from": "comp_be_acme",
        "to":   "0208:0123456789",
        "document": {
          "number":    "INV-2026-0451",
          "issueDate": "2026-04-30",
          "dueDate":   "2026-05-30",
          "currency":  "EUR",
          "buyer":     { "vatNumber": "BE0987654321" },
          "lines": [{
            "description": "Consulting — April 2026",
            "quantity": 10, "unit": "hours",
            "unitPrice": 150.00,
            "vatCategory": "S", "vatRate": 21
          }],
          "payment": {
            "reference": "+++123/4567/89000+++",
            "iban": "BE68 5390 0754 7034"
          }
        }
      }'
[/code]

Response: a `document.sent` webhook fires when the recipient AP confirms receipt. No `compliance.reported` event will follow — that's intentional now.

## Lifecycle on Belgian invoices

You can still call `POST /v1/documents/{id}/lifecycle` on Belgian invoices to record `approved`, `rejected`, `paid`, etc. — Flowie keeps the audit trail and emits `lifecycle.updated` webhooks. The difference vs France/Italy:

Country| Lifecycle update emits| Compliance report  
---|---|---  
🇫🇷 France| `lifecycle.updated` \+ `compliance.reported` (PPF)| Yes — Flowie reports to PPF  
🇮🇹 Italy| `lifecycle.updated` \+ `compliance.reported` (SDI)| Yes — Flowie reports to SDI  
🇧🇪 Belgium| `lifecycle.updated` only| **No** — Peppol delivery is the compliance  
  
If your code paths branch on `compliance.reported` for Belgium, treat the absence of that event as the success signal — the lifecycle update completing is the only thing you need.

## Validation errors

BE-CIUS validation runs in Flowie before the invoice ever leaves the access point. The codes you see come from the standard Peppol BIS Billing 3.0 validator artifacts (EN 16931 business rules + the BE-CIUS schematron). The full ruleset is large — the table below highlights the rules most BE integrations hit.

Rule family| What it checks| Where it surfaces  
---|---|---  
`BR-CO-*`| EN 16931 cross-line totals: line nets, document totals, VAT breakdowns must reconcile.| `422 Unprocessable Entity` on `POST /v1/documents/send` or `/validate`. Check `error.details[]` for the failing rule code and the offending XPath.  
`BR-BE-*`| BE-CIUS additions: BTW required on B2B parties, OGM-VCS structured-communication checksum, allowed VAT categories.| Same — synchronous `422`. Specific code names depend on the BE-CIUS schematron version Flowie ships; the response body always carries the rule code, the human description, and the XPath.  
VAT lookup| Seller / buyer BTW number active in KBO/BCE.| Caught at `POST /v1/companies` (company creation) — bad VATs never reach the send path.  
`MERC-*`| Mercurius B2G acceptance — OVO number recognised, schema accepted.| `document.failed` webhook with `errorCode` set, after the Peppol delivery hop.  
  
Validation moved from regulator to send-time

Before HERMES retired, schematron failures on Belgian invoices surfaced as deferred `compliance.reported.failed` webhooks. Today the same checks run locally before the invoice leaves Flowie — failures are `422`s on the synchronous `POST /v1/documents/send` response, with the validator's own rule code in `error.details[].code`. Faster feedback, no extra event-handling glue. 

## Testing your Belgian integration

Use the [sandbox host](<../sandbox/index.html>) with a `flw_test_…` key. Two reproducible tests cover the cases most integrators care about:

What you want to test| How  
---|---  
BE happy path (B2B)| Sender VAT `BE0000000001`, recipient `0208:TEST_OK`, both VATs populated. `document.sent` \+ `document.delivered` webhooks fire; **no** `compliance.reported`.  
Mercurius B2G send| Recipient `9925:BE-mercurius-99999`. Same response shape as a private recipient.  
Recipient unreachable| Recipient `0208:TEST_AP_FAIL` → `document.failed` webhook with `RECIPIENT_UNREACHABLE`.  
Validation rejection| Send with a deliberately broken UBL (e.g. mismatched line totals) → `422` on the synchronous response. The exact rule code comes from the BE-CIUS schematron and varies by validator version.  
  
For exhaustive negative testing of the validator, use `POST /v1/documents/validate` — it runs every BE-CIUS rule and returns the full `error.details[]` without attempting Peppol delivery.

## Migration: HERMES → Peppol

If your stack assumed Flowie would auto-report Belgian invoices to HERMES, here's the diff:

Used to| Now  
---|---  
Listen for `compliance.reported` with `data.platform == "HERMES"`| Drop the listener for BE. The event no longer fires.  
Branch on `data.platform == "HERMES"` in your webhook router| Remove the branch. `compliance.reported` only fires for FR (PPF) and IT (SDI).  
Set `settings.autoCompliance.HERMES` on a BE company| Field accepted but a no-op; remove on next config refresh.  
Filter `GET /v1/compliance/reports?platform=HERMES`| Returns historical rows only. New BE invoices won't add rows here.  
Reject-handling on `HER-001` / `HER-002` / `HER-007`| Move the equivalent reject-handling onto the synchronous `422` response from `POST /v1/documents/send`. Read `error.details[].code` (BE-CIUS schematron rule) and `error.details[].xpath` (where in the UBL it failed).  
  
The `compliance_reports` table itself keeps historical HERMES rows for audit — they're never deleted, they just stop being created.

## FAQ

### Do I need to register with anything new?

No. Flowie publishes BE companies to the Peppol SMP automatically (the same registration that already let you send Peppol invoices anywhere in Europe). There is no successor to HERMES.

### Can I keep using paper invoices for B2C?

Yes. The 2026-01-01 mandate is B2B only. B2C remains free format until further notice.

### What about the SME exemption?

No exemption — the mandate covers **all** B2B taxable transactions regardless of company size, which is unusual for Europe. Plan accordingly.

### Is the BLOB-embedded PDF required?

No, it's optional. But many recipients still prefer a human-readable rendering for accounts payable. Flowie generates it automatically when you send JSON.

### What about CTC (continuous transaction control) in 2028?

The federal government has signalled intent to align with the EU ViDA timeline (CTC by 2028) but no concrete Belgian regulation exists yet. When it lands, Flowie will surface it as a regulator-side leg again — same shape as PPF/SDI today. We'll announce in the [changelog](<../changelog.html>).

### I had `HERMES_REPORT_URL` in my env. What now?

You can remove it. Flowie no longer reads `HERMES_REPORT_URL` or `HERMES_REPORT_TOKEN` — the corresponding adapter has been deleted. Leaving the variables set is harmless but unused.

## References

**Primary sources** (Belgian government & EU regulator):

  * [efacture.belgium.be](<https://efacture.belgium.be/fr/article/pour-qui-la-facturation-electronique-deviendra-t-elle-obligatoire>) — official Belgian e-invoicing portal (`belgium.be`); scope of the 2026-01-01 B2B mandate, exemptions, FAQ for taxpayers.
  * [Loi du 6 février 2024](<https://etaamb.openjustice.be/fr/loi-du-06-fevrier-2024_n2024001635.html>) — full text of the Belgian e-invoicing law (NUMAC `2024001635`), as published in the _Moniteur belge_ on 2024-02-20. Modifies the VAT Code and Income Tax Code 1992.
  * [eJustice · official Moniteur belge entry](<https://www.ejustice.just.fgov.be/cgi/article.pl?language=fr&sum_date=2024-02-20&numac_search=2024001635>) — authoritative Belgian government version of the law.
  * [HERMES portal](<https://hermes-belgium.be/hermeslogin?lang=fr>) — official portal carrying the FPS Finance decommissioning notice (consultation-only access closed 2026-03-31).
  * [EU Commission · eInvoicing in Belgium](<https://ec.europa.eu/digital-building-blocks/sites/spaces/DIGITAL/pages/467108877/eInvoicing+in+Belgium>) — pan-European reference page; legal basis, mandate scope, Peppol BIS profile.
  * [OpenPeppol · Belgium country profile](<https://peppol.org/learn-more/country-profiles/belgium/>) — authoritative Peppol facts maintained by OpenPeppol AISBL.
  * [Mercurius portal](<https://mercurius.bosa.be>) — federal B2G hub run by FPS BOSA.
  * [KBO / BCE](<https://kbopub.economie.fgov.be/>) — Belgian VAT-number registry (FPS Economy).



**Industry analyses** (independent confirmation of the retirement timeline):

  * [Sovos · Belgium Sunsets Hermes](<https://sovos.com/regulatory-updates/vat/belgium-sunsets-hermes-e-invoicing-platform-by-end-of-2025/>) — vendor regulatory update.
  * [Banqup · Belgium retires the HERMES platform](<https://www.banqup.com/resources/blog/belgium-retires-the-hermes-platform-why-your-e-invoicing-strategy-must-change-before-2026>) — vendor analysis of the retirement decision.
