Si factures amb Odoo a Espanya (o l'implantaràs abans del 2027), VeriFactu és una obligació legal amb sanció, i arriba al teu sistema de facturació facis servir Odoo cada dia o no. Aquí expliquem com es calcula l'empremta que encadena cada registre amb l'anterior, els tres errors de càlcul que hem comès nosaltres i què fa un sistema ben construït davant un rebuig de l'AEAT.
Idea clau: VeriFactu no exigeix facturació electrònica ni un format nou de factura. Exigeix que el sistema que factura generi, en expedir cada factura (o immediatament abans, mai després), un registre encadenat amb l'anterior mitjançant empremta i inalterable. Un procés nocturn no compleix.
Què és exactament VeriFactu?
VeriFactu és el nom popular dels requisits tècnics del Reglament dels Sistemes Informàtics de Facturació (RRSIF), aprovat pel Reial decret 1007/2023, que desenvolupa l'article 29.2.j) de la Llei general tributària. No és la factura electrònica B2B de la Ley Crea y Crece: aquesta és una altra obligació, amb el seu propi calendari, sobre el format de la factura. VeriFactu regula com es comporta el teu programari per dins.
Hi ha dues modalitats. A VERI*FACTU, el teu Odoo envia cada registre a la seu de l'AEAT gairebé en temps real i la factura porta QR i la llegenda «VERI*FACTU». A la no VERI*FACTU el registre es genera i se signa igual, però es conserva localment.
L'empremta encadenada: què és i com es calcula
L'empremta és un SHA-256 de 64 caràcters hexadecimals que resumeix unes poques dades de la factura més l'empremta del registre anterior. Aquest «més l'empremta de l'anterior» és el mecanisme: si algú retoca la factura 4.000, deixa de quadrar la 4.001 i les següents.
Quins camps hi entren i en quin ordre ho fixa l'article 13 de l'Ordre HAC/1177/2024. Per a un registre d'alta són vuit:
- NIF de l'emissor (IDEmisorFactura), sense prefix de país.
- Número de factura i sèrie (NumSerieFactura).
- Data d'expedició, en DD-MM-AAAA (FechaExpedicionFactura).
- Tipus de factura: F1, F2, F3 o R1 a R5 (TipoFactura).
- Quota total (CuotaTotal).
- Import total (ImporteTotal).
- Empremta del registre anterior (Huella).
- Data, hora i fus de generació, ISO 8601 (FechaHoraHusoGenRegistro).
L'anul·lació en fa servir cinc, i aquí hi ha la primera trampa: aquests camps es diuen IDEmisorFacturaAnulada, NumSerieFacturaAnulada i FechaExpedicionFacturaAnulada, i el nom del camp entra en el càlcul.
El BOE diu quins camps, no com: l'apartat 13.2 remet al document tècnic de la seu de l'AEAT, versió 0.1.2 de 27 d'agost de 2024. Aquí es perd gairebé tothom, perquè els valors no s'enganxen un darrere l'altre: es concatenen com a parells nomCamp=valor units per &, retallant els espais a l'inici i al final de cada valor i sense que comptin els zeros a la dreta en els numèrics. La cadena va en UTF-8, se li aplica SHA-256 i la sortida és hexadecimal en majúscules, 64 caràcters. En el primer registre l'empremta anterior hi va present però buida:
IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&FechaHoraHusoGenRegistro=2024-01-01T19:20:30+01:00 SHA-256 → 3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60
La nostra funció d'empremta retorna aquests valors exactes per als dos registres d'alta del document: 3C464DAF… i F7B94CFD…. Aquesta és l'única comprovació que val: que la teva empremta tingui 64 caràcters no demostra res; que retorni l'empremta publicada per a les dades publicades, sí.
Els tres errors de càlcul que hem vist (els tres, nostres)
Els tres donen una empremta impecable a la vista i una cadena coherent; el que no coincideix és el càlcul de l'AEAT:
| Com es va calcular | Empremta que surt | Per què passa |
|---|---|---|
| Valors enganxats, sense noms de camp ni separadors | 9689947A… | Qui només llegeix el BOE hi veu camps, no etiquetes. Corregit el 13-06-2026. |
| Llavor del primer registre: 64 zeros | BCA62A69… | L'exemple de l'AEAT ho desmenteix: l'etiqueta va buida. Corregit el 15-06-2026. |
| Data d'expedició en ISO (2024-01-01) | 048C3862… | Expedició en DD-MM-AAAA, generació en ISO: dos formats en una cadena. Corregit el 09-07-2026. |
El tercer no va ser un descuit de lectura sinó una dada que canvia de tipus pel camí: en importar històrics, les línies passen per un camp JSON i un objecte data torna com a text «AAAA-MM-DD». Cada importació s'encadenava malament i després fallava la seva pròpia verificació d'integritat, que rellegeix la data de la columna real.
El segon tenia una prova dedicada («el primer registre porta l'empremta anterior buida») i estava verda. No provava res: no emetia cap factura, de manera que el registre gènesi no existia dins seu i la comprovació vivia darrere d'un «si existeix el gènesi» que mai no es complia. A més, esperava 64 zeros: si s'hagués executat, hauria fallat.
I això no es nota sol: el document de l'AEAT diu que, quan l'empremta informada no coincideix amb la que ella calcula, el registre es marca com a «Acceptat amb errors». No és un rebuig, així que tret que el teu sistema vigili aquest estat no salta cap alarma.
Rebutjos, esmena i reenviament
L'AEAT pot acceptar el registre, acceptar-lo amb errors o rebutjar-lo. Al nostre mòdul cada registre neix encadenat (ja té número, empremta i empremta anterior) i avança a enviat, amb el sobre XML desat; acceptat, amb el seu CSV; rebutjat, amb el codi d'error i la resposta íntegra; o reintentant i error permanent.
La cua reintenta amb espera creixent (30 segons, 2 minuts, 10 minuts, 30 minuts, 2 hores i 12 hores) i al sisè intent passa a error permanent. Un HTTP 429 no és un error del registre: atura la cua de tota l'empresa fins que expira l'espera.
El reenviament és el contraintuïtiu: no recalcula res. Es reconstrueix el mateix sobre des del mateix registre, amb el mateix número i les mateixes dues empremtes. La cadena es va tancar en expedir la factura i no depèn que l'AEAT respongui; recalcular l'empremta en reenviar trencaria tot el que ve després per una caiguda de xarxa.
Si el que està malament és el contingut, tampoc s'edita. L'esquema de l'AEAT porta dues marques: Subsanacion (S/N), que diu que aquest registre corregeix un d'anterior, i RechazoPrevio, que en el registre d'alta admet N, S i X (X és el registre que existeix al teu sistema però l'AEAT mai no va tenir, el cas de qui passa de no VERI*FACTU a VERI*FACTU); en l'anul·lació només admet S o N.
I si la factura no val, no s'esborra: s'afegeix un registre d'anul·lació amb empremta pròpia. Eliminar un registre aixeca un error que diu això mateix, i els quatre camps de cadena estan protegits contra escriptura, també des de codi. Un UPDATE directe deixa la cadena trencada i a la vista, i el llibre d'esdeveniments (24 tipus, entre ells restauració des de còpia i intent d'alteració) és de només afegir.
Terminis i sanció: des de quan i quant
Aquests són els terminis vigents després del Reial decret llei 15/2025:
| Col·lectiu / supòsit | Data o import | Base legal |
|---|---|---|
| Contribuents de l'Impost sobre Societats | Sistemes adaptats abans de l'1 de gener de 2027 | RD 1007/2023, art. 3.1.a) i disp. final 4a |
| Autònoms i la resta d'obligats de l'art. 3.1 | Sistemes operatius abans de l'1 de juliol de 2027 | RD 1007/2023, disp. final 4a |
| Productors i comercialitzadors de sistemes | Ja exigible: producte adaptat, i declaració responsable del productor per versió | RD 1007/2023, disp. final 4a i art. 13 |
| Tenir en ús un sistema sense la certificació exigida | 50.000 € per exercici | Art. 201 bis.2 i 4 LGT |
| Produir o comercialitzar un sistema no conforme | 150.000 € per exercici amb vendes i tipus de sistema | Art. 201 bis.1 i 4 LGT |
L'article 201 bis LGT no fixa un màxim, sinó multes d'import fix, i el fet sancionable és el sistema: no cal que l'AEAT descobreixi una factura manipulada. Si l'únic que falta és el certificat exigit (en el RRSIF, la declaració responsable del productor), la multa al comercialitzador baixa a 1.000 € per sistema venut.
I compta encara que no facturis amb Odoo cada dia: n'hi ha prou amb emetre una factura, una factura rectificativa o una factura d'exportació des d'Odoo perquè aquest Odoo sigui també un sistema informàtic de facturació subjecte al reglament. La facturació nativa no genera el registre encadenat.
Com complir VeriFactu amb Odoo
El primer pas, abans de gastar res, és saber en quin punt és la teva instal·lació: el nostre Verifactu Readiness Check és una auditoria gratuïta de la teva facturació a Odoo, amb troballes concretes.
Per al compliment tenim el nostre mòdul flexigo_spain_verifactu (VeriFactu España: AEAT RRSIF Compliance), per a Odoo 17, 18 i 19, amb 283 proves a cada branca: registre encadenat, segell de temps, QR, enviament en temps real, llibre d'esdeveniments i verificació d'integritat. És als nostres mòduls publicats i el deixem configurat amb el servei d'implantació.
Si a més emets factura electrònica, el que decideix l'arquitectura és qui és l'emissor legal: l'article 9 del Reglament exigeix que el registre el generi el sistema que expedeix la factura, «de forma simultània o immediatament anterior». Està desenvolupat a B2Brouter i Odoo; la resta d'obligacions, a solucions.
Preguntes freqüents
Com es calcula exactament l'empremta de VeriFactu?
Amb SHA-256 sobre parells nomCamp=valor units per &, amb els vuit camps de l'article 13 de l'Ordre HAC/1177/2024 en el seu ordre, retallant els espais a l'inici i al final de cada valor, en UTF-8, i amb la sortida en hexadecimal i en majúscules, 64 caràcters. En el primer registre, el camp d'empremta anterior hi va present i buit. Per comprovar-ho, reprodueix els exemples que publica l'AEAT.
Quins són els terminis exactes de VeriFactu el 2027?
Segons la disposició final quarta del RD 1007/2023, vigent després del RD llei 15/2025: l'1 de gener de 2027 per als contribuents de l'Impost sobre Societats i l'1 de juliol de 2027 per a la resta d'obligats de l'article 3.1, autònoms inclosos. Els productors i comercialitzadors ja estan obligats a oferir producte adaptat.
Enllaços útils dins de FlexigoTech
El que fem sobre això
Vols saber si el teu Odoo compleix VeriFactu?
Comencem per l'auditoria gratuïta i, en la primera trucada, et diem on ets i què falta: inclòs si l'empremta que genera el teu sistema coincideix amb la que calcula l'AEAT. Escriu-nos a comercial@flexigobe.com o truca al +34 616 809 504.

