Romanian e-invoicing: what an automated flow looks like
What happens between your invoice and the tax authority, why invoices get rejected, and what changes when nothing is uploaded by hand.
If you run a company in Romania and your invoicing software was chosen somewhere else, RO e-Factura is probably the first thing that does not fit. It is not an option and it is not a local nicety: business-to-business invoices have to reach the tax authority in a structured format, through the state's own channel, and an invoice that does not get there has not legally been issued.
Most companies live it as a monthly chore: someone sits and uploads files to a portal, one by one, then comes back a few days later to see which ones were accepted. It does not have to be that way. Once the flow is wired directly into the tax authority, that step disappears completely — and, more importantly, so do the rejections, because errors get caught before anything is sent.
What actually happens between your invoice and the state
An electronic invoice is not a PDF. It is a structured XML file that follows the European standard as adapted for Romania. The state does not read a document, it reads fields: who issues, who receives, which product, which VAT rate, which unit of measure.
The file is transmitted through the Virtual Private Space — SPV — the channel a company uses to communicate electronically with ANAF, the Romanian tax authority. There it is validated automatically. If it passes, it receives an identifier and becomes the official invoice. If it does not, it is rejected with a reason.
The official details, including the deadlines — which are updated periodically, so they are worth checking at the source rather than in an article — are on the ANAF page for the RO e-Factura system and in the Ministry of Finance section. Both are published in Romanian only, which is part of the problem this article is trying to solve.
Why invoices get rejected
Almost never out of bad faith. Almost always out of manual processes.
Wrong identification data. A mistyped tax identification number, an incomplete address, a missing country code. The person issuing the invoice sees a customer they know; the system sees a field that does not match.
VAT rates or units of measure that do not follow the format. The standard has fixed lists of accepted values. "pcs" written the way you like it is not the same thing as the code the validator expects.
Late transmission. Deadlines are regulated and lateness is penalised. When uploading is manual, it depends on one person being available — so on holidays, on busy days, and on forgetting.
No clear record. The most treacherous one. If you have no single place showing what was sent, what was accepted and what was rejected, you find out about a problem only when somebody comes looking for you.
What the flow looks like when it is automatic
The difference is not that it "goes faster". It is that three steps disappear entirely.
It is generated valid from the start. The invoice is composed directly from data already in the system — the customer, the products, the rates — and comes out in the correct format, without anyone transcribing anything.
It is validated before it leaves. The system checks locally what the tax authority would check: identification numbers, rates, units, mandatory fields. An invoice with problems is stopped before transmission, when fixing it is cheap.
It sends itself. No upload, no portal, no person who has to remember.
The status comes back into the list. Accepted or rejected, with the reason, right next to the invoice. You do not log in anywhere to find out.
The archive stays searchable. Every invoice sent, with its status and its identifier, in one place you can answer a question from without digging.
What to ask of an invoicing system
A few criteria that separate a real integration from an export dressed up as one:
- A direct connection to the tax authority, not "an XML export that you upload". The second is still manual work, just one step shorter.
- Validation before transmission. Without it, you learn about the error from the tax authority, which means late.
- The status of every invoice, visible in the list, with the rejection reason written so that someone who is not an accountant can act on it.
- An alert on rejection. A status you have to go and look for is a status you do not see.
- A complete history that survives the change of fiscal year.
What it looks like in practice
FlowDeskOne does exactly this flow, but starting further up: the customer's request becomes a quote, the quote becomes a contract, the contract becomes a work order, and the work order becomes the invoice that is validated against the RO_CIUS standard and leaves automatically for the Virtual Private Space. The status from the tax authority, with the rejection reason where there is one, appears directly in the list.
The part that matters is not the last step but the first: because the data is entered once, at the start of the chain, the invoice has no way of containing a transcription error. Automating transmission solves the lost time. A single flow solves the rejections.
If you already have an invoicing system and only want the Romanian tax authority part connected to it, or if you want the whole chain in one place, tell me what you need built.
Got a project to start?
The articles above come from delivered projects. If yours looks like one of them, write to me and I tell you what it actually took.