DEV Community

Olivier EBRAHIM
Olivier EBRAHIM

Posted on

Factur-X 2026 Implementation Guide for SMB Construction: A Developer's Roadmap

Factur-X 2026 Implementation Guide for SMB Construction: A Developer's Roadmap

The French government has mandated Factur-X adoption for all B2B invoices by January 1, 2026. For construction SMBs and their software providers, this isn't just a compliance checkbox—it's a fundamental shift in how invoices are created, transmitted, and processed.

If you're building or maintaining construction management software in France, understanding Factur-X 2026 isn't optional anymore. Let's walk through what you need to know, practical implementation strategies, and the real-world implications for your users.

What is Factur-X 2026, and Why Should You Care?

Factur-X is a hybrid invoice format that combines:

  • PDF/A-3 layer: human-readable invoice for clients
  • XML layer (UBL or CII format): machine-readable structured data for automated processing

The 2026 mandate means every B2B invoice issued by French companies must be dual-format. No exceptions. No grace period extensions (unlike the original 2024 deadline, which got extended).

For construction SMBs, this is critical because:

  1. Clients (contractors, developers) will reject invoices that don't comply
  2. Penalty: invoices can be refused, payment delayed, or flagged for tax audit
  3. Your software is now legally responsible for generating compliant documents

Why Construction is Different

Construction workflows are messier than SaaS invoicing:

  • Multiple cost types: material, labor, subcontractor, equipment hire
  • Progressive billing: phased invoices tied to project milestones
  • Mixed clients: some use public procurement (CHORUS), others are small builders
  • Retention clauses: partial payment holds until project completion
  • VAT complexity: reduced rates for renovation, special rules for second homes

A generic Factur-X library won't cut it. You need construction-specific schema mapping.

Technical Implementation: The 5-Step Roadmap

Step 1: Choose Your XML Format (UBL vs. CII)

UBL (Universal Business Language) is simpler and more widely adopted in France:

<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
  <ID>2026-INV-001</ID>
  <IssueDate>2026-01-15</IssueDate>
  <InvoiceCurrency>EUR</InvoiceCurrency>
  <!-- Line items with tax rates -->
</Invoice>
Enter fullscreen mode Exit fullscreen mode

CII (UN/CEFACT) is more complex but supports advanced business rules. For most SMBs, UBL is the right choice—less overhead, good tool support, no performance penalty.

Decision: Use UBL unless your clients specifically demand CII (unlikely before 2026).

Step 2: Generate the PDF/A-3 Layer

Your existing PDF invoice generation is 90% there. You need to:

  1. Keep your current HTML→PDF pipeline (iText, wkhtmltopdf, etc.)
  2. Ensure PDF/A-3 compliance: no JavaScript, no external fonts, embedded metadata
  3. Attach the XML stream to the PDF as a file attachment named factur-x.xml

Libraries that handle this:

  • iText 8.0+ (Java/C#): PdfWriter.setTagged(true) + attachment API
  • PyPDF4 / pikepdf (Python): lower-level but works
  • Node.js: pdf-lib + post-processing tools like qpdf

For construction software, I recommend wrapping your PDF generation in a utility:

from pdf_attachments import attach_xml_to_pdf

invoice_pdf = generate_pdf(invoice_data)
facturx_xml = generate_ubl_xml(invoice_data)
final_pdf = attach_xml_to_pdf(invoice_pdf, facturx_xml, 'factur-x.xml')
Enter fullscreen mode Exit fullscreen mode

Step 3: Build the UBL/XML Generation Layer

Map your invoice schema to UBL. Focus on these critical fields:

Your Field UBL Element Notes
Invoice number Invoice/ID Must be unique per company per year
Issue date Invoice/IssueDate Format: YYYY-MM-DD
Line amount InvoiceLine/LineExtensionAmount Before tax
Tax rate TaxTotal/TaxSubtotal/Percent 0, 5.5, 10, 20% for construction
Seller info AccountingSupplierParty SIRET mandatory in France
Buyer info AccountingCustomerParty SIRET if B2B

For construction: add a separate ProjectReference element if your invoice is tied to a jobsite:

<InvoiceLine>
  <LineReference>Chantier Paris-Eiffel-2026-Q1</LineReference>
  <OrderReference>
    <ID>CHANTIER-2026-0001</ID>
  </OrderReference>
  <!-- Standard line items -->
</InvoiceLine>
Enter fullscreen mode Exit fullscreen mode

Use a library to avoid hand-rolling XML. Python example:

from lxml import etree

def create_facturx_xml(invoice):
    root = etree.Element("Invoice", xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2")

    # Header
    etree.SubElement(root, "ID").text = invoice['number']
    etree.SubElement(root, "IssueDate").text = invoice['date'].isoformat()

    # Seller (your construction company)
    supplier = etree.SubElement(root, "AccountingSupplierParty")
    supplier_id = etree.SubElement(supplier, "PartyIdentification")
    etree.SubElement(supplier_id, "ID").text = invoice['seller_siret']

    # ... line items, taxes, totals ...

    return etree.tostring(root, pretty_print=True, encoding='utf-8')
Enter fullscreen mode Exit fullscreen mode

Step 4: Validate Against the French Standard Profile

France uses a specific Factur-X profile stricter than the base UBL standard. Tools:

  • Vérif (French tax authority): free online validator at https://www.solusfactur.fr
  • Konik Checker: Python/Java library for offline validation
  • UBL.Schematron: open-source XSD validation

Before going live, validate 50+ test invoices covering:

  • Simple labor-only invoices
  • Material + labor combos
  • Subcontractor pass-throughs
  • VAT-exempt items (if applicable)
  • Retention clauses (partial payment)

Step 5: Integrate into Your Construction Management Platform

If you're building or maintaining construction software like Anodos, Factur-X generation should be:

  1. Automatic: triggered on invoice creation, not a manual export
  2. Transparent: users never see the XML; they just generate a PDF
  3. Auditable: log which version of Factur-X was used, XML hash
  4. Flexible: support both UBL and CII if enterprise clients demand it

For systems that already support voice-based estimating or jobsite photo documentation, Factur-X is just another data layer. The tricky part is the transition—existing invoices need migration, and you need customer support ready for the Jan 2026 deadline.

Common Pitfalls (Learn from Others' Mistakes)

  1. Forgetting the PDF/A-3 validation: Your PDF might embed XML, but if it's not PDF/A-3 compliant, tax authorities will reject it.
  2. SIRET format: French SIRET is 14 digits. Validate format + check digit. Many systems accept invalid SIRETs.
  3. Line-level VAT: Don't sum tax rates; compute tax per line item, then total. Rounding differences = invoice rejection.
  4. Language codes: Use ISO 639-1 ("fr", "en"), not language names. Some validators are strict.
  5. Attachment naming: The XML must be named exactly factur-x.xml in the PDF. Typos break parsing.

Timeline for Your Implementation

  • Now (mid-2025): Start with UBL generation, test with validators
  • August 2025: Pilot with 10-20 SMB customers, collect feedback
  • October 2025: Go live for all new invoices
  • November 2025: Backfill historical invoices (optional but recommended for audit trail)
  • January 1, 2026: Mandatory compliance

Resources

Conclusion

Factur-X 2026 is not a distant regulation—it's here, and your construction clients will start enforcing it in Q4 2025. Building a robust UBL generation engine now saves you last-minute firefighting and keeps your SMB users compliant.

The good news: it's technically straightforward once you understand the schema. The better news: most of your PDF layer already works; you're just adding an XML sibling. Start small, validate obsessively, and you'll ship on time.


Olivier Ebrahim, founder of Anodos, has spent the last 2 years helping French construction SMBs navigate digital transformation. When he's not building Factur-X integrations, he's on jobsites testing real-world workflows.

Top comments (0)