Investigación, Diseño de Señales y Sistemas de Decisión

Tengo conversaciones (chat o WhatsApp), tickets de soporte y eventos de producto o website, pero no comparten el mismo ID y el journey queda a medias. ¿Cómo uno

Lucía Ferrer
Lucía Ferrer
9 min de lectura·

Respuesta

No necesitas un ID perfecto para reconstruir el journey, necesitas un modelo de identidad con reglas claras, auditables y por capas. Empieza creando un person_id interno y una tabla identity_map que registre qué identificadores viste, cuándo y con qué confianza. Luego une primero lo determinístico (login, email o teléfono verificado) y después lo probabilístico con ventanas de tiempo calibradas. El resultado útil es un timeline limpio por persona, con métricas accionables y un nivel de confianza explícito en cada enlace.

1) Definir el objetivo: de datos sueltos a timeline auditable

El error de enfoque más frecuente es intentar “pegar” chats, tickets y eventos como si fueran piezas de un rompecabezas con una única forma correcta. En la vida real, esos datos llegan con huecos, duplicados y señales que se contradicen, así que el objetivo correcto no es perfección, es trazabilidad.

Define un entregable concreto: una timeline por persona que sea auditable. Auditable significa que puedas responder tres preguntas sin sufrir: qué eventos incluí, por qué los asigné a esta persona y qué tan seguro estoy. En términos prácticos, suele aterrizar en tres capas. Una capa de identidad con person_id propio y un identity_map, una tabla de eventos canónica con event_id, person_id, timestamp, source y payload, y un conjunto de reglas de unión versionadas para poder comparar “antes y después” cuando ajustes la lógica.

Tip práctico 1: antes de discutir tooling, acuerda dos o tres decisiones de negocio que esa timeline debe habilitar, por ejemplo medir tiempo a resolución, conversión después de soporte y puntos de abandono antes de compra. Eso evita que el proyecto se convierta en arqueología de datos sin final.

2) Inventario de señales e identificadores disponibles

El stitching se gana o se pierde en el inventario. No basta con listar campos, hay que clasificarlos por estabilidad y calidad.

En conversaciones de chat o WhatsApp, típicamente tienes teléfono, wa_id, handle, external_user_id si lo pasas desde tu producto, timestamps de mensajes y a veces un identificador de conversación o thread. En tickets de soporte, aparecen email, teléfono, ticket_id, requester_id, org_id, created_at y metadatos del agente. En eventos de producto o web, verás user_id si hay login, anonymous_id o cookie_id, device_id, session_id, email o teléfono capturado en formularios, ip y user_agent.

Ahora clasifica:

  1. Identificadores fuertes y estables: user_id interno, contact_id de CRM, email verificado, teléfono verificado.
  2. Identificadores medios: device_id o cookie_id cuando se vinculan a un login, session_id, tokens de “abrir chat desde web”.
  3. Identificadores débiles: ip, user_agent, geolocalización aproximada.

Y mide calidad: tasa de nulos, formatos inconsistentes, duplicados, valores genéricos como “info@” o teléfonos compartidos por familias o empresas.

Tip práctico 2: calcula un tablero simple por fuente con null rate y duplicados por identificador. Si tu email viene vacío en 40 por ciento de chats, esa realidad debe influir en tus reglas, no al revés.

3) Diseñar el modelo de identidad: person_id, identity_map y reglas

La pieza central es decidir que tu “persona” no es ninguno de los IDs de las herramientas. Es un person_id que tú asignas y administras.

Un esquema mínimo que funciona bien es una tabla identity_map con columnas como person_id, id_type, id_value, first_seen_at, last_seen_at, source, confidence y evidence_event_id. La idea no es sobreescribir IDs originales, sino mapearlos. Eso te permite conservar historia, resolver duplicados y explicar por qué se unieron dos registros.

Define invariantes sencillas. Por ejemplo, un mismo par id_type más id_value no debería mapear a dos person_id a la vez, salvo que declares un conflicto explícito. Y cuando exista conflicto, no lo tapes, regístralo en una tabla de identity_conflict para revisión.

Una analogía ligera: tu identity_map es como la libreta de contactos del teléfono, pero en vez de “mamá” y “mecánico”, guarda evidencia de cuándo viste cada número y con qué seguridad.

4) Normalización de claves: antes de unir, limpiar

Antes de unir, limpia. Es aburrido, pero es donde se elimina la mayoría del ruido.

Normaliza email con trim y lower case, y define cómo tratar alias. Normaliza teléfono a E.164 con país, quitando separadores, y valida longitudes. Normaliza timestamps a UTC y decide qué timestamp manda cuando hay diferencias, por ejemplo servidor sobre cliente para eventos web. Estandariza nombres de evento para que “purchase”, “order_completed” y “compra” no sean tres cosas distintas.

Si te preocupa privacidad, crea hashes consistentes de email y teléfono para unir sin exponer el dato en claro en todas las capas. Y documenta excepciones, como emails genéricos o teléfonos compartidos, porque son minas antipersona para el stitching.

Error común: unir por email sin distinguir verificado versus capturado en un formulario. Qué hacer en su lugar: marca el origen y el estado de verificación en el identity_map y baja el confidence cuando sea “capturado” en vez de “verificado”.

5) Estrategia de stitching en capas: determinística primero, luego heurística

La estrategia que mejor resiste auditoría es por capas.

Primero, enlaces determinísticos, en este orden típico: user_id interno o contact_id, luego email verificado, luego teléfono o wa_id, luego device_id o cookie_id cuando se ligan a login. Después, si realmente lo necesitas, aplicas heurísticas como ip más user_agent más una ventana de tiempo.

El diseño importa más que la regla puntual. Trabaja como pipeline incremental: resuelves identidades fuertes, propagas person_id hacia eventos anónimos cercanos, y al final manejas colisiones con reglas de bloqueo. Una regla de bloqueo saludable es “nunca unir solo por ip”. En redes corporativas o móviles compartidas, ip es como reconocer gente por el color de la chaqueta: hoy sirve, mañana es un desastre.

6) Ventanas de tiempo (time windows) por tipo de enlace

Las ventanas de tiempo son tu perilla de sensibilidad. Muy amplias, mezclas personas. Muy cortas, pierdes continuidad.

Aquí conviene seguir controles explícitos como los de la tabla determinística que el motor insertará en esta respuesta. La lógica general suele ser:

Chat con ticket: si un usuario escribe y luego abre ticket, ese vínculo se da dentro de 24 a 72 horas según tu SLA y hábitos.

Web con chat: la navegación que “explica” el chat suele estar dentro de 30 a 120 minutos, a menos que tengas un disparador claro de “abrir chat desde esta sesión”.

Login con cookie: el vínculo entre navegación anónima y usuario logueado puede sostenerse hasta 30 días si tu producto lo soporta y tu riesgo de colisión es bajo.

Eventos post soporte: si quieres medir impacto en conversión o retención, mira 7 a 30 días, dependiendo del ciclo de compra.

La tabla anterior te resume los controles y qué se rompe si los configuras mal.

Set: Ventana chat-ticket Set: Ventana web-chat Set: Ventana eventos post-soporte Set: Validación de ventanas

Consejo operativo: valida ventanas con backtesting. Toma una muestra con ground truth parcial, por ejemplo sesiones con login, y mira cómo cambia la tasa de colisión al ampliar o achicar ventanas. Si al pasar de 48 a 96 horas se duplican los conflictos, no era “más datos”, era más confusión.

7) Deduplicación y ordering: crear un timeline limpio

Una vez que asignas person_id, necesitas limpiar el timeline. En chats hay reintentos, en web hay retries, en tickets hay actualizaciones que parecen eventos nuevos.

Usa un idempotency key cuando exista source_event_id. Cuando no exista, crea un hash de contenido más bucket de tiempo y una regla por canal. Mantén event_id canónico y un campo is_duplicate_of para que puedas reconstruir raw versus curated.

En el ordering, decide precedencia de timestamps. Un criterio típico es ordenar por timestamp de servidor cuando exista, y conservar el del cliente como dato secundario para diagnóstico.

8) Jerarquía de fuentes y resolución de conflictos

Cuando dos fuentes discrepan, no todas tienen el mismo peso. Si tu CRM dice que el email verificado de un contacto es A y un ticket trae B, lo razonable es tratar B como posible alias o dato desactualizado, no como verdad que pisa todo.

Define una jerarquía simple y explícita. Un patrón común es CRM o identidad del producto como más confiable, luego soporte, luego eventos de producto instrumentados, y por último web anónima. En conflictos, no forces merges automáticos si el impacto es alto. Registra el conflicto, pide evidencia adicional como login, verificación o coincidencia en un segundo identificador.

Una práctica que funciona bien es revisar manual o semiautomáticamente el top de conflictos por impacto, por ejemplo los que afectan a cuentas grandes o a funnels críticos. Esto no es burocracia, es control de calidad donde realmente importa.

9) Niveles de confianza y scoring de enlaces

Sin niveles de confianza, terminas discutiendo con opiniones. Con niveles, discutes con números.

Define tiers sencillos:

  1. High: mismo user_id, o email o teléfono verificado, o wa_id ligado a un contacto existente.
  2. Medium: cookie_id o device_id ligado a login, o chat iniciado desde sesión con token trazable.
  3. Low: heurística basada en ip más user_agent más ventana de tiempo, siempre con bloqueos para evitar merges agresivos.

Guarda la evidencia en campos como evidence_event_id y rule_id, con timestamp de cuándo se aplicó. Y reporta métricas con filtros, por ejemplo “High only” y “High más Medium”, para ver sensibilidad. Si un KPI solo se ve bien en Low, probablemente es un espejismo.

10) Reconstruir el journey y métricas accionables

Con person_id y eventos canónicos, reconstruyes el journey ordenando por timestamp y agrupando en sesiones o episodios. Un episodio de soporte puede empezar en chat, continuar en ticket y cerrarse con una resolución, y luego conectarse con comportamiento post soporte.

Las métricas que más valor suelen dar cuando unes señales rotas:

Tiempo desde primer contacto a apertura de ticket, para detectar fricción en autoservicio o en el traspaso de canal.

Tiempo a resolución por tipo de entrada, chat versus ticket, y su impacto en repetición de contacto.

Conversión post soporte, por ejemplo compra en 7 a 30 días después de una conversación, segmentada por nivel de confianza del stitching.

Drop off pre compra con contexto de soporte, por ejemplo usuarios que visitan pricing, abren chat y luego abandonan.

Dos notas importantes para no autoengañarte. Primero, sesgo por cobertura: si solo puedes unir bien a los logueados, tus conclusiones describen a ese segmento. Segundo, la confianza debe influir en decisiones: usa High para reporting ejecutivo y agrega Medium para exploración, dejando Low para hipótesis y no para promesas.

Si tuviera que priorizar, haría esto primero: construir identity_map con dos o tres identificadores fuertes, definir ventanas con validación, y producir una tabla de eventos canónica con deduplicación. No sobre optimices heurísticas al inicio. Es mejor un timeline más corto pero confiable que uno largo que mezcla personas como si fueran capítulos de novelas distintas.

Control Dónde vive Qué configurar Qué se rompe si está mal
Set: Ventana chat-ticket Reglas de unificación de identidad 24-72 horas (según SLA de soporte) Conversaciones incompletas. no se vincula el chat con el ticket posterior
Set: Ventana web-chat Reglas de unificación de identidad 30-120 minutos No se atribuye la navegación web al chat. contexto de usuario perdido
Set: Ventana eventos post-soporte Métricas de impacto de negocio 7-30 días No se mide el impacto real del soporte en la conversión o retención
Set: Ventana login-cookie Reglas de unificación de identidad Hasta 30 días Historial de navegación anónimo no se une al usuario logueado
Set: Validación de ventanas Proceso de QA de datos Backtesting y tasa de colisión Uniones incorrectas — demasiado amplias o pérdidas de contexto — demasiado cortas

Fuentes


Última actualización: 2026-08-27 | Calypso

Etiquetas

conversaciones-tickets-y-eventos-cmo-unir-seales-rotas