Vision general
La app utiliza PostHog React Native SDK (v4.57+) para product analytics, conectandose a la instancia EU (eu.i.posthog.com).
Autocapture esta deshabilitado: todos los eventos se capturan de forma explicita mediante la
API publica. Session replay esta habilitado — ver Session replay.
Arquitectura
Cliente singleton
Definido en
src/core/analytics/client.posthog.ts. Inicializa y exporta la instancia unica de
PostHog.API publica
Expuesta desde
src/core/analytics/index.ts. Todas las interacciones con analytics pasan por
esta capa.Eventos
Catalogo de eventos definido en
src/core/analytics/events.ts.Configuracion
Parametros de conexion en
src/core/config/posthog.ts.API publica
La API se exporta desdesrc/core/analytics/index.ts y expone los siguientes metodos:
- Capturar evento
- Identificar usuario
- Registrar pantalla
Convencion de nombres
Todos los eventos de la app usan la convencion{category}_{action}:
app_opened— evento de ciclo de vida de la apptab_viewed— navegacion entre tabs principalesbooking_started— accion en el flujo de bookinghome_nps_survey_opened— evento del NPS de home review
src/core/analytics/events.ts y se referencian siempre via analyticsEvents.* — nunca se usan strings hardcodeados.
Eventos generales de la app
Estos eventos se disparan automaticamente a nivel global y no requieren integracion manual en cada pantalla.Ciclo de vida
Implementacion: Hook
useAppOpenedTracking en app/_layout.tsx. Usa AppState de React Native para detectar transiciones entre background/inactive y active.
Navegacion entre tabs
Implementacion:
screenListeners.focus en app/(tabs)/_layout.tsx.
Vistas de pantalla
Implementacion:
usePathname() de expo-router con useEffect en RootLayoutNav (app/_layout.tsx).
Cambio de propiedad
Implementacion: En
HomePropertySelector.tsx, se captura en ambos paths (iOS bottom sheet y Android modal).
Eventos de booking
Eventos relacionados con el flujo de reservas, intercambios y alquileres. Todos en la seccionanalyticsEvents.booking.*.
Navegacion en booking
Seleccion de calendario
Flujo de creacion de reserva
Filtros
Gestion de reservas
Eventos del Home NPS
El flujo del Home Annual Review (NPS) tiene su propio conjunto de 7 eventos con el prefijohome_nps_*. Estos eventos trackean el funnel completo desde la exposicion (card) hasta la finalizacion del survey y la visualizacion de resultados. Entry points: home card y deep link.
Documentacion completa de eventos NPS
Ver la referencia detallada de los 7 eventos del Home NPS, propiedades, flujos y guia de dashboard
en PostHog.
Eventos del Version Gate
Eventos relacionados con el flujo de version gate (actualizaciones de la app). SeccionanalyticsEvents.versionGate.*.
Implementacion: En el hook
useVersionCheck (src/shared/services/versionGate/useVersionCheck.ts), la función dismiss() captura el evento antes de ocultar el banner.
El evento solo se dispara para actualizaciones recomendadas. Las actualizaciones obligatorias no
tienen opción de dismiss y por tanto no generan este evento.
Eventos del Financial Report
Identificacion de usuarios
Identify
Se llama aanalytics.identify() en los siguientes momentos:
- Durante la inicializacion de autenticacion
- Tras login exitoso
- Tras registro exitoso
- En cada token refresh
email, name.
Archivo: src/modules/auth/store/authStore.ts
Reset
Se llama aanalytics.reset() al hacer logout o eliminar cuenta.
Sincronizacion de perfil
El hookuseAnalyticsProfileSync sincroniza automaticamente home_types (array de tipos de propiedad del usuario) con el perfil de PostHog.
Archivo: src/shared/hooks/useAnalyticsProfileSync.ts
Feature flags
PostHog gestiona los feature flags de la aplicacion. Se evaluan del lado del cliente y permiten activar o desactivar funcionalidades de forma remota.Session replay
La grabacion de sesiones movil esta habilitada conenableSessionReplay: true en src/core/config/posthog.ts, junto al modulo nativo @posthog/react-native-plugin.
Masking
Politica: masking minimo — solo credenciales. Texto e imagenes son visibles en las grabaciones.
Lo unico enmascarado son los inputs de credenciales — email y password en
LoginForm, ResetPasswordForm y ResendForm — envueltos en PostHogMaskView. Sin esa mascara, el email se grabaria en claro y la password tambien cuando el usuario activa el toggle de mostrarla (secureTextEntry solo protege mientras esta oculta).
Contexto de la decision: las stores no exigen masking. Apple exige divulgar la grabacion de actividad (politica de privacidad y App Privacy label — precedente Glassbox 2019); las credenciales se enmascaran por seguridad basica. Chat e imagenes visibles es decision de producto. PostHogMaskView funciona tambien con New Architecture (usa accessibilityLabel="ph-no-capture", que el masker de posthog-ios 3.69+ respeta para cualquier vista).
Frecuencia de captura
La grabacion toma una captura de la jerarquia de vistas en el hilo principal. Por defecto el SDK lo hace cada 1000ms; en la app se sube a 2000ms conthrottleDelayMs: 2000 en sessionReplayConfig, para reducir a la mitad ese coste y evitar el lag percibido en builds con replay. La timeline pasa a un frame cada 2s, suficiente para seguir la accion del usuario.
Control desde el dashboard
La grabacion efectiva se controla server-side en PostHog (Settings → Session replay), sin release:- Toggle de grabacion del proyecto (
session_recording_opt_in, compartido entre web y movil) - Feature flag vinculado — el SDK lo reevalua en
identify()/reset()sin reiniciar la app - Sampling y duracion minima de sesion
- Event triggers (arrancar la grabacion al capturarse un evento concreto)
Requisitos de build
@posthog/react-native-plugin es un modulo nativo: requiere build nueva de EAS y no se activa via OTA update. Las builds anteriores siguen funcionando con el replay silenciosamente desactivado.
Configuracion del SDK
Archivos clave
Guia para agregar nuevos eventos
- Definir la constante en
src/core/analytics/events.tsdentro del grupo correspondiente - Usar siempre
analyticsEvents.grupo.evento— nunca strings hardcodeados - Seguir la convencion
{category}_{action} - Capturar en el lugar correcto: preferir callbacks de exito para acciones async,
useEffectpara exposiciones - Propiedades relevantes: incluir IDs de entidades, tipos/categorias, y contexto necesario para segmentacion