Description
From 1 September 2026, French businesses must receive electronic invoices, and
issuing them becomes mandatory in turn. An invoice between two French businesses
no longer travels as a PDF by e-mail: it travels through a plateforme agréée
(PA), a platform registered by the tax administration.
WeInvoice is one of those platforms — registered under number 0104. This plugin
connects your shop to it directly. There is no intermediary, no third-party
account to open and no government API key to request: your shop talks to the
platform that files the invoice.
What it does
- Turns a qualifying WooCommerce order into a compliant electronic invoice and files it through WeInvoice, in the background, without ever slowing a customer’s checkout.
- Numbers your invoices in one unbroken sequence, or keeps your own if you already have one.
- Creates the credit note a refund owes — automatically, for a partial refund as well as a full one.
- Shows the official lifecycle of each invoice on the order screen — deposited, received, made available, approved, refused, paid — in the regulatory vocabulary, not a re-invented one.
- Checks at checkout whether a business customer is reachable in the French PPF directory, so you know before the order is placed rather than after a rejection.
- Gives you one screen — WooCommerce → WeInvoice — that says where every invoice stands: what is waiting, what is in progress, what stopped and why, in plain language, with a button to send a stopped document again once you have fixed what caused it.
- Warns you, on that same screen, when nothing on your server is starting the background queue: your invoices would then leave late, and an electronic invoice is owed within 24 hours.
What it deliberately does not do
B2C orders never leave your shop. An order whose buyer is a private
individual, or whose SIREN is not registered in the PPF directory, produces no
electronic invoice and no request of any kind. It is counted on the
WooCommerce → WeInvoice screen so you can see exactly how much of your
business is not covered, and that count stays on your server. The
regulation handles those sales through e-reporting, which this version does
not cover: if you sell to consumers you still owe that declaration by another
route, and this plugin will never pretend otherwise.
It is also not a cash-register system: it does not take payments, does not keep a
till and records no settlement of its own.
Requirements
- A WeInvoice account with an API key.
- WordPress 6.8 or later, WooCommerce 8.2 or later, PHP 7.4 or later.
- Sellers established in France, invoicing French business customers.
External Services
This plugin connects to one external service, and to nothing else. There is
no analytics service, no error-reporting service, no relay and no telemetry of
any kind.
WeInvoice (api.weinvoice.fr)
Who operates it. Weproc SAS, France — the plateforme agréée n°0104 that
files your invoices with the tax administration.
What it is used for. Filing your electronic invoices and the credit notes
your refunds owe, reading their regulatory lifecycle statuses back, and checking
whether a business customer is registered in the French PPF directory.
When data is sent. Never before you have entered your own WeInvoice API key
on the plugin’s settings screen. Once you have, https://api.weinvoice.fr is
contacted in five situations, and no other:
- When you save your credentials or press Test the connection — your API key is exchanged for a short-lived access token, and your account is asked which company invoices for this shop.
- When you save your credentials — the shop subscribes to the status updates of its own invoices, which is what makes situation 5 possible.
- When a business customer has entered a SIREN and the order is placed — that SIREN alone is sent, to check whether the company is reachable.
- When an order whose buyer carries a directory-registered SIREN reaches the processing or completed status, and when such an order is refunded — that document’s invoice data is sent. This happens in a background job, never while a page is being served.
- While one of your invoices is still in flight — its status is read back, at most hourly on the first day and much less often afterwards, and not at all once it is settled.
What data is sent. In situation 3, a SIREN. In situation 4, the data an
electronic invoice legally carries: your own identification, the business
customer’s identification (SIREN/SIRET, company name, billing address), the order
lines with their amounts and VAT, the totals and the payment terms.
What is never sent. Orders placed by private individuals, orders whose buyer
carries no registered SIREN, your shop’s traffic, your customer list, your
products, and the count of out-of-perimeter orders itself.
- Service: https://weinvoice.fr
- Terms of service: https://weinvoice.fr/cgu
- Privacy policy: https://weinvoice.fr/politique-de-confidentialite
In situation 3, the SIREN is checked at most once a day per company: the
answer is remembered on your own server, and a customer typing does not trigger
anything — the check happens when the order is placed. If it cannot be made, the
order goes through anyway; nothing at your checkout ever depends on our
availability.
Screenshots





Installation
- Install and activate WooCommerce first — this plugin requires it and WordPress will not activate it without it.
- Install this plugin from the WordPress plugin directory, or upload the ZIP under Plugins Add New Upload Plugin.
- Activate it.
- Go to WooCommerce Settings Integrations WeInvoice.
- Paste the API key issued in your WeInvoice space, choose the environment, and save. Nothing is sent anywhere before that moment.
- Check the Invoice numbering setting on the same screen. Leave it on WeInvoice unless your shop already gives its orders real invoice numbers through another extension.
FAQ
-
Do I need an account with a government portal?
-
No. WeInvoice is itself a plateforme agréée; your shop talks to it, and it
files with the administration. You need a WeInvoice account, nothing else. -
Who gives my invoices their numbers?
-
WeInvoice does, unless you tell it otherwise. An invoice number cannot be reused
and the sequence must not skip numbers, and a plain WooCommerce order number is
neither of those: it is a website reference your shop shares with its pages,
media and coupons, so it jumps whenever you publish anything else — and two shops
belonging to the same company would produce the same one. Leaving the numbering
to WeInvoice gives you one unbroken series.Choose This shop only if you already run an extension that gives your orders
real invoice numbers; the plugin then sends the number your shop displays, and
nothing about your series changes.Whichever you choose, the order number always travels on the invoice as your own
reference, so you can find the order back from it. -
I already had this plugin connected. Did the update renumber my invoices?
-
No. A shop that was already connected keeps numbering its own invoices, exactly
as before. The new setting is on the connection screen if you want to switch. -
What happens to my orders from private customers?
-
Nothing leaves your shop. They are counted locally so that you can see them, and
that is all. Those sales fall under e-reporting, which this version does not
handle. -
Where do my business customers enter their SIREN?
-
In an optional Company SIREN number field the plugin adds to the additional
information section of your checkout — both the classic one and the block one. A
customer who leaves it blank orders exactly as before: the field never blocks a
sale. A number that is not nine valid digits is refused on the spot, while the
customer is still on the page, rather than after the order is placed. -
I already use the EU VAT Number extension. Do my customers have to type their SIREN again?
-
No. A French VAT number contains the company’s SIREN, so the plugin reads the
number that extension already stores and uses it. A VAT number issued in another
country is left alone: its digits belong to a company in that country’s register,
not to a French one, so no invoice is ever built from it. -
What if a customer’s SIREN is not in the PPF directory yet?
-
The order goes through and stays on your shop: it is marked out of perimeter and
counted, and nothing about it is sent anywhere. If the check itself could not be
made — your server offline, ours busy — the order is simply left undecided and
sorted out when its invoice is filed. Your checkout never fails because of us. -
A refund happened. Do I have to do anything?
-
No. A refund creates the credit note it owes, automatically, for a partial refund
as well as a full one — nothing to tick and no e-mail to send. -
Does it slow down my shop?
-
No. Nothing is sent while an order is being saved: the order is put in a queue
and the sending happens in the background, so a slow or unavailable service can
never delay or break a customer’s checkout. -
An invoice did not leave. What happens?
-
It is retried on its own, with a growing delay, for up to four days — long enough
for you to sign a missing mandate, settle an account or switch on a setting and
have the invoice leave without touching anything. Every attempt is recorded on
the order itself, successes and failures alike, and stays there as long as the
order does. -
Does it work with high-performance order storage (HPOS)?
-
Yes. The plugin declares compatibility with HPOS and reads and writes orders
exclusively through the WooCommerce CRUD. -
Does it work with the block-based checkout?
-
Yes. Compatibility with the cart and checkout blocks is declared, and the
business-customer field is registered for both the block and the classic
checkout. -
Where do I get an API key?
-
In your WeInvoice space, under Espace développeur. The key is displayed once,
in theclient_id.secretform; paste it whole into the plugin’s settings
screen. It is stored on your own server, is never displayed again and is
removed when you uninstall the plugin. -
The plugin says my site seems to be hosted outside the European Union. What does that mean?
-
Your shop’s request never reached WeInvoice: it was stopped by the filtering
device in front of the platform, which the French e-invoicing conformity rules
require. Invoicing data must stay inside the EU, so a shop whose server makes
its outbound connections from outside it cannot file invoices. Ask your host
which country your site connects out from — nothing on your WeInvoice account
needs changing. -
Where is my data hosted?
-
On WeInvoice’s infrastructure, in the European Union. See the privacy policy
linked above.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Weproc French E-Invoicing for WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Weproc French E-Invoicing for WooCommerce” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.7.3
- wordpress.org review: the vendored SDK revision stamp is now
SDK-REVISION.txt(extension-less files are not permitted in the directory). No functional change.
0.7.2
- wordpress.org review: drop the Update URI header (directory-hosted plugins must not carry it), fix the Plugin URI, ship the .pot only (translations come from translate.wordpress.org).
0.7.1
- A rejected invoice now tells you why. The reason does not travel with the status: the plugin asks for it separately, the moment a rejection lands. That second read was being cancelled by the rule that never asks twice about a settled invoice — so the order screen could show “213 Rejetée” and nothing to act on. The reason is now fetched once, is not lost if the attempt fails, and the invoice stops being read as soon as it arrives.
0.7.0
- A company number your customer types at the checkout is no longer refused on its check digit. Whether a company can be invoiced is decided by the official business directory, and some real French company numbers do not satisfy that key — so refusing them at the till turned business orders into ordinary sales without anything erroring. A number that is not nine digits is still refused, and a number the directory does not list is still left out of scope, with the reason named on the WeInvoice screen.
- A shop that WeInvoice cannot reach — behind a firewall, on an intranet, on a local install — no longer shows a blank status for an invoice that has in fact been filed. It reads the full lifecycle back, including the moment the regulatory data reaches the public portal, exactly as a reachable shop is told it.
- First release exercised end to end against a real WeInvoice environment: a real order, a real invoice, a real credit note.
0.6.0
- WeInvoice now numbers your invoices by default, in one unbroken sequence. A WooCommerce order number is a website reference whose sequence skips numbers, which an invoice number must not do.
- A new setting on the connection screen lets a shop that already produces real invoice numbers keep sending its own.
- A shop that was already connected keeps its own numbering: nothing is renumbered by this update.
- If your WeInvoice account is not set to number invoices, the connection screen now says so, with a link to the switch — and invoices wait for you instead of being given up on.
- One screen — WooCommerce → WeInvoice — now says where every invoice stands: what is waiting, what stopped and why, and how much of your business this connector does not cover.
- First release published to the WordPress plugin directory.
0.5.0
- The official lifecycle of each invoice now appears on the order screen and in a column of the order list — the regulatory code and its French label, “212 Encaissée” and not “paid”.
- A finished invoice is shown apart from one still in flight, so a glance down the order list separates what is settled from what is not.
- When an invoice is rejected or refused, the reason is shown in plain language, with a button to send a corrected one.
- Statuses arrive as they happen, over a signed channel your shop subscribes to when you connect it.
- A shop that cannot be reached from the internet — behind a firewall, on an intranet, on a staging site — is not left in the dark: it asks WeInvoice instead, often on the first day and rarely afterwards, and stops asking once an invoice is settled.
0.4.0
- Invoices are now sent. An order that reaches Processing or Completed is queued for emission — including one paid by bank transfer, cheque or on delivery, which many connectors miss because nothing marks them paid automatically.
- Nothing is sent while the order is being saved: the order is put in a queue and the sending happens in the background, so a slow or unavailable service can never delay or break a customer’s checkout.
- If the sending fails it is retried on its own, with a growing delay, for up to four days — long enough for you to sign a missing mandate or settle an account and have the invoice leave without touching anything.
- A refund creates a credit note, automatically, for a partial refund as well as a full one. Nothing to tick and no e-mail to send.
- An order that reaches Processing and later Completed is invoiced once, never twice.
- Every attempt is recorded on the order itself, successes and failures alike, and stays there for as long as the order does.
- Orders from private customers still produce no request of any kind.
0.3.0
- Adds an optional Company SIREN number field to the checkout — both the classic checkout and the block-based one.
- The number is checked as it is submitted: nine digits and a valid check key, with the error shown on the spot rather than after the order.
- Business customers are recognised from the EU VAT Number extension too, when your shop uses it: a French VAT number contains the SIREN. A VAT number from another country is never turned into one.
- Each order is marked as covered or not covered, on the order itself, so the invoice queue of the next release has nothing to work out again.
- Orders from private customers still produce no request of any kind — the check runs only for an order that carries a valid SIREN, at most once a day per company, and never while a customer is typing.
- If the check cannot be made the order goes through anyway; your checkout never depends on our availability.
0.2.0
- Connect the shop: paste your WeInvoice API key on the integration screen, pick the environment, and check the connection.
- The company invoicing for the shop is resolved automatically when the key carries only one, and asked for otherwise.
- Every refusal is explained in plain language, with a link to the WeInvoice screen that settles it — including a site hosted outside the European Union, a plan without API access, and each missing regulatory prerequisite.
- A “Test the connection” button re-runs the check without changing anything.
- The API key is stored on your server in a row WordPress does not preload, is never displayed again, and is deleted on uninstall.
0.1.0
- First skeleton release: WooCommerce integration screen, translations, HPOS and cart/checkout-blocks compatibility declarations. No connection and no outbound request yet.
