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.
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 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 = falseto 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) |
| 2024-07 | Business Experts Group reassesses HERMES and recommends decommissioning — private Peppol AP market deemed mature. | efacture.belgium.be (FPS Finance) |
| 2026-01-01 | B2B mandate goes live: all domestic B2B taxable transactions must use structured e-invoicing over Peppol. | OpenPeppol · Belgium |
| End of 2025 (per FPS Finance) | HERMES send path decommissioned. | HERMES portal · official notice |
| 2026-03-31 | HERMES consultation-only window closes. Platform fully offline. | HERMES portal · official notice |
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:
┌─────────────┐ ┌────────────┐ ┌──────────────┐ ┌────────────────┐
│ Sender ERP │ →→→ │ Sender AP │ →→ │ Recipient AP │ →→ │ Recipient ERP │
│ │ │ (Flowie) │ │ (any Peppol) │ │ │
└─────────────┘ └────────────┘ └──────────────┘ └────────────────┘
↓
[discovers recipient via SMP]
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 afterBE). Flowie validates against the KBO/BCE registry on company creation. -
buyer.vatNumberrequired for B2B
Same format. For B2C, omit
buyer.vatNumberand 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-02on bad checksum. -
document.lines[].vatCategoryrequired
Standard Peppol categories (
S,Z,E,AE,K,G,O,L,M); BE rejectsKif 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:
9925:BE-mercurius-<OVO-number>
Look up the OVO number for any public entity in the Mercurius portal, or query Flowie's directory:
curl https://back.p2p-flowie.com/exchange/v1/directory/search?country=BE&naceCodes=8411 \
-H "Authorization: Bearer $FLOWIE_KEY"
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:
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"
}
}
}'
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. |
compliance.reported.failed webhooks. Today the same checks run locally before the invoice leaves Flowie — failures are 422s 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 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.
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 — 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 — 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 — authoritative Belgian government version of the law.
- HERMES portal — official portal carrying the FPS Finance decommissioning notice (consultation-only access closed 2026-03-31).
- EU Commission · eInvoicing in Belgium — pan-European reference page; legal basis, mandate scope, Peppol BIS profile.
- OpenPeppol · Belgium country profile — authoritative Peppol facts maintained by OpenPeppol AISBL.
- Mercurius portal — federal B2G hub run by FPS BOSA.
- KBO / BCE — Belgian VAT-number registry (FPS Economy).
Industry analyses (independent confirmation of the retirement timeline):
- Sovos · Belgium Sunsets Hermes — vendor regulatory update.
- Banqup · Belgium retires the HERMES platform — vendor analysis of the retirement decision.
