Eventos, segmentación y paneles
Cómo se etiquetan los eventos, cómo separar clientes y cómo armar dashboards.
Eventos capturados
Automáticos
$pageview, $pageleave, $identify, excepciones ($exception), heatmaps y session
recordings. No requieren instrumentación: los maneja el PostHogService.
De negocio (custom)
Instrumentados con posthogService.capture(...) en el punto exacto de la acción
(siempre en la rama de éxito, sin PII):
| Evento | Dónde | Props |
|---|---|---|
user_signed_in | auth.service.ts | — |
user_signed_up | register.component.ts | — |
user_signed_out | auth.service.ts | — |
login_failed | login.component.ts | error_code |
authorization_exported | authorizations.component.ts | filter_count |
authorization_billing_exported | authorizations.component.ts | filter_count |
billing_status_changed | billing.component.ts | new_status, authorization_id |
delivery_note_scanned | dispatch-scanner.component.ts | delivery_note_id |
delivery_notes_dispatched | dispatch-scanner.component.ts | note_count |
supply_note_created | supply-note-form.component.ts | supply_note_id, warehouse_id |
coordination_created | create-coordination-modal.component.ts | management_unit_count |
Cómo agregar un evento nuevo
private posthogService = inject(PostHogService);
// En el next/tap de la operación exitosa:
this.posthogService.capture('nombre_del_evento', {
entidad_id: id, // solo ids/contadores
// ⚠️ nunca PII: nombre de paciente, DNI, dirección, etc.
});
Reglas: nombre en snake_case, disparar en éxito, sin PII (usar ids y contadores).
Segmentación por cliente
Cada evento sale con dos marcadores del cliente (se setean en el init):
| Marcador | Origen | Cómo se usa | Requisitos |
|---|---|---|---|
deployment (event property) | posthog.register({ deployment }) | Filtro y breakdown normales | Cualquier plan ✅ |
instance (group) | posthog.group('instance', ...) | Filtro/aggregación por grupo | Requiere Group analytics |
Valores de deployment: gproyectar, cedit, demo, pre, csalud, daxsalud,
emergencias, development.
Para el día a día usá deployment (propiedad de evento suelta, no la de dentro de
Groups): funciona en cualquier plan y sin configurar nada. Dejá instance (group)
para analítica a nivel "instancia" si algún día activás Group analytics.
Armar dashboards
Opción A — un dashboard por cliente
- Nuevo dashboard (ej. "IDI — cedit").
- Dashboard filter: property
deployment=cedit. - Todos los insights quedan scopeados a ese cliente.
- Duplicar el dashboard y cambiar el filtro para los demás clientes.
Opción B — un dashboard comparativo
- Un único dashboard con Breakdown by →
deploymenten cada insight: una serie por cliente para comparar.
Elegí A si cada cliente lo mira gente distinta; B si querés monitorear/comparar todo desde un lugar. Se pueden combinar.
Filtrar / breakdown en un insight
- Filtrar: Add filter → property
deployment→equals→cedit. - Comparar: Breakdown by → event property
deployment.
Hasta desplegar a cada entorno, solo verás data de development (lo que se testea en
local). Los dashboards se pueden dejar armados desde ya; se llenan solos a medida que
los clientes empiezan a mandar eventos.
Ad blockers (uBlock)
El reverse proxy hace que el tráfico sea first-party y reduce el bloqueo, pero no lo elimina al 100%. uBlock (sobre todo EasyPrivacy) puede bloquear por:
- Nombre del subdominio: evitar
events/analytics/track/stats(los cazan las listas). Preferir un subdominio neutro del dominio propio, o mejor aún, proxy en el mismo dominio que la app (same-origin), que es lo más difícil de bloquear. - Path: hay reglas por patrón (
/e/,/array/,/static/array.js,/decide/) que matchean aunque el dominio sea propio.
Diagnóstico: abrir el Logger de uBlock (ícono → dashboard → Logger), recargar y ver qué requests salen en rojo — indica si bloquea el dominio, el path o el asset.
Siempre habrá un % de usuarios con bloqueo agresivo que no envíe eventos. Es esperable; no se puede garantizar el 100% de captura.
Installation Health
En PostHog → Web analytics → Installation Health. Con la config actual deberían pasar
los checks de $pageview, $pageleave, scroll depth, Authorized URLs, reverse proxy y
web vitals. Si $pageleave aparece en rojo, verificar que no esté seteado
capture_pageview: false en el init (romper el pageview automático también apaga el
pageleave).