FlowieExchange
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 below for the exact code changes.

TL;DR

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.

DateEventSource
2024-02-06Belgium adopts the B2B e-invoicing law (Loi du 6 février 2024).Loi du 6 février 2024 (Moniteur belge)
2024-07Business Experts Group reassesses HERMES and recommends decommissioning — private Peppol AP market deemed mature.efacture.belgium.be (FPS Finance)
2026-01-01B2B 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-31HERMES consultation-only window closes. Platform fully offline.HERMES portal · official notice

Timeline 2017 → 2028

DateWhoWhat
2017-01-01All BE businessesFederal B2G via Mercurius (live, still in force).
2024-02-06LegislatorsLoi du 6 février 2024 enacted (B2B mandate).
2025-12-31FPS FinanceHERMES send-path decommissioned.
2026-01-01Domestic B2B taxable transactionsMandatory structured e-invoicing over Peppol BIS 3.0 (BE-CIUS).
2026-03-31FPS FinanceHERMES consultation window closes.
2028-01-01 indicativeAll B2BContinuous 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):

Required fields for Belgian invoices

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:

CountryLifecycle update emitsCompliance report
🇫🇷 Francelifecycle.updated + compliance.reported (PPF)Yes — Flowie reports to PPF
🇮🇹 Italylifecycle.updated + compliance.reported (SDI)Yes — Flowie reports to SDI
🇧🇪 Belgiumlifecycle.updated onlyNo — 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 familyWhat it checksWhere 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 lookupSeller / 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 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 testHow
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 sendRecipient 9925:BE-mercurius-99999. Same response shape as a private recipient.
Recipient unreachableRecipient 0208:TEST_AP_FAILdocument.failed webhook with RECIPIENT_UNREACHABLE.
Validation rejectionSend 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 toNow
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 routerRemove the branch. compliance.reported only fires for FR (PPF) and IT (SDI).
Set settings.autoCompliance.HERMES on a BE companyField accepted but a no-op; remove on next config refresh.
Filter GET /v1/compliance/reports?platform=HERMESReturns historical rows only. New BE invoices won't add rows here.
Reject-handling on HER-001 / HER-002 / HER-007Move 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):

Industry analyses (independent confirmation of the retirement timeline):