Skip to main content

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):

EventoDóndeProps
user_signed_inauth.service.ts
user_signed_upregister.component.ts
user_signed_outauth.service.ts
login_failedlogin.component.tserror_code
authorization_exportedauthorizations.component.tsfilter_count
authorization_billing_exportedauthorizations.component.tsfilter_count
billing_status_changedbilling.component.tsnew_status, authorization_id
delivery_note_scanneddispatch-scanner.component.tsdelivery_note_id
delivery_notes_dispatcheddispatch-scanner.component.tsnote_count
supply_note_createdsupply-note-form.component.tssupply_note_id, warehouse_id
coordination_createdcreate-coordination-modal.component.tsmanagement_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):

MarcadorOrigenCómo se usaRequisitos
deployment (event property)posthog.register({ deployment })Filtro y breakdown normalesCualquier plan ✅
instance (group)posthog.group('instance', ...)Filtro/aggregación por grupoRequiere Group analytics

Valores de deployment: gproyectar, cedit, demo, pre, csalud, daxsalud, emergencias, development.

tip

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

  1. Nuevo dashboard (ej. "IDI — cedit").
  2. Dashboard filter: property deployment = cedit.
  3. Todos los insights quedan scopeados a ese cliente.
  4. Duplicar el dashboard y cambiar el filtro para los demás clientes.

Opción B — un dashboard comparativo

  • Un único dashboard con Breakdown by → deployment en 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 deploymentequalscedit.
  • Comparar: Breakdown by → event property deployment.
note

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.

caution

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).