VeriFactu: archivo de registros firmados en Stripe

Si facturas con Stripe, no basta con guardar la factura en PDF. Yo tendría listo un archivo que una XML firmados, PDF con QR, respuestas de la AEAT, logs del sistema y los IDs de Stripe de cada cobro, factura, abono o rectificación.

En pocas palabras, esto es lo que dejaría atado desde el día 1:

  • Qué guardar: XML de alta, anulación y rectificativa; PDF conforme; acuses de AEAT en VERI*FACTU; y registro de eventos.
  • Cómo ordenarlo: carpetas por año, mes, serie y número, con estados como pendiente, aceptado, aceptado-con-errores y rechazado.
  • Cómo enlazarlo con Stripe: guardar invoice.id, payment_intent.id, charge.id, customer.id, credit_note.id, refund.id y, si aplica, subscription.id.
  • Qué revisar: numeración sin huecos, cadena SHA-256, QR, NIF, base imponible y firma.
  • Cuánto tiempo conservarlo: 4 años por criterio fiscal y 6 años por criterio mercantil.
  • Cómo protegerlo: copias diarias en dos ubicaciones y acceso por roles.

Hay una diferencia que cambia todo: en VERI*FACTU el registro se remite a la AEAT en tiempo real (similar al funcionamiento del conector Stripe TicketBai); en NO VERI*FACTU yo debo custodiar los XML firmados con su cadena hash intacta. Ese punto marca cómo archivo, cómo valido y cómo respondo ante una revisión.

Si quiero encontrar un expediente en segundos, necesito que cada registro se pueda buscar por factura, pago, cliente, serie y número o ID VeriFactu. Y si Stripe genera un abono o una anulación, el enlace con la factura original debe quedar guardado en ambos lados.

Mi idea base sería simple: un archivo fiscal ordenado, trazable y exportable en ZIP, con todo lo que pide una comprobación sin tener que reconstruir nada a mano después.

Archivo VeriFactu con Stripe: Estructura, Metadatos y Trazabilidad

Archivo VeriFactu con Stripe: Estructura, Metadatos y Trazabilidad

2. Estructura de carpetas para XML firmados, PDFs, registros y mensajes de la AEAT

Una vez tengas claro qué documentos debes conservar, toca decidir dónde guardarlos y cómo nombrarlos para que una inspección no se convierta en una búsqueda eterna. Lo más sensato es separarlo desde el primer día por tipo de archivo.

2.1 Carpetas principales recomendadas

La estructura base para un archivo Stripe-VeriFactu separa cuatro tipos de contenido en carpetas independientes:

RutaContenidoPara qué sirve
/verifactu/records/xml/XML firmados enviados a la AEATArchivo fiscal del alta
/verifactu/invoices/pdf/PDFs con el QR obligatorio y el texto «VeriFactu»Copia para el cliente
/verifactu/logs/Registros de eventos: accesos, errores y actualizacionesTrazabilidad del sistema
/verifactu/aeat/Mensajes de envío y respuesta de la AEATPrueba de envío y respuesta

Esta separación hace que localizar un expediente por factura, pago o cliente sea mucho más simple. Además, ayuda cuando toca revisar, filtrar o exportar documentación.

Con las carpetas ya divididas, el siguiente paso es dar a cada expediente una ruta y un nombre que no dejen lugar a dudas.

2.2 Convenciones de nombre y anidado por año, serie y estado

Dentro de cada carpeta principal, usa la estructura AAAA/MM/Serie/Número/. Este orden cronológico viene muy bien para detectar huecos en la secuencia numérica, algo que importa porque la numeración debe ser correlativa y sin saltos. También conviene que la ruta coincida con el identificador interno del registro, para que apunte de forma directa a la capa de metadatos.

Para los nombres de archivo, un patrón como SERIE-NUMERO_FECHA_NIF-RECEPTOR.pdf permite reconocer el documento sin tener que abrir la base de datos. Es de esas cosas que parecen pequeñas, pero cuando buscas una factura concreta entre cientos o miles de archivos, se nota.

Dentro de cada serie, mantén subcarpetas de estado:

  • /pendiente/
  • /aceptado/
  • /aceptado-con-errores/
  • /rechazado/

Así, el sistema puede mover cada registro desde /pendiente/ a /aceptado/ en cuanto llegue la respuesta de la AEAT. Y de ese modo, cada expediente queda listo para exportarse sin perder la trazabilidad.

2.3 Exportaciones ZIP y copias de seguridad periódicas

Para una inspección, prepara archivos ZIP que incluyan el XML, el PDF y la respuesta de la AEAT de cada factura. La exportación no sirve solo para “sacar una copia”. Sirve para conservar y mover un expediente completo sin romper el hilo documental.

Establece copias periódicas en dos ubicaciones distintas. Antes de exportar, valida estos datos: NIF, base imponible, QR y hash. Si falta uno solo, el paquete queda incompleto y puede no ser válido ante la AEAT.

Con la estructura ya fijada, el siguiente paso es unir cada expediente con los IDs de Stripe mediante un conector Stripe Verifactu y con sus datos fiscales.

3. Modelo de metadatos que vincula los registros VeriFactu con facturas, pagos y clientes de Stripe

Con la estructura de carpetas ya cerrada, aparece un problema menos visible, pero igual de serio: saber si el XML que tienes delante corresponde exactamente a ese pago de Stripe y a ese cliente. Ahí entra el modelo de metadatos. Sin ese modelo, el archivo acaba siendo un conjunto de ficheros sueltos, sin un nexo claro entre ellos.

3.1 Campos fiscales y de trazabilidad obligatorios

Cuando los ficheros ya están ordenados por tipo y fecha, cada expediente necesita metadatos comunes para poder localizarlo y comprobarlo. Cada registro debe incluir emisor, receptor, serie, número, fecha e impuestos. La trazabilidad, por su parte, se apoya en la huella SHA-256, el hash previo y la marca de tiempo en formato ISO 8601.

Los campos de trazabilidad obligatorios son:

  • Huella SHA-256 del registro actual
  • Huella SHA-256 del registro inmediatamente anterior
  • Identificador del sistema emisor
  • Fecha y hora en ISO 8601

3.2 Identificadores de Stripe que hay que guardar en cada registro

El archivo debe recoger los identificadores del objeto de Stripe que dio origen al registro. Así puedes unir el registro con la operación de Stripe sin dar rodeos.

Campo de metadatosOrigen en StripeFunción en el archivo
stripe_invoice_idinvoice.idEnlace principal con la factura
payment_intent_idpayment_intent.idVincula el registro con la transacción
charge_idcharge.idReferencia al cargo concreto
customer_idcustomer.idPermite buscar todos los registros de un cliente
credit_note_id / refund_idcredit_note.id / refund.idTrazabilidad de rectificativas y abonos
subscription_idsubscription.idÚtil en facturación recurrente

Con estos IDs guardados, ya puedes pasar al siguiente paso: enlazar devoluciones y rectificativas con el registro original.

3.3 Enlace bidireccional entre Stripe y el archivo

Guarda en los campos metadata de la factura de Stripe el identificador VeriFactu, el estado de envío a la AEAT y la URL del PDF con el QR obligatorio. El Stripe Verifactu Connector automatiza este proceso y mantiene el vínculo al día en ambos sentidos.

Con ese enlace guardado por las dos partes, la siguiente sección aplica las reglas de cadena y búsqueda.

4. Reglas de trazabilidad para facturas, abonos y documentos rectificativos

Con los metadatos bien enlazados, el siguiente paso es dejar el archivo listo para una revisión de principio a fin. La idea es simple: que una revisión interna o una inspección pueda seguir la secuencia de registros sin huecos ni choques entre datos. A partir de esos metadatos, toca encadenar cambios y ubicar cada expediente sin margen de duda.

4.1 Cadena de hashes y referencias al registro anterior

Cada registro debe guardar su propia huella SHA-256, la del registro anterior y la referencia a la serie, el número y la fecha del registro previo. También debe conservar la marca temporal exacta del registro: día, hora, minuto y segundo. Esta cadena sirve para detectar cambios o borrados durante una auditoría y, además, hace más fácil localizar el expediente por factura, pago o cliente.

Si el hash recalculado no coincide con el almacenado, el registro no es válido. Así de claro. Con la cadena cerrada, ya se puede pasar a separar bien abonos, anulaciones y rectificativas.

4.2 Enlace entre abonos, rectificativas y el registro original

Cuando Stripe genera un abono o una anulación, crea el documento fiscal que toque y enlázalo con la factura original. La secuencia siempre sigue el mismo orden: factura original → abono o anulación → documento rectificativo → enlace explícito al registro original con serie, número, fecha y huella.

Para que luego no toque rebuscar, guarda el invoice_id de Stripe y el identificador del registro original junto con la huella VeriFactu y el estado AEAT. Conviene guardar ese vínculo en ambos sentidos, tanto en los metadatos del archivo como en Stripe. Un flujo automatizado con webhooks ayuda a generar el XML y el PDF rectificativos sin intervención manual. Para lograr esta automatización, se puede emplear la API de itcons.app para el intercambio de datos.

4.3 Búsqueda por factura, pago o cliente

Un archivo bien montado permite localizar cualquier expediente desde varios puntos de entrada. Esta tabla muestra qué se puede recuperar según el criterio de búsqueda:

Criterio de búsquedaElementos recuperados del archivo
stripe_invoice_idXML firmado, PDF con QR, respuesta de la AEAT, log de eventos
payment_intent_id / charge_idFactura original y rectificativa asociada, si existe
customer_id / NIFHistorial fiscal del cliente
Serie + númeroXML firmado, posición en la cadena de hashes, hash anterior y posterior
ID de registro VeriFactuEstado de verificación en la AEAT, marca temporal de envío

Guarda el NIF legal junto al customer_id. Con esa trazabilidad cerrada, el siguiente paso es validar exportaciones, firmas y copias de seguridad.

5. Exportación, verificación y lista de comprobación final

Con la trazabilidad ya cerrada, queda la última parte: mantener el archivo sano con el paso del tiempo. Exportar, verificar y controlar accesos no es algo que se haga una vez y ya está. Conviene tratarlo como una rutina y, si puedes, dejarlo automatizado desde el primer día. Puedes ver cómo funciona en esta demo del conector Stripe–VeriFactu.

5.1 Comprobaciones periódicas de archivos y firmas

Con el archivo ya trazado, toca revisarlo y conservar su integridad.

Cada envío a la AEAT debe figurar como aceptado. Si no lo está, el sistema tiene que reintentar el envío de forma automática y marcar ese registro con una incidencia.

También conviene programar revisiones automáticas semanales para comprobar tres cosas: que no haya saltos en la numeración, que la cadena de hashes SHA-256 siga intacta y que el PDF mantenga el formato legal correcto.

Si el sistema genera firma electrónica, revisa además que esa firma siga siendo verificable. Parece un detalle menor, pero no lo es: una firma que no se puede validar deja el expediente cojo.

5.2 Copias de seguridad y control de acceso

Las copias de seguridad deben hacerse cada día y mantenerse en dos copias, en ubicaciones físicas y proveedores distintos.

En cuanto al acceso, aplica un modelo por roles. Dicho de forma simple: solo el responsable fiscal o el asesor autorizado deberían poder consultar o exportar los registros. Para proteger la integridad y la confidencialidad, restringe también el acceso a los certificados digitales y conserva el log de eventos junto con las copias.

Sobre los plazos de conservación, hay dos referencias que no conviene perder de vista:

5.3 Primeros pasos para poner en marcha el archivo

Antes de emitir la primera factura, deja fijadas estas cinco reglas operativas:

  1. Estructura de carpetas estable: usa la jerarquía ya definida de año, mes, serie y número, y mantenla coherente para recuperar cualquier expediente con rapidez.
  2. Metadatos obligatorios desde el primer registro: desde el primer registro, guarda los metadatos fiscales y de trazabilidad obligatorios.
  3. Vinculación con identificadores de Stripe: cada registro debe incluir stripe_invoice_id y payment_intent_id.
  4. Cadena de hashes activa: no incorpores ningún registro sin la huella anterior; si falla la cadena, no incorpores el registro al archivo.
  5. Índice maestro exportable en una base de datos externa: enlaza IDs, archivos y estado AEAT.

El Stripe VeriFactu Connector automatiza captura, firma, envío y PDF con QR sin tocar el flujo de Stripe.

FAQs

¿Qué diferencia práctica hay entre VERIFACTU y NO VERIFACTU al archivar registros?

La diferencia principal está en quién se hace cargo de la conservación y la trazabilidad frente a la AEAT.

En VERI*FACTU, los registros se envían de forma automática, segura e inmediata a la sede electrónica.

En NO VERI*FACTU, ese envío no se hace en línea. Por eso, el empresario debe guardar los registros y poder acreditar ante una inspección su integridad, legibilidad y trazabilidad inalterable.

¿Qué pasa si falta un ID de Stripe o se rompe la cadena hash?

Si falta un ID de Stripe o se rompe la cadena hash, se pierde la integridad y la trazabilidad que exige VeriFactu. Y ahí empieza el problema.

Los registros deben ser inalterables. No puede haber omisiones ni cambios posteriores. Si falta una pieza, aunque parezca pequeña, el registro deja de cumplir lo que pide la norma.

Además, cualquier fallo en la secuencia o la ausencia de datos ligados al cobro impide generar el código QR reglamentario y cumplir con la remisión a la AEAT.

¿Cómo recupero rápido una rectificativa vinculada a una factura original?

Accede a la ficha de la factura original desde tu panel de Stripe. Desde ahí podrás ver qué factura se ha modificado y encontrar su rectificativa gracias a la estructura de datos que conecta ambos registros.

En esa misma ficha también puedes revisar el estado de la comunicación con la Agencia Tributaria, comprobar el código VeriFactu y descargar el PDF con el código QR.

Publicaciones de blog relacionadas

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *