Factur-X 2026: Implementation Guide for French Construction SaaS
TL;DR
Factur-X 2026 is the new French/EU e-invoicing standard (UBL derivative) that replaces older formats. If you're building SaaS for construction in France, your invoicing pipeline must support it by January 2026. This guide covers the implementation path for developers.
Why Factur-X Matters Now
Background
- Factur-X 2025 was optional for large companies (>250 employees)
- Factur-X 2026 becomes mandatory for all French companies (>1 employee) and EU suppliers
- Non-compliance = penalties, invoice rejection, payment delays
- Old formats (PDF-only, EDI/EDIFACT, XML custom) are deprecated
Impact on Construction SaaS
Construction businesses issue 10–100 invoices/month (small PME) to 1000+ invoices/month (big contractors). A single broken invoice format means:
- Customer's accounting system rejects it (automated parsing fails)
- Manual data entry by customer (annoying, error-prone)
- Payment delay (your cash flow suffers)
- Potential URSSAF audit flag (French tax authority)
What Is Factur-X 2026?
Factur-X is a semantic structured XML format based on UBL 2.1 (Universal Business Language) with French-specific extensions.
Structure (Simplified)
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<ID>INV-2026-00042</ID>
<IssueDate>2026-01-15</IssueDate>
<InvoiceTypeCode>380</InvoiceTypeCode> <!-- 380 = commercial invoice -->
<DocumentCurrencyCode>EUR</DocumentCurrencyCode>
<!-- Supplier -->
<AccountingSupplierParty>
<Party>
<PartyName>
<Name>SARL Anodos</Name>
</PartyName>
<PostalAddress>
<StreetName>123 Rue de la Paix</StreetName>
<CityName>Paris</CityName>
<PostalZone>75001</PostalZone>
<CountrySubentity>FR</CountrySubentity>
</PostalAddress>
<PartyTaxScheme>
<CompanyID>FR12345678901</CompanyID> <!-- SIRET for FR -->
</PartyTaxScheme>
</Party>
</AccountingSupplierParty>
<!-- Buyer (same structure) -->
<AccountingCustomerParty>
...
</AccountingCustomerParty>
<!-- Line items -->
<InvoiceLine>
<ID>1</ID>
<InvoicedQuantity unitCode="MTR">2.5</InvoicedQuantity>
<LineExtensionAmount currencyID="EUR">750.00</LineExtensionAmount>
<Item>
<Name>BA13 plasterboard sheets</Name>
<ClassifiedTaxCategory>
<ID>S</ID> <!-- Standard rate (20% FR) -->
<Percent>20</Percent>
</ClassifiedTaxCategory>
</Item>
<Price>
<PriceAmount currencyID="EUR">300.00</PriceAmount>
</Price>
</InvoiceLine>
<!-- Totals -->
<LegalMonetaryTotal>
<LineExtensionAmount currencyID="EUR">750.00</LineExtensionAmount>
<TaxInclusiveAmount currencyID="EUR">900.00</TaxInclusiveAmount>
<PayableAmount currencyID="EUR">900.00</PayableAmount>
</LegalMonetaryTotal>
</Invoice>
Implementation Steps (For Developers)
Step 1: Choose a Library (Don't Build From Scratch)
Node.js / JavaScript:
-
peppol-invoice(lightweight, UBL 2.1 compliant) -
facturx-js(French-specific, maintained by FNTP) -
invoiz(commercial, full-stack, overkill for most)
Python:
-
facturx(official, from Chorus Pro maintainers) -
xsdata(schema-based XML generation, flexible)
PHP / Laravel:
-
dompdf+ custom XML (manual, but straightforward) -
easybill/facturx(Packagist, French startup)
Recommendation: Use a library. Hand-rolling XML is a footgun (encoding, whitespace, attribute order matter for validation).
Step 2: Validate Against Peppol/Chorus Pro
French invoices must pass Peppol validation (European standard) and be submittable to Chorus Pro (France's e-invoicing portal).
Tools:
- Peppol Validator (free, EC-hosted): https://www.peppol.eu/
- Chorus Pro test environment: https://chorustest.gouv.fr/ (requires SIREN/SIRET registration)
Once validated, your SaaS can:
- Generate Factur-X XML from quote/invoice data
- Embed it in a PDF (hybrid format: human-readable + machine-readable)
- Optionally submit to Chorus Pro (if customer has opted in)
Step 3: Handle Edge Cases in Construction
Construction invoices have quirks:
A. Partial Invoices (Milestone Billing)
Quote: €10,000 total
Milestone 1 (foundation): €3,000 (30%) — invoice dated 2026-01-10
Milestone 2 (walls): €5,000 (50%) — invoice dated 2026-01-20
Milestone 3 (finish): €2,000 (20%) — invoice dated 2026-02-01
Factur-X supports this via InvoiceTypeCode 380 (partial invoice) with a parent quote reference. Each invoice must link to the original quote (Factur-X: BillingReference/InvoiceDocumentReference).
B. Retention/Hold-Backs
Construction often withholds 5–10% until final handoff. Factur-X models this as:
<PrepaidAmount>500.00</PrepaidAmount> <!-- Already paid (advance) -->
<AllowanceCharge>
<ChargeIndicator>true</ChargeIndicator>
<Amount>-500.00</Amount> <!-- Hold-back (negative charge) -->
<AllowanceChargeReason>Retention until final inspection</AllowanceChargeReason>
</AllowanceCharge>
C. Reverse Invoices (Credit Notes)
If a material was over-charged or a job was partially canceled:
<InvoiceTypeCode>381</InvoiceTypeCode> <!-- 381 = credit note -->
<BillingReference>
<InvoiceDocumentReference>
<ID>INV-2026-00042</ID> <!-- References the original invoice -->
</InvoiceDocumentReference>
</BillingReference>
Integration Checklist
- [ ] Library selected and integrated into invoicing module
- [ ] SIRET/SIREN lookup from company master data
- [ ] Tax rate logic for standard (20%) and reduced rates (5.5%, 2.1%)
- [ ] Line item -> Factur-X item mapping (including unit codes: MTR, TNE, PA, etc.)
- [ ] PDF generation with embedded Factur-X XML (hybrid format)
- [ ] Unit tests for edge cases (partial invoices, holds, credit notes)
- [ ] Peppol validator integration (automated check before sending)
- [ ] Chorus Pro test submission (if applicable for your customer)
- [ ] Rollback plan (if invoice generation fails, graceful fallback to old format)
- [ ] Customer communication (notify when Factur-X is live)
Real-World Implementation Time
For a mid-stage construction SaaS (100–500 customer invoices/month):
| Task | Effort | Notes |
|---|---|---|
| Library integration | 4–8 hours | Mostly reading docs + test data |
| Core invoice mapping | 16–24 hours | Data model alignment, tax logic |
| Edge cases (partial, hold-backs) | 8–12 hours | Construction-specific quirks |
| Testing + validation | 12–16 hours | Peppol + Chorus Pro test |
| Deployment + monitoring | 4–8 hours | Gradual rollout, error logging |
| Total | 44–68 hours | ~1–2 sprints for a 2-person team |
Cost Implications
- Factur-X library: Free (open-source) to €50–200/year (commercial)
- PDF generation: Already in your stack (dompdf, wkhtmltopdf, etc.)
- Validation API: Free (Peppol) or included in Chorus Pro subscription
- Infrastructure: No extra servers needed (XML generation is CPU-light)
Bottom line: Minimal cost, high compliance value.
Conclusion
Factur-X 2026 is coming. If you're building construction SaaS in France, implement it by Q3 2025 (before the January 2026 mandate). Use a library, validate early, test with real customer data, and educate your users on the change.
If you're already using Anodos, our invoicing module includes Factur-X 2026 by default — no extra work on your end.
Olivier Ebrahim
Founder, Anodos — Construction crew management SaaS with built-in Factur-X 2026 compliance.
Top comments (0)