FacturConforme
FacturConforme
Description
France is making electronic invoicing mandatory. From 1 September 2026, every VAT-registered company must be able to receive electronic invoices, and new mentions become mandatory on invoices. From 1 September 2027, small and medium companies must issue their invoices in a structured format and transmit their transaction data (e-reporting).
A WooCommerce store is not ready out of the box. It does not collect the customer’s SIREN number, does not qualify the nature of the operation, and does not carry the mandatory legal mentions required by French law.
FacturConforme fills that gap.
Please note: the rules this plugin implements are French. The interface is available in English and in French, and follows your site language.
What the plugin does
- Adds a SIREN / SIRET field and an intra-community VAT field to the checkout, on both the classic and the block checkout.
- Validates the identifiers mathematically: Luhn key for SIREN and SIRET, and the control key for French VAT numbers whose key is numeric. Foreign VAT numbers are checked for country code and shape only, not against any registry. Typing mistakes are caught at checkout instead of six months later.
- Determines the category of the operation automatically — supply of goods, supply of services, or mixed — from the contents of the order.
- Carries the mandatory legal mentions required by the French commercial code: late payment penalties, the 40 euro recovery fee, and early payment discount.
- Generates the invoice as a CII XML file following the EN 16931 profile, one of the three formats accepted by the reform.
- Produces credit notes for refunded orders, referencing the invoice they correct.
- Assigns proper invoice numbers: a chronological, gap-free sequence, distinct from order numbers, allocated under a database lock and never recalculated. Credit notes get their own sequence.
- Freezes each issued document: the XML is built once, stored with its SHA-256 fingerprint and chained to the previous one, and every later download serves exactly those bytes.
- Reports, order by order, what is missing for the invoice to be compliant, with a dedicated column in the order list and a summary dashboard.
- Summarises the transactions subject to e-reporting, split into ten-day or monthly periods according to your VAT regime, with a CSV export. This summary is an aid to your declaration, not a declaration file: it does not convert currencies and does not deduct refunds, and it says so where those cases occur.
What this plugin produces, precisely
It produces a CII XML document following the EN 16931 profile of the Factur-X specification. A complete Factur-X invoice is a PDF/A-3 file carrying that XML inside it; this plugin generates the XML alone, which is one of the three formats the French reform accepts in its own right.
Validation
Every document the plugin issues is checked against the official Factur-X artefacts for the EN 16931 profile: the XSD schema and the Schematron business rules, run locally at build time over a matrix of fiscal scenarios — goods, services, mixed, two VAT rates, shipping, fees, discounts, bank transfer, exemption, reverse charge, out of scope, zero rate, and credit notes including refunds of shipping alone. A sample was also submitted to the FNFE-MPE online validator (reports 2026-139776 and 2026-139777, profile CII EN 16931).
This says the documents are well formed and follow the standard’s rules. It does not say your accounting is right: that remains yours, and your accountant’s.
What the Pro version adds
Automatic transmission to an approved platform, automated e-reporting, invoice lifecycle statuses and supplier invoice reception are part of the Pro version, available on facturconforme.fr.
Independence
The plugin is not tied to any approved platform. You choose yours; the plugin connects to it.
Installation
- Install and activate the plugin.
- Go to WooCommerce > Settings > FacturConforme.
- Enter your store SIREN and VAT number.
- Choose how the SIREN field behaves at checkout.
Screenshots

The compliance dashboard: what is missing, order by order, before an invoice can be issued.

On each order: the compliance status, the issued invoice with its number and fingerprint, and the credit notes.

The e-reporting summary, split into ten-day or monthly periods according to your VAT regime.

The settings: store identity, collection at checkout, VAT categories and mandatory mentions.
Faq
No. The free version prepares and checks the data. Transmission must go through an approved platform, and is part of the Pro version.
The field is optional by default. You can make it mandatory only when the customer fills in a company name.
Yes, and with the block checkout as well.
Sales to private individuals and to customers established outside France are not electronically invoiced: they fall under e-reporting. The plugin marks those orders accordingly instead of producing a file that would be rejected.
Reviews
Changelog
0.9.1
- Class, constant, option, meta key and hook prefixes lengthened from FC_ to FCONF_, so they meet the four-character minimum and are far less likely to collide with another plugin.
- Admin notices are shown only to users who can act on them, and the issuance result appears only on WooCommerce screens.
0.9.0
- Credit note totals were wrong whenever shipping or fees were refunded: line amounts were summed negative while charges were summed positive, so the document stated a total that was neither the sum of its own parts nor the amount actually refunded. All amounts are now brought into the document’s orientation before any addition, and the official Schematron confirms the fix.
- Refunding shipping alone produced a credit note with no line at all, which the standard rejects. Shipping and fees now become invoice lines when they are the only thing refunded.
- Every issued document is reconciled against the WooCommerce total before it is recorded. A document whose total does not match is refused rather than stored.
- The invoice number and the document are now written in a single operation. A failure in the generator no longer leaves an order numbered but without a document; a number consumed without a document is recorded, so a gap in the sequence can be justified.
- Yearly numbering no longer resets a shared counter: each year has its own counter, which removes the race two requests could hit on 1 January. The numbering policy is frozen once the first invoice is issued.
- Dates and the numbering year now follow the site timezone. In UTC, the first invoice issued after midnight on 1 January fell into the closed year’s series.
- Issued documents are archived base64-encoded: with legacy order storage, WordPress strips backslashes from metadata, and a document containing one no longer matched its own fingerprint.
- Out-of-scope operations no longer carry a VAT rate or VAT identifiers, as the standard requires. Intra-community supply and export were removed from the VAT categories: they need a delivery country and a foreign buyer, which this plugin routes to e-reporting rather than invoicing.
- A VAT category and its reason are now required for lines without VAT wherever they appear, shipping and fees included, and compound taxes block issuance instead of merely warning.
- SEPA direct debit is no longer declared as a card payment when it runs through another gateway, and no longer asks for the seller IBAN, which is not the account concerned.
- A document can no longer be built without an allocated number.
0.8.1
- Escaping fixed on the two hidden fields and the nonce of the new issue form, reported by Plugin Check.
0.8.0
- Issuing an invoice is now an explicit action. It checks the order, allocates the number under a lock, builds the document once and freezes it with a SHA-256 fingerprint. Downloads serve exactly those bytes. Previously the XML was rebuilt on every download from the current order and settings, so two different documents could carry the same invoice number.
- Downloading no longer allocates a number. A preview click used to consume a sequence number, even on an order that could not be invoiced.
- Invoice numbers are allocated under a named database lock, so two simultaneous requests cannot consume two numbers for one order and leave a gap in the sequence.
- The yearly counter reset is now atomic, is refused when the template carries no year, and the template itself is frozen once the first invoice has been issued.
- Uninstalling keeps the sequence counters. Deleting them meant a reinstall restarted at 1 and reissued numbers already used.
- Credit notes: dated on the refund, not on the invoice; refunded quantities and unit prices preserved; refunded shipping and fees stay charges instead of turning into discounts; their own continuous sequence. Amount-only refunds are refused with an explanation instead of producing an empty credit note.
- A line without VAT must now say which category it falls under — exemption, reverse charge, out of scope, intra-community supply, export or genuine zero rate — with its reason. Everything was previously declared zero-rated, which is wrong on most French invoices and invisible to validators.
- Bank transfer without an IBAN, missing seller VAT number while the order carries VAT, missing billing country, incomplete customer address and compound taxes are now reported instead of passing as compliant. An unknown payment gateway is declared as undefined rather than as an online payment.
- E-reporting: a period entirely in a foreign currency is now flagged, refunds are attributed to their own date, VAT rates are read from the WooCommerce tax lines instead of being recomputed by division, and each period is aggregated once instead of twice.
- Minimum WooCommerce version raised to 8.9, the release that introduced the additional checkout fields API the block checkout relies on.
0.7.0
- Interface translated into English, with a complete French translation shipped. French stores see exactly the same wording as before.
- The mandatory legal wording of the invoice is no longer part of the interface translation: it is invoice content, imposed by French law, and now goes through a filter so it can be replaced country by country.
- Invoice number templates accept {year}, {month} and {number}. The former {annee}, {mois} and {num} keep working.
0.6.1
- Removed the author URI, which duplicated the plugin URI and blocked submission to the plugin directory.
- Declared WooCommerce as a required plugin, so the site prevents activation without it instead of showing a notice afterwards.
- Updated the WooCommerce compatibility range.
0.6.0
- Readme rewritten in English, as required by the WordPress plugin directory.
- CSV export rewritten without direct stream functions.
- Translation loading left to WordPress, as recommended since version 4.6.
- Direct database calls documented: the atomic allocation of invoice numbers cannot be done through the options API without risking duplicate numbers.
0.5.1
- Clear separation between electronic invoicing and e-reporting. Sales to private individuals or to customers outside France no longer produce an electronic invoice.
0.5.0
- Corrections from the official FNFE-MPE validator: billing mode (BT-23), the three mandatory legal mentions, seller and buyer electronic addresses (BT-34, BT-49), and IBAN requirement for bank transfers.
0.4.0
- Proper invoice numbering, atomically allocated. Credit notes for refunds.
0.3.0
- E-reporting summary with CSV export.
0.2.0
- CII XML generation following the EN 16931 profile.
0.1.0
- First version: identifier collection, mandatory mentions and compliance checks.