Skip to main content
VERI*FACTU invoices don’t necessarily need to be printed because they are issued with electronic invoicing systems such as Invopop. Source: AEAT FAQ.
The AEAT is not strict about the validation, but it’s best to keep your intentions clear. GOBL gives you alternative fields such as op_date and value_date to store details about your invoicing operation.
Yes, we are especially powerful and simple for this. Read more in our white label use case.
VERI*FACTU will be mandatory for companies from January 1st, 2026. The rest of tax payers (mainly self-employed indidividuals) from 1 July 2026. Companies reporting with SII (large companies) or TicketBAI are exempt from reporting with VERI*FACTU.
There are three ways to correct an invoice:
  1. The recommended approach is to issue a GOBL Invoice with the type credit-note or debit-note, which in VERI*FACTU translates to a “Factura Rectificativa por Diferencias”.
  2. If the above approach does not apply, you can issue an invoice of type corrective, which in VERI*FACTU translates to a “Factura Rectificativa por Sustitución”.
  3. Lastly, you can use the Cancel VERI\*FACTU (Spain) step, which will void the invoice in the tax authority. This should only be used under special circumstances and not as part of a regular workflow.
The response from VERI*FACTU should contain all the details you need to be able to decide what changes need to be made to the GOBL document in order to be processed correctly. Make the changes either via the Invopop API or console directly on the same document, and simply resend to the VERI*FACTU workflow.Invopop will ensure that the correct substitution document is generated by checking previous attempts and including the correct codes in the new request.
VERI*FACTU requires every request to be linked with a fingerprint or hash. During the “Generate VERI*FACTU” and “Cancel VERI*FACTU” actions, Invopop will automatically find the last request made for the same supplier, and incorporate the chained data into the new request.Its important to understand the VERI*FACTU focuses on requests, and not individual documents; a single invoice may have multiple entries in the chain if it has been processed multiple times due to incorrect details, cancellations, or substitutions.Invopop guarantees the chain is never broken using database transactions and retries in the case of collisions.
Yes, VERI*FACTU allows issue dates to be in the past, as long as they are after October 28, 2024. Note that the issue date can’t be set with a date in the future.
The most common errors are related to format issues or invalid extensions, which are already handled in Invopop through the es-verifactu-v1 addon validations. These prevent most of the typical problems before they reach the submission stage.Among the errors that aren’t yet validated on our side, the five most frequent ones are:
  • 4104: Error en la cabecera: el valor del campo NIF del bloque ObligadoEmision no está identificado. → The issuer’s name must match what’s registered for that NIF (tax ID).
  • 4102: El XML no cumple el esquema. Falta informar campo obligatorio. → Usually occurs when a required field is missing in the XML, often within the Desglose (taxes) section.
  • 1110: El NIF no está identificado en el censo de la AEAT. → The provided NIF (tax ID) isn’t found in the AEAT registry (often due to typos or testing data).
  • 3000: Registro de facturación duplicado. → Triggered when issuing the same invoice series/code twice.
  • 2001: El NIF del bloque Destinatarios no está identificado en el censo de la AEAT. → Similar to 1110, but applies to the NIF (tax ID) of the customer.
You can set your own description using the notes object in the invoice. The key used for the description needs to be set to general. For example:
 "notes": [
        {
            "key": "general",
            "text": "This will appear as DescripcionOperacion"
        }
    ]
We generate a default description if the note is not provided which is what you are currently seeing. This default description will neatly cut off before it reaches a length of 500 characters as that is the limit the AEAT imposes.
We do not provide the QR code image itself. The QR code is a visual representation of a URL that you need to generate on your own if you’re creating custom PDFs or need it for any other purpose.The full requirements are in the AEAT VERI*FACTU QR specification PDF document in Spanish. Here you can read that:
The “QR” code must have a size between 30x30 and 40x40 millimeters and follow the specifications of the ISO/IEC 18004:2015 standard. For the generation of the “QR” code, the M (medium) error correction level shall be used.
Generate your own QR code image as follows:
1

Obtain the VERI*FACTU URL

  • API: fetch the entry and get data -> head -> stamps -> verifactu-qr.
  • Console: in the invoice entry click on the kebab ··· menu and select View Headers.
2

Generate the QR image

Use the VERI*FACTU URL in a library capable of generating ISO/IEC 18004:2015 QR images (Invopop uses go-qr)
3

Store or use the image

Store or embed the image in your PDF. You can see how we generate QR images in our open source gobl.html library.
No, you don’t need to register with TicketBAI, or upload any digital certificates to Invopop. As a certified billing provider, Invopop will sign all invoices with our own digital certificate.TicketBAI allows three types of certificates; Invopop uses the certificado sello de empresa which allows us to sign e-invoices on behalf of our customers, saving you the burden of registering and uploading certificates yourself.
  • Bizkaia: by the end of each quarter, except for companies under SII (turnover above 6 million euros), which must report within 4 days.
  • Gipuzkoa and Álava: The submission must be done immediately after generating the invoice.

Participate in our community

Ask and answer questions about Spain’s regulation →