Factur-X 2026: Implementation Guide for SMB Construction SaaS
The 2026 French regulatory deadline for electronic invoicing is closer than you think. If you're building SaaS for construction firms, contractors, or architects, you need Factur-X—and you need it right.
This is not a sales pitch. This is a technical deep-dive on what Factur-X actually is, why it matters for French construction SMBs, and how to implement it without losing your mind.
What Is Factur-X, Really?
Factur-X (also called ZUGFeRD in Germany and the EU) is an XML-based structured invoice standard. Think of it like JSON for invoices: machine-readable, extensible, and designed to eliminate the chaos of PDF-only billing.
The Core Idea
Instead of a flat PDF with human-readable numbers, a Factur-X invoice embeds:
- Structured header data (sender, receiver, date, amounts)
- Line items with SKU, quantity, unit price, tax rate
- Payment terms, bank details, references
- Digital signature (optional but recommended)
All of this lives in a hybrid file: a PDF you can print + an XML stream you can parse.
Why France Mandates It in 2026
Context: The EU Directive 2014/55/EU requires e-invoicing for B2B and B2G (government) transactions. France chose Factur-X as its national standard. By January 1, 2026, B2B invoices must be Factur-X-compliant.
For construction SMBs, this is critical because:
- Subcontractors → Main contractors = B2B = mandatory Factur-X
- Main contractors → State projects = B2G = mandatory Factur-X
- Late compliance = fines + payment delays = cash-flow nightmare
Technical Architecture: The Three Layers
1. XML Semantic Layer
The invoice data lives in an XML file that conforms to the UN/CEFACT Cross Industry Invoice (CII) standard. Here's a minimal skeleton:
<?xml version="1.0" encoding="UTF-8"?>
<CrossIndustryInvoice xmlns="...">
<ExchangedDocument>
<ID>INV-2025-001234</ID>
<IssueDateTime>20250115</IssueDateTime>
<TypeCode>380</TypeCode> <!-- 380 = invoice -->
</ExchangedDocument>
<SupplyChainTradeTransaction>
<!-- Parties, line items, totals -->
</SupplyChainTradeTransaction>
</CrossIndustryInvoice>
Key fields for construction:
-
BuyerOrderReferencedDocument(purchase order reference) -
ApplicableHeaderTradeSettlement(payment terms, tax, bank details) -
IncludedSupplyChainTradeLineItem(the items being invoiced)
2. PDF/A Layer (The Human-Readable Wrapper)
The XML is embedded inside a PDF/A-3b file as an attachment. This way:
- Users can print and read it like any invoice
- Accountants can import the data automatically
- It's legally valid in both forms
Tools for embedding: Use a library like Apache PDFBox (Java), PyPDF2 (Python), or qpdf (C++) to attach the XML as a file stream to the PDF.
# Pseudocode: Python example
from pypdf import PdfWriter
writer = PdfWriter()
writer.add_metadata({'/Producer': 'MyBTPSaaS/1.0'})
# Attach XML as embedded file
with open('invoice.xml', 'rb') as xml_file:
writer.add_attachment('factur-x.xml', xml_file.read())
with open('invoice-final.pdf', 'wb') as output:
writer.write(output)
3. Profile Level (The Strictness Ladder)
Factur-X comes in three profiles, from most lenient to strictest:
| Profile | Use Case | Required Fields | Validator Complexity |
|---|---|---|---|
| Minimum | Invoices with basic data | ID, date, seller, buyer, amount | Low |
| Basic | Small trades, services | ↑ + line items, unit prices, tax rates | Medium |
| Full | B2B, government contracts, constructions | ↑ + payment terms, bank details, PO ref, notes | High |
Construction firms almost always need "Full" because of purchase orders, subcontractor hierarchies, and retention clauses.
Implementation Checklist
Phase 1: Schema & Validation
- [ ] Choose your XML schema validator (XSD). Use the official FNFE-Métier XSD for construction.
- [ ] Validate your XML output against CII_v100p02d01.xsd (UN standard).
- [ ] Test with a free validator: https://www.validatesml.org
Phase 2: PDF Embedding
- [ ] Select a PDF library (Apache PDFBox, iText, LibreOffice UNO).
- [ ] Embed the XML as a conformance level
ZUGFeRDin the PDF metadata. - [ ] Verify the embedded file is readable with
pdftotext+ manual inspection.
Phase 3: Testing & Submission
- [ ] Use the official test portal: https://mục-bj.gouv.fr (French government's PISTE platform).
- [ ] Send a test invoice; wait for automated validation response.
- [ ] Iterate on validation errors (namespace issues, missing fields are common).
Real-World Gotchas
1. Tax Rates in Construction
Construction invoices often have retention clauses (10-20% holdback until project completion). Factur-X handles this via the SpecifiedTradeAllowanceCharge element. Don't bake retention into line-item prices—encode it as a charge.
Wrong:
<NetAmount>900.00</NetAmount> <!-- Already includes 10% retention -->
Right:
<NetAmount>1000.00</NetAmount>
<SpecifiedTradeAllowanceCharge>
<ChargeIndicator>true</ChargeIndicator>
<ActualAmount>100.00</ActualAmount>
<Reason>Retention (10%)</Reason>
</SpecifiedTradeAllowanceCharge>
2. SIRET/SIREN Validation
French business identifiers must be valid and formatted correctly:
- SIRET: 14 digits (firm-level)
- SIREN: 9 digits (company-level)
Validate before embedding. A typo in SIRET = invoice rejection downstream.
3. Currency & Localization
Default to EUR. If you support multi-currency, declare it explicitly in the SupplyChainTradeTransaction root. DateFormat must be YYYYMMDD (not MM/DD/YYYY).
4. Signature & Trust
Factur-X supports XAdES digital signatures. For SMBs this is overkill, but required for government tenders. If you add signature support:
- Use a qualified eSignature provider (e.g., Universign, Docusign EU).
- Embed the signature as an ASiC-E container inside the PDF.
- Cost: ~€0.50–€2.00 per signature.
Integration Pattern for Construction SaaS
If you're building a solution like Anodos—which does jobsite management, instant quoting, and invoicing—here's the flow:
User creates quote in mobile app
↓
[AI voice input: "10 m² plasterboard install, 25 €/m²"]
↓
Quote saved in DB (line items, seller SIRET, buyer SIRET)
↓
User converts to invoice (date, payment terms, retention %)
↓
Factur-X XML generated from template
↓
XML validated against schema
↓
PDF created, XML embedded
↓
User sends to buyer's email
↓
Buyer's accounting software auto-imports line items
The beauty: no data re-entry. Your quote → invoice → accounting chain is automated.
Open-Source & Paid Tools
For Validation
- Validator (Free): https://www.validatesml.org
- Government Test Portal: https://portail.mục-bj.gouv.fr
For XML Generation
- aisatools Factur-X Generator (Python): https://github.com/Algos-Factions/aisatools
- mustang-project (Java): https://github.com/ZUGFeRD/mustangproject
- facturx (Python): https://pypi.org/project/facturx/
For PDF Embedding
- Apache PDFBox (Java, mature)
- PyPDF2 (Python, simple)
- iText 7 (Java/C#, paid for commercial use)
Timeline & Adoption Reality
- Today (Q1 2025): Adopt, test, deploy in staging.
- Mid-2025: Public beta—invite early customers to test end-to-end.
- Q4 2025: Mandatory cutover. Your invoicing system must emit Factur-X.
- 2026 Q1: Government portals enforce it. Non-compliant invoices = rejected.
For construction firms with 50+ employees, this is already happening. For smaller trades, there's grace—but not much.
What's Next?
- Build the generator: Start with a template engine (Jinja2, Handlebars, etc.) and emit XML from your invoice model.
- Validate: Wire up a schema validator. Make it part of your CI/CD.
- Test with real data: Get 3–5 construction firms to beta-test. Collect feedback on your UX.
- Go live: January 2026 is non-negotiable.
The firms that move early will have zero friction. The ones that wait until November 2025? They'll be firefighting.
Olivier Ebrahim, founder of Anodos, a mobile-first construction SaaS for SMB jobsite management, invoicing, and team coordination.
Top comments (0)