FR / EN

BASE

Home Studio Approach

SERVICES

Custom Development Backend & Architecture Batch invoicing Factur-X Factur-X Integration

INSTALLATION

Electronic Invoicing Recruitment Data Collection Invoice Stamper

FREE TOOLS

Quote generator Factur-X demo

RESOURCES

Flask chatbot VS Code environment pack Documentation framework Static site

CONTENT

Electronic Invoicing 2026 API Integration Why Host Your Own Invoicing System Why Build Without SaaS Robust Backend Data Security Technical Notes

SUPPORT

FAQ Contact Links

SUPPORT

FAQ Contact Links

Factur-X EN16931: why your PDF invoice is probably not compliant

Technical note on Factur-X EN16931 compliance, PDF/A-3, XSD and Schematron, and the most common errors in e-invoicing solutions.

The e-invoicing reform sets strict deadlines. Many solutions claim to be Factur-X compliant. Few actually are.

Factur-X compliance is not just about embedding an XML file inside a PDF.
It relies on three distinct, independent, and all mandatory levels.

The three compliance levels

A Factur-X invoice is considered compliant only if it simultaneously satisfies these three requirements:

  • XSD-valid XML: the XML file structure is syntactically correct
  • Schematron-valid XML: EN16931 business rules are respected (amounts, VAT, identifiers)
  • PDF/A-3 compliant: the PDF document is long-term archivable with the XML correctly embedded

Most solutions only validate one or two of these levels. PDF/A-3 is consistently the most problematic part.

Why PDF/A-3 is the real problem

Generating a PDF and embedding an XML file into it does not produce a compliant PDF/A-3 document.

PDF/A-3 enforces strict constraints on the document itself: fully embedded fonts, declared color spaces, ICC OutputIntent present, compliant XMP metadata.

Most HTML-to-PDF generation libraries do not produce valid PDF/A by default. Without explicit configuration — declared color space and associated ICC OutputIntent — the resulting document remains a standard PDF and is invalid under the archival standard, even if the embedded XML is fully structured.

The Factur-X validator detects this immediately. The invoice is rejected.

What the validator actually checks

The reference Factur-X validator performs three distinct passes:

  • XSD validation of the XML structure
  • Schematron validation of EN16931 business rules
  • PDF/A-3 validation of the complete document

A solution that passes XSD and Schematron but fails on PDF/A-3 is not Factur-X compliant. It produces a correct XML inside a non-archivable PDF.

The most commonly overlooked business rules

The French Schematron layer enforces additional requirements beyond the core EN16931 data model. The following issues are among the most common causes of rejected invoices.

  • BT-34: seller electronic routing identifier (electronic address)
  • BT-49: buyer electronic routing identifier (electronic address)
  • BT-23: nature of the transaction (supply of goods, provision of services, or mixed transaction)
  • Statement regarding the absence of early payment discounts
  • Late payment penalty statement

BT-34 and BT-49 are not simple contact email addresses. They represent electronic routing identifiers (SIREN, email address, or another EAS identifier depending on the context) used for exchanges between Approved Platforms. Their absence may cause Schematron validation to fail even when the XML is otherwise perfectly structured.

BT-23 follows the same principle. It specifies the nature of the transaction (supply of goods, provision of services, or mixed transaction). Recent updates to the French validation rules now check this information as well, even though it was often omitted by older Factur-X generators.

Early payment discounts and late payment penalties follow the same logic: they are rarely hard-coded in existing generators because they are not part of traditional accounting requirements. However, EN16931 expects them by default, whether or not they apply to the actual invoice scenario.

The VAT-related legal mention follows the same missing-default logic: many generators only display it when the VAT rate is zero, while overlooking that a different legal statement (reverse charge, exemption, or export) remains mandatory as soon as a specific tax regime applies, even when VAT is non-zero.

Compliance evolves over time

Contrary to a common misconception, generating a compliant Factur-X document once does not guarantee that the generator will remain compliant over time. The EN16931 specifications, the French Schematron rules and the associated Business Terms evolve regularly.

New validation checks may be introduced as validators are updated. Information that was previously tolerated, such as certain Business Terms or the nature of the transaction, can progressively become mandatory during XML validation.

Compliance is therefore not simply about generating a valid XML file once, but about keeping the generator aligned with evolving European and French specifications.

The combination that works

PDF/A-3 compliance requires a PDF generation library capable of natively producing an archivable document.

mPDF generates clean PDF/A-1b output, with an integrated ICC OutputIntent, embedded fonts and compliant XMP metadata. The Python factur-x library then injects the EN16931 XML and converts the document to PDF/A-3.

The result passes all three validation levels: XSD, Schematron, PDF/A-3.

This remains true only if the business data embedded in the XML also complies with the latest French validation rules.

What this means in practice

An existing invoicing solution can be made Factur-X compliant without a full rewrite.

The XML engine adapts to the existing data structure. The PDF/A-3 injection is added at the output of the current PDF generator.

The existing business system does not need to be redesigned. However, the Factur-X generator must evolve alongside new validation rules to ensure long-term compliance.

What changes: the produced document is now valid, archivable, and interoperable with e-invoicing platforms.

The September 2026 deadline for B2B e-invoice reception leaves no room for partial solutions.

Learn more about electronic invoicing

← Back to Technical Notes