Skip to main content
VeriFactu

VeriFactu error 3000: the AEAT already has that invoice on record

Error 3000 appears when you send the AEAT, the Spanish tax agency, a record with the same invoice identifier as one it already holds. It is rarely your mistake: usually an earlier submission got through even though its answer was lost on the way. What matters is the status of that earlier record, and it comes back in the same answer.

FlexigoTech · Editor in charge: Víctor Gómez · Updated 4 November 2026

Key facts

Module
VeriFactu
Versions
Odoo 17, 18, 19 and 20
Checked
in the module's source code, version 20.0 · against the sources linked at the end
Reading time
3 min

What it means

The AEAT text is Registro de facturación duplicado., «duplicate invoicing record», and it belongs to the section of the official list that rejects the invoice, not the whole submission. The identifier being compared is the IDFactura block: the issuer's tax ID, the invoice number and its issue date. In Odoo those three come from the company's tax ID, the number Odoo gave the invoice and its date.

Along with code 3000, the AEAT answer includes a RegistroDuplicado block that tells you what happened to the record already on file: the ID of the request it came in with, its status and, if it had one, its own error code.

Card for VeriFactu code 3000
The 3000 card: a rejection of the invoice that the module treats as accepted when the earlier record is on file as correct.

When it happens with Odoo

The AEAT answers every submission with a status per record. If that answer never arrives, because of a network cut or a timeout, the module cannot know whether the AEAT stored the record: it puts the submission in Retrying and tries again later, with waits from 2 minutes to 12 hours. If the first attempt did get in, the second one comes back with a 3000. It is the AEAT's way of telling you it already had it.

What the module does with the answer

Status of the earlier recordWhat you get in Odoo
Correcta (correct)The record becomes «Aceptado AEAT» (accepted) and is not sent again.
AceptadaConErrores (accepted with errors)It becomes «Aceptado con errores (subsanar)», with the code and description of the earlier record.
Anything elseIt is handled as a rejection: Retrying and, on the sixth attempt, Dead Letter.

This matches what the AEAT says: if the record is already on file as correct or accepted with errors, it must not be resent. Sending it again would only produce another 3000.

AEAT submission queue in Odoo grouped by status
The submission queue grouped by status: pending, retrying, submitted, failed and Dead Letter. Odoo 20 screenshot with demo data; the AEAT answers are simulated.

What you need to do

  • If the record ended up as «Aceptado AEAT», nothing. The invoice is registered exactly once.
  • If it ended up as «Aceptado con errores (subsanar)», the problem is not the duplicate but the error the earlier record already had. Look up its code in this series of pages.
  • If 3000 keeps appearing for different invoices, check that two systems are not sending the same invoices with the same tax ID, for instance a test copy of Odoo pointing at the production environment.

Can 3000 come from another invoice with the same number?

Only if the tax ID, number and date all match. Odoo does not repeat numbers within a journal, so the usual case is the same invoice sent twice.

Where do I see the earlier record?

In the answer stored with the submission, the Raw Response field of the queue, which holds the whole RegistroDuplicado block.

Cancellation records follow the same identifier logic. What happens when you cancel an invoice the AEAT does not have, or one already cancelled, is on the cancellations page.

Keep reading

VeriFactu error 4134: «Servicio no activo», what happens to your invoices and how to resend themWhat VeriFactu error 4134 from the Spanish tax agency means, why it rejects the whole submission and how to resend your invoices from Odoo 17, 18, 19 and 20.VeriFactu errors 3001 and 3002: cancelling an invoice the AEAT does not have, or already cancelledVeriFactu errors when cancelling: 3001 (already cancelled), 3002 (does not exist) and the Generador block. What Odoo 17, 18, 19 and 20 does when you cancel an invoice.VeriFactu errors in Odoo: how to read what the AEAT says and what your own system stops firstHow to read VeriFactu errors in Odoo 17, 18, 19 and 20: submission states, AEAT codes, certificate, NIF and record chain, and what to do in each case.
Checked in the module's source code (version 20.0) and the linked sources

Sources