Factur-X 2026 Implementation for French Construction SMBs: A Developer's Guide
If you build software for French construction teams, you already know: Factur-X (ZUGFeRD) becomes mandatory for all B2B invoicing on January 1, 2026. This isn't optional. This is law.
What does that mean? Your invoicing system must output XML-embedded PDF invoices—human-readable AND machine-readable in one file. No more PDFs alone. No more paper invoices scanned by hand.
For SMBs in bâtiment (construction), this is non-trivial. A single invoice might have 3–5 different VAT rates (materials 20%, labor 10%, subcontractor reverse-charge 0%), project codes, delivery milestones, and payment terms spanning 60-90 days. Get the XML wrong, and your customer's accounting system rejects it automatically.
Let me walk you through the path to compliance.
What Factur-X Actually Is
Factur-X is a "container" format:
- Outside: A valid PDF document (human-readable, printable, archivable)
- Inside: An embedded XML file following the Peppol standard (machine-readable, auto-importable into accounting software)
When your client receives the invoice, their ERP extracts the XML, auto-populates the GL, matches it to PO references, and flags discrepancies. No data entry. No manual reconciliation. That's the whole point.
The EU standardized this because SMBs were losing 3–5 days per invoice manually re-entering data. Large corporates have been demanding it for years.
The French Specifics (This Trip You Up)
French construction invoicing is messy:
SIRET, not SIREN → Your VAT ID in Factur-X must be your SIRET (14-digit business number), not SIREN. Format:
SchemeID="0209"in the XML.Reverse-charge on subcontractor labor → If you're invoicing corporate clients for work done by a subcontractor, the VAT on that portion is 0% (the client's responsibility). Your Factur-X XML must separate this line item with
TaxCategoryCode="AE"(reverse-charge).Project/cost-center codes → Corporate MOE (maitre d'ouvrage = prime contractor) always demand their internal project codes on invoices. Factur-X supports
OrderReferenceDocumentID. If you don't capture this at quote time, your invoice will be rejected.Milestone-based invoicing → Construction invoicing isn't "goods shipped, invoice sent." It's "foundation poured on March 15, invoice sent March 20, payment due May 20." The XML field
ActualDeliveryDatemust match work completion, not invoice date. Many devs forget this.Chorus Pro is mandatory → France's government portal (chorus.gouv.fr) is the official hub. If you're invoicing any public or semi-public client (municipality, schools, hospitals), your invoice MUST pass Chorus Pro validation. Even if you're invoicing only private clients, Chorus Pro's validator is free and essential.
Implementation: 3 Paths
Path 1: Buy SaaS (Fastest, Recommended for <50 invoices/month)
Use a construction SaaS that has Factur-X 2026 built-in—like Anodos, which is built specifically for French BTP SMBs. They handle the XML generation, validation, Chorus Pro integration, and updates. You just enter invoice data normally.
Pros:
- Go-live in 2–4 weeks
- Zero technical debt
- Automatic compliance updates when regulations shift
- Built-in jobsite workflows (GPS payroll, voice-to-quote, photo levée de réserves)
Cons:
- Subscription cost (€49–500/month depending on team size)
- Lock-in (switching later is painful)
Time to revenue: 2–4 weeks.
Path 2: Upgrade Your Existing ERP (Medium, 4–8 weeks)
If you use Keobat, Batappli, Gesy, or OptimBTP, request the Factur-X 2026 module. Most vendors are rolling it out Q4 2024 / Q1 2025.
Pros:
- Integrates with existing data
- Vendor handles compliance
- Minimal retraining
Cons:
- Module often costs extra
- Timeline depends on vendor (Q1 2025 at earliest)
- May require parallel testing for 2-3 months
Time to revenue: 4–8 weeks.
Path 3: Custom XML Generation (Only if you're a Dev Building Your Own)
If you maintain bespoke invoicing code:
# Pseudo-code example (Python)
from facturx import Invoice
from datetime import datetime
invoice_data = {
'invoice_number': 'INV-2025-0001',
'invoice_date': datetime.now().date(),
'seller_name': 'Acme Construction SARL',
'seller_siret': '12345678901234',
'buyer_name': 'Corporate Client Inc.',
'buyer_siret': '98765432109876',
'line_items': [
{'description': 'Charpente bois - matériel', 'qty': 50, 'unit': 'm²',
'unit_price': 120.00, 'vat_rate': 0.20}, # Materials: 20% VAT
{'description': 'Main-d\'oeuvre pose charpente', 'qty': 40, 'unit': 'h',
'unit_price': 45.00, 'vat_rate': 0.10}, # Labor (artisan): 10% VAT
],
'payment_terms': '30 jours',
'delivery_date': '2025-05-15', # Work completion, not invoice date
}
facturx_invoice = Invoice.from_dict(invoice_data)
facturx_invoice.to_file('invoice_2025_0001.pdf') # Outputs PDF with embedded XML
Then validate:
# Using Peppol validator
curl -X POST https://peppol.helger.com/public/upload \
-F file=@invoice_2025_0001.pdf
Pros:
- Full control
- No vendor dependency
Cons:
- 6–12 weeks of dev time
- You own compliance testing and Chorus Pro certification
- Ongoing maintenance (regulations evolve)
Time to revenue: 6–12 weeks minimum.
Pre-Implementation Checklist (Do This Now)
Before building or buying:
- [ ] Audit current invoicing: PDF-only? Scanned paper? ERP with no XML export?
- [ ] List all clients who receive invoices → which are corporate (might demand XML)?
- [ ] Check VAT structure: how many rates? Reverse-charge situations?
- [ ] Do any clients require PO-to-invoice matching? (This affects Factur-X field mappings)
- [ ] Will you invoice public/semi-public clients? (Triggers Chorus Pro requirement)
- [ ] Current invoice volume per month? (Drives decision: SaaS vs. custom dev)
- [ ] Payment cycle: 30/60/90 days? (Affects XML
PaymentTermsNotefield)
Testing Before Go-Live
-
Peppol validator (free): https://peppol.helger.com/public/locale-en_US/
- Upload test invoices, get instant XML validation reports
-
Chorus Pro test environment: https://chorus.gouv.fr/
- Create test account, validate sample invoices
-
Real-world UAT: Ask 2–3 corporate clients to test with you
- Their ERP must auto-import your XML without manual rework
- If import fails, XML is wrong; debug before go-live
-
Decimal precision: Test edge cases (€1.99, €0.01 VAT fractional splits)
- XML uses decimals; PDFs use 2 digits. Mismatch = auto-rejection
Timeline to Compliance
| Milestone | Date | Owner |
|---|---|---|
| Audit + decision | Now – Nov 2024 | Leadership + Finance |
| SaaS pilot / ERP upgrade / dev kickoff | Dec 2024 – Jan 2025 | All paths |
| UAT with clients | Feb – Mar 2025 | Sales + Tech |
| Chorus Pro certification (if needed) | Apr 2025 | Tech / Vendor |
| Mandatory go-live | Jan 1, 2026 | Everyone |
Resources
- Factur-X official spec: https://www.e-invoicing.org/ (Peppol)
- Chorus Pro (French gov hub): https://chorus.gouv.fr/
- Open-source Python library: https://github.com/alexis-via/facturx
- French industry guide: Federation Française du Bâtiment (ffbatiment.fr)
This isn't a nice-to-have. It's the law. But the good news? If you implement it properly, you're also improving your invoice-to-cash cycle—fewer rejections, faster payment, better data quality.
Start your audit now. Test in Q1 2025. Go live January 1.
Olivier Ebrahim
Founder of Anodos, a construction SaaS built for French SMBs. We handle Factur-X 2026 compliance, plus real-time jobsite management, voice-to-quote with AI, and GPS payroll—so your team can focus on building.
Top comments (0)