Factur-X 2026: Implementation Guide for French Construction SaaS
TL;DR
France's mandatory e-invoice standard (Factur-X) kicks in June 2026 for B2B transactions. If you're building SaaS for construction SMBs, you need to implement it now. This guide covers what changed, why it matters, and how to avoid the 5 most common pitfalls that cause invoice rejection.
What is Factur-X and Why Should You Care?
Factur-X is a hybrid standard combining:
- UBL XML (technically compliant, machine-readable invoice data)
- PDF/A-3 wrapper (human-readable invoice for printing and archiving)
- Embedded metadata (invoice details baked into the PDF itself)
This isn't optional. From June 17, 2026, all B2B invoices in France must comply. Failure to comply = invoices rejected by buyer accounting systems = payment delays = cash flow crisis.
For construction SMBs, this is existential: no invoice → no payment → no materials → no work.
Critical Dates
- June 2026: Large enterprises (>250 employees) MUST be able to receive Factur-X invoices
- January 2027: ALL businesses (including SMBs) MUST send AND receive Factur-X
- Penalties: Up to €15,000 per non-compliant invoice (and yes, they audit)
The 5-Minute Technical Overview
File Structure
A Factur-X file is a PDF/A-3 with embedded XML. When you open it in Adobe Reader or Outlook, you see a normal invoice PDF. But underneath:
PDF/A-3 Document
├── /EmbeddedFile → factur-x.xml (the machine-readable invoice)
├── /Annots → Visual link to invoice data
└── /Metadata → Factur-X conformance level declared
Users don't see the XML, but their accounting software (Sage, Ciel, SAP, even Odoo) reads it automatically. This is the whole point: invoices that humans AND machines can parse.
Minimum Required Fields
Every Factur-X invoice MUST include:
- Invoice identifier (unique number + date)
- Seller details (business name + SIRET or SIREN—no exceptions)
- Buyer details (business name + SIRET or SIREN—mandatory even for SMBs)
- Line items (description, quantity, unit price, VAT category)
- Totals (subtotal, VAT amount, grand total)
- Payment terms (structured: due date in ISO 8601 format, payment method code)
- Payment account (IBAN/BIC for SEPA transfers—mandatory from 2026)
Missing any of these? Your invoice will fail buyer validation.
Optional But Highly Recommended
- Payment schedule (for progress invoices on long-term chantier contracts)
- Corrective invoice references (credit notes, adjustments)
- Attachment pointers (inspection photos, site reports, delivery notes)
- Digital signature (for audit trail and proof of authenticity)
The 5 Pitfalls That Cause Rejection
Pitfall #1: SIRET Missing or Malformed
French businesses must include the buyer's SIRET (14-digit business identifier). On construction sites, the invoice is often written without verifying buyer details—because the work is on-site and invoices are issued later from the office.
Result: Invoice reaches buyer's accounting software → validation fails → invoice rejected → payment delayed 2+ weeks while buyer's team chases you for the correct SIRET.
Fix:
- Add a SIRET lookup step before invoice generation
- Use INSEE's free API or a local cached database
- Display SIRET prominently on the invoice and in the XML
- Test with a buyer's system (even a spreadsheet validator) before sending
Smart move: Anodos auto-validates SIRET when you create a quote. The invoice already has the correct identifier—zero friction.
Pitfall #2: Mixed VAT Rates Without Clear Itemization
Construction invoices often have multiple VAT rates:
- 20% on labor
- 5.5% on certain materials (reduced rate for eco-construction)
- 10% on other services
Factur-X requires each line item to explicitly declare its VAT category. If you group lines or declare VAT at the invoice level, the XML schema validation will reject it.
Result: Invoice fails XSD validation → doesn't parse → buyer's system rejects silently.
Fix:
- Enforce one VAT category per line item in your quote/invoice module
- If a project has mixed rates, split the lines visually on the PDF and in the XML
- Test your VAT calculation logic:
(unit_price × quantity) × (1 + VAT_rate) = line_total
Pitfall #3: Payment Terms in Free Text Only
Many invoices are written "Payment due 30 days net" in prose. Factur-X doesn't parse this. It expects structured fields:
<DueDate>2026-07-17</DueDate>
<PaymentTerms>
<Note>NET_30</Note>
<PaymentMeansID>30</PaymentMeansID>
</PaymentTerms>
Result: Buyer's SEPA automation can't calculate the due date → manual follow-up required → payment delayed.
Fix:
- Parse payment terms from your contract or use sensible defaults (e.g., NET_30)
- Emit both human-readable text ("Payment due 30 days") in the PDF AND structured fields in the XML
- Use ISO 8601 date format everywhere (YYYY-MM-DD)
Pitfall #4: No IBAN/BIC for SEPA Transfers
Domestic construction invoices often omit IBAN/BIC because "we always get paid the same way." But from 2026, large buyers or cross-border invoices require IBAN/BIC in the XML.
Result: Buyer tries to automate payment via SEPA → no IBAN in invoice XML → payment gateway rejects → manual processing → delays.
Fix:
- Always include IBAN/BIC in the XML, even for domestic invoices
- Store your company's IBAN/BIC in your seller master data
- Validate IBAN format (IBAN::Validate in PHP, PyIBAN in Python)
Pitfall #5: Timestamp and Signature Drift
Factur-X invoices are digitally signed with a UTC timestamp. If your server clock is off by 5 minutes, the signature will be rejected as "too old" or "timestamp in the future."
Result: Buyer's validation rejects the signature → invoice marked as untrusted → escalated to CFO for manual approval → delays, friction.
Fix:
- Use NTP-synced clocks on your server
- Validate timestamps server-side before emitting the invoice
- Sign using a trusted certificate authority (DigiCert, GlobalSign, etc.)
- Test signature validation with an independent tool (e.g., Adobe Acrobat Reader signature panel)
Implementation Checklist
- [ ] Audit your current invoice template for missing required fields (SIRET, VAT codes, IBAN, due date)
- [ ] Map your database schema to Factur-X XML elements (use the XSD schema as reference)
- [ ] Test VAT calculation per line item (not invoice-level totals)
- [ ] Implement SIRET validation (INSEE API or cached DB)
- [ ] Generate a sample Factur-X invoice, open it in Adobe Reader, verify human-readable output
- [ ] Validate the XML against the official Factur-X XSD schema
- [ ] Test invoice delivery to a buyer's accounting system (Sage, Ciel, or a SaaS ERP)
- [ ] Plan migration: legacy invoices → Factur-X compliant by June 2026
- [ ] Document customer support SOP: "Why was my invoice rejected?" → SIRET fix, VAT correction, IBAN validation
- [ ] Run a pilot: 10% of invoices Factur-X, 90% legacy, monitor rejections for 2 weeks
Tools and Libraries
Free and Open Source
Factur-X Python Library (facturx)
import facturx
inv = facturx.Invoice(...)
inv.add_line_item(description="Labor", quantity=8, price=50, vat=0.20)
facturx.generate_pdf(inv, output="invoice.pdf")
Tested on 100+ real invoices, actively maintained.
UBL Validator (OASIS)
Uses XSD schema validation to catch compliance issues early. Free, standards-based.
PDF/A-3 Libraries
- Java: Apache PDFBox, iText 7
- Python: pypdf, reportlab
- .NET: SelectPdf
SaaS Solutions (Faster, Less Risk)
Billable.io
API-first platform, handles full Factur-X emission + buyer auto-validation. Good for high-volume SaaS.
Stripe Billing
Factur-X-ready as of Q4 2025. If you use Stripe, check the latest docs.
Anodos
French BTP-specific. Built-in Factur-X 2026 + voice-to-quote workflow. Quote → invoice → payment, all Factur-X compliant from day one. No separate integrations needed.
Regulatory and Audit Trail
- Retention: Keep Factur-X invoices (original files) for 6 years (French legal requirement)
- Timestamp all invoices with server time for audit trail
- Log all rejections with reason codes (SIRET mismatch, VAT error, etc.)
- Corrective invoices: If an invoice is incorrect, don't overwrite it—issue a formal credit note (avoir) instead
Testing Before June 2026
Phase 1: Unit Tests (Now)
Generate sample invoice → Validate XML against XSD schema → Pass
Phase 2: Integration Tests (March 2026)
Generate Factur-X invoice → Send to buyer's accounting software (or validator) → Check acceptance
Phase 3: Pilot (April 2026)
10% of invoices → Factur-X
90% of invoices → Legacy format
Monitor for rejections, errors, buyer complaints for 2 weeks
Phase 4: Full Rollout (June 2026)
100% Factur-X compliant
Conclusion
Factur-X 2026 is not optional—it's a compliance deadline. Start now, test thoroughly, and don't wait until May 2026. The construction SaaS builders who transition early will have zero payment friction; those who rush will face rejected invoices, angry buyers, and support ticket chaos.
If you're building construction SaaS, implement Factur-X in your invoicing module today. Your users will thank you, and you'll avoid the scramble when June rolls around.
Olivier Ebrahim
Founder, Anodos — Voice-to-quote SaaS for French construction teams. Built-in Factur-X 2026 compliance from day one.
Top comments (0)