# Catálogo de Analíticas — SaveFamily (módulo legacy) > Documento para el equipo de Marketing. Describe cada evento de Firebase > Analytics que la app envía desde el módulo legacy: qué significa, cuándo se > dispara, qué parámetros trae, y qué insight ofrece. > > **Ambiente:** Eventos visibles en vivo en Firebase Console Analytics > **DebugView** (para builds debug/profile con el flag de debug activado). > Los reportes históricos están en **Realtime**, **Engagement Events** y > **Engagement Pages and screens**. > > **Parámetro común:** Cada evento incluye automáticamente un parámetro > `consent_status` (`true` / `false`) para permitir filtrado por > consentimiento GDPR cuando corresponda. --- ## Índice 1. [User Properties (propiedades del usuario)](#user-properties) 2. [Screen Views (vistas de pantalla automáticas)](#screen-views) 3. [Autenticación (`legacy_auth_*`)](#autenticación) 4. [Cuenta (`legacy_account_*`)](#cuenta) 5. [Dispositivo — Setup / alta (`legacy_device_setup_*`)](#dispositivo--setup) 6. [Dispositivo — Funciones (`legacy_device_*`)](#dispositivo--funciones) 7. [Contactos del dispositivo (`legacy_contacts_*`)](#contactos-del-dispositivo) 8. [Ajustes (`legacy_settings_*`)](#ajustes) 9. [Soporte (`legacy_support_*`)](#soporte) 10. [Onboarding (`legacy_onboarding_*`)](#onboarding) 11. [Panel principal (`legacy_control_panel_*`)](#panel-principal) 12. [Ubicación y mapa (`legacy_location_*`)](#ubicación-y-mapa) --- ## User Properties Son propiedades que se setean una sola vez por usuario (al hacer login) y sirven para **segmentar** a los usuarios en los reportes. Cualquier evento puede cruzarse por estas dimensiones en Firebase Analytics. | Propiedad | Descripción | Valores ejemplo | Cuándo se setea | |---|---|---|---| | `env` | Ambiente de la app | `development`, `staging`, `production` | Al arrancar la app | | `user_id` (interna) | Identificador único del usuario | UUID del backend | Al confirmar el login (después del 2FA) | | `user_role` | Rol del usuario en el backend | `client`, `admin`, etc. | Al login | | `user_language` | Idioma preferido del usuario | `es`, `en`, `fr`, `de`, `it`, `pt` | Al login | | `user_signup_date` | Fecha de creación de la cuenta (ISO 8601 UTC) | `2024-04-07T10:34:42.000Z` | Al login | | `user_has_phone` | Si tiene teléfono registrado | `true` / `false` | Al login | | `user_has_api_key` | Si tiene una API key asignada (usuario técnico) | `true` / `false` | Al login | > **Nota futura:** Cuando se lance el plan premium, se agregará > `user_plan` (`free` / `premium` / `family`) para segmentar la base por > plan. --- ## Screen Views Cada vez que el usuario navega a una pantalla, Firebase recibe un evento automático `screen_view` con el parámetro `screen_name` igual al nombre lógico de la ruta (no el nombre de clase Flutter). **Esto se captura automáticamente**, sin instrumentación manual en cada pantalla, mediante un listener del router. **También captura los cambios de tab del bottom navigation** (home device functions mapa chat). ### Pantallas del módulo legacy que se trackean | Screen name | Pantalla | |---|---| | `splash` | Pantalla de carga inicial | | `legacy_onboarding` | Intro/onboarding | | `legacy_login` | Pantalla de login | | `legacy_signup` | Alta de cuenta | | `legacy_recover_password` | Recuperación de contraseña | | `legacy_device_setup` | Wizard de alta de reloj/dispositivo | | `legacy_request_link_phone` | Inicio de vinculación de teléfono | | `legacy_verify_link_phone_code` | Verificación del código OTP | | `control_panel` | Dashboard principal (home del legacy) | | `customer_service` | Pantalla de soporte | | `account_settings` | Menú de cuenta | | `personal_data` | Editar datos personales | | `change_password` | Cambiar contraseña | | `linked_devices` | Dispositivos vinculados a la cuenta | | `app_users` | Sub-usuarios de la app | | `delete_account` | Flujo de eliminación de cuenta | | `device_management` | Menú de gestión del dispositivo | | `scheduled_activities` | Actividades programadas | | `contacts` | Contactos del dispositivo | | `edit_contact` | Editar un contacto | | `health` | Salud (ritmo cardíaco, SpO2) | | `remote_connection` | Conexión remota (cámara, llamada) | | `locate_device` | Localizar dispositivo | | `rewards` | Recompensas | | `activity_meter` | Medidor de actividad (pasos) | | `apps_use` | Uso de apps | | `volume_control` | Control de volumen | | `call_history` | Historial de llamadas | | `background_image` | Imagen de fondo del dispositivo | | `legacy_location` | Mapa de ubicación | | `legacy_chat` | Chat (placeholder) | | `settings` | Menú de ajustes | | `alarm` | Alarmas | | `remote_management` | Gestión remota | | `sos_agenda` | Contactos SOS | | `sound` | Sonido del dispositivo | | `sync_clock` | Sincronización de reloj | | `app_store` | Gestión de apps instaladas | | `battery` | Batería / modo nocturno | | `block_phone` | Bloqueo de teléfono (whitelist) | | `disable_functions` | Desactivar funciones (teclado, GPS) | | `language` | Idioma del dispositivo | | `legacy_notifications` | Notificaciones del dispositivo | | `remote_on_off` | Encendido/apagado remoto | | `alerts` | Alertas | | `timezone` | Zona horaria | | `wifi_settings` | Configuración WiFi | **Insight para marketing:** Con estas screen_view podés construir funnels (ej: `legacy_login control_panel device_management locate_device`) y medir tiempos entre pantallas, rebotes y pantallas más visitadas. --- ## Autenticación Prefijo `legacy_auth_*` — cubre login, 2FA, signup, recuperación de contraseña, vinculación de teléfono y logout. ### Login | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_login_attempt` | El usuario pulsa "Iniciar sesión" después de validar el formulario en el cliente. | — | Tope del funnel de login. Usar como base del "100 %" del funnel. | | `legacy_auth_login_success` | El backend aceptó email + contraseña. Aún falta el 2FA. | — | Credenciales válidas. Usar para medir la calidad de la contraseña/email. | | `legacy_auth_login_failure` | El backend rechazó las credenciales o hubo un error de red. | `reason` (mensaje de error) | Fricción. Analizar los `reason` más frecuentes para detectar problemas. | ### 2FA (doble factor) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_2fa_requested` | El backend envió el código 2FA al usuario. | — | Usuario pasó el primer paso del login. | | `legacy_auth_2fa_verified` | El código 2FA fue verificado y la sesión está activa. | — | Login exitoso. Fin del funnel de login. | | `legacy_auth_2fa_failure` | El código 2FA fue rechazado (incorrecto, expirado). | `reason` | Fricción en el 2FA. Si es muy alto, puede indicar problemas con la entrega del código. | | `legacy_auth_2fa_resend` | El usuario pidió reenviar el código. | — | Indica que no le llegó el primero. Útil para medir problemas de entrega. | ### Signup El signup es un wizard de **2 pasos** (`step_index` 0, 1): - **Paso 0 — Datos personales:** nombre, apellido, email, teléfono (con picker de país), aceptación de términos. - **Paso 1 — Contraseña:** password y repeat password con validación de reglas. El `language` se infiere del locale del dispositivo al momento del submit. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_signup_started` | El usuario envió el formulario final (submit del paso 1). | — | Top del funnel de request al backend. | | `legacy_auth_signup_completed` | El backend creó la cuenta exitosamente. | — | Conversión de nueva cuenta. | | `legacy_auth_signup_failed` | Error en el alta (email ya existe, datos inválidos, error de red). | `reason` | Drop-off del signup. Analizar `reason` para ver si hay patrones. | | `legacy_auth_signup_step_completed` | El usuario avanzó a un paso siguiente (validación pasó). | `step_index` (0, 1) — el paso que JUSTO terminó | Funnel interno del signup. Permite ver cuántos completan paso 0 y llegan al 1. | | `legacy_auth_signup_step_back` | El usuario tocó "atrás" dentro del wizard. | `step_index` — el paso del que vuelve | Indica que el usuario quiere corregir algo — fricción. | | `legacy_auth_signup_step_validation_failed` | El usuario tocó "siguiente" pero la validación del formulario lo rechazó. | `step_index` | **Muy valioso:** dice en qué paso hay más problemas de validación. Si step 0 falla: nombre/apellido, email, teléfono o términos. Si step 1 falla: reglas de contraseña. | ### Recuperación de contraseña Flujo **exclusivo por email** (se removió la opción de SMS/teléfono). | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_password_reset_requested` | El usuario inició el flujo de recuperar contraseña tipeando su email. | — | Fricción: alguien no recuerda su contraseña. | | `legacy_auth_password_reset_email_sent` | El backend confirmó el envío del email de recuperación. | — | Confirma que el email salió. Cruzar con `reset_requested` para medir fallas. | | `legacy_auth_password_reset_completed` | El usuario guardó la nueva contraseña exitosamente. | — | **Conversión final** del funnel de recuperación. | | `legacy_auth_password_reset_failed` | Error al intentar guardar la nueva contraseña. | `reason` (`unequal_passwords`, `too_short`, `no_capitals`, `no_numbers`, `no_special_chars`, o mensaje del backend) | Permite ver qué reglas de validación molestan más a los usuarios. | ### Vinculación de teléfono | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_link_phone_code_requested` | El usuario envió su número y pidió el código OTP. | — | Inicio del flujo de linking. | | `legacy_auth_link_phone_code_request_failed` | Falló el pedido del código al backend. | `reason` | Fricción inicial. | | `legacy_auth_link_phone_code_verified` | El código OTP fue verificado con éxito. | — | Número vinculado. | | `legacy_auth_link_phone_code_verification_failed` | Falló la verificación (código incorrecto o expirado). | `reason` | Fricción en el segundo paso. | ### Logout | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_auth_logout` | El usuario cerró sesión y la app limpió la sesión local. | — | Señal de fin de sesión. Cruzar con duración de sesión para ver patrones de uso. | --- ## Cuenta Prefijo `legacy_account_*` — cubre edición de perfil, contraseña, dispositivos vinculados, usuarios de la app y **eliminación de cuenta (señal crítica de churn)**. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_account_personal_data_edited` | El usuario guardó cambios en sus datos personales (nombre, apellido, teléfono). | — | Engagement con la cuenta. | | `legacy_account_password_changed` | Cambio de contraseña exitoso. | — | Señal de buen hábito de seguridad. | | `legacy_account_password_change_failed` | El cambio de contraseña falló. | `reason` | Fricción. | | `legacy_account_linked_device_unlinked` | El usuario quitó un dispositivo vinculado de su cuenta. | — | Posible señal temprana de desuso del dispositivo. | | `legacy_account_linked_device_renamed` | El usuario renombró un dispositivo vinculado (editó el carrier name). | — | Personalización / engagement con la gestión de dispositivos. | | `legacy_account_app_user_delete_triggered` | El usuario tocó "eliminar" en la pantalla de app users. | — | Nota técnica: la implementación actual borra al usuario logueado (parece ser placeholder). El evento se mantiene para medir demanda del feature. | | `legacy_account_deletion_initiated` | **CHURN SIGNAL** — El usuario entró al flujo "Eliminar cuenta". | — | Top del funnel de churn. | | `legacy_account_deletion_confirmed` | El usuario confirmó la eliminación y la API call está en progreso. | — | El usuario quiere realmente irse. | | `legacy_account_deletion_completed` | El backend confirmó la eliminación. | — | Usuario perdido. | | `legacy_account_deletion_cancelled` | El usuario canceló antes de confirmar la eliminación. | — | Save: el usuario se arrepintió. Útil para medir efectividad de pantallas de retención. | --- ## Dispositivo — Setup Prefijo `legacy_device_setup_*` — **el momento aha del producto**: vincular un reloj/dispositivo del hijo a la cuenta del padre/madre. ### Funnel del wizard | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_setup_started` | El usuario entró al wizard de alta de dispositivo. | — | Top del funnel de activación. | | `legacy_device_setup_step_completed` | El usuario completó un paso del wizard. | `step` (`intro`, `link_info`, `scan_watch`, `profile`), `duration_seconds` (cuánto tardó en ese paso) | Permite ver dónde se abandona más el wizard **Y cuánto tiempo pasan los usuarios en cada paso** — fricción directa. | | `legacy_device_setup_completed` | El dispositivo se creó exitosamente y está vinculado. | `child_gender` (M/F/other), `relation_type` (mother/father/etc), `child_age_years` | **Conversión de activación + demográficos del usuario final**. Marketing puede construir **personas reales** con estos 3 params: género, edad y relación con el adulto que compró. | | `legacy_device_setup_failed` | Falló un paso del wizard. | `at_step` (en qué paso falló), `reason` (error) | Señal para el equipo técnico de dónde hay problemas. | | `legacy_device_setup_cancelled` | El usuario volvió atrás y abandonó el wizard. | `at_step` | Drop-off del wizard. | ### Entrada del código del reloj (QR vs. manual) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_setup_qr_scanned` | El usuario escaneó exitosamente el código QR del reloj. | — | Método "rápido". Si su ratio baja, el QR scanner puede estar fallando. | | `legacy_device_setup_manual_code_entered` | El usuario avanzó con el código tipeado manualmente (no escaneó). | — | Fallback. Si crece mucho el ratio vs QR, invertir en mejorar la UX del scanner. | ### Familias con múltiples hijos | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_setup_reset_for_new_kid` | Después de terminar un alta, el usuario tocó "agregar otro hijo". | — | **Señal de familia con múltiples hijos**. Estos usuarios típicamente tienen mayor retention y LTV — son el mejor segmento. | --- ## Dispositivo — Funciones Prefijo `legacy_device_*` — acciones sobre el dispositivo ya vinculado. Mide qué features del producto se usan más. ### Localización del dispositivo (comando "find") | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_locate_requested` | El usuario pulsó el botón de localizar (intento). | — | Uso del feature principal del producto. Top del mini-funnel de localización. | | `legacy_device_locate_success` | El comando de localizar fue enviado con éxito al backend. | — | El dispositivo va a sonar. Conversión del mini-funnel. | | `legacy_device_locate_failure` | El comando de localizar falló (error del backend o de red). | `reason` | Problema técnico al localizar. Drop-off del mini-funnel. | ### Conexión remota (cámara + llamadas) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_remote_connection_started` | El usuario entró a la pantalla de conexión remota. | — | Intención de interactuar remotamente. | | `legacy_device_remote_connection_photo_taken` | El usuario pidió una foto de la cámara remota. | — | Feature avanzada. Permite medir uso de la cámara del reloj. | | `legacy_device_remote_connection_call_initiated` | El usuario inició una llamada bidireccional. | — | Feature crítica: llamar al niño. | | `legacy_device_remote_connection_picture_viewed` | El usuario navegó entre fotos de la cámara remota. | `direction` (`next`, `prev`, `direct`) | Engagement con la galería: cuántas fotos revisa el padre después de pedirlas. | ### Volumen del dispositivo Cada envío del formulario dispara **un evento por tipo de volumen que efectivamente cambió** (media, ringtone, alarm) — si el usuario movió solo el media, solo se manda ese. Permite medir qué tipo de sonido configuran más los padres. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_volume_control_changed` | El usuario guardó un cambio de volumen en el dispositivo, se emite 1 vez por cada tipo modificado. | `type` (`media`, `ringtone`, `alarm`), `level` (0-100) | Configuración. Cruzar `type` para ver cuál se ajusta más. | ### Imagen de fondo del reloj | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_background_image_changed` | El usuario seleccionó una imagen existente como fondo. | — | Personalización. | | `legacy_device_background_image_uploaded` | El usuario subió una foto personal como fondo. | — | Alta personalización — indicador de engagement. | ### Actividades programadas (alarmas personalizadas del dispositivo) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_scheduled_activity_added` | El usuario agregó una actividad programada. | `week_day` (0-6, 0 = domingo), `period` (`HH:mm-HH:mm`) | **Dato muy útil:** permite ver qué horarios programan los padres (desayuno, colegio, deberes, etc) y qué días. | | `legacy_device_scheduled_activity_updated` | El usuario editó una actividad programada. | `week_day`, `period` | Refinamiento de configuración. | | `legacy_device_scheduled_activity_removed` | El usuario eliminó una actividad programada. | — | | ### Recompensas | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_rewards_granted` | El usuario asignó minutos de recompensa al dispositivo. | `amount` (cantidad de minutos) | Gamificación / recompensas de uso. | ### Podómetro (Activity Meter) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_activity_pedometer_toggled` | El usuario activó/desactivó el contador de pasos. | `enabled` (`true` / `false`) | | | `legacy_device_activity_meter_time_range_changed` | El usuario cambió el rango de fechas en la pantalla de pasos. | `range` (`today`, `seven_days`, `thirty_days`, `custom`) | **Engagement profundo:** el padre no solo abre la pantalla, sino que investiga distintos períodos. | ### Salud (ritmo cardíaco / SpO2) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_health_heart_rate_frequency_changed` | El usuario cambió la frecuencia de medición del ritmo cardíaco. | `frequency_seconds` | Personalización de monitoreo de salud. | | `legacy_device_health_measurement_started` | El usuario inició una medición manual de ritmo cardíaco. | — | Interés en datos de salud del niño. | | `legacy_device_health_time_range_changed` | El usuario cambió el rango de fechas en la pantalla de salud. | `range` | Engagement profundo: padres revisando el historial de salud. | ### Uso de aplicaciones (Apps Use) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_apps_use_time_range_changed` | El usuario cambió el rango de fechas en la pantalla de uso de apps. | `range`, `total_duration_seconds` (total acumulado del período), `top_app_name` (app más usada en ese período) | **El evento más rico del módulo.** Permite a marketing segmentar directo: "padres cuyos hijos usan más TikTok que YouTube", "familias con uso > 4hs/día", etc. | ### Historial de llamadas | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_device_call_history_filter_changed` | El usuario cambió el filtro del historial. | `filter` (`all`, `incoming`, `outgoing`, `missed`) | **Cuando se filtra `missed` es señal de preocupación** del padre: busca llamadas perdidas del hijo. | --- ## Contactos del dispositivo Prefijo `legacy_contacts_*` — contactos permitidos para llamadas desde el dispositivo del niño. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_contacts_added` | El usuario agregó un contacto al dispositivo. | `total_count` (cantidad total de contactos DESPUÉS del add) | Configuración inicial o expansión de la agenda. El `total_count` permite segmentar "padres con agenda chica vs grande". | | `legacy_contacts_edited` | El usuario editó un contacto existente. | — | | | `legacy_contacts_deleted` | El usuario eliminó un contacto del dispositivo. | `total_count` (cantidad total DESPUÉS del delete) | | --- ## Ajustes Prefijo `legacy_settings_*` — configuración general del dispositivo (alarmas, SOS, bloqueos, idioma, red, etc). ### Alarmas | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_alarm_added` | Alarma nueva creada. | `time` (`HH:mm`) | Uso del feature de alarma. El `time` permite ver qué horarios son más populares (despertador matutino, hora del colegio, etc). | | `legacy_settings_alarm_updated` | Alarma existente editada. | `time` (el NUEVO `HH:mm`) | Refinamiento. | | `legacy_settings_alarm_removed` | Alarma eliminada. | — | | ### Contactos SOS | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_sos_contact_added` | Contacto SOS agregado. | `total_count` | Configuración de seguridad. Muy importante. | | `legacy_settings_sos_contact_removed` | Contacto SOS removido. | `total_count` | | ### Whitelist del teléfono (bloqueo de llamadas) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_block_phone_contact_added` | Contacto agregado a la whitelist de llamadas permitidas. | `total_count` | Control parental. | | `legacy_settings_block_phone_contact_removed` | Contacto removido de la whitelist. | `total_count` | | ### Control parental (funciones desactivadas) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_disable_functions_changed` | El usuario guardó cambios en la pantalla de funciones desactivadas. | — | Engagement con control parental (evento agregado). | | `legacy_settings_disable_functions_keyboard_toggled` | Se guardó con el teclado habilitado/deshabilitado. | `enabled` | Control granular. | | `legacy_settings_disable_functions_gps_toggled` | Se guardó con el GPS habilitado/deshabilitado. | `enabled` | Control granular. | ### Otros ajustes del dispositivo | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_language_changed` | Se cambió el idioma del dispositivo. | `language` (ej. `es`, `en`) | | | `legacy_settings_alerts_configured` | El usuario guardó cambios en las alertas. | `alert_count` (cuántas alertas activas), `alerts_enabled` (lista separada por comas truncada a 100 chars) | Permite ver qué alertas son más populares y cuántas alertas promedio configuran los padres. | | `legacy_settings_timezone_changed` | Se cambió la zona horaria. | `timezone` | | | `legacy_settings_wifi_added` | Se agregó una red WiFi permitida. | `total_count` | | | `legacy_settings_wifi_removed` | Se eliminó una red WiFi permitida. | `total_count` | | | `legacy_settings_sound_changed` | Se cambió el modo de sonido del dispositivo. | `mode` (`normal` / `silent` / `vibrate`) | Preferencia de perfil sonoro del niño. | | `legacy_settings_sync_clock_triggered` | El usuario disparó una sincronización manual del reloj del dispositivo. | — | | | `legacy_settings_battery_night_mode_toggled` | El usuario activó/desactivó el modo nocturno (ahorro de batería). | `enabled` | | ### Gestión remota del dispositivo (comandos destructivos) Estos eventos son **muy importantes** para churn analysis. Un `factory_reset` típicamente precede a un desvinculado y potencial churn. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_settings_remote_management_shutdown` | El usuario apagó el dispositivo remotamente. | — | Acción poco frecuente. | | `legacy_settings_remote_management_restart` | El usuario reinició el dispositivo remotamente. | — | Típicamente usado cuando hay problemas técnicos. | | `legacy_settings_remote_management_factory_reset` | **CHURN SIGNAL** — El usuario reseteó el dispositivo a fábrica. | — | Borra el dispositivo. Frecuentemente precede un `legacy_account_linked_device_unlinked` y luego `legacy_account_deletion_*`. Cruzar para medir correlación. | --- ## Soporte Prefijo `legacy_support_*` — solo 1 evento hoy, medirá la demanda de soporte. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_support_contact_initiated` | El usuario tocó el botón para contactar soporte (ej. abrir el cliente de email). | `channel` (`email` hoy; en el futuro también `phone`, `whatsapp`), `country` (país seleccionado en el formulario) | Demanda de soporte **por país**: permite ver dónde se originan más tickets. Nota: mide la **intención** de contactar, no confirma envío. | --- ## Onboarding Prefijo `legacy_onboarding_*` — los slides de intro iniciales de la app. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_onboarding_step_changed` | El usuario pasó a un nuevo slide del intro. | `step_index` (número de slide, empieza en 0) | Medir cuántos slides el usuario ve antes de empezar. | --- ## Panel principal Prefijo `legacy_control_panel_*` — acciones en el home del legacy. | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_control_panel_device_selected` | El usuario cambió el dispositivo activo (útil cuando hay varios hijos). | `total_devices` (cuántos dispositivos tiene vinculados) | Qué dispositivo está monitoreando activamente. El `total_devices` permite **segmentar por tamaño de familia** (1 hijo, 2 hijos, 3+). | | `legacy_control_panel_positions_refreshed` | El usuario tiró del pull-to-refresh o tocó "actualizar" en el dashboard. | — | Preocupación activa del usuario. Indicador de engagement alto. | --- ## Ubicación y mapa Prefijo `legacy_location_*` — **el feature más rico del producto**. Acá capturamos toda la interacción del usuario con el mapa: ver el trayecto, crear zonas seguras, ver lugares frecuentes, cambiar frecuencia de actualización, etc. ### Geofences (zonas seguras) — CRUD básico | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_geofence_created` | Se creó una geofence (API confirmó). | — | **Conversión final** del funnel de creación. | | `legacy_location_geofence_updated` | Se actualizó una geofence existente. | — | Refinamiento de configuración de zonas. | | `legacy_location_geofence_deleted` | Se eliminó una geofence. | — | | ### Lugares frecuentes — CRUD básico | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_frequent_place_created` | Se creó un lugar frecuente (API confirmó). | — | **Conversión final** del funnel. | | `legacy_location_frequent_place_updated` | Se actualizó un lugar frecuente. | — | | | `legacy_location_frequent_place_deleted` | Se eliminó un lugar frecuente. | — | | ### Funnel de creación de lugares (geofences y frequent places) Este es el funnel más valioso del módulo de ubicación. Permite medir **cuánta gente empieza a crear una zona vs. cuánta termina**. ``` legacy_location_place_creation_started (top: 100 %) legacy_location_point_confirmed (paso 1 completado) legacy_location_radius_confirmed (solo geofences — paso 2) legacy_location_geofence_created (bottom: API OK) o legacy_location_frequent_place_created ``` | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_place_creation_started` | El usuario tocó "agregar zona" o "agregar lugar frecuente". | `mode` (`geofence` / `frequent_place`) | Top del funnel. | | `legacy_location_point_confirmed` | El usuario tocó el mapa para fijar el centro del lugar. | `mode` | Paso 1 del funnel completado. | | `legacy_location_radius_confirmed` | El usuario confirmó el radio de la geofence (solo aplica a geofences). | `radius` (metros), `is_editing` (`true` si estaba editando una existente, `false` si es nueva) | Paso 2 del funnel completado. Permite también **analizar qué tamaños de zonas eligen los usuarios** (radios más comunes casa, escuela, etc.). | | `legacy_location_place_creation_cancelled` | El usuario salió del flujo de creación/edición antes de terminar. | `mode`, `at_step` (`picking_point` o `adjusting_radius`) | **Drop-off del funnel**. El `at_step` dice exactamente dónde lo perdimos. | ### Exploración y edición | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_geofence_selected` | El usuario tocó una geofence del mapa para verla. | — | Engagement: el usuario está mirando sus zonas. | | `legacy_location_geofence_dismissed` | El usuario cerró el popup de la geofence sin hacer nada. | — | "Miró pero no editó". Indicador de exploración. | | `legacy_location_geofence_edit_started` | El usuario tocó "editar" en una geofence seleccionada. | — | Intención de editar. Mid-funnel de edición. | | `legacy_location_frequent_place_selected` | El usuario tocó un lugar frecuente para verlo. | — | Engagement. | | `legacy_location_frequent_place_dismissed` | El usuario cerró el popup del lugar frecuente. | — | | | `legacy_location_history_position_selected` | El usuario tocó un punto del historial de ubicaciones en el mapa. | — | Inspección detallada del trayecto. | | `legacy_location_history_position_dismissed` | El usuario cerró el detalle del punto de historial. | — | | ### Historial de ubicaciones | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_history_loaded` | El usuario cargó el historial para un rango de fechas. | — | Interés en el historial. | | `legacy_location_history_cleared` | El usuario limpió el trayecto del mapa. | — | | ### Frecuencia de ubicación (privacidad vs. precisión) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_frequency_updated` | El usuario cambió cada cuánto el dispositivo manda su posición. | `frequency_seconds` (ej. `60`, `300`, `900`) | **Dato súper útil:** indica preferencia entre privacidad y precisión/batería. Correlacionar con retention. | ### Capas del mapa (toggles de visibilidad) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_map_geofences_toggled` | El usuario mostró/ocultó las geofences en el mapa. | `visible` (`true` / `false`) | | | `legacy_location_map_frequent_places_toggled` | El usuario mostró/ocultó los lugares frecuentes. | `visible` | | | `legacy_location_map_route_trail_toggled` | El usuario mostró/ocultó la línea del trayecto histórico. | `visible` | | ### Modo "seguir en vivo" | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_following_toggled` | El usuario activó/desactivó el modo "seguir dispositivo" (el mapa se re-centra automáticamente). | `enabled` (`true` / `false`) | **Engagement alto:** el usuario está viendo al hijo en tiempo real. Correlacionar con horarios (ej. entrada/salida del cole). | ### UI del mapa (chrome) | Evento | Cuándo se dispara | Parámetros | Qué significa para marketing | |---|---|---|---| | `legacy_location_map_actions_expanded` | El usuario abrió/cerró el drawer de acciones del mapa. | `expanded` (`true` / `false`) | Indica conocimiento de la UI. | | `legacy_location_map_zoomed` | El usuario hizo zoom in/out y se quedó en ese nivel (con debounce de 1 segundo para no spamear). | `zoom` (nivel de zoom final) | Nivel de detalle con el que los usuarios miran el mapa. Un zoom alto indica "me importa ver dónde exactamente está". | | `legacy_location_map_style_changed` | El usuario eligió otro estilo visual para el mapa desde el selector de capas. | `style` (`standard` / `voyager` / `light` / `dark` / `satellite`) | Personalización de la experiencia. **Satellite** es el más usado por padres que quieren ver edificios reales. | | `legacy_location_map_center_tapped` | El usuario tocó el botón "centrar en el dispositivo" del mapa. | — | Acción de re-centrado manual. Indica que el mapa se desplazó y el usuario quiere volver al hijo. | | `legacy_location_map_refresh_tapped` | El usuario tocó el botón de refresco dentro del mapa (distinto del pull-to-refresh del control panel). | — | **Engagement intenso:** el usuario quiere la posición más reciente AHORA. Suele dispararse en momentos de ansiedad. | | `legacy_location_shared` | El usuario tocó "compartir ubicación" — abre el share sheet nativo para mandar la posición del hijo a otra app. | — | **Acción viral del producto.** Es la más importante para crecimiento orgánico: indica que el usuario está mandando data del producto a contactos fuera de la app (familia, pareja, abuelos). | | `legacy_location_list_sheet_opened` | El usuario abrió el bottom sheet con la lista de geofences, lugares frecuentes e historial. | — | Quiere explorar todo lo que tiene configurado. Mid-funnel de gestión. | | `legacy_location_history_type_filter_changed` | El usuario filtró el historial por tipo de posición. | `type` (`gps` / `wifi` / `sos` / `all` cuando limpia el filtro) | Indica interés en una fuente de datos específica. **`sos`** filtrado es señal de un evento crítico que el usuario está investigando. | --- ## Cómo usar este catálogo ### Para construir funnels Tomá un evento "inicio" y uno "fin" en Firebase Analytics Engagement **Funnels** y comparalos: - **Signup:** `legacy_auth_signup_started _completed` - **Login:** `legacy_auth_login_attempt _2fa_verified` - **Activación (aha moment):** `legacy_device_setup_started _completed` - **Creación de zona segura:** `legacy_location_place_creation_started _geofence_created` - **Churn:** `legacy_account_deletion_initiated _deletion_completed` ### Para segmentar audiencias En **Audiences** podés filtrar por user properties (`user_language`, `user_has_phone`, etc.) y cruzarlo con cualquiera de estos eventos. ### Para detectar problemas Filtrar por los eventos con `_failed` o `_failure` y mirar los `reason` más frecuentes en la pestaña Events Parameter. ### Para medir engagement diario Los eventos `legacy_control_panel_positions_refreshed`, `legacy_location_following_toggled` y las screen_views del mapa son los indicadores más fuertes de usuarios activos y preocupados. --- ## Eventos propuestos para el futuro (NO implementados aún) Esta sección es la **wishlist** para cuando existan los features o lleguen las decisiones pendientes. ### Cuando exista el plan premium/suscripción - `purchase` / `purchase_subscription` (con `value`, `currency`, `transaction_id`) - `action_click_gopremium` (botón de upgrade) - `subscription_error_payment` / `subscription_canceled_payment` - User property `user_plan` (`free` / `premium` / `family`) ### Limit popups / free-tier walls - `legacy_limit_hit` con `limit_type` (max_devices, max_contacts, etc.) - `legacy_limit_popup_shown` - `legacy_limit_popup_upgrade_clicked` ### Referral / invitación - `legacy_referral_screen_viewed` - `legacy_referral_code_shared` (con `channel`) - `legacy_referral_signup_completed` ### NPS / rating - `legacy_nps_prompt_shown` - `legacy_nps_score_submitted` (con `score` 0–10) - `legacy_app_rating_submitted` ### Push notification engagement - `legacy_notification_received` (background) - `legacy_notification_opened` (tap app abre) - `legacy_notification_dismissed` ### Aha moments - `legacy_first_device_connected` (primera vez que el usuario vincula un dispositivo — requiere persistencia de "primera vez") - `legacy_first_session_completed` ### A/B testing - `ab_test_` (cuando empecemos experimentos con Remote Config) ### Errores de API / health técnica - `legacy_api_error` con `endpoint`, `status_code` (detectar endpoints flakey) - `legacy_session_expired` --- ## Referencias técnicas - **Proyecto Firebase:** `sf-platform-pre` (para dev+staging) / `sf-platform-prod` (pendiente de crear) - **Package Dart:** `packages/sf_tracking/` - **Mixins:** Cada grupo de eventos vive en un mixin aparte dentro del package (`auth_tracking.dart`, `location_tracking.dart`, etc). - **GDPR:** Cada evento incluye automáticamente el parámetro `consent_status` para permitir filtrado post-hoc en BigQuery cuando se implemente el consent screen. - **Ambiente:** `env` se setea como user property (`development` / `staging` / `production`), por lo que **todos los reportes pueden filtrarse por ambiente** y producción no se va a mezclar con testing. --- ## Changelog del catálogo - **2026-04-07** — Creación inicial. 61 eventos del módulo legacy implementados y validados en device físico (iPhone 14 Pro iOS 18 + Samsung Galaxy A55 Android 15). - **2026-04-07** — Se agregaron 16 eventos nuevos al módulo de ubicación (funnel de creación, exploración, edición, follow mode, map zoom debounced, history). - **2026-04-07** — Se expandió el tracking de `device_management` con 8 eventos nuevos y 3 enriquecimientos de parámetros: - NUEVOS: `legacy_device_locate_success/failure`, `legacy_device_remote_connection_picture_viewed`, `legacy_device_activity_meter_time_range_changed`, `legacy_device_health_time_range_changed`, `legacy_device_apps_use_time_range_changed` (con total_duration_seconds y top_app_name), `legacy_device_call_history_filter_changed`. - ENRIQUECIDOS: `legacy_device_volume_control_changed` ahora dispara un evento por cada tipo (media/ringtone/alarm) que efectivamente cambió; `legacy_device_scheduled_activity_added/updated` ahora incluyen `week_day` y `period`; `legacy_contacts_added/deleted` ahora incluyen `total_count`. - **2026-04-07** — Se expandió el tracking de `settings` con 3 eventos nuevos y 7 enriquecimientos de parámetros: - NUEVOS: `legacy_settings_remote_management_shutdown/restart/factory_reset` (churn signal crítico). - ENRIQUECIDOS: `legacy_settings_alarm_added/updated` ahora incluyen `time`; `legacy_settings_sos_contact_added/removed` incluyen `total_count`; `legacy_settings_block_phone_contact_added/removed` incluyen `total_count`; `legacy_settings_wifi_added/removed` incluyen `total_count`; `legacy_settings_sound_changed` incluye `mode`; `legacy_settings_alerts_configured` incluye `alert_count` y `alerts_enabled`. - **2026-04-07** — Se expandió el tracking de `device_setup` con 3 eventos nuevos y 2 enriquecimientos críticos: - NUEVOS: `legacy_device_setup_qr_scanned`, `legacy_device_setup_manual_code_entered`, `legacy_device_setup_reset_for_new_kid` (señal de familias con múltiples hijos). - ENRIQUECIDOS: `legacy_device_setup_step_completed` ahora incluye `duration_seconds` (tiempo por paso — fricción directa); `legacy_device_setup_completed` ahora incluye `child_gender`, `relation_type`, `child_age_years` ( demográficos del usuario final para personas de marketing). - **2026-04-07** — Se expandió el tracking de `legacy_auth` con 3 eventos nuevos para el funnel interno del signup: - NUEVOS: `legacy_auth_signup_step_completed`, `legacy_auth_signup_step_back`, `legacy_auth_signup_step_validation_failed` (originalmente con `step_index` 0-2; reducido a 0-1 en abril 2026 al simplificar el signup). - **2026-04-07** — Pasada final de cobertura en `legacy_auth`, `account`, `support`, `control_panel`: 6 eventos nuevos y 2 enriquecimientos. - NUEVOS AUTH: `legacy_auth_password_reset_completed`, `legacy_auth_password_reset_failed` (con `reason` granular), `legacy_auth_link_phone_code_request_failed`, `legacy_auth_link_phone_code_verification_failed`. - NUEVOS ACCOUNT: `legacy_account_linked_device_renamed`, `legacy_account_app_user_delete_triggered`. - ENRIQUECIDOS: `legacy_support_contact_initiated` ahora incluye `country` además de `channel`; `legacy_control_panel_device_selected` ahora incluye `total_devices` (proxy de tamaño de familia). - **2026-04-07** — Se expandió la cobertura de los widgets del módulo `location` con 6 eventos nuevos sobre acciones top-level del mapa: - NUEVOS: `legacy_location_map_style_changed` (selector de capas), `legacy_location_map_center_tapped`, `legacy_location_map_refresh_tapped`, `legacy_location_shared` ( acción viral del producto), `legacy_location_list_sheet_opened`, `legacy_location_history_type_filter_changed` (con `type` para detectar interés en posiciones SOS). - **2026-04-15** — Cambios de producto en `legacy_auth`: - **Signup reducido a 2 pasos** (antes 3). Se quitaron los campos de documento, fecha de nacimiento, lugar de nacimiento, país de nacimiento, relación con el niño y dirección completa. El request al backend ahora solo incluye `firstName`, `lastName`, `email`, `phone` (E.164), `language` (del locale del dispositivo) y `password`. `step_index` de los eventos `legacy_auth_signup_step_*` pasa de 0-2 a 0-1. - **Recover password solo por email**: se eliminó la UI de teléfono móvil en ambos screens del flujo (`request_recovery` y `new_password`). Los eventos del flujo se mantienen igual pero ahora siempre corresponden al canal email. Se eliminó del state `recoveryFormat` (ya no hay rama SMS). - **User properties (Firebase Analytics)** ahora se sincronizan solo en shells autenticados (dashboards legacy y payment), no en rutas públicas. Los eventos en sí no cambian — solo se movió el disparador de la sync para evitar llamadas espurias a `/auth/me` en login/signup/recover_password.