returnEasier está construido para el RGPD desde la base: todos los datos personales viven en servidores de la Unión Europea y la app responde correctamente a los tres webhooks de privacidad de Shopify (solicitud de acceso, supresión de cliente y supresión de tienda). El único dato que se conserva tras una supresión es el audit log de eventos, y se conserva precisamente porque es la prueba legal de que cumpliste el Artículo 11 bis.
¿Dónde están los datos? (residencia UE)
Todos los proveedores con datos personales están en la Unión Europea:
| Servicio | Proveedor | Región / nota |
|---|---|---|
| Base de datos | Neon | eu-west-2 (AWS, Londres) |
| Ficheros (PDF, fotos…) | Cloudflare R2 | Jurisdicción UE (.eu) |
| Email transaccional | Brevo | Francia (sin Schrems II) |
| Rate limiting | Upstash | UE |
| Errores | Sentry | Instancia UE, con scrubbing de PII |
| Analítica de producto | PostHog | Instancia UE |
Además, el token de acceso de tu tienda y las claves de Sendcloud se guardan cifrados (AES-256-GCM), y todos los webhooks se validan con HMAC antes de procesarse. Nunca se registran emails ni datos personales en los logs: para correlacionar se usa una huella (los primeros caracteres de un hash del email).
Los tres webhooks de RGPD
Shopify exige que toda app responda a tres webhooks de privacidad. returnEasier los implementa así:
1. Solicitud de acceso (customers/data_request)
Cuando un cliente ejerce su derecho de acceso, returnEasier reúne todos los datos personales que tiene de él —pedidos, solicitudes, eventos, confirmaciones y verificaciones del portal— y te los envía a ti, el responsable del tratamiento, en un export JSON por email. La app no guarda copia del export: lo genera y lo entrega. Si te pide de nuevo sus datos, se vuelve a generar.
2. Supresión de cliente (customers/redact)
Cuando un cliente pide la supresión de sus datos, returnEasier:
- Anonimiza el email (a un valor neutro) y borra el nombre en sus pedidos.
- Borra las notas del cliente en las solicitudes (los campos estructurales —cantidades, motivo— se conservan).
- Invalida de inmediato su verificación del portal.
- Elimina las confirmaciones de desistimiento y sus PDF de R2.
- Conserva el audit log de eventos: es inmutable y se mantiene como prueba del cumplimiento legal.
3. Supresión de tienda (shop/redact)
Shopify dispara este webhook 48 horas después de que desinstales la app. returnEasier hace una limpieza profunda: anonimiza los datos de clientes de toda la tienda, borra los ficheros de R2 (PDF, fotos, etiquetas), limpia la configuración (ajustes legales, branding, Sendcloud), redacta el token y deja el plan en Free. La fila de la tienda y el audit log se conservan (el log referencia a la tienda) como tombstone para que el registro siga siendo atribuible.
¿Cómo se reconcilia la supresión con un log inmutable?
Es la pregunta clave. El audit log es append-only: la base de datos rechaza cualquier UPDATE o DELETE sobre los eventos. Cuando llega una supresión, se anonimizan las tablas mutables (pedidos, notas, verificaciones) y se borran los ficheros, pero los eventos se conservan bajo la base legal de obligación legal (probar el cumplimiento del Artículo 11 bis).
Nota de transparencia: la base legal concreta para conservar PII dentro del log inmutable está pendiente de revisión por abogado. Como siguiente paso está prevista una retención por capas del propio log (conservar solo los hashes pasado un plazo mayor); mientras tanto, las filas de eventos se conservan protegidas por el trigger de inmutabilidad.
Anonimización automática a los 5 años
Además de las supresiones que dispara Shopify, returnEasier ejecuta una tarea semanal (cada lunes de madrugada, en UTC) que aplica la retención de 5 años: cada registro corre su propio reloj desde su creación y, pasado el plazo, la tarea:
- Anonimiza el email (a un valor neutro) y borra el nombre en los pedidos antiguos.
- Borra las notas del cliente en las solicitudes (incluidas las notas por artículo); los campos estructurales —cantidades, motivo— se conservan.
- Anonimiza las verificaciones del portal caducadas.
- Elimina de R2 los ficheros asociados: el PDF de confirmación, la etiqueta de envío y las fotos del cliente.
- Deja constancia en el audit log con un evento de anonimización (sin datos personales), que además evita repetir el trabajo.
Si el borrado de un fichero falla, la tarea no da el registro por anonimizado: lo reintenta la semana siguiente hasta confirmar que el fichero desapareció. No tienes que configurar nada: la retención funciona sola en todos los planes.
¿Qué puedes hacer tú?
- Atender solicitudes de tus clientes: los webhooks de Shopify se encargan del trabajo automáticamente; tú recibes el export de acceso por email.
- Exportar tu histórico antes de desinstalar (ver «¿Qué es el audit log y cómo exporto mi histórico auditable?»).
- Entender qué pasa al desinstalar o cancelar: lo detalla «Desinstalar o cancelar returnEasier».