En tránsito: HTTPS/TLS 1.2+ en todas las conexiones (Shopify ↔ app, navegador ↔ app, app ↔ Resend). Los webhooks se verifican por HMAC; las peticiones del admin por token de sesión JWT firmado.
En reposo: base de datos en un servicio gestionado con cifrado de disco (Cloud SQL / Neon / Turso, todos cifran por defecto con AES-256). En desarrollo local, SQLite en disco cifrado por FileVault.
Secretos: variables de entorno del hosting, nunca en el repositorio (.env ignorado).
Copias de seguridad
Las del proveedor gestionado: automáticas, cifradas con la misma clave que la base de datos, retención 7 días, sin copias manuales fuera del proveedor.
Al borrar datos (retención, desinstalación, redact), las copias expiran en ese plazo.
Separación de entornos
Producción: tienda del comerciante, base de datos de producción.
Desarrollo: tienda de desarrollo de Shopify con datos ficticios, base de datos aparte.
Tests: SQLite desechable por proceso, sin datos reales.
Minimización y prevención de pérdida de datos
Se guardan solo los campos del apartado 3 de docs/privacidad-y-dpa.md; no hay copia de archivos de evidencia (van directos a Shopify).
No se exportan datos a terceros salvo los subencargados listados.
Sin acceso público a la base de datos; solo la app, por red privada del proveedor.
Registro de auditoría de cada acción sobre datos (AuditEvent).
Control de acceso
Los usuarios entran por el admin de Shopify; Refutely no gestiona contraseñas de usuario. Shopify exige verificación en dos pasos para el personal con acceso a apps.
Acceso a servidores y base de datos: solo el operador, con clave SSH / cuenta del proveedor con 2FA y contraseña larga generada por gestor.
Acceso al repositorio: cuentas con 2FA.
Registro
Cada lectura de expediente, guardado, envío, decisión, retención y borrado queda en AuditEvent (quién, qué, cuándo).
Logs de aplicación sin datos personales más allá del número de pedido.
Dependencias
npm audit en cada despliegue; versiones fijadas en package-lock.json.