E-invoicing mandate: validate your Factur-X invoices before you send
France (2026–2027) and Germany are making structured e-invoicing mandatory. Here is what changes, which formats are accepted, why invoices get rejected under EN 16931, and how to check yours.
What the e-invoicing mandate changes
Structured electronic invoicing is becoming mandatory for B2B transactions across the EU. In France, the reform phases in over 2026–2027: all businesses must be able to receive electronic invoices from September 2026, and the obligation to issue them is rolled out through 2026–2027 by company size. In Germany, businesses must already accept structured B2B e-invoices since January 2025, with issuance obligations following.
A PDF by email is no longer enough. Invoices must carry a structured, machine-readable payload that conforms to the European semantic standard EN 16931 — otherwise the receiving platform or buyer rejects them.
Which formats are accepted
The mandate is built on EN 16931. In practice the common carriers are Factur-X (a hybrid PDF/A-3 with an embedded UN/CEFACT CII XML), its German equivalent ZUGFeRD (technically aligned with Factur-X), and the UBL / Peppol BIS syntaxes. Whatever the container, the embedded XML must satisfy EN 16931 business rules.
This validator checks the CII XML of your Factur-X / ZUGFeRD invoices against EN 16931 and each Factur-X profile (MINIMUM, BASIC-WL, BASIC, EN 16931, EXTENDED).
Why compliant-looking invoices still get rejected
A file can be valid XML and still be rejected: EN 16931 adds business rules that XSD never checks — line totals that must equal the sum of lines, VAT breakdowns that must reconcile with the header, mandatory parties and identifiers, and profile-specific constraints.
The most common rejection causes are totals/VAT inconsistencies (BR-CO rules), a missing or wrong profile identifier, and missing mandatory fields (invoice number, issue date, type code, seller/buyer name).
How to prepare
Validate every invoice against EN 16931 and the target Factur-X profile before you send it. Fix totals by accumulating amounts as integer minor units to avoid rounding drift, and make sure the declared profile URN matches the actual content level.
Integrating an export? Validate in your pipeline (batch or API) so non-conformant invoices are caught before they reach a platform or buyer.