Si facturas con Odoo en España — o vas a implantarlo antes de 2027 —, VeriFactu es una obligación legal con sanción, y alcanza a tu sistema de facturación uses o no Odoo a diario. Aquí explicamos cómo se calcula la huella que encadena cada registro con el anterior, los tres errores de cálculo que hemos cometido nosotros y qué hace un sistema bien construido ante un rechazo de la AEAT.
Idea clave: VeriFactu no exige facturación electrónica ni un formato nuevo de factura. Exige que el sistema que factura genere, al expedir cada factura — o inmediatamente antes, nunca después —, un registro encadenado con el anterior mediante huella e inalterable. Un proceso nocturno no cumple.
¿Qué es exactamente VeriFactu?
VeriFactu es el nombre popular de los requisitos técnicos del Reglamento de Sistemas Informáticos de Facturación (RRSIF), aprobado por el Real Decreto 1007/2023, que desarrolla el artículo 29.2.j) de la Ley General Tributaria. No es la factura electrónica B2B de la Ley Crea y Crece: esa es otra obligación, con su propio calendario, sobre el formato de la factura. VeriFactu regula cómo se comporta tu software por dentro.
Hay dos modalidades. En VERI*FACTU, tu Odoo envía cada registro a la sede de la AEAT casi en tiempo real y la factura lleva QR y la leyenda «VERI*FACTU». En la no VERI*FACTU el registro se genera y se firma igual, pero se conserva localmente.
La huella encadenada: qué es y cómo se calcula
La huella es un SHA-256 de 64 caracteres hexadecimales que resume unos pocos datos de la factura más la huella del registro anterior. Ese «más la huella del anterior» es el mecanismo: si alguien retoca la factura 4.000, deja de cuadrar la 4.001 y las siguientes.
Qué campos entran y en qué orden lo fija el artículo 13 de la Orden HAC/1177/2024. Para un registro de alta son ocho:
- NIF del emisor (IDEmisorFactura), sin prefijo de país.
- Número de factura y serie (NumSerieFactura).
- Fecha de expedición, en DD-MM-AAAA (FechaExpedicionFactura).
- Tipo de factura: F1, F2, F3 o R1 a R5 (TipoFactura).
- Cuota total (CuotaTotal).
- Importe total (ImporteTotal).
- Huella del registro anterior (Huella).
- Fecha, hora y huso de generación, ISO 8601 (FechaHoraHusoGenRegistro).
La anulación usa cinco, y ahí está la primera trampa: esos campos se llaman IDEmisorFacturaAnulada, NumSerieFacturaAnulada y FechaExpedicionFacturaAnulada, y el nombre del campo entra en el cálculo.
El BOE dice qué campos, no cómo: el apartado 13.2 remite al documento técnico de la sede de la AEAT, versión 0.1.2 de 27 de agosto de 2024. Ahí se pierde casi todo el mundo, porque los valores no se pegan uno detrás de otro: se concatenan como pares nombreCampo=valor unidos por &, recortando los espacios al inicio y al final de cada valor y sin que cuenten los ceros a la derecha en los numéricos. La cadena va en UTF-8, se le aplica SHA-256 y la salida es hexadecimal en mayúsculas, 64 caracteres. En el primer registro la huella anterior va presente pero vacía:
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
Nuestra función de huella devuelve esos valores exactos para los dos registros de alta del documento: 3C464DAF… y F7B94CFD…. Esa es la única comprobación que vale: que tu huella tenga 64 caracteres no demuestra nada; que devuelva la huella publicada para los datos publicados, sí.
Los tres errores de cálculo que hemos visto (los tres, nuestros)
Los tres dan una huella impecable a la vista y una cadena coherente; lo que no coincide es el cálculo de la AEAT:
| Cómo se calculó | Huella que sale | Por qué pasa |
|---|---|---|
| Valores pegados, sin nombres de campo ni separadores | 9689947A… | Quien lee solo el BOE ve campos, no etiquetas. Corregido el 13-06-2026. |
| Semilla del primer registro: 64 ceros | BCA62A69… | El ejemplo de la AEAT lo desmiente: la etiqueta va vacía. Corregido el 15-06-2026. |
| Fecha de expedición en ISO (2024-01-01) | 048C3862… | Expedición en DD-MM-AAAA, generación en ISO: dos formatos en una cadena. Corregido el 09-07-2026. |
El tercero no fue un descuido de lectura sino un dato que cambia de tipo por el camino: al importar históricos, las líneas pasan por un campo JSON y un objeto fecha vuelve como texto «AAAA-MM-DD». Cada importación se encadenaba mal y luego fallaba su propia verificación de integridad, que relee la fecha de la columna real.
El segundo tenía una prueba dedicada — «el primer registro lleva la huella anterior vacía» — y estaba verde. No probaba nada: no emitía factura alguna, así que el registro génesis no existía dentro de ella y la comprobación vivía tras un «si existe el génesis» que nunca se cumplía. Encima esperaba 64 ceros: de haberse ejecutado, habría fallado.
Y esto no se nota solo: el documento de la AEAT dice que, cuando la huella informada no coincide con la que ella calcula, el registro se marca como «Aceptado con errores». No es un rechazo, así que salvo que tu sistema vigile ese estado no salta ninguna alarma.
Rechazos, subsanación y reenvío
La AEAT puede aceptar el registro, aceptarlo con errores o rechazarlo. En nuestro módulo cada registro nace encadenado — ya tiene número, huella y huella anterior — y avanza a enviado, con el sobre XML guardado; aceptado, con su CSV; rechazado, con el código de error y la respuesta íntegra; o reintentando y error permanente.
La cola reintenta con espera creciente — 30 segundos, 2 minutos, 10 minutos, 30 minutos, 2 horas y 12 horas — y al sexto intento pasa a error permanente. Un HTTP 429 no es error del registro: para la cola de toda la empresa hasta que expira la espera.
El reenvío es lo contraintuitivo: no recalcula nada. Se reconstruye el mismo sobre desde el mismo registro, con el mismo número y las mismas dos huellas. La cadena se cerró al expedir la factura y no depende de que la AEAT conteste; recalcular la huella al reenviar rompería todo lo posterior por un corte de red.
Si lo que está mal es el contenido, tampoco se edita. El esquema de la AEAT trae dos marcas: Subsanacion (S/N), que dice que este registro corrige uno anterior, y RechazoPrevio, que en el registro de alta admite N, S y X — X es el registro que existe en tu sistema pero la AEAT nunca tuvo, el caso de quien pasa de no VERI*FACTU a VERI*FACTU —; en la anulación solo admite S o N.
Y si la factura no vale, no se borra: se añade un registro de anulación con huella propia. Eliminar un registro levanta un error que dice eso mismo, y los cuatro campos de cadena están protegidos contra escritura, también desde código. Un UPDATE directo deja la cadena rota y a la vista, y el libro de eventos — 24 tipos, entre ellos restauración desde copia e intento de alteración — es de solo añadir.
Plazos y sanción: desde cuándo y cuánto
Estos son los plazos vigentes tras el Real Decreto-ley 15/2025:
| Colectivo / supuesto | Fecha o importe | Base legal |
|---|---|---|
| Contribuyentes del Impuesto sobre Sociedades | Sistemas adaptados antes del 1 de enero de 2027 | RD 1007/2023, art. 3.1.a) y disp. final 4.ª |
| Autónomos y el resto de obligados del art. 3.1 | Sistemas operativos antes del 1 de julio de 2027 | RD 1007/2023, disp. final 4.ª |
| Productores y comercializadores de sistemas | Ya exigible: producto adaptado, y declaración responsable del productor por versión | RD 1007/2023, disp. final 4.ª y art. 13 |
| Tener en uso un sistema sin la certificación exigida | 50.000€ por ejercicio | Art. 201 bis.2 y 4 LGT |
| Producir o comercializar un sistema no conforme | 150.000€ por ejercicio con ventas y tipo de sistema | Art. 201 bis.1 y 4 LGT |
El artículo 201 bis LGT no fija un máximo, sino multas de importe fijo, y el hecho sancionable es el sistema: no hace falta que la AEAT descubra una factura manipulada. Si lo único que falta es el certificado exigido — en el RRSIF, la declaración responsable del productor —, la multa al comercializador baja a 1.000€ por sistema vendido.
Y cuenta aunque no factures con Odoo a diario: basta con emitir una factura, un abono o una factura de exportación desde Odoo para que ese Odoo sea también un sistema informático de facturación sujeto al reglamento. La facturación nativa no genera el registro encadenado.
Cómo cumplir VeriFactu con Odoo
El primer paso, antes de gastar nada, es saber en qué punto está tu instalación: nuestro Verifactu Readiness Check es una auditoría gratuita de tu facturación en Odoo, con hallazgos concretos.
Para el cumplimiento está nuestro módulo flexigo_spain_verifactu (VeriFactu España — AEAT RRSIF Compliance), para Odoo 17, 18 y 19, con 283 pruebas en cada rama: registro encadenado, sello de tiempo, QR, envío en tiempo real, libro de eventos y verificación de integridad. Está en nuestros módulos publicados y lo dejamos configurado con el servicio de implantación.
Si además emites factura electrónica, lo que decide la arquitectura es quién es el emisor legal: el artículo 9 del Reglamento exige que el registro lo genere el sistema que expide la factura, «de forma simultánea o inmediatamente anterior». Está desarrollado en B2Brouter y Odoo; el resto de obligaciones, en soluciones.
Preguntas frecuentes
¿Cómo se calcula exactamente la huella de VeriFactu?
Con SHA-256 sobre pares nombreCampo=valor unidos por &, con los ocho campos del artículo 13 de la Orden HAC/1177/2024 en su orden, recortando los espacios al inicio y al final de cada valor, en UTF-8, y con la salida en hexadecimal y en mayúsculas, 64 caracteres. En el primer registro, el campo de huella anterior va presente y vacío. Para comprobarlo, reproduce los ejemplos que publica la AEAT.
¿Cuáles son los plazos exactos de VeriFactu en 2027?
Según la disposición final cuarta del RD 1007/2023, vigente tras el RD-ley 15/2025: el 1 de enero de 2027 para los contribuyentes del Impuesto sobre Sociedades y el 1 de julio de 2027 para el resto de obligados del artículo 3.1, autónomos incluidos. Los productores y comercializadores ya están obligados a ofrecer producto adaptado.
Enlaces útiles dentro de FlexigoTech
Lo que hacemos sobre esto
¿Quieres saber si tu Odoo cumple VeriFactu?
Empezamos por la auditoría gratuita y, en la primera llamada, te decimos dónde estás y qué falta — incluido si la huella que genera tu sistema coincide con la que calcula la AEAT. Escríbenos a comercial@flexigobe.com o llama al +34 616 809 504.

