Descripción General de la Aplicación
FinGuard es una aplicación móvil de finanzas personales (iOS y Android, Capacitor 6). Permite registrar transacciones —por voz, texto, SMS o entrada manual—, organizarlas en categorías, establecer presupuestos, crear grupos de gasto compartido y obtener análisis mediante inteligencia artificial.
| Atributo | Valor |
|---|---|
| Nombre / App ID | FinGuard · com.finguard.app |
| Marco legal aplicable | Ley 1581 de 2012 (Habeas Data), Decreto 1377 de 2013 |
| Email de soporte | soporte@finguard.app |
| Backend | Render (región US) — PostgreSQL |
| Estado de textos legales | Borrador — todos pendientes de revisión legal |
Textos Legales Actuales — Para Validar y Modificar
A continuación se transcriben exactamente los tres textos legales que hoy existen en la app. Cada uno indica para qué sirve, dónde aparece y qué puntos requieren corrección o validación.
terms_accepted_at).
FinGuard — Política de Privacidad y Tratamiento de Datos Personales
¿Qué datos recopilamos?
Para crear tu cuenta almacenamos en nuestros servidores: correo electrónico, nombre y contraseña cifrada. Estos datos son necesarios para gestionar tu acceso.
Tus datos financieros son tuyos.
Tus transacciones, categorías, presupuestos y configuración financiera se almacenan exclusivamente en la base de datos local de tu dispositivo. No se transmiten a servidores externos.
Notificaciones procesadas.
El contenido de las notificaciones bancarias que la app intercepta se analiza localmente y no se envía a servidores.
Registros técnicos.
Registros anónimos de errores (sin datos financieros ni personales) pueden enviarse a nuestros servidores para mejorar la estabilidad de la app.
Tus derechos (Ley 1581 de 2012).
Tienes derecho a conocer, actualizar, rectificar y suprimir tus datos personales. Escríbenos a soporte@finguard.app.
⚠️ Borrador pendiente de revisión legal antes de publicación.
[Texto idéntico al Texto 1 — transcripción omitida para evitar repetición. Contiene las mismas brechas B-01 a B-12.]
backup_consent_at). Al desactivar el servicio, backup_consent_at se pone en NULL y los backups se eliminan del servidor.
Términos de Cloud Backup
¿Qué se respalda?
Transacciones, categorías, presupuestos, recurrentes y configuración de la cuenta. No se respaldan contraseñas, tokens de sesión ni notificaciones procesadas.
¿Dónde se almacena?
En los servidores seguros de FinGuard (Render, región US). Máximo 3 copias por cuenta. La más antigua se elimina al crear una nueva.
Privacidad y acceso
Datos cifrados en tránsito (HTTPS/TLS). Solo tú puedes acceder desde tu cuenta. FinGuard no comparte con terceros.
Revocación y eliminación
Al desactivar, todas las copias se eliminan permanente e irrecuperablemente de nuestros servidores.
Inventario de Datos Personales y Financieros
3.1 Almacenados en servidor (PostgreSQL — Render, US)
| Campo / Tabla | Descripción | Retención |
|---|---|---|
users.email | Correo electrónico (identificador único) | Hasta eliminación de cuenta |
users.password_hash | Hash bcrypt (salt 12) — nunca texto plano | Hasta eliminación de cuenta |
users.name | Nombre del usuario | Hasta eliminación de cuenta |
users.tier | Plan (free / premium) | Hasta eliminación de cuenta |
users.terms_accepted_at | Timestamp de aceptación de política de datos | Hasta eliminación de cuenta |
users.totp_secret | Secreto 2FA cifrado (si el usuario activa 2FA) | Hasta desactivación |
users.backup_consent_at | Timestamp de aceptación de términos de backup | Hasta revocación |
refresh_tokens | Token de sesión (hash SHA-256), expira en 30 días | 30 días o hasta logout |
user_backups | Datos financieros del usuario (solo si activó Cloud Backup) | Máx. 3 copias; la más antigua se elimina |
groups / group_members | Nombre del grupo, UUID de usuario, rol, estado | Hasta eliminar grupo / salir |
group_email_invitations | Email de invitado, nombre del invitador | 7 días |
sync_messages | Blob cifrado de transacciones grupales | 7 días |
app_logs | Logs técnicos: nivel, categoría, mensaje, stack trace | No definido — brecha B-06 |
3.2 Almacenados localmente en el dispositivo (SQLite cifrado — SQLCipher)
| Tabla | Contenido |
|---|---|
settings | Nombre, moneda, tema, día de corte, listas blancas de SMS/notificaciones |
transactions | Monto, moneda, tipo, categoría, concepto, fecha, fuente, texto original (raw_input) |
categories / budgets | Categorías personalizadas y presupuestos por categoría |
recurring_transactions | Gastos recurrentes configurados |
merchant_aliases | Patrones texto → categoría (reglas de automatización) |
user_groups / group_sync_queue | Grupos sincronizados y cola de sincronización pendiente |
ai_insight_cache | Insights de IA cacheados localmente (hash + texto) |
transactions.raw_input
Almacena el texto crudo dictado por voz o tecleado. Puede contener información personal más allá del dato financiero. La política no lo menciona (brecha B-09).
3.3 Procesados pero no almacenados
| Dato | Procesamiento | Destino |
|---|---|---|
| Notificaciones de apps bancarias | Leídas en Android, parseadas localmente con IA | Solo el resultado (monto, categoría) se guarda en SQLite local |
| SMS bancarios | Leídos por plugin SmsPlugin o vía deep link | Solo el resultado parseado se guarda en SQLite |
| Audio de voz | Transcrito localmente (Web Speech API) | El texto transcrito se envía al servidor solo para parseo de IA |
Flujos de Datos a Terceros
4.1 Groq AI (groq.com)
| Endpoint | Datos enviados |
|---|---|
POST /ai/parse | Texto libre del usuario (puede contener conceptos de gastos) + lista de categorías |
POST /ai/classify | Texto máx. 500 caracteres para clasificar si es financiero |
POST /ai/analyze | Datos agregados y anonimizados: período, totales, categorías con montos, promedios |
Modelo: llama-3.1-8b-instant. No se envía identificador de usuario. Análisis limitado a 1 llamada/6h por usuario.
4.2 Resend (resend.com) — Email transaccional
| Email enviado | Datos del usuario |
|---|---|
| Verificación de email / recuperación de contraseña | Dirección de email |
| Invitación a grupo | Email del destinatario, nombre del grupo, nombre del invitador |
4.3 Render (render.com) — Infraestructura
Aloja toda la base de datos PostgreSQL (ver §3.1). Región: US.
4.4 Capacitor / Ionic
Framework de código abierto. No envía datos a servidores de Ionic/Capacitor. No requiere DPA.
Mecanismos de Consentimiento Actuales
5.1 Consentimiento en registro (obligatorio)
| Aspecto | Detalle |
|---|---|
| Implementación | Checkbox requerido + botón de envío deshabilitado hasta marcar |
| Registro en servidor | terms_accepted_at (timestamp) en tabla users |
| Versión de la política | No se registra — solo el timestamp de aceptación |
| Brecha | Si el texto cambia, no hay forma de saber qué versión aceptó cada usuario |
5.2 Consentimiento de Cloud Backup (voluntario, solo Premium)
| Aspecto | Detalle |
|---|---|
| Implementación | Checkbox requerido + aceptación de términos específicos del servicio |
| Registro | backup_consent_at en users; al revocar se pone en NULL |
| Eliminación | Al desactivar, las copias se eliminan del servidor. Verificar eliminación física. |
5.3 Permisos de sistema (Android/iOS)
| Permiso | Uso | Declarado |
|---|---|---|
RECEIVE_SMS / READ_SMS | Leer SMS bancarios para auto-registrar transacciones | Sí — capacitor.config.ts |
| Acceso a notificaciones (Android) | Leer notificaciones de apps bancarias | Sí — NotificationListenerPlugin |
| Reconocimiento de voz / micrófono | Entrada por voz | Sí — useSpeechRecognition |
| Notificaciones locales | Alertas de gastos recurrentes y movimientos detectados | Sí — LocalNotifications |
RECEIVE_SMS en Android requiere justificación especial en Play Store y declaración explícita en el formulario de permisos. Actualmente no existe un aviso in-app previo a la solicitud que explique el uso (brecha B-10).
Análisis de Brechas Legales
| # | Brecha | Riesgo | Prioridad |
|---|---|---|---|
| B-01 | La política dice "datos financieros almacenados exclusivamente en el dispositivo". Falso si se activa Cloud Backup. | Información engañosa | Alta |
| B-02 | No se menciona la transferencia internacional a Render (US). Art. 26 Ley 1581 requiere autorización expresa. | Incumplimiento Art. 26 | Alta |
| B-03 | No se menciona el uso de Groq AI para procesar texto de transacciones. | Falta de transparencia | Alta |
| B-04 | No se menciona Resend como encargado del tratamiento de emails. | Subencargado no declarado | Media |
| B-05 | La política no tiene versión ni fecha. Imposible saber qué versión aceptó cada usuario. | Trazabilidad | Alta |
| B-06 | app_logs en servidor sin período de retención definido. | Retención indefinida | Media |
| B-07 | No existe política de privacidad en URL pública. Obligatoria para Play Store y App Store. | Requisito de tiendas | Alta |
| B-08 | No hay mecanismo in-app para eliminación de cuenta. Google Play lo exige desde agosto 2023. | Incumplimiento Play Store | Alta |
| B-09 | transactions.raw_input almacena texto crudo del usuario. La política no lo menciona. | Falta de transparencia | Media |
| B-10 | No hay aviso in-app previo a la solicitud de permisos SMS/notificaciones que explique el uso. | Buenas prácticas / tiendas | Media |
| B-11 | No hay Responsable del Tratamiento nombrado con razón social o NIT. | Requisito Ley 1581 | Alta |
| B-12 | No hay plazos de respuesta para derechos ARCO. Ley 1581 exige respuesta en 15 días hábiles. | Procedimiento incompleto | Alta |
| B-13 | Los términos de Cloud Backup no mencionan si los datos están cifrados en reposo en el servidor. | Falta de transparencia técnica | Media |
| B-14 | No hay política de cookies/rastreo (siendo app móvil puede no aplicar, pero conviene declararlo). | Bajo impacto | Baja |
Documentos Legales Faltantes
| Documento | Necesidad |
|---|---|
| Política de Privacidad pública (URL accesible) | Obligatoria para Play Store y App Store |
| Aviso in-app previo a permisos SMS/notificaciones | Buenas prácticas y requisito de tiendas |
| Política de eliminación de cuenta in-app | Obligatoria para Google Play (desde agosto 2023) |
| DPA con Resend | Obligatorio — actúa como subencargado del tratamiento |
| DPA con Render | Obligatorio — encargado de infraestructura con datos en US |
| Registro de actividades de tratamiento | Buenas prácticas Ley 1581 |
Datos Técnicos Relevantes
Cifrado y seguridad implementados
| Capa | Mecanismo |
|---|---|
| Contraseñas | bcrypt, factor de coste 12 |
| Base de datos local (dispositivo) | SQLCipher (AES) con clave en Keychain (iOS) / EncryptedSharedPreferences (Android) |
| Comunicación cliente-servidor | HTTPS/TLS (certificado provisto por Render) |
| Tokens de sesión | SHA-256 hash; JWT firmado con JWT_SECRET |
| 2FA (opcional) | TOTP (compatible con Google Authenticator) |
| Backup en servidor | Texto almacenado; cifrado en reposo en Render no confirmado en código |
Períodos de retención técnicos implementados
| Dato | Retención |
|---|---|
| Token de verificación de email | 24 horas |
| Refresh token de sesión | 30 días |
| Invitación por código (grupos) | 48 horas (configurable) |
| Invitación por email (grupos) | 7 días |
| Mensajes de sincronización grupal | 7 días |
| Backup (copias) | Máximo 3; la más antigua se elimina al crear nueva |
| Logs de aplicación (servidor) | No definido — brecha B-06 |
Preguntas para el Abogado
- ¿Es necesario registrar la base de datos ante la SIC antes de publicar la app?
- ¿Cómo debe redactarse la cláusula de transferencia internacional dado que el servidor está en US (Render)?
- ¿El procesamiento de texto enviado a Groq (empresa estadounidense) requiere autorización expresa del titular aunque los datos no incluyan identificador personal?
- ¿Qué plazos y mecanismos exactos deben implementarse para el ejercicio de derechos ARCO?
- ¿Se requiere DPO (Delegado de Protección de Datos) dado el volumen y tipo de datos procesados?
- ¿La interceptación de SMS bancarios (con permiso del usuario vía SO) requiere alguna declaración adicional más allá del permiso del sistema operativo?
- ¿Qué versión/número debe llevar la política y qué pasa con los usuarios que aceptaron versiones anteriores?