Verifactu es el nombre del reglamento aprobado por el Real Decreto 1007/2023, que obliga a cualquier programa de facturación, también al software a medida de muchas empresas de Madrid, a encadenar sus registros con una huella SHA-256 e imprimir un QR en cada factura. Las sociedades deben cumplir antes del 1 de enero de 2027 (Real Decreto-ley 15/2025). Adaptarlo es un proyecto de desarrollo de software a medida en Madrid.
El artículo 201 bis de la Ley 58/2003, General Tributaria, sanciona con 50.000 euros por ejercicio la tenencia de un sistema que no cumpla y con 150.000 euros por ejercicio y tipo de programa a quien lo produce. En un desarrollo propio, el productor es tu proveedor o tu empresa si el código lo escribe tu equipo.
Al terminar sabrás qué modalidad te conviene y qué pedirle a quien mantiene tu sistema, empezando por una auditoría técnica del código de facturación.
Qué es Verifactu y a qué software a medida afecta
Verifactu es el reglamento de requisitos de los sistemas informáticos de facturación aprobado por el Real Decreto 1007/2023 y desarrollado por la Orden HAC/1177/2024. Exige que todo software que emita facturas encadene cada registro con el anterior para que cualquier alteración deje un rastro verificable ante la AEAT.
Según el artículo 3 del Real Decreto 1007/2023 consolidado en el BOE, afecta a sociedades, autónomos, no residentes con establecimiento permanente y entidades en atribución de rentas que facturen con un programa. Quedan fuera quienes llevan los libros registro por el Suministro Inmediato de Información (SII).
Qué exige Verifactu técnicamente a tu código
Verifactu exige a tu código cinco piezas técnicas, que concreta la Orden HAC/1177/2024 de especificaciones técnicas:
- Registro de alta y de anulación: cada factura genera un registro inalterable. Corregir exige un registro nuevo.
- Huella encadenada: cada registro incluye la huella del anterior, calculada con SHA-256 (artículo 13 y anexo de la orden).
- Código QR: entre 30x30 y 40x40 milímetros, norma ISO/IEC 18004 (artículo 21). En factura electrónica basta con su URL como campo independiente.
- Registro de eventos: anota por sí solo sucesos como la detección de anomalías (artículo 9 de la orden).
- Declaración responsable: el productor certifica que el sistema cumple, visible en cada versión (artículo 13 del reglamento).
VERI*FACTU o no verifactu: qué modalidad elegir
La modalidad VERI*FACTU remite cada registro a la AEAT en el momento y queda exenta de firmarlo (artículo 16 del Real Decreto 1007/2023). La elección dura, como mínimo, hasta el final del año natural del primer envío.
- Elige VERI*FACTU si: facturas siempre con conexión. Tu integración respeta el control de flujo de la AEAT, con una espera inicial de 60 segundos entre envíos (artículo 16 de la orden).
- Elige no verifactu si: necesitas emitir sin conexión, por ejemplo en una feria. Asumes firma XAdES de cada registro y copias de seguridad de los registros de facturación que garanticen su conservación.
Verifactu regula cómo registras lo que facturas. La factura electrónica B2B obligatoria regula cómo se la entregas a otra empresa y la conciliación bancaria automática por API cierra el cobro.
Plazos vigentes de Verifactu para empresas de Madrid
Los plazos vigentes los fija el Real Decreto-ley 15/2025, que modificó la disposición final cuarta del Real Decreto 1007/2023 y que el Congreso convalidó en diciembre de 2025:
- Contribuyentes del Impuesto sobre Sociedades: sistemas adaptados antes del 1 de enero de 2027.
- Resto de obligados del artículo 3.1: sistemas operativos antes del 1 de julio de 2027.
El 5 de octubre de 2026 el Ministerio de Hacienda publicó una nota informativa que prevé aplazar hasta octubre de 2028 las obligaciones pendientes, para alinearlas con la factura electrónica de las empresas de hasta 8 millones de euros. A 9 de octubre de 2026 el BOE no recoge ninguna norma que lo haga efectivo, así que planifica con las fechas vigentes.
Qué hacer si tu facturación es a medida
Adaptar un software de facturación propio empieza por localizar cada punto que emite facturas:
- Inventario de puntos de emisión: un ERP a medida con módulo de facturación, una automatización de presupuestos y facturas en la web o una integración entre CRM y facturación emiten facturas por separado.
- Tabla de registros inmutable: solo inserciones y un único servicio que calcula la huella. Ningún agente de IA escribe ahí directamente, por los riesgos de delegar facturas en la IA.
- Productor identificado: quién firma la declaración responsable queda por escrito en el contrato.
CodeZone Pro Tip: calcula la huella encadenada de cada registro de alta y verifica la cadena completa para localizar al instante un registro alterado o borrado.
import hashlib
# Campos del registro de alta en el orden del artículo 13.1.a) de la Orden HAC/1177/2024,
# con los nombres XML que fija el documento técnico de la AEAT sobre la huella
CAMPOS_ALTA = ("IDEmisorFactura", "NumSerieFactura", "FechaExpedicionFactura", "TipoFactura",
"CuotaTotal", "ImporteTotal", "Huella", "FechaHoraHusoGenRegistro")
def serializar(registro: dict) -> str:
# La AEAT quita espacios al inicio y al final; un campo vacío queda como "Huella="
return "&".join(f"{c}={str(registro.get(c, '')).strip()}" for c in CAMPOS_ALTA)
def calcular_huella(registro: dict) -> str:
# SHA-256 (valor 01 de la lista L12 del anexo), entrada UTF-8, salida hexadecimal en mayúsculas
return hashlib.sha256(serializar(registro).encode("utf-8")).hexdigest().upper()
def verificar_cadena(registros: list[dict]) -> list[int]:
"""Devuelve las posiciones donde la cadena se rompe."""
rotos, anterior = [], "" # el primer registro no tiene huella previa
for i, reg in enumerate(registros):
# "Huella" es la del registro anterior; "HuellaPropia", la calculada para este registro
if reg.get("Huella", "") != anterior or reg.get("HuellaPropia") != calcular_huella(reg):
rotos.append(i)
anterior = reg.get("HuellaPropia", "")
return rotos
if __name__ == "__main__":
# Ejemplo del documento técnico de la AEAT: la huella esperada empieza por 3C464DAF
r1 = {"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"}
r1["HuellaPropia"] = calcular_huella(r1)
print(r1["HuellaPropia"], verificar_cadena([r1])) # lista vacía si la cadena está íntegraEste control convierte la obligación legal en una alarma operativa: si alguien modifica un importe en la base de datos, la verificación nocturna devuelve la posición del registro roto antes de que lo detecte la AEAT.
Lo Que Arriesgas Si Tu Facturación a Medida Llega Tarde
Un sistema no adaptado sigue emitiendo facturas y acumula sanción por cada ejercicio en que lo uses. Adaptar con margen te permite probar en el portal de pruebas externas de la AEAT y cerrar por contrato quién firma como productor.
En Codezone adaptamos sistemas de facturación a medida y dejamos documentada la declaración responsable. Cuéntanos cómo factura hoy tu empresa y te decimos qué hay que tocar.