Skip to content

Veri*factu: what Spain now requires of your invoicing software

The obligation is not "print a QR code on invoices". It is that every invoice joins a signed chain nobody can rewrite — which changes things you do today without thinking: fixing an amount, deleting a bad invoice, retrying a failed submission.

Updated · By

The dates, after two postponements

Royal Decree-Law 15/2025, published in the Spanish official gazette on 3 December 2025, postponed Veri*factu for a second time. The dates in force are 1 January 2027 for corporate income tax payers and 1 July 2027 for the remaining obliged parties.

That matters beyond the calendar: a lot of commercial urgency circulated through 2026 based on dates that had already moved. Confirm the date that applies to you against the legislation rather than against whoever is selling you software — and read what follows as the shape of the problem, not as tax advice for your business.

What it really requires: a chain, not a QR code

The printed QR is the visible part, which is why it is the part every demo shows. The part that constrains system design is different: each invoice produces a billing record carrying a huella — a SHA-256 computed over a canonical string of fields in an exact order, which includes the hash of the previous record.

Three practical consequences follow, and you will meet all three:

  • History becomes read-only. Editing an invoice from three months ago would invalidate the hash of every record after it. There is no repair: those records are already signed.
  • Annulling is not deleting. A withdrawn invoice is expressed as an annulment record appended to the end of the chain. The original stays. History grows rather than being corrected.
  • Two simultaneous invoices are a concurrency problem. If two users issue in the same instant and nothing serialises access to the head of the chain, the chain forks. Boris takes a row lock on the chain head before appending, precisely because both records would already be signed and no repair would exist.

Retrying is not regenerating

This is the quietest way to break a chain. The tax agency times out, the submission fails, and the natural engineering instinct is to rebuild the record and send it again. But the record contains its own generation timestamp: rebuilding it changes the hash, and the next record in your chain now points at a hash that no longer exists.

A correct retry re-sends the stored payload, byte for byte. If a vendor cannot explain how their retries work, that single question will save you the most.

"Correct" does not mean accepted

The response has two levels. The submission status can read Correcto while the record inside it was AceptadoConErrores — which is exactly what the agency returns when its own recomputation of your hash disagrees with yours. Software that only reads the submission level will show you a green tick on an invoice that has a recorded problem.

A good system refuses to invoice

This is the uncomfortable part, and the line between a fiscal register and a PDF generator. A billing record is a statement filed with the tax authority, not a commercial document. When a field is missing, inventing it is not flexibility — it is signing something untrue.

In Boris the fiscal mapping refuses, and each refusal names what to fix, in cases like these:

  • An undecided zero VAT rate. Exempt, not subject, and "nobody entered it" are three different declarations, indistinguishable from the number alone.
  • An unidentified recipient above the simplified-invoice limit. In hospitality that limit is €3,000; above it the recipient is mandatory, and the record is refused rather than filed wrong.
  • A credit note that names no original invoice. A correction that does not say what it corrects is not a correction.
  • A missing issuer tax number, name, or invoice series number.

A refusal at the moment of issue is a two-minute annoyance. The same field filed wrong is an incident that surfaces months later, already signed, in your name.

Five questions before you buy

  1. What happens if I try to edit an invoice that has already been filed?
  2. Does a retry re-send the stored payload, or rebuild it?
  3. Does it distinguish AceptadoConErrores from accepted?
  4. What happens when two users invoice in the same second?
  5. Which missing data makes it refuse to file — and does it tell me before or after?

One note of honesty about Boris: the hash, the chaining, the QR and the XML are built and verified against the official schemas and against the three worked examples in the tax agency's own specification. Live submission needs each business's own certificate, and until that is installed it runs in simulation mode. We would rather tell you that than let you discover it in January 2027.

Frequently asked questions

When does Veri*factu actually apply?

Royal Decree-Law 15/2025 (published 3 December 2025) postponed it a second time: 1 January 2027 for corporate income tax payers and 1 July 2027 for everyone else. It was not in force during 2026. Any vendor who sold you urgency in 2026 was selling a date that had been moved.

What is the huella and why does it constrain the software?

It is a SHA-256 over a canonical string of fields in an exact order, and that string includes the previous record's hash. Your invoices become a chain: altering an old invoice invalidates every hash after it, which is the point. It also means the software cannot quietly repair a record it already issued.

Can a wrong invoice be deleted?

Not by removing the record. A withdrawal is filed as an annulment record appended to the end of the chain, and the original issue record stays. History is extended, never corrected — so an invoicing tool that lets you edit a filed invoice without warning you is the one that will cost you in an audit.

What should the software do when the VAT treatment is unclear?

Refuse to file, not guess. A zero rate may mean exempt, not subject, or simply unentered, and those are three different tax declarations that look identical as a number. Filling it in by default is signing a false statement in your name.