What the ZUGFeRD Validator Checks
Generating a file is not the same as generating a valid file. The validator runs three independent checks on every upload: all three must pass for your invoice to be accepted by accounting systems and public portals.
Validation Layer 1: XML Schema
The embedded XML must conform to the Cross Industry Invoice (CII) D16B schema. Schema errors are structural: a missing element, a wrong data type, or an attribute in the wrong namespace. These are caught before any business rules are applied and usually indicate a code generation or serialisation bug.
Validation Layer 2: EN 16931 Schematron Rules
The Schematron layer enforces over 200 semantic business rules defined in the European e-invoicing standard. Rules are identified by codes such as BR-01, BR-CO-15, or DE-R-001. Common failures:
- BR-08 - Invoice currency code is missing (BT-5)
- BR-CO-15 - VAT category tax amount does not match the calculated value
- BR-S-08 - Tax rate (BT-119) is mandatory when VAT category is Standard
- DE-R-003 - Seller tax ID (BT-31 or BT-32) is required for German domestic invoices
Each error in the report includes the rule code, the XPath of the failing element, and a plain-language description, no need to read the spec to understand what to fix.
Validation Layer 3: PDF/A-3b Conformance
ZUGFeRD requires the PDF container to be a PDF/A-3b archive. A regular PDF will fail even if the embedded XML is perfectly valid. Common causes: missing embedded fonts, no ICC output intent, incorrect XMP metadata, or the XML attachment not declared with the AFRelationship key set to Alternative.
Profile-Specific Checks
The validator applies additional rules depending on which ZUGFeRD profile the file declares. Higher profiles require more data fields: submitting a MINIMUM-profile file where EN 16931 is expected will produce dozens of missing-field errors.
| Profile | Line items required | Allowances & charges | Full EN 16931 rules |
|---|---|---|---|
| MINIMUM | No | No | No |
| BASIC WL | No | Yes | No |
| BASIC | Yes | No | No |
| EN 16931 | Yes | Yes | Yes |
| EXTENDED | Yes | Yes | Yes + extensions |
Validating an XRechnung instead?
XRechnung is pure XML with its own German rule set (CIUS) on top of EN 16931, including the mandatory Leitweg-ID. It has a dedicated tool: