Get in touch
  • WordPress
  • Payments
  • v1.0.1

e-Factura ANAF for WooCommerce — RO e-Factura invoices to ANAF (SPV) straight from orders

Romanian RO e-Factura invoices from WooCommerce orders: UBL 2.1 under CIUS-RO 1.0.1, sent directly to the ANAF API (SPV) through your own OAuth application, no accounting SaaS. Upload index, ANAF status and the signed answer ZIP on the order, CUI field at checkout, retry queue, TEST and PRODUCTION. Pro — B2C reporting, credit notes from refunds, foreign buyers, the ANAF PDF for customers, SPV messages.

Download Free
Pro · one-year licence The more sites, the less each one costs
Compatibility
WooCommerce 8.0+ · WordPress 6.2+ · PHP 7.4+ · HPOS · classic and block checkout · UBL 2.1 / CIUS-RO 1.0.1 · RO e-Factura API (OAuth)
Licence
one site, annual
Trial
7 days, no card, one per site
Updated
September 2026
Or all 144 Pro modules with All Access — 4 990 ₴ / year

What Free has,
and what Pro adds

The free version works with no time limit. Pro adds the rest of the features in the table.

Feature Free Pro
380 invoice (UBL 2.1, CIUS-RO 1.0.1) from the order of a company with a CUI: seller, buyer, items, shipping and fees as lines, VAT per rate ✔ ✔
Automatic on "Completed" or "Processing" + a "Send to e-Factura" button on the order ✔ ✔
Direct upload to the ANAF API through your own ANAF OAuth application, no third-party service ✔ ✔
ANAF status (stareMesaj) and the signed answer ZIP with the Ministry of Finance seal — on the order and in the register ✔ ✔
Rejected — the reason from the ANAF answer, "Rebuild and send" with the same number, "Discard" ✔ ✔
Retry queue: network problems, ANAF technical errors and rate limits never lose an invoice ✔ ✔
CUI, trade register and company name fields on the classic and block checkout, CUI check digit validation ✔ ✔
Romanian address checks before sending: county as RO-XX, sector 1–6 for Bucharest, field lengths ✔ ✔
Several VAT rates from WooCommerce taxes, lines without VAT (E/Z/AE), seller not registered for VAT (O), the "TVA la încasare" note ✔ ✔
Your own number series with a yearly or monthly counter, separate counters for TEST and PRODUCTION ✔ ✔
TEST (api.anaf.ro/test) and PRODUCTION environments ✔ ✔
Automatic ANAF token renewal and a reminder when the connection is about to end ✔ ✔
Plugin languages: English, română ✔ ✔
B2C reporting through uploadb2c: the buyer's CNP or 13 zeros — ✔
381 credit notes from WooCommerce refunds — by items or by amount, referencing the invoice — ✔
Buyers from the EU (K) and outside the EU (G) with extern=DA — ✔
The invoice PDF rendered by ANAF in the admin and for the customer in My Account — ✔
"SPV messages" tab: received and sent messages of the last 1–60 days, ZIP and PDF — ✔
Bulk sending of past orders, CSV register, e-mails on rejected invoices and an ending connection — ✔

What it looks like

e-Factura ANAF invoice register in the WooCommerce admin with ANAF statuses
Invoice register: an invoice rejected by ANAF with the BR-RO-111 error text and the “Rebuild and send” and “Discard” buttons, below — accepted invoices, credit notes and foreign buyers with upload indexes and links to the XML, ZIP and PDF. TEST environment, ANAF answers simulated.
e-Factura box on a WooCommerce order: invoice accepted by ANAF
The “e-Factura” box on the order: invoice number, “Accepted by ANAF”, upload index, links to the details, XML and the ZIP from SPV.
The CUI is not valid error on the WooCommerce block checkout
Block checkout: CUI / CIF, company name and trade register fields; a CUI with a wrong check digit stops the order.

The trial starts when you ask

A fresh install is the free version, nothing switches on by itself. The “Try Pro for 7 days” button → e-mail → the key right in the window and by e-mail.

One key — one site

Moving the store? Unbind the licence on the old domain and activate it on the new one yourself. If our server is unreachable, Pro keeps working for 14 more days. For studios — keys for 5 or 25 sites, or unlimited.

Technical requirements

  • WooCommerce 8.0+ with the classic or block checkout, HPOS compatible
  • WordPress 6.2+ · PHP 7.4+ with OpenSSL and ZipArchive
  • A qualified certificate of a person with SPV rights for the seller’s CUI (legal representative, designated representative or authorised person)
  • An ANAF application for the “E-Factura” service with the site’s callback URL. We recommend pretty permalinks (/wp-json/…): whether ANAF accepts a callback with “?rest_route=” has not been verified. Security plugins that switch off the REST API break the callback — tokens can then be pasted manually.
  • Currency — RON only; orders in other currencies are skipped with a note
  • WooCommerce taxes with the Romanian rates — the rates go into the invoice from the taxes of each order
  • Plugin languages: English and Romanian.

Version history

v1.0.1 Current September 2026

ANAF answers (signed ZIPs, error lists, SPV messages, PDFs) are kept in the site database instead of the uploads folder, which nginx served by direct URL; existing files are moved on update…

v1.0.0 First release September 2026

UBL 2.1 / CIUS-RO 1.0.1, ANAF OAuth, upload, stareMesaj, descarcare, retry queue, CUI fields on the classic and block checkout, RO address checks, TEST and PRODUCTION; English and Romanian.

Frequently bought with e-Factura ANAF for WooCommerce

4 modules in one order — 40% cheaper than separately

“Store starter” bundle e-Factura ANAF Nova Poshta Premium LiqPay Telegram notifications and Viber/SMS for customers Need more — all 144 modules in All Access for 4 990 ₴.
3 590 ₴ / year instead of 5 960 UAH bought separately
Buy the bundle →

Full module description

e-Factura ANAF for WooCommerce is a plugin for shops in Romania that sell on WooCommerce and have to report their invoices to the national RO e-Factura system (SPV) of the ANAF tax authority. It turns an order into an electronic invoice in UBL 2.1 under the Romanian specification CIUS-RO 1.0.1 and sends it to the ANAF API itself, through your own OAuth application — the way accounting programs do it, but without a SaaS in between and without a monthly subscription. The upload index, the ANAF status and the answer ZIP with the Ministry of Finance seal are kept with the order.

What you need. A company registered in SPV; a qualified digital certificate of a person with SPV rights for the company’s CUI; your own ANAF application for the “E-Factura” service, registered in the developer profile on anaf.ro with the callback URL the plugin shows. Invoices are in RON only.

How it was tested, honestly. The plugin was tested on a local WooCommerce store with ANAF answers simulated from the official API documentation (upload, stareMesaj, descarcare, uploadb2c) and the examples of Romania’s Ministry of Finance. Every XML from the test orders — B2B, B2C, a seller not registered for VAT, credit notes — passed the official ANAF validator (UBL 2.1 XSD + CIUS-RO 1.0.9 schematron). We have not run it against the live ANAF, test or production, yet: that needs the certificate of a Romanian company. Start in the TEST environment with your company during the 7-day Pro trial — if ANAF answers differently from its documentation, we fix it promptly.

Responsibility for the content of the invoice stays with the shop. The plugin builds the invoice from the WooCommerce order data and from the VAT settings you choose: categories for lines without VAT, the non-VAT-payer mode, “TVA la încasare”, B2C reporting, foreign buyers. These are your accountant’s decisions — show them the settings before switching to PRODUCTION.

What the admin gets

  • WooCommerce → e-Factura: the “Invoices”, “SPV messages”, “Settings” and “Licence” tabs.
  • Invoice register: number, order, buyer with CUI, total, ANAF status, upload index or the rejection text; status filter and search. Links to the details, XML, the ANAF answer ZIP and the PDF (Pro).
  • “Send / check now” sends the queue and checks the statuses at once, without waiting for cron.
  • Notices at the top of the admin: rejected or undelivered invoices, no ANAF connection, a connection that is about to end.

Every order has an “e-Factura” box: invoice number, status (“Accepted by ANAF”, “Rejected by ANAF”, queued), upload index and links to the XML and ZIP. An order without an invoice gets a “Send to e-Factura” button. The order notes record each step: invoice created, uploaded with its index, accepted or rejected with the reason.

A rejected invoice is visible at once: in the register, on the order and in a notice at the top of the admin, next to the error text from the ANAF answer ZIP (for example BR-RO-111 about the county code). Once the order is fixed, “Rebuild and send” rebuilds the invoice with the same number, which never reached the buyer; one you do not need is closed with “Discard”.

What the buyer sees

The checkout gets the “CUI / CIF (for an invoice to a company)” and “Trade register no.” fields and, while WooCommerce hides its own Company field, “Company name (for the invoice)”. Without a CUI the order is an ordinary one. With a CUI the plugin checks the check digit (with or without the RO prefix), and a CNP typed into the CUI field is refused with a hint. A CUI without a company name does not pass. Works on the classic and the block checkout.

ANAF requires the sector (SECTOR1–SECTOR6) for an address in Bucharest. A Bucharest buyer without a sector in the City field is asked to add it, for example “Sector 3” — otherwise ANAF itself would reject the invoice.

How it works — step by step

  1. ANAF application. In the developer profile on anaf.ro you register an application for the “E-Factura” service with the callback URL from the plugin settings; ANAF gives you a Client ID and a Client Secret.
  2. Connection. WooCommerce → e-Factura → Settings: Client ID and Client Secret, “Connect to ANAF”, choose the qualified certificate. “Check the connection” tests the token with a request to ANAF.
  3. Seller. CUI, name, address, county (the sector for Bucharest), IBAN, VAT payer or not, the number series.
  4. Checkout. A company buyer enters its CUI; a wrong CUI or a Bucharest address without a sector does not pass.
  5. Order status. The order becomes “Completed” (or “Processing” — your choice): the plugin checks the data against the RO rules, builds the XML with the next number and queues it. No number is used up until the data passes the checks.
  6. Sending. Action Scheduler uploads the XML to ANAF right away (upload), cron is the safety net. Then the plugin polls the state (stareMesaj) with a growing pause, within the ANAF rate limits.
  7. Answer. Accepted — the ZIP with the invoice and the Ministry of Finance signature is kept with the order; rejected — the error text in the register and on the order.
  8. Failures. ANAF down, a technical error or 429 — the invoice waits and is retried with the same XML; a “transmisa anterior” duplicate is tied to the original index.

Pro. A WooCommerce refund — by items or by amount — produces a 381 credit note referencing the invoice, sent to ANAF the same way. Orders without a CUI are reported through uploadb2c with the CNP (if the buyer gave it) or 13 zeros. EU buyers with a VAT number get category K, buyers outside the EU get G, both with extern=DA.

Under the hood

  • UBL 2.1, CustomizationID CIUS-RO 1.0.1: 380 invoice and 381 credit note; the XML is frozen once built, so a retry sends the same file byte for byte.
  • ANAF OAuth: authorization code on logincert.anaf.ro, token_content_type=jwt, a state against forged callbacks. The access token lasts 90 days and is renewed automatically 10 days before it ends; the refresh token lasts 365 days, then a new sign-in with the certificate. The Client Secret and the tokens are stored encrypted in the database (AES-256 with the site’s keys).
  • RO e-Factura API: upload / uploadb2c, stareMesaj, descarcare, listaMesajeFactura and transformare (PDF) — within the ANAF limits on the number of requests.
  • ANAF answers (signed ZIPs, error lists, SPV messages, PDFs) are kept in the site database since version 1.0.1, not in the uploads folder — no web server, nginx included, can hand them out by direct URL. Downloads go only through the admin with a capability check, the customer PDF with an order key and owner check.
  • Locked numbering: two orders in the same second never get the same number; separate counters for TEST and PRODUCTION.
  • Simulation mode: the CCEF_ANAF_MOCK constant in wp-config.php simulates ANAF answers in the TEST environment — to check the shop without a certificate.
  • Deleting the plugin removes the tokens, crons and caches; the invoice register and the ANAF answers stay as accounting records. The CCEF_DELETE_DATA constant removes everything.

Installation

  1. Plugins → Add New → Upload Plugin: choose efactura-anaf-for-woocommerce-1.0.1.zip and activate.
  2. Register an “E-Factura” application in the ANAF developer profile with the callback URL from the plugin settings.
  3. WooCommerce → e-Factura → Settings: Client ID and Client Secret, “Connect to ANAF”, the certificate, “Check the connection”.
  4. Fill in the seller data and the number series (a series of its own if another program also issues invoices), keep the TEST environment.
  5. Place a test order with a CUI and set it to “Completed” — within a minute the order shows the index and the ANAF status.
  6. Show the VAT settings to your accountant and switch the environment to PRODUCTION.
  7. For Pro: paste the licence key from the e-mail after payment or start the 7-day trial.

Questions
about the module

Didn't find the answer? Message us on Telegram and we'll reply within a business day.

@catcode_support Setup, compatibility, activation
What do I need to start?

A company registered in SPV, a qualified digital certificate of a person with SPV rights for its CUI, and your own application for the "E-Factura" service registered in the ANAF developer profile with the callback URL the plugin shows. ANAF gives you a Client ID and a Client Secret — paste them into the settings and sign in with the certificate.

What has the plugin been tested on?

On a local WooCommerce store with ANAF answers simulated from the official API documentation and the examples of Romania's Ministry of Finance. Every XML from the test orders passed the official ANAF validator (CIUS-RO 1.0.9 schematron). It has not yet run against the live ANAF, test or production: that needs the certificate of a Romanian company. Try it with your company in the TEST environment during the 7-day Pro trial.

Does it work in currencies other than RON?

No. This version sends invoices in RON only; orders in other currencies are skipped with a note on the order.

How often do I have to sign in with the certificate?

The access token is valid for 90 days and renewed automatically, the refresh token for 365 days. Once a year you sign in with the certificate again; the plugin reminds you in advance.

Who is responsible for the content of the invoice?

The shop. The plugin builds the invoice from the order data and from the VAT settings you choose. VAT categories, "TVA la încasare", B2C reporting are your accountant's decisions; show them the settings before switching to PRODUCTION.

Where are the ANAF answers kept?

In the site database, not in a web-accessible folder: the ZIP can be downloaded only in the admin, the PDF only by the customer who placed the order.

Not quite what you are looking for?

We build custom modules for WordPress, WooCommerce, OpenCart and Shopify. Tell us about the task and we'll prepare an estimate.

Order a custom module