El audit log de returnEasier es un registro inmutable de todo lo que ocurre con tus solicitudes: cada vez que se crea una, se aprueba, se marca recibida o se reembolsa, queda una fila que no se puede modificar ni borrar. Cada evento se sella con un hash SHA-256 encadenado con el anterior, formando una cadena a prueba de manipulación. Cuando necesitas entregar pruebas —a un auditor, a la administración o a tu asesor— vas a Cumplimiento → Exportar y descargas un ZIP con todo el histórico y un fichero de integridad para verificarlo.
¿Por qué el registro es inmutable?
La tabla de eventos es append-only: la base de datos solo admite añadir filas. Un trigger de PostgreSQL rechaza cualquier intento de UPDATE o DELETE sobre ella, venga de donde venga (la app, un script, una migración o un atacante con permisos). No es una promesa de configuración: está impuesto en el motor de la base de datos.
Sobre esa base se construye la cadena de hashes:
- Cada evento se convierte a un JSON canónico (claves ordenadas, sin ambigüedad) y se le calcula un SHA-256.
- Ese hash se calcula incluyendo el hash del evento anterior (
hash_anterior). El primer evento de cada cadena es el «génesis». - Si alguien cambiara un solo dato de un evento pasado, su hash cambiaría y dejaría de cuadrar con el
hash_anteriordel evento siguiente: la manipulación se delata sola.
Las solicitudes (return_requests) llevan también su propio hash y hash anterior, que se incluyen en la exportación para que se puedan verificar fuera de la app.
¿Cómo exporto mi histórico auditable?
La exportación vive en Cumplimiento → Exportar (ruta /app/settings/compliance/export) dentro de la app, en el Shopify Admin.
- Abre Cumplimiento → Exportar en el menú lateral.
- Indica un rango de fechas: «desde» y «hasta» (formato fecha). Puedes dejar ambos vacíos para exportar todo tu histórico. Las fechas se interpretan en la zona horaria de tu tienda (por defecto Europe/Madrid).
- Pulsa exportar. Según el número de solicitudes del rango, returnEasier hace una de dos cosas (ver más abajo).
Descarga al momento o por email, según el volumen
returnEasier ajusta la entrega al tamaño del rango para no bloquear el navegador con descargas enormes:
| Solicitudes en el rango | Qué ocurre |
|---|---|
| 0 – 100 | Se genera y se descarga el ZIP al momento. |
| 101 – 1000 | returnEasier te envía el ZIP por email (enlace temporal). |
| Más de 1000 | La exportación se rechaza: acota el rango de fechas. |
El límite duro es de 1000 solicitudes por exportación. Si tu histórico es mayor, divídelo en varios rangos de fechas (por ejemplo, trimestre a trimestre) y exporta cada uno.
¿Qué hay dentro del ZIP?
El archivo se llama returneasier-auditoria-<tu-tienda>-<fecha>.zip y contiene:
LEEME.txt— guía en lenguaje claro: qué es cada fichero y cómo verificar la integridad.solicitudes.csv— una fila por solicitud, con columnas comopublic_id,tipo,estado,creada_en_utc,resuelta_en_utc,pedido,cliente_email,cliente_nombre,importe,moneda,motivo,resolucion_preferida,notas_cliente,hash,hash_anterioryrefund_id.eventos.csv— el registro append-only completo:public_id,evento,actor,actor_id,fecha_utc,hash,hash_anteriorypayload_json.pdfs/— los PDF de acuse de recibo de cada desistimiento, uno por solicitud.INTEGRITY.json— el fichero de integridad: algoritmo (SHA-256), recuentos, el hash de cada fichero del ZIP y la verificación de cada cadena de eventos.
¿Cómo verifico la integridad de la exportación?
El INTEGRITY.json es la pieza clave para demostrar que nada se ha tocado:
- Trae el hash SHA-256 de cada fichero del ZIP. Recalcula el hash de, por ejemplo,
eventos.csvcon cualquier herramienta estándar y compáralo con el que figura ahí. - Incluye la verificación de cada cadena de eventos: por cada solicitud indica si su cadena está «ok» o «rota» y, en su caso, el motivo (cadena bifurcada, ciclo, hash que no recompone…).
- Si algún PDF no se pudo recuperar (por ejemplo, porque se borró por una solicitud RGPD), queda anotado en la lista de PDF no disponibles con su motivo, en lugar de fallar la exportación entera.
El propio INTEGRITY.json no puede contener su propio hash, así que es el único fichero que no se autocomprueba; todo lo demás sí.
Relación con otras funciones
El audit log es la base de las plantillas legales y del PDF de acuse de recibo (ver «El PDF de acuse de recibo»): cada confirmación de desistimiento que se envía al cliente queda anclada a la cadena de hashes. Para entender qué emails generan esos eventos, mira «Los emails que envía returnEasier». Y antes de desinstalar o cancelar, conviene exportar el histórico: lo cuenta «Desinstalar o cancelar returnEasier».