Description
Your shop receives an order and the invoice appears on its own: numbered from the company’s series, carrying the order’s VAT, filed with ANAF through RO e-Factura (SPV) and sent to the customer by e-mail. Nothing has to be copied by hand from one system into another.
Quick setup. Paste an API key, choose the order status that triggers issuing, and that’s it — three steps, no XML to configure and no digital certificate to install. The settings screen shows you at a glance the company tied to the key, the environment (test or production), whether the ANAF authorisation is valid, and how many invoices you have left this month.
The plugin does not generate invoices itself and does not talk to ANAF directly. It sends the order to the invoicing service facturare.completez.ro, which assigns the number from the series, builds the UBL 2.1 XML according to CIUS-RO and files it with the Romanian tax authority’s SPV. The result: an invoice issued from the shop looks exactly like one issued from the service, and numbering stays a single series — not two sources overwriting each other.
RO e-Factura is Romania’s national electronic invoicing system, mandatory for business transactions. This plugin is the bridge between your WooCommerce shop and that obligation.
Completez E-Invoicing is an independent product by Completez. It is not affiliated with, endorsed or sponsored by WooCommerce, Automattic or ANAF (the Romanian tax administration). WooCommerce is a trademark of Automattic Inc.; RO e-Factura and SPV are public services of ANAF, named here only to describe what the plugin connects to.
What it does
- Quick setup — the API key, the status that triggers issuing, and the shop invoices on its own.
- Issues the invoice at the status you choose — “Completed”, “Processing” or any other.
- Files the invoice with ANAF (SPV) and tracks the reply: “accepted” or “rejected” land back on the order.
- Sends the invoice to the customer by e-mail, with the PDF attached, and adds it under My account Orders.
- Recognises companies by the tax ID (CUI) from checkout and fills in the rest from the ANAF registry.
- Takes the order’s VAT line by line, exactly as WooCommerce calculated it, not from today’s settings: an old order is invoiced with the rate it had then.
- Shipping and fees become invoice lines; coupons and discounts are already reflected in the line amounts.
- Credit notes (storno) from a single button, or automatically on a full refund (off by default).
- Each order’s status is shown in a column in the order list: issued, processing, accepted, rejected, error.
Don’t lose invoices
Issuing does not happen during checkout. A call that includes filing with ANAF can take seconds, and ANAF does go down now and then; placed at payment completion, it would keep the customer on the processing page and, on a timeout, throw an error over an order that was already paid.
That is why the order enters the WooCommerce queue (Action Scheduler) and goes out right after. If issuing fails, the plugin retries on its own, with growing pauses (2 minutes to 12 hours, six attempts). Errors that a retry cannot fix — an incomplete address, a wrong key — stop on the first try, with the reason written into the order note.
The same order never receives two invoices: every request carries a unique identifier (wc_order_1024), and the service returns the invoice already issued instead of making another.
Built for invoices that pass at ANAF
The things that, in practice, decide whether an invoice is accepted or rejected:
- The county is sent in a form ANAF understands. “Bucureşti” written with a Turkish cedilla (as it comes from many themes and imports) is not the same as “București” with a comma below, and that difference is the difference between a filed invoice and a rejected one.
- The Bucharest sector is derived from the address, because ANAF requires “SECTOR 3”, not “București”, as the locality.
- Broken text (the “�” character, from old databases or CSV imports in CP1252) is cleaned before sending and flagged in the order note. On a filed invoice, a single wrong letter can only be corrected through a credit note.
- Discounts do not become negative-price lines — UBL does not allow them — but are distributed proportionally across the invoice lines, preserving the total and the VAT per rate.
- The unit price is computed so that, multiplied by the quantity, it yields exactly the amount the customer paid, with no one-penny drift.
- An incomplete address stops issuing with a message that says what is missing, instead of sending an invoice that then gets stuck at filing.
What you need
An account on facturare.completez.ro with the company authorised at ANAF, and an API key with write permission, created under Integrations.
External services
The plugin sends order data to facturare.completez.ro, the service that issues the invoice and files it with ANAF. Without this service, the plugin has nothing to do.
What is sent, when an invoice is issued: the customer’s billing data (name or company name, tax ID if present, address, locality, county, country, e-mail, phone), the order lines (names, quantities, prices, VAT rates), shipping, fees, currency, payment method, the order number and date, plus an internal identifier of the order and of the customer.
When it is sent: when the invoice is issued (automatically, at the configured status, or manually from the order), when a filing is retried, on a credit note, and when fetching the PDF.
The data reaches ANAF as part of the electronic invoice, under the legal reporting obligation (RO e-Factura).
Service: facturare.completez.ro · API documentation
Terms: facturare.completez.ro/termeni · Privacy: facturare.completez.ro/privacy
Screenshots





Installation
- Install and activate the plugin. WooCommerce must be active.
- Create an API key in the invoicing service, under Integrations. Give it write permission. The key is shown only once, at creation.
- In WordPress, go to WooCommerce Settings Integration Completez E-Invoicing and paste the key. At the top you will see the company tied to it, the environment (test or production), the ANAF authorisation status and the available series.
- Issue the first invoice manually, from the “e-Factura” box on an order, to see the result.
- If it looks right, tick “Issue invoices for new orders” and choose the order status that triggers issuing.
Optionally, so the ANAF status reaches the order instantly: copy the notifications URL from the plugin settings into the API key in the service, and paste here the secret generated there. Without a webhook, the plugin polls a few times on its own (at 5 minutes, 30 minutes, 2, 6 and 24 hours).
FAQ
-
Can I test without issuing real invoices?
-
Yes, in two ways. Tick “Test environment” in the settings, or use a test key created in the service. Test invoices go to the ANAF test environment, have no fiscal value and do not count against your monthly plan. A test key stays in test even if the tick is removed — no combination of settings accidentally reaches the real SPV.
-
What happens if the customer does not fill in a tax ID (CUI)?
-
The invoice is issued to the individual, from the billing address. For companies, the plugin looks for the CUI in the fields used by Romanian checkout plugins (
_billing_cif,_billing_cui,_vat_numberand others); if your shop uses a custom field, you set it in the settings. -
An order did not get an invoice. Where do I see why?
-
In the order notes, where the reason is written, along with whether a retry is coming. In more detail, under WooCommerce Status Logs, source
completez-e-invoicing-for-woocommerce. The status also shows in the “e-Factura” column in the order list. -
I issued on an order by mistake. What do I do?
-
“Unlink invoice” from the order box: the order becomes free for a new issue. The invoice stays in the invoicing service — a fiscal document is not deleted remotely, it is reversed with a credit note.
-
Can the shop use a different invoice series?
-
Yes. The series is chosen in the invoicing service, on the API key (under Integrations): keep the company’s default series to share numbering with invoices issued manually, or pick a dedicated series so the shop gets its own number range. No plugin setting is needed — the key carries the series, and the plugin settings screen shows which one the shop issues on. Series are created in the service.
-
Two shops on the same company?
-
Yes, but change the “Identifier prefix” on the second one. Without that, order 1024 from both would look like a single one, and the second shop would receive the first shop’s invoice.
-
Does it work with HPOS (High-Performance Order Storage)?
-
Yes. The plugin reads and writes only through the WooCommerce orders API and declares compatibility, so it does not block enabling HPOS.
-
Is the plugin interface only in Romanian?
-
Yes. It is built for a Romanian fiscal obligation, with terms that have no useful equivalent in another language (“SPV”, “stornare”, “CIUS-RO”). This readme is in English as required by the plugin directory; a Romanian translation can be contributed separately.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Completez E-Invoicing for WooCommerce” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Completez 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
1.0.0
- First release.
- Automatic issuing at the chosen order status, through the WooCommerce queue, with backoff retries.
- Filing with the SPV and tracking the ANAF reply, through a signed webhook or periodic checks.
- The invoice PDF kept locally, attached to the chosen WooCommerce e-mails and available in the customer account.
- A status column in the order list, a box on the order with manual actions, a bulk action for orders left without an invoice.
- Manual credit notes, or automatic on a full refund.
- Text cleaning before sending (UTF-8, Romanian comma-below diacritics, control characters) and normalising counties to the form ANAF accepts.
