E-Invoice Conformance Lab

EN 16931 · XRechnung · Factur-X / ZUGFeRD · Peppol BIS 3

Independent e-invoice conformance lab for the EU

We run the same orders through real e-invoice generators and check every invoice against the official KoSIT, CEN EN 16931 and Peppol rules — then report what breaks, publicly and reproducibly.

See the resultsGet your invoices checked

16,200invoices validated
14generators tested
6bugs reported upstream
3fixed by maintainers

Results

39.7% of Factur-X invoices from a popular WooCommerce invoice plugin fail schema validation

We fed the same 600 synthetic shop orders through WooCommerce, Odoo 19 and twelve libraries, then checked all 16,200 invoices against KoSIT/XRechnung, CEN EN 16931, Peppol BIS 3.0.20 and the amount actually charged. The rule sets often disagree.

✓ passes / accepted % failure rate n/a scenario not applicable
Generator / configSegmentKoSIT accept %XSD invalid %CEN calc fail %Peppol R120 fail %Due ≠ order total %
WooCommerce PDF Invoices 5.16.4 — Factur-XB2B63.736.3000
WooCommerce PDF Invoices 5.16.4 — Factur-XB2C57.043.0000
WooCommerce PDF Invoices 5.16.4 — Peppol BIS 3bothn/a0000
Odoo 19 — Factur-X, round_globallyB2Bn/a032.780.72.0
Odoo 19 — Factur-X, round_globallyB2Cn/a042.704.7
Odoo 19 — Factur-X, round_per_lineB2Bn/a0080.70
Odoo 19 — Peppol BIS 3 / XRechnungbothn/a / 1000000
Mustang 2.26.0 — library-computed totalsB2B10000090.7
Mustang 2.26.0 — library-computed totalsB2C10000066.7
horstoeko/zugferd 1.0.133, drafthorse 2025.2.0 (reference totals)both1000000
josemmo/einvoicing 0.3.1 — library-computed totals, 2 dp rounding matrixB2B10000090.7
josemmo/einvoicing 0.3.1 — library-computed totals, 2 dp rounding matrixB2C10000066.7
speedata/einvoice 0.0.23 — library-computed totals (CII + UBL)B2B10000090.7
speedata/einvoice 0.0.23 — library-computed totals (CII + UBL)B2C10000066.7
ZUGFeRD-csharp 18.0.1 — XRechnung CII, no delivery date (PR #981)both0100000
ZUGFeRD-csharp 18.0.1 — XRechnung UBL / CII with delivery date (reference totals)both1000000
num-num/ubl-invoice 2.4.1 — Peppol BIS 3 (Belgium), reference totalsbothn/a0000
akretion factur-x 7.7 — Factur-X PDF (France), XML read back, reference totalsboth1000000
easybill/zugferd-php 6.0.0 — XRechnung CII, reference totalsboth1000000
invopop/gobl 0.510.0 + gobl.cii 0.80.0 — EN 16931 CII, totals computed by GOBLb2b1000006.0
invopop/gobl 0.510.0 + gobl.cii 0.80.0 — EN 16931 CII, totals computed by GOBLb2c1000001.3
invopop/gobl 0.510.0 + gobl.ubl 0.97.0 — Peppol BIS 3 UBL, totals computed by GOBLbothn/a0001.3–6.0
PyCheval 0.3.3 — Factur-X EN 16931 CII, reference totalsboth1000000
python-en16931 0.2 — Peppol BIS 3 UBL, library-computed totals, coupon as document discountB2Bn/a00092.0
python-en16931 0.2 — Peppol BIS 3 UBL, library-computed totals, coupon as document discountB2Cn/a00072.7

300 B2B + 300 B2C synthetic carts per configuration (DE, 19%/7% VAT, coupons, shipping). "n/a" = no XRechnung scenario applies (not a rejection). Peppol rules only bind Peppol BIS documents; findings show inconsistency between rule sets, not legal invalidity. Full method and limitations in the repository.

Methodology

How we test

Same input for everyone

600 synthetic shop orders per configuration (300 B2B + 300 B2C; DE, 19%/7% VAT, coupons, shipping), fed identically into every generator.

Official validators

KoSIT/XRechnung configuration, CEN EN 16931 schematron (UBL and CII), XSD schema and Peppol BIS 3.0.20 rules.

Money check

Beyond the rules: we compare the amount due in the invoice with the amount actually charged for the order.

Full method, data and limitations on GitHub →

Upstream reports

Reported to maintainers

Bugs found while building the matrix, reported with a repro and a suggested fix.

WooCommerce PDF Invoices 5.16.4

Open

#1662

Open

josemmo/einvoicing 0.3.1

Open

#93

Open

speedata/einvoice (≤ v0.0.20), UBL writer

Fixed

#185

Fixed (PR #186), released in v0.0.23 — re-tested: 9/9 UBL repro invoices KoSIT-acceptable; related #187–#190 also fixed

horstoeko/zugferd 1.0.132

Fixed

#390

Released in v1.0.133 (re-tested: E/AE/K/G/O exemption reasons KoSIT-acceptable)

ZUGFeRD-csharp

Known issue

Discussion #986

Known issue, workaround: set only one of PersonName/DepartmentName (CII-SR-465/466)

Monthly report

State of EU e-invoice interoperability — October 2026

13,200 invoices, 10 generators, French Factur-X scenarios, upstream status.

Read the October 2026 report

Upstream confirmations

What maintainers said

Exactly what is stated in the public threads (checked 25 Oct 2026).

Odoo 18.0 — CII unit price precision

PR open

PR #297750

We ran the fix through our 600-order harness; the Odoo developer thanked us for running it and for the detailed numbers.

Odoo 18.0 — CII totals from line net amounts

PR open

PR #297752

Same harness run; the Odoo developer thanked us for the thorough run and confirmed the observed behaviour is intended and mirrors the UBL export.

Odoo 18.0 — cash rounding in CII grand total

Closed

PR #295442

Closed on 24 Oct 2026.

WooCommerce PDF Invoices — RoundingAmount order

Open

#1662

Independently reproduced in the thread with KoSIT validator 1.6.3 (XRechnung 3.0.2 configuration).

ZUGFeRD-csharp — PersonName + DepartmentName

Known issue

Discussion #986

The maintainer confirmed it is a known issue; workaround: set only one of the two fields.

Check one of your own invoices for free →

Get checked

Get your invoices checked

Fixed prices. We confirm scope in writing before you pay — PayPal or SEPA bank transfer (invoice with bank details sent by email).

Free check

0 €
One invoice

Findings summary within 2 business days. No account, no payment.

Library / vendor audit

790 €
Your generator's output

Systematic test cases across VAT categories S, E, AE, K, G, O, allowances/charges and rounding. Includes one re-test after your fix.

Please do not send invoices containing real personal data. Free self-service: the GitHub Action runs the same checks in your CI.