I wired my own Symfony invoicing to a French e-invoicing platform. Five things I learned.
France made e-invoicing mandatory in stages. Since 1 September 2026, every VAT-registered company must be able to receive electronic invoices through an approved platform (a "plateforme agréée", formerly called PDP). Large companies already issue them. Small and medium businesses must issue them, and report their B2C sales, from 1 September 2027. Before offering this to e-commerce clients, I did…
Since 2026, France mandates e-invoicing for VAT-registered businesses. Large companies already comply, while small and medium enterprises must start by September 2027. For my own Symfony app, I integrated it with an approved e-invoicing platform, enabling both issuing and receiving invoices. My findings reveal five crucial insights.
First, there are two distinct invoice types: domestic business-to-business (B2B) and consumer or international transactions. The code routes e-invoices to the platform while e-reporting handles B2C and foreign sales. Data reliability is key, as many shops lack accurate customer categorization.
Second, the platform receives structured XML via Factur-X. I generate UBL invoices, which clients receive as Factur-X PDFs containing embedded EN16931 CII XML. Both formats originate from the same invoice, ensuring consistency.
Third, an invoice has a defined lifecycle: submitted, received, made available, rejected, and paid. The platform updates statuses via webhook or polling. I translate official statuses to three admin-friendly states: pending, received, and rejected. Rejects are critical, as unaddressed invoices result in unpaid taxes.
Fourth, implement a safety mechanism before connecting to the platform. Feature flags prevent unauthorized transmissions. I store invoices locally until transmission is approved, and pass unique invoice IDs for traceability.
Lastly, receiving invoices is now mandatory. My app already retrieves supplier invoices through the platform's API. If you're not already doing this, focus on this aspect first. For platforms like Sylius or custom Symfony shops, the real advantage lies in leveraging your own order data to seamlessly route orders to e-invoicing or e-reporting, generate Factur-X invoices, transmit them through approved platforms, and maintain the invoice lifecycle.
While open-source Factur-X generation for Sylius exists, connecting to a real e-invoicing platform and handling B2C e-reporting remain challenges. I'm Pierre-Arthur Demengel, a Symfony and Sylius developer based in Metz, France. Should you be working on this for a French business, I invite you to ask questions in the comments.
Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.