Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.invopop.com/llms.txt

Use this file to discover all available pages before exploring further.

https://assets.invopop.com/apps/verifactu/icon.svg

VERI*FACTU invoicing guide

View implementation guide ›
https://assets.invopop.com/apps/verifactu/icon.svg

VERI*FACTU supplier guide

View implementation guide ›
DeveloperInvopop
CategoryGovernment
ScopeB2B, B2C
CountrySpain
Invopop’s VERI*FACTU app is designed to support full compliance with Spain’s VERI*FACTU e-invoicing regulation. It provides endpoints and workflows to automate supplier onboarding, document upload, identity verification, and invoice generation, enabling businesses and intermediaries to issue e-invoices in accordance with Spanish law.Key Features
  1. Workflow Automation: this app makes several workflow actions available to issue invoices and onboard suppliers.
  2. Legally compliant PDF invoices: VERI*FACTU requires QR codes to consult the status of a document with the AEAT. This app will automatically generate compliant PDF invoices.
  3. VERI*FACTU XML generation: this app will generate a legally compliant XML which is included as an attachment in the Silo Entry and sent to the tax agency when issuing an invoice.
  4. Supplier Registration & Verification: this app will generate a registration link where suppliers will upload their identity documents and sign an agreement to issue invoices under their name (also available through the API).
  5. White-Label: the process allows issuance on behalf of clients (white-label) or directly as an organization, according to user needs.
  6. QR Code: Generates the VERI*FACTU QR code according to the AEAT specifications.
Make sure to check out our VERI*FACTU implementation guides for instructions on how to issue invoices) and onboard suppliers.

FAQ

Invoicing questions
You should send the credit note with the same sign as the original invoice.In Spain, unlike other countries, credit notes must be submitted to Hacienda with inverse values. Invopop handles this conversion automatically before transforming the credit note into a “factura rectificativa” (corrective invoice).This means you only need to send the credit note following international standards (with same sign as the invoice). Invopop will automatically adapt it when submitting to Hacienda.For reference, see the GOBL Invoice documentation with type set to credit-note.
See the Spain tax regime in GOBL for tax categories, NIF rules, and Spanish-specific extensions. Subsystem-specific addons live alongside: es-verifactu-v1, es-tbai-v1, es-facturae-v3.
In VERI*FACTU, you should only cancel an invoice if it hasn’t been handed to the customer nor accepted by the tax authority. Different from a credit note or a corrective, canceling an invoice doesn’t produce a second document, which means you don’t have a paper to hand to your customer to show the cancellation. That’s why, if the invoice has been handed to the customer, we recommend issuing a credit note instead.
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.
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.
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.
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.
KeyText
reverse-chargeReverse Charge / Inversión del sujeto pasivo.
simplified-schemeFactura expedida por contribuyente en régimen simplificado.
self-billedFacturación por el destinatario.
travel-agencyRégimen especial de las agencias de viajes.
second-hand-goodsRégimen especial de los bienes usados.
artRégimen especial de los objetos de arte.
antiquesRégimen especial de las antigüedades y objetos de colección.
cash-basisRégimen especial del criterio de caja.
Registering supplier questions
We reject agreements when:
  • The uploaded document is not signed (they upload the unsigned template).
  • Users upload a handwritten signature without and ID.
  • The electronic signature is made with an FNMT certificate.
  • The agreement is missing a date or location.
  • The name is entered as an email address.
The job will state the reason for rejection.
A KO will be triggered and the supplier will be labelled with the Error state. We currently recommend sending a reminder to the supplier through a webhook.The registration link will not expire and the entity will still be able to upload their registration documents which will be validated. Should you choose to run this workflow again using this supplier, the supplier will be accepted or rejected immediately because the required documentation has already been provided and validated.
If the uploaded agreement documents were rejected, a KO will be triggered and the supplier will be labelled with the Error state. We currently recommend sending a notification to the supplier through a webhook within the Error Handling section.Afterwards, if you wish to re-register the supplier with new documents, you must:
  1. Unregister the supplier using the Unregister Supplier workflow.
  2. Re-run the Register supplier workflow.
This will restart the entire registration process. When uploading documents, the previously submitted agreement will appear selected by default. Simply choose a new file and click Continue to override the old one. See the image below for reference:
Overriding the previously submitted agreement
In order to complete the representation agreement you will need to provide the following information:Company
  1. Name
  2. NIF
  3. Address
Legal representative
  1. Full name
  2. Government ID type and number
  3. Address
Spain supplier example
{
  "$schema": "https://gobl.org/draft-0/org/party",
  "name": "Invopop S.L.",
  "tax_id": {
    "country": "ES",
    "code": "B85905495"
  },
    "people": [
        {
            "name": {
                "given": "Juan",
                "surname": "Pérez González"
            },
            "identities": [
                {
                    "key": "national",
                    "code": "123456789A"
                }
            ],
            "addresses": [
                {
                    "num": "10",
                    "street": "Calle Ejemplo",
                    "locality": "Madrid",
                    "region": "Madrid",
                    "code": "28020",
                    "country": "ES"
                }
            ]
        }
    ],
  "addresses": [
    {
      "num": "42",
      "street": "Calle Pradillo",
      "locality": "Madrid",
      "region": "Madrid",
      "code": "28002",
      "country": "ES"
    }
  ],
  "emails": [
    {
      "addr": "billing@example.com"
    }
  ]
}
If the entity is an self-employed individual (autónomo), only the information requested in in the Legal representative section is required.
Spain autónomo supplier example
{
  "$schema": "https://gobl.org/draft-0/org/party",
  "name": "Juan Pérez González",
  "tax_id": {
    "country": "ES",
    "code": "B85905495"
  },
  "addresses": [
    {
      "num": "42",
      "street": "Calle Pradillo",
      "locality": "Madrid",
      "region": "Madrid",
      "code": "28002",
      "country": "ES"
    }
  ],
  "emails": [
    {
      "addr": "autonomo@example.com"
    }
  ]
}
The supplier can add their electronic signature to the PDF document (instructions), or sign with a handwritten signature (we recommend using Adobe’s online service.
Individual documents are limited to a maximum size of 10MB. Uploads exceeding this size will result in an error.
Run the VERI*FACTU Register Supplier workflow. The legal representative signs the PDF agreement (electronic or handwritten signature with ID) and Invopop registers the supplier with AEAT for invoicing on their behalf.
More answers in our Spain FAQ section

Participate in our community

Ask and answer questions about the VERI*FACTU Spain App →