[{"data":1,"prerenderedAt":2312},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fresolucion-identidad-seis-senales-un-perfil":12},{"i18nKey":4,"paths":5},"data-003-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11},"\u002Fde\u002Fdata\u002Fidentity-resolution-6-signale-zu-einer-kundenidentitaet","\u002Fen\u002Fdata\u002Fidentity-resolution-unifying-6-signals-into-single-customer-identity","\u002Fes\u002Fdata\u002Fresolucion-identidad-seis-senales-un-perfil","\u002Ffr\u002Fdata\u002Fresolution-identite-6-signaux-vers-profil-client-unique","\u002Fit\u002Fdata\u002Frisoluzione-identita-sei-segnali-a-profilo-cliente-unico","\u002Fru\u002Fdata\u002Frazreshenie-identichnosti-6-signalov-v-yedin-profil",{"_path":8,"_dir":13,"_draft":14,"_partial":14,"_locale":15,"title":16,"description":17,"publishedAt":18,"modifiedAt":18,"category":13,"i18nKey":4,"tags":19,"readingTime":25,"author":26,"body":27,"_type":2306,"_id":2307,"_source":2308,"_file":2309,"_stem":2310,"_extension":2311},"data",false,"","Resolución de Identidad: De 6 Señales a un Perfil de Cliente Único","Hash matching, vinculación probabilística e identidad de hogar: cómo unificar touchpoints dispersos en un perfil único. Pipeline server-side y esquemas prácticos.","2026-07-19",[20,21,22,23,24],"resolucion-identidad","hash-matching","vinculacion-probabilistica","cdp","first-party-data",9,"Roibase",{"type":28,"children":29,"toc":2292},"root",[30,62,69,115,120,139,145,158,170,338,391,403,498,511,518,557,563,575,580,1046,1065,1090,1096,1101,1107,1112,1253,1266,1575,1587,1940,1952,1958,1970,1997,2008,2089,2102,2108,2121,2150,2155,2161,2198,2253,2281,2286],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35,38,45,47,53,54,60],{"type":36,"value":37},"text","Un usuario hace clic en una campaña desde su móvil, añade un producto al carrito en escritorio, compra en la tienda física. Tres señales, tres identidades diferentes: ",{"type":31,"tag":39,"props":40,"children":42},"code",{"className":41},[],[43],{"type":36,"value":44},"device_id",{"type":36,"value":46},", ",{"type":31,"tag":39,"props":48,"children":50},{"className":49},[],[51],{"type":36,"value":52},"cookie_hash",{"type":36,"value":46},{"type":31,"tag":39,"props":55,"children":57},{"className":56},[],[58],{"type":36,"value":59},"email_hash",{"type":36,"value":61},". La resolución de identidad es el pipeline de datos que convierte estos fragmentos en un único perfil de cliente. En la era post-cookie —Consent Mode v2, iOS ATT, CCPA— la arquitectura de resolución de identidad basada en server-side y first-party data ya no es una recomendación, es una obligación.",{"type":31,"tag":63,"props":64,"children":66},"h2",{"id":65},"por-qué-existen-6-señales-diferentes",[67],{"type":36,"value":68},"Por qué existen 6 señales diferentes",{"type":31,"tag":32,"props":70,"children":71},{},[72,74,80,81,86,88,93,95,100,102,107,108,113],{"type":36,"value":73},"El stack de marketing moderno recopila señales de identidad en seis capas: ",{"type":31,"tag":75,"props":76,"children":77},"strong",{},[78],{"type":36,"value":79},"browser cookie",{"type":36,"value":46},{"type":31,"tag":75,"props":82,"children":83},{},[84],{"type":36,"value":85},"ID de dispositivo",{"type":36,"value":87}," (IDFA\u002FGAID), ",{"type":31,"tag":75,"props":89,"children":90},{},[91],{"type":36,"value":92},"hash autenticado",{"type":36,"value":94}," (email SHA-256), ",{"type":31,"tag":75,"props":96,"children":97},{},[98],{"type":36,"value":99},"customer ID",{"type":36,"value":101}," (interno de CRM\u002FCDP), ",{"type":31,"tag":75,"props":103,"children":104},{},[105],{"type":36,"value":106},"fingerprint IP+user-agent",{"type":36,"value":46},{"type":31,"tag":75,"props":109,"children":110},{},[111],{"type":36,"value":112},"household graph",{"type":36,"value":114},". Cada uno se activa en un punto diferente del lifecycle.",{"type":31,"tag":32,"props":116,"children":117},{},[118],{"type":36,"value":119},"La cookie del navegador entra en juego en el primer touchpoint; el ID de dispositivo en aplicaciones móviles; el hash autenticado cuando se recopila email o teléfono; el customer ID después del checkout; el fingerprint para emparejamiento probabilístico sin consentimiento; el household graph para agrupar dispositivos conectados desde el mismo router. El problema: estas seis señales se almacenan en tablas diferentes, con TTL distintos (cookie 90 días, IDFA indefinido, hash de email hasta que el cliente se elimina). Sin resolución, cada canal cuenta usuarios diferentes —en modelos de mix de marketing se produce doble conteo, en tests de incrementalidad hay sobreestimación, en cohortes de retención aparece una retención falsa.",{"type":31,"tag":32,"props":121,"children":122},{},[123,125,130,132,137],{"type":36,"value":124},"La lógica de resolución se construye con dos métodos: ",{"type":31,"tag":75,"props":126,"children":127},{},[128],{"type":36,"value":129},"determinístico (hash matching)",{"type":36,"value":131}," y ",{"type":31,"tag":75,"props":133,"children":134},{},[135],{"type":36,"value":136},"probabilístico (graph linking)",{"type":36,"value":138},". Determinístico: el hash SHA-256 del email vincula un evento de navegador con una transacción backend —100% de certeza. Probabilístico: si ves el mismo IP+user-agent en dos eventos dentro de 24 horas, la probabilidad de que sea el mismo usuario es del 73% (ejemplo de threshold). Sin resolución, el número de usuarios únicos se infla entre 40-80% (según la categoría y mix de dispositivos).",{"type":31,"tag":63,"props":140,"children":142},{"id":141},"hash-matching-convertir-email-y-teléfono-en-claves-de-identidad",[143],{"type":36,"value":144},"Hash matching: convertir email y teléfono en claves de identidad",{"type":31,"tag":32,"props":146,"children":147},{},[148,150,156],{"type":36,"value":149},"Hash matching es la columna vertebral de la resolución de identidad server-side. Cuando un usuario proporciona email o teléfono, el cliente (o sGTM) genera el hash SHA-256 y lo escribe en la tabla ",{"type":31,"tag":39,"props":151,"children":153},{"className":152},[],[154],{"type":36,"value":155},"identity_map",{"type":36,"value":157},". En los siguientes eventos anónimos, buscan la cookie o ID de dispositivo para acceder al hash.",{"type":31,"tag":32,"props":159,"children":160},{},[161,163,168],{"type":36,"value":162},"Esquema simple de ",{"type":31,"tag":39,"props":164,"children":166},{"className":165},[],[167],{"type":36,"value":155},{"type":36,"value":169},":",{"type":31,"tag":171,"props":172,"children":176},"pre",{"className":173,"code":174,"language":175,"meta":15,"style":15},"language-sql shiki shiki-themes github-dark","CREATE TABLE identity_map (\n  canonical_id STRING NOT NULL,      -- UUID, ID interno\n  signal_type STRING NOT NULL,       -- 'email_sha256', 'phone_sha256', 'device_id', 'cookie'\n  signal_value STRING NOT NULL,      -- hash o ID\n  first_seen TIMESTAMP,\n  last_seen TIMESTAMP,\n  PRIMARY KEY (signal_type, signal_value)\n);\n","sql",[177],{"type":31,"tag":39,"props":178,"children":179},{"__ignoreMap":15},[180,209,234,257,279,298,315,329],{"type":31,"tag":181,"props":182,"children":185},"span",{"class":183,"line":184},"line",1,[186,192,197,203],{"type":31,"tag":181,"props":187,"children":189},{"style":188},"--shiki-default:#F97583",[190],{"type":36,"value":191},"CREATE",{"type":31,"tag":181,"props":193,"children":194},{"style":188},[195],{"type":36,"value":196}," TABLE",{"type":31,"tag":181,"props":198,"children":200},{"style":199},"--shiki-default:#B392F0",[201],{"type":36,"value":202}," identity_map",{"type":31,"tag":181,"props":204,"children":206},{"style":205},"--shiki-default:#E1E4E8",[207],{"type":36,"value":208}," (\n",{"type":31,"tag":181,"props":210,"children":212},{"class":183,"line":211},2,[213,218,223,228],{"type":31,"tag":181,"props":214,"children":215},{"style":205},[216],{"type":36,"value":217},"  canonical_id STRING ",{"type":31,"tag":181,"props":219,"children":220},{"style":188},[221],{"type":36,"value":222},"NOT NULL",{"type":31,"tag":181,"props":224,"children":225},{"style":205},[226],{"type":36,"value":227},",      ",{"type":31,"tag":181,"props":229,"children":231},{"style":230},"--shiki-default:#6A737D",[232],{"type":36,"value":233},"-- UUID, ID interno\n",{"type":31,"tag":181,"props":235,"children":237},{"class":183,"line":236},3,[238,243,247,252],{"type":31,"tag":181,"props":239,"children":240},{"style":205},[241],{"type":36,"value":242},"  signal_type STRING ",{"type":31,"tag":181,"props":244,"children":245},{"style":188},[246],{"type":36,"value":222},{"type":31,"tag":181,"props":248,"children":249},{"style":205},[250],{"type":36,"value":251},",       ",{"type":31,"tag":181,"props":253,"children":254},{"style":230},[255],{"type":36,"value":256},"-- 'email_sha256', 'phone_sha256', 'device_id', 'cookie'\n",{"type":31,"tag":181,"props":258,"children":260},{"class":183,"line":259},4,[261,266,270,274],{"type":31,"tag":181,"props":262,"children":263},{"style":205},[264],{"type":36,"value":265},"  signal_value STRING ",{"type":31,"tag":181,"props":267,"children":268},{"style":188},[269],{"type":36,"value":222},{"type":31,"tag":181,"props":271,"children":272},{"style":205},[273],{"type":36,"value":227},{"type":31,"tag":181,"props":275,"children":276},{"style":230},[277],{"type":36,"value":278},"-- hash o ID\n",{"type":31,"tag":181,"props":280,"children":282},{"class":183,"line":281},5,[283,288,293],{"type":31,"tag":181,"props":284,"children":285},{"style":205},[286],{"type":36,"value":287},"  first_seen ",{"type":31,"tag":181,"props":289,"children":290},{"style":188},[291],{"type":36,"value":292},"TIMESTAMP",{"type":31,"tag":181,"props":294,"children":295},{"style":205},[296],{"type":36,"value":297},",\n",{"type":31,"tag":181,"props":299,"children":301},{"class":183,"line":300},6,[302,307,311],{"type":31,"tag":181,"props":303,"children":304},{"style":205},[305],{"type":36,"value":306},"  last_seen ",{"type":31,"tag":181,"props":308,"children":309},{"style":188},[310],{"type":36,"value":292},{"type":31,"tag":181,"props":312,"children":313},{"style":205},[314],{"type":36,"value":297},{"type":31,"tag":181,"props":316,"children":318},{"class":183,"line":317},7,[319,324],{"type":31,"tag":181,"props":320,"children":321},{"style":188},[322],{"type":36,"value":323},"  PRIMARY KEY",{"type":31,"tag":181,"props":325,"children":326},{"style":205},[327],{"type":36,"value":328}," (signal_type, signal_value)\n",{"type":31,"tag":181,"props":330,"children":332},{"class":183,"line":331},8,[333],{"type":31,"tag":181,"props":334,"children":335},{"style":205},[336],{"type":36,"value":337},");\n",{"type":31,"tag":32,"props":339,"children":340},{},[341,343,349,351,357,359,365,367,373,375,381,383,389],{"type":36,"value":342},"Cuando un usuario escribe ",{"type":31,"tag":39,"props":344,"children":346},{"className":345},[],[347],{"type":36,"value":348},"usuario@ejemplo.com",{"type":36,"value":350}," en un formulario de registro, sGTM realiza hash SHA-256 y ejecuta ",{"type":31,"tag":39,"props":352,"children":354},{"className":353},[],[355],{"type":36,"value":356},"INSERT",{"type":36,"value":358},": ",{"type":31,"tag":39,"props":360,"children":362},{"className":361},[],[363],{"type":36,"value":364},"('uuid-123', 'email_sha256', 'abc123...', NOW(), NOW())",{"type":36,"value":366},". En la misma sesión, si existe la cookie ",{"type":31,"tag":39,"props":368,"children":370},{"className":369},[],[371],{"type":36,"value":372},"_ga=GA1.1.xyz",{"type":36,"value":374},", se crea una segunda fila: ",{"type":31,"tag":39,"props":376,"children":378},{"className":377},[],[379],{"type":36,"value":380},"('uuid-123', 'cookie', 'GA1.1.xyz', NOW(), NOW())",{"type":36,"value":382},". Así, dos señales se unen bajo ",{"type":31,"tag":39,"props":384,"children":386},{"className":385},[],[387],{"type":36,"value":388},"canonical_id = uuid-123",{"type":36,"value":390},".",{"type":31,"tag":32,"props":392,"children":393},{},[394,396,401],{"type":36,"value":395},"En la siguiente sesión, el usuario llega solo con ",{"type":31,"tag":39,"props":397,"children":399},{"className":398},[],[400],{"type":36,"value":372},{"type":36,"value":402},", sin email. La búsqueda en BigQuery:",{"type":31,"tag":171,"props":404,"children":406},{"className":173,"code":405,"language":175,"meta":15,"style":15},"SELECT canonical_id\nFROM identity_map\nWHERE signal_type = 'cookie' AND signal_value = 'GA1.1.xyz'\nLIMIT 1;\n",[407],{"type":31,"tag":39,"props":408,"children":409},{"__ignoreMap":15},[410,423,436,479],{"type":31,"tag":181,"props":411,"children":412},{"class":183,"line":184},[413,418],{"type":31,"tag":181,"props":414,"children":415},{"style":188},[416],{"type":36,"value":417},"SELECT",{"type":31,"tag":181,"props":419,"children":420},{"style":205},[421],{"type":36,"value":422}," canonical_id\n",{"type":31,"tag":181,"props":424,"children":425},{"class":183,"line":211},[426,431],{"type":31,"tag":181,"props":427,"children":428},{"style":188},[429],{"type":36,"value":430},"FROM",{"type":31,"tag":181,"props":432,"children":433},{"style":205},[434],{"type":36,"value":435}," identity_map\n",{"type":31,"tag":181,"props":437,"children":438},{"class":183,"line":236},[439,444,449,454,460,465,470,474],{"type":31,"tag":181,"props":440,"children":441},{"style":188},[442],{"type":36,"value":443},"WHERE",{"type":31,"tag":181,"props":445,"children":446},{"style":205},[447],{"type":36,"value":448}," signal_type ",{"type":31,"tag":181,"props":450,"children":451},{"style":188},[452],{"type":36,"value":453},"=",{"type":31,"tag":181,"props":455,"children":457},{"style":456},"--shiki-default:#9ECBFF",[458],{"type":36,"value":459}," 'cookie'",{"type":31,"tag":181,"props":461,"children":462},{"style":188},[463],{"type":36,"value":464}," AND",{"type":31,"tag":181,"props":466,"children":467},{"style":205},[468],{"type":36,"value":469}," signal_value ",{"type":31,"tag":181,"props":471,"children":472},{"style":188},[473],{"type":36,"value":453},{"type":31,"tag":181,"props":475,"children":476},{"style":456},[477],{"type":36,"value":478}," 'GA1.1.xyz'\n",{"type":31,"tag":181,"props":480,"children":481},{"class":183,"line":259},[482,487,493],{"type":31,"tag":181,"props":483,"children":484},{"style":188},[485],{"type":36,"value":486},"LIMIT",{"type":31,"tag":181,"props":488,"children":490},{"style":489},"--shiki-default:#79B8FF",[491],{"type":36,"value":492}," 1",{"type":31,"tag":181,"props":494,"children":495},{"style":205},[496],{"type":36,"value":497},";\n",{"type":31,"tag":32,"props":499,"children":500},{},[501,503,509],{"type":36,"value":502},"Devuelve: ",{"type":31,"tag":39,"props":504,"children":506},{"className":505},[],[507],{"type":36,"value":508},"uuid-123",{"type":36,"value":510},". Vinculan el evento a este ID —el usuario se reconoce sin usar el hash de email. La precisión del hash matching es del 100% porque la colisión criptográfica es imposible. Pero existe un problema de cobertura: si el usuario nunca proporcionó email, no hay hash, entonces recurren al método probabilístico.",{"type":31,"tag":512,"props":513,"children":515},"h3",{"id":514},"riesgo-de-colisión-y-salt",[516],{"type":36,"value":517},"Riesgo de colisión y salt",{"type":31,"tag":32,"props":519,"children":520},{},[521,523,536,538,544,546,555],{"type":36,"value":522},"El riesgo de colisión SHA-256 es teórico: 1 entre 2^128 intentos. Pero en producción, el verdadero problema es que ",{"type":31,"tag":75,"props":524,"children":525},{},[526,528,534],{"type":36,"value":527},"el mismo email podría estar vinculado a dos ",{"type":31,"tag":39,"props":529,"children":531},{"className":530},[],[532],{"type":36,"value":533},"canonical_id",{"type":36,"value":535}," diferentes",{"type":36,"value":537}," (error manual, restos de migración antigua). Por eso añaden ",{"type":31,"tag":39,"props":539,"children":541},{"className":540},[],[542],{"type":36,"value":543},"UNIQUE INDEX (signal_type, signal_value)",{"type":36,"value":545},". El uso de salt (email + string secreto, luego hash) no aumenta el riesgo de colisión pero añade una capa de privacidad en el diseño de ",{"type":31,"tag":547,"props":548,"children":552},"a",{"href":549,"rel":550},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Ffirstparty",[551],"nofollow",[553],{"type":36,"value":554},"arquitectura de datos first-party",{"type":36,"value":556}," —al rotar el salt, los hashes antiguos se invalidan, útil para el derecho al olvido según GDPR.",{"type":31,"tag":63,"props":558,"children":560},{"id":559},"vinculación-probabilística-ip-user-agent-y-device-graph",[561],{"type":36,"value":562},"Vinculación probabilística: IP, user-agent y device graph",{"type":31,"tag":32,"props":564,"children":565},{},[566,568,573],{"type":36,"value":567},"Si el usuario navega anónimo, no hay señal determinística. En este caso, usan un ",{"type":31,"tag":75,"props":569,"children":570},{},[571],{"type":36,"value":572},"probabilistic graph",{"type":36,"value":574},": IP + user-agent + proximidad temporal para generar un score de \"probablemente el mismo usuario\". Ejemplo: dos eventos desde la misma IP con el mismo user-agent, 15 minutos de diferencia —85% de probabilidad de ser el mismo usuario.",{"type":31,"tag":32,"props":576,"children":577},{},[578],{"type":36,"value":579},"Lógica simple de merge probabilístico:",{"type":31,"tag":171,"props":581,"children":583},{"className":173,"code":582,"language":175,"meta":15,"style":15},"WITH anon_events AS (\n  SELECT\n    event_id,\n    ip_address,\n    user_agent,\n    event_timestamp,\n    FARM_FINGERPRINT(CONCAT(ip_address, user_agent)) AS fingerprint\n  FROM events\n  WHERE canonical_id IS NULL\n),\nclusters AS (\n  SELECT\n    fingerprint,\n    MIN(event_timestamp) AS first_event,\n    MAX(event_timestamp) AS last_event,\n    COUNT(*) AS event_count\n  FROM anon_events\n  GROUP BY fingerprint\n  HAVING TIMESTAMP_DIFF(MAX(event_timestamp), MIN(event_timestamp), HOUR) \u003C 24\n)\nSELECT\n  a.event_id,\n  c.fingerprint AS probable_cluster_id\nFROM anon_events a\nJOIN clusters c ON a.fingerprint = c.fingerprint;\n",[584],{"type":31,"tag":39,"props":585,"children":586},{"__ignoreMap":15},[587,609,617,625,633,641,649,676,689,712,721,738,746,755,778,800,833,846,859,911,920,929,951,979,992],{"type":31,"tag":181,"props":588,"children":589},{"class":183,"line":184},[590,595,600,605],{"type":31,"tag":181,"props":591,"children":592},{"style":188},[593],{"type":36,"value":594},"WITH",{"type":31,"tag":181,"props":596,"children":597},{"style":205},[598],{"type":36,"value":599}," anon_events ",{"type":31,"tag":181,"props":601,"children":602},{"style":188},[603],{"type":36,"value":604},"AS",{"type":31,"tag":181,"props":606,"children":607},{"style":205},[608],{"type":36,"value":208},{"type":31,"tag":181,"props":610,"children":611},{"class":183,"line":211},[612],{"type":31,"tag":181,"props":613,"children":614},{"style":188},[615],{"type":36,"value":616},"  SELECT\n",{"type":31,"tag":181,"props":618,"children":619},{"class":183,"line":236},[620],{"type":31,"tag":181,"props":621,"children":622},{"style":205},[623],{"type":36,"value":624},"    event_id,\n",{"type":31,"tag":181,"props":626,"children":627},{"class":183,"line":259},[628],{"type":31,"tag":181,"props":629,"children":630},{"style":205},[631],{"type":36,"value":632},"    ip_address,\n",{"type":31,"tag":181,"props":634,"children":635},{"class":183,"line":281},[636],{"type":31,"tag":181,"props":637,"children":638},{"style":205},[639],{"type":36,"value":640},"    user_agent,\n",{"type":31,"tag":181,"props":642,"children":643},{"class":183,"line":300},[644],{"type":31,"tag":181,"props":645,"children":646},{"style":205},[647],{"type":36,"value":648},"    event_timestamp,\n",{"type":31,"tag":181,"props":650,"children":651},{"class":183,"line":317},[652,657,662,667,671],{"type":31,"tag":181,"props":653,"children":654},{"style":205},[655],{"type":36,"value":656},"    FARM_FINGERPRINT(",{"type":31,"tag":181,"props":658,"children":659},{"style":489},[660],{"type":36,"value":661},"CONCAT",{"type":31,"tag":181,"props":663,"children":664},{"style":205},[665],{"type":36,"value":666},"(ip_address, user_agent)) ",{"type":31,"tag":181,"props":668,"children":669},{"style":188},[670],{"type":36,"value":604},{"type":31,"tag":181,"props":672,"children":673},{"style":205},[674],{"type":36,"value":675}," fingerprint\n",{"type":31,"tag":181,"props":677,"children":678},{"class":183,"line":331},[679,684],{"type":31,"tag":181,"props":680,"children":681},{"style":188},[682],{"type":36,"value":683},"  FROM",{"type":31,"tag":181,"props":685,"children":686},{"style":205},[687],{"type":36,"value":688}," events\n",{"type":31,"tag":181,"props":690,"children":691},{"class":183,"line":25},[692,697,702,707],{"type":31,"tag":181,"props":693,"children":694},{"style":188},[695],{"type":36,"value":696},"  WHERE",{"type":31,"tag":181,"props":698,"children":699},{"style":205},[700],{"type":36,"value":701}," canonical_id ",{"type":31,"tag":181,"props":703,"children":704},{"style":188},[705],{"type":36,"value":706},"IS",{"type":31,"tag":181,"props":708,"children":709},{"style":188},[710],{"type":36,"value":711}," NULL\n",{"type":31,"tag":181,"props":713,"children":715},{"class":183,"line":714},10,[716],{"type":31,"tag":181,"props":717,"children":718},{"style":205},[719],{"type":36,"value":720},"),\n",{"type":31,"tag":181,"props":722,"children":724},{"class":183,"line":723},11,[725,730,734],{"type":31,"tag":181,"props":726,"children":727},{"style":205},[728],{"type":36,"value":729},"clusters ",{"type":31,"tag":181,"props":731,"children":732},{"style":188},[733],{"type":36,"value":604},{"type":31,"tag":181,"props":735,"children":736},{"style":205},[737],{"type":36,"value":208},{"type":31,"tag":181,"props":739,"children":741},{"class":183,"line":740},12,[742],{"type":31,"tag":181,"props":743,"children":744},{"style":188},[745],{"type":36,"value":616},{"type":31,"tag":181,"props":747,"children":749},{"class":183,"line":748},13,[750],{"type":31,"tag":181,"props":751,"children":752},{"style":205},[753],{"type":36,"value":754},"    fingerprint,\n",{"type":31,"tag":181,"props":756,"children":758},{"class":183,"line":757},14,[759,764,769,773],{"type":31,"tag":181,"props":760,"children":761},{"style":489},[762],{"type":36,"value":763},"    MIN",{"type":31,"tag":181,"props":765,"children":766},{"style":205},[767],{"type":36,"value":768},"(event_timestamp) ",{"type":31,"tag":181,"props":770,"children":771},{"style":188},[772],{"type":36,"value":604},{"type":31,"tag":181,"props":774,"children":775},{"style":205},[776],{"type":36,"value":777}," first_event,\n",{"type":31,"tag":181,"props":779,"children":781},{"class":183,"line":780},15,[782,787,791,795],{"type":31,"tag":181,"props":783,"children":784},{"style":489},[785],{"type":36,"value":786},"    MAX",{"type":31,"tag":181,"props":788,"children":789},{"style":205},[790],{"type":36,"value":768},{"type":31,"tag":181,"props":792,"children":793},{"style":188},[794],{"type":36,"value":604},{"type":31,"tag":181,"props":796,"children":797},{"style":205},[798],{"type":36,"value":799}," last_event,\n",{"type":31,"tag":181,"props":801,"children":803},{"class":183,"line":802},16,[804,809,814,819,824,828],{"type":31,"tag":181,"props":805,"children":806},{"style":489},[807],{"type":36,"value":808},"    COUNT",{"type":31,"tag":181,"props":810,"children":811},{"style":205},[812],{"type":36,"value":813},"(",{"type":31,"tag":181,"props":815,"children":816},{"style":188},[817],{"type":36,"value":818},"*",{"type":31,"tag":181,"props":820,"children":821},{"style":205},[822],{"type":36,"value":823},") ",{"type":31,"tag":181,"props":825,"children":826},{"style":188},[827],{"type":36,"value":604},{"type":31,"tag":181,"props":829,"children":830},{"style":205},[831],{"type":36,"value":832}," event_count\n",{"type":31,"tag":181,"props":834,"children":836},{"class":183,"line":835},17,[837,841],{"type":31,"tag":181,"props":838,"children":839},{"style":188},[840],{"type":36,"value":683},{"type":31,"tag":181,"props":842,"children":843},{"style":205},[844],{"type":36,"value":845}," anon_events\n",{"type":31,"tag":181,"props":847,"children":849},{"class":183,"line":848},18,[850,855],{"type":31,"tag":181,"props":851,"children":852},{"style":188},[853],{"type":36,"value":854},"  GROUP BY",{"type":31,"tag":181,"props":856,"children":857},{"style":205},[858],{"type":36,"value":675},{"type":31,"tag":181,"props":860,"children":862},{"class":183,"line":861},19,[863,868,873,878,883,888,892,897,901,906],{"type":31,"tag":181,"props":864,"children":865},{"style":188},[866],{"type":36,"value":867},"  HAVING",{"type":31,"tag":181,"props":869,"children":870},{"style":205},[871],{"type":36,"value":872}," TIMESTAMP_DIFF(",{"type":31,"tag":181,"props":874,"children":875},{"style":489},[876],{"type":36,"value":877},"MAX",{"type":31,"tag":181,"props":879,"children":880},{"style":205},[881],{"type":36,"value":882},"(event_timestamp), ",{"type":31,"tag":181,"props":884,"children":885},{"style":489},[886],{"type":36,"value":887},"MIN",{"type":31,"tag":181,"props":889,"children":890},{"style":205},[891],{"type":36,"value":882},{"type":31,"tag":181,"props":893,"children":894},{"style":188},[895],{"type":36,"value":896},"HOUR",{"type":31,"tag":181,"props":898,"children":899},{"style":205},[900],{"type":36,"value":823},{"type":31,"tag":181,"props":902,"children":903},{"style":188},[904],{"type":36,"value":905},"\u003C",{"type":31,"tag":181,"props":907,"children":908},{"style":489},[909],{"type":36,"value":910}," 24\n",{"type":31,"tag":181,"props":912,"children":914},{"class":183,"line":913},20,[915],{"type":31,"tag":181,"props":916,"children":917},{"style":205},[918],{"type":36,"value":919},")\n",{"type":31,"tag":181,"props":921,"children":923},{"class":183,"line":922},21,[924],{"type":31,"tag":181,"props":925,"children":926},{"style":188},[927],{"type":36,"value":928},"SELECT\n",{"type":31,"tag":181,"props":930,"children":932},{"class":183,"line":931},22,[933,938,942,947],{"type":31,"tag":181,"props":934,"children":935},{"style":489},[936],{"type":36,"value":937},"  a",{"type":31,"tag":181,"props":939,"children":940},{"style":205},[941],{"type":36,"value":390},{"type":31,"tag":181,"props":943,"children":944},{"style":489},[945],{"type":36,"value":946},"event_id",{"type":31,"tag":181,"props":948,"children":949},{"style":205},[950],{"type":36,"value":297},{"type":31,"tag":181,"props":952,"children":954},{"class":183,"line":953},23,[955,960,964,969,974],{"type":31,"tag":181,"props":956,"children":957},{"style":489},[958],{"type":36,"value":959},"  c",{"type":31,"tag":181,"props":961,"children":962},{"style":205},[963],{"type":36,"value":390},{"type":31,"tag":181,"props":965,"children":966},{"style":489},[967],{"type":36,"value":968},"fingerprint",{"type":31,"tag":181,"props":970,"children":971},{"style":188},[972],{"type":36,"value":973}," AS",{"type":31,"tag":181,"props":975,"children":976},{"style":205},[977],{"type":36,"value":978}," probable_cluster_id\n",{"type":31,"tag":181,"props":980,"children":982},{"class":183,"line":981},24,[983,987],{"type":31,"tag":181,"props":984,"children":985},{"style":188},[986],{"type":36,"value":430},{"type":31,"tag":181,"props":988,"children":989},{"style":205},[990],{"type":36,"value":991}," anon_events a\n",{"type":31,"tag":181,"props":993,"children":995},{"class":183,"line":994},25,[996,1001,1006,1011,1016,1020,1024,1029,1034,1038,1042],{"type":31,"tag":181,"props":997,"children":998},{"style":188},[999],{"type":36,"value":1000},"JOIN",{"type":31,"tag":181,"props":1002,"children":1003},{"style":205},[1004],{"type":36,"value":1005}," clusters c ",{"type":31,"tag":181,"props":1007,"children":1008},{"style":188},[1009],{"type":36,"value":1010},"ON",{"type":31,"tag":181,"props":1012,"children":1013},{"style":489},[1014],{"type":36,"value":1015}," a",{"type":31,"tag":181,"props":1017,"children":1018},{"style":205},[1019],{"type":36,"value":390},{"type":31,"tag":181,"props":1021,"children":1022},{"style":489},[1023],{"type":36,"value":968},{"type":31,"tag":181,"props":1025,"children":1026},{"style":188},[1027],{"type":36,"value":1028}," =",{"type":31,"tag":181,"props":1030,"children":1031},{"style":489},[1032],{"type":36,"value":1033}," c",{"type":31,"tag":181,"props":1035,"children":1036},{"style":205},[1037],{"type":36,"value":390},{"type":31,"tag":181,"props":1039,"children":1040},{"style":489},[1041],{"type":36,"value":968},{"type":31,"tag":181,"props":1043,"children":1044},{"style":205},[1045],{"type":36,"value":497},{"type":31,"tag":32,"props":1047,"children":1048},{},[1049,1051,1056,1058,1064],{"type":36,"value":1050},"Esta consulta agrupa eventos por hash de IP+UA dentro de 24 horas. El ID del cluster se usa como ",{"type":31,"tag":39,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":36,"value":533},{"type":36,"value":1057}," temporal, pero incluyen un score de confianza: ",{"type":31,"tag":39,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":36,"value":1063},"event_count > 3 AND time_span \u003C 1 HOUR → confidence=0.9",{"type":36,"value":390},{"type":31,"tag":32,"props":1066,"children":1067},{},[1068,1073,1075,1081,1083,1088],{"type":31,"tag":75,"props":1069,"children":1070},{},[1071],{"type":36,"value":1072},"Household graph:",{"type":36,"value":1074}," Si desde la misma IP llegan diferentes user-agents (laptop, tablet, teléfono), probablemente es el mismo hogar. Aquí crean un ",{"type":31,"tag":39,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":36,"value":1080},"household_id",{"type":36,"value":1082}," y lo colocan bajo el ",{"type":31,"tag":39,"props":1084,"children":1086},{"className":1085},[],[1087],{"type":36,"value":533},{"type":36,"value":1089}," individual. Por ejemplo, suscripción a Amazon Prime: 1 pago, 6 perfiles —la resolución de identidad agrega al nivel de hogar.",{"type":31,"tag":512,"props":1091,"children":1093},{"id":1092},"tasa-de-falsos-positivos",[1094],{"type":36,"value":1095},"Tasa de falsos positivos",{"type":31,"tag":32,"props":1097,"children":1098},{},[1099],{"type":36,"value":1100},"En vinculación probabilística existe riesgo de falsos positivos. La misma IP + user-agent puede provenir de dos usuarios diferentes (WiFi de oficina, biblioteca). Si el threshold es muy permisivo (50% de confianza), verán 15-25% de falsos positivos. La mejor práctica de la industria: threshold de 75%+ confianza, ventana temporal de 1 hora, mínimo 2 eventos coincidentes. Vendedores como LiveRamp usan bases de datos de grafos (Neo4j) y combinan 30+ señales alegando 95%+ de precisión —pero en su propio pipeline first-party con 2-3 señales, 80% de precisión es suficiente.",{"type":31,"tag":63,"props":1102,"children":1104},{"id":1103},"pipeline-server-side-sgtm-bigquery-dbt",[1105],{"type":36,"value":1106},"Pipeline server-side: sGTM + BigQuery + dbt",{"type":31,"tag":32,"props":1108,"children":1109},{},[1110],{"type":36,"value":1111},"La resolución de identidad en producción funciona con este flujo de datos:",{"type":31,"tag":1113,"props":1114,"children":1115},"ol",{},[1116,1135,1174,1199,1222],{"type":31,"tag":1117,"props":1118,"children":1119},"li",{},[1120,1125,1127,1133],{"type":31,"tag":75,"props":1121,"children":1122},{},[1123],{"type":36,"value":1124},"Ingestión de eventos sGTM:",{"type":36,"value":1126}," El evento de GTM del cliente va a sGTM, que añade el hash SHA-256 si existe email, escribe el evento raw en BigQuery (",{"type":31,"tag":39,"props":1128,"children":1130},{"className":1129},[],[1131],{"type":36,"value":1132},"events_raw",{"type":36,"value":1134},").",{"type":31,"tag":1117,"props":1136,"children":1137},{},[1138,1143,1145,1151,1153,1158,1160,1166,1167,1173],{"type":31,"tag":75,"props":1139,"children":1140},{},[1141],{"type":36,"value":1142},"Modelo de staging dbt:",{"type":36,"value":1144}," La tabla ",{"type":31,"tag":39,"props":1146,"children":1148},{"className":1147},[],[1149],{"type":36,"value":1150},"stg_events",{"type":36,"value":1152}," limpia eventos de ",{"type":31,"tag":39,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":36,"value":1132},{"type":36,"value":1159},", parsea columnas ",{"type":31,"tag":39,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":36,"value":1165},"signal_type",{"type":36,"value":131},{"type":31,"tag":39,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":36,"value":1172},"signal_value",{"type":36,"value":390},{"type":31,"tag":1117,"props":1175,"children":1176},{},[1177,1182,1184,1190,1192,1197],{"type":31,"tag":75,"props":1178,"children":1179},{},[1180],{"type":36,"value":1181},"Merge de identity_map dbt:",{"type":36,"value":1183}," Cuando aparece un nuevo hash, se ejecuta un ",{"type":31,"tag":39,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":36,"value":1189},"MERGE",{"type":36,"value":1191}," en ",{"type":31,"tag":39,"props":1193,"children":1195},{"className":1194},[],[1196],{"type":36,"value":155},{"type":36,"value":1198}," (lógica upsert).",{"type":31,"tag":1117,"props":1200,"children":1201},{},[1202,1207,1209,1214,1216,1221],{"type":31,"tag":75,"props":1203,"children":1204},{},[1205],{"type":36,"value":1206},"Enriquecimiento canonical_id dbt:",{"type":36,"value":1208}," Cada evento se une con ",{"type":31,"tag":39,"props":1210,"children":1212},{"className":1211},[],[1213],{"type":36,"value":155},{"type":36,"value":1215},", se realiza lookup de ",{"type":31,"tag":39,"props":1217,"children":1219},{"className":1218},[],[1220],{"type":36,"value":533},{"type":36,"value":390},{"type":31,"tag":1117,"props":1223,"children":1224},{},[1225,1230,1232,1238,1239,1245,1247,1252],{"type":31,"tag":75,"props":1226,"children":1227},{},[1228],{"type":36,"value":1229},"Agregación dbt:",{"type":36,"value":1231}," Las métricas a nivel de usuario (",{"type":31,"tag":39,"props":1233,"children":1235},{"className":1234},[],[1236],{"type":36,"value":1237},"user_ltv",{"type":36,"value":46},{"type":31,"tag":39,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":36,"value":1244},"session_count",{"type":36,"value":1246},") se agregan por ",{"type":31,"tag":39,"props":1248,"children":1250},{"className":1249},[],[1251],{"type":36,"value":533},{"type":36,"value":390},{"type":31,"tag":32,"props":1254,"children":1255},{},[1256,1258,1264],{"type":36,"value":1257},"Fragmento de modelo dbt (",{"type":31,"tag":39,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":36,"value":1263},"models\u002Fstaging\u002Fstg_events.sql",{"type":36,"value":1265},"):",{"type":31,"tag":171,"props":1267,"children":1269},{"className":173,"code":1268,"language":175,"meta":15,"style":15},"{{ config(materialized='incremental') }}\n\nWITH events_with_signals AS (\n  SELECT\n    event_id,\n    event_timestamp,\n    COALESCE(user_properties.email_sha256, NULL) AS email_hash,\n    COALESCE(user_properties.ga_client_id, NULL) AS cookie_id,\n    event_params\n  FROM {{ source('bigquery', 'events_raw') }}\n  {% if is_incremental() %}\n  WHERE event_timestamp > (SELECT MAX(event_timestamp) FROM {{ this }})\n  {% endif %}\n)\nSELECT * FROM events_with_signals;\n",[1270],{"type":31,"tag":39,"props":1271,"children":1272},{"__ignoreMap":15},[1273,1295,1304,1324,1331,1338,1345,1393,1438,1446,1476,1494,1538,1546,1553],{"type":31,"tag":181,"props":1274,"children":1275},{"class":183,"line":184},[1276,1281,1285,1290],{"type":31,"tag":181,"props":1277,"children":1278},{"style":205},[1279],{"type":36,"value":1280},"{{ config(materialized",{"type":31,"tag":181,"props":1282,"children":1283},{"style":188},[1284],{"type":36,"value":453},{"type":31,"tag":181,"props":1286,"children":1287},{"style":456},[1288],{"type":36,"value":1289},"'incremental'",{"type":31,"tag":181,"props":1291,"children":1292},{"style":205},[1293],{"type":36,"value":1294},") }}\n",{"type":31,"tag":181,"props":1296,"children":1297},{"class":183,"line":211},[1298],{"type":31,"tag":181,"props":1299,"children":1301},{"emptyLinePlaceholder":1300},true,[1302],{"type":36,"value":1303},"\n",{"type":31,"tag":181,"props":1305,"children":1306},{"class":183,"line":236},[1307,1311,1316,1320],{"type":31,"tag":181,"props":1308,"children":1309},{"style":188},[1310],{"type":36,"value":594},{"type":31,"tag":181,"props":1312,"children":1313},{"style":205},[1314],{"type":36,"value":1315}," events_with_signals ",{"type":31,"tag":181,"props":1317,"children":1318},{"style":188},[1319],{"type":36,"value":604},{"type":31,"tag":181,"props":1321,"children":1322},{"style":205},[1323],{"type":36,"value":208},{"type":31,"tag":181,"props":1325,"children":1326},{"class":183,"line":259},[1327],{"type":31,"tag":181,"props":1328,"children":1329},{"style":188},[1330],{"type":36,"value":616},{"type":31,"tag":181,"props":1332,"children":1333},{"class":183,"line":281},[1334],{"type":31,"tag":181,"props":1335,"children":1336},{"style":205},[1337],{"type":36,"value":624},{"type":31,"tag":181,"props":1339,"children":1340},{"class":183,"line":300},[1341],{"type":31,"tag":181,"props":1342,"children":1343},{"style":205},[1344],{"type":36,"value":648},{"type":31,"tag":181,"props":1346,"children":1347},{"class":183,"line":317},[1348,1353,1357,1362,1366,1371,1375,1380,1384,1388],{"type":31,"tag":181,"props":1349,"children":1350},{"style":489},[1351],{"type":36,"value":1352},"    COALESCE",{"type":31,"tag":181,"props":1354,"children":1355},{"style":205},[1356],{"type":36,"value":813},{"type":31,"tag":181,"props":1358,"children":1359},{"style":489},[1360],{"type":36,"value":1361},"user_properties",{"type":31,"tag":181,"props":1363,"children":1364},{"style":205},[1365],{"type":36,"value":390},{"type":31,"tag":181,"props":1367,"children":1368},{"style":489},[1369],{"type":36,"value":1370},"email_sha256",{"type":31,"tag":181,"props":1372,"children":1373},{"style":205},[1374],{"type":36,"value":46},{"type":31,"tag":181,"props":1376,"children":1377},{"style":188},[1378],{"type":36,"value":1379},"NULL",{"type":31,"tag":181,"props":1381,"children":1382},{"style":205},[1383],{"type":36,"value":823},{"type":31,"tag":181,"props":1385,"children":1386},{"style":188},[1387],{"type":36,"value":604},{"type":31,"tag":181,"props":1389,"children":1390},{"style":205},[1391],{"type":36,"value":1392}," email_hash,\n",{"type":31,"tag":181,"props":1394,"children":1395},{"class":183,"line":331},[1396,1400,1404,1408,1412,1417,1421,1425,1429,1433],{"type":31,"tag":181,"props":1397,"children":1398},{"style":489},[1399],{"type":36,"value":1352},{"type":31,"tag":181,"props":1401,"children":1402},{"style":205},[1403],{"type":36,"value":813},{"type":31,"tag":181,"props":1405,"children":1406},{"style":489},[1407],{"type":36,"value":1361},{"type":31,"tag":181,"props":1409,"children":1410},{"style":205},[1411],{"type":36,"value":390},{"type":31,"tag":181,"props":1413,"children":1414},{"style":489},[1415],{"type":36,"value":1416},"ga_client_id",{"type":31,"tag":181,"props":1418,"children":1419},{"style":205},[1420],{"type":36,"value":46},{"type":31,"tag":181,"props":1422,"children":1423},{"style":188},[1424],{"type":36,"value":1379},{"type":31,"tag":181,"props":1426,"children":1427},{"style":205},[1428],{"type":36,"value":823},{"type":31,"tag":181,"props":1430,"children":1431},{"style":188},[1432],{"type":36,"value":604},{"type":31,"tag":181,"props":1434,"children":1435},{"style":205},[1436],{"type":36,"value":1437}," cookie_id,\n",{"type":31,"tag":181,"props":1439,"children":1440},{"class":183,"line":25},[1441],{"type":31,"tag":181,"props":1442,"children":1443},{"style":205},[1444],{"type":36,"value":1445},"    event_params\n",{"type":31,"tag":181,"props":1447,"children":1448},{"class":183,"line":714},[1449,1453,1458,1463,1467,1472],{"type":31,"tag":181,"props":1450,"children":1451},{"style":188},[1452],{"type":36,"value":683},{"type":31,"tag":181,"props":1454,"children":1455},{"style":205},[1456],{"type":36,"value":1457}," {{ source(",{"type":31,"tag":181,"props":1459,"children":1460},{"style":456},[1461],{"type":36,"value":1462},"'bigquery'",{"type":31,"tag":181,"props":1464,"children":1465},{"style":205},[1466],{"type":36,"value":46},{"type":31,"tag":181,"props":1468,"children":1469},{"style":456},[1470],{"type":36,"value":1471},"'events_raw'",{"type":31,"tag":181,"props":1473,"children":1474},{"style":205},[1475],{"type":36,"value":1294},{"type":31,"tag":181,"props":1477,"children":1478},{"class":183,"line":723},[1479,1484,1489],{"type":31,"tag":181,"props":1480,"children":1481},{"style":205},[1482],{"type":36,"value":1483},"  {% ",{"type":31,"tag":181,"props":1485,"children":1486},{"style":188},[1487],{"type":36,"value":1488},"if",{"type":31,"tag":181,"props":1490,"children":1491},{"style":205},[1492],{"type":36,"value":1493}," is_incremental() %}\n",{"type":31,"tag":181,"props":1495,"children":1496},{"class":183,"line":740},[1497,1501,1506,1511,1516,1520,1525,1529,1533],{"type":31,"tag":181,"props":1498,"children":1499},{"style":188},[1500],{"type":36,"value":696},{"type":31,"tag":181,"props":1502,"children":1503},{"style":205},[1504],{"type":36,"value":1505}," event_timestamp ",{"type":31,"tag":181,"props":1507,"children":1508},{"style":188},[1509],{"type":36,"value":1510},">",{"type":31,"tag":181,"props":1512,"children":1513},{"style":205},[1514],{"type":36,"value":1515}," (",{"type":31,"tag":181,"props":1517,"children":1518},{"style":188},[1519],{"type":36,"value":417},{"type":31,"tag":181,"props":1521,"children":1522},{"style":489},[1523],{"type":36,"value":1524}," MAX",{"type":31,"tag":181,"props":1526,"children":1527},{"style":205},[1528],{"type":36,"value":768},{"type":31,"tag":181,"props":1530,"children":1531},{"style":188},[1532],{"type":36,"value":430},{"type":31,"tag":181,"props":1534,"children":1535},{"style":205},[1536],{"type":36,"value":1537}," {{ this }})\n",{"type":31,"tag":181,"props":1539,"children":1540},{"class":183,"line":748},[1541],{"type":31,"tag":181,"props":1542,"children":1543},{"style":205},[1544],{"type":36,"value":1545},"  {% endif %}\n",{"type":31,"tag":181,"props":1547,"children":1548},{"class":183,"line":757},[1549],{"type":31,"tag":181,"props":1550,"children":1551},{"style":205},[1552],{"type":36,"value":919},{"type":31,"tag":181,"props":1554,"children":1555},{"class":183,"line":780},[1556,1560,1565,1570],{"type":31,"tag":181,"props":1557,"children":1558},{"style":188},[1559],{"type":36,"value":417},{"type":31,"tag":181,"props":1561,"children":1562},{"style":188},[1563],{"type":36,"value":1564}," *",{"type":31,"tag":181,"props":1566,"children":1567},{"style":188},[1568],{"type":36,"value":1569}," FROM",{"type":31,"tag":181,"props":1571,"children":1572},{"style":205},[1573],{"type":36,"value":1574}," events_with_signals;\n",{"type":31,"tag":32,"props":1576,"children":1577},{},[1578,1580,1586],{"type":36,"value":1579},"El modelo incremental se ejecuta cada hora, procesa el último batch. La lógica de merge de identidad va en otro modelo (",{"type":31,"tag":39,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":36,"value":1585},"models\u002Fcore\u002Ffct_identity_resolved.sql",{"type":36,"value":1265},{"type":31,"tag":171,"props":1588,"children":1590},{"className":173,"code":1589,"language":175,"meta":15,"style":15},"SELECT\n  e.event_id,\n  COALESCE(im_email.canonical_id, im_cookie.canonical_id) AS canonical_id,\n  e.event_timestamp\nFROM {{ ref('stg_events') }} e\nLEFT JOIN {{ ref('identity_map') }} im_email\n  ON e.email_hash IS NOT NULL\n  AND im_email.signal_type = 'email_sha256'\n  AND im_email.signal_value = e.email_hash\nLEFT JOIN {{ ref('identity_map') }} im_cookie\n  ON e.cookie_id IS NOT NULL\n  AND im_cookie.signal_type = 'cookie'\n  AND im_cookie.signal_value = e.cookie_id;\n",[1591],{"type":31,"tag":39,"props":1592,"children":1593},{"__ignoreMap":15},[1594,1601,1621,1676,1692,1714,1736,1762,1792,1828,1848,1872,1901],{"type":31,"tag":181,"props":1595,"children":1596},{"class":183,"line":184},[1597],{"type":31,"tag":181,"props":1598,"children":1599},{"style":188},[1600],{"type":36,"value":928},{"type":31,"tag":181,"props":1602,"children":1603},{"class":183,"line":211},[1604,1609,1613,1617],{"type":31,"tag":181,"props":1605,"children":1606},{"style":489},[1607],{"type":36,"value":1608},"  e",{"type":31,"tag":181,"props":1610,"children":1611},{"style":205},[1612],{"type":36,"value":390},{"type":31,"tag":181,"props":1614,"children":1615},{"style":489},[1616],{"type":36,"value":946},{"type":31,"tag":181,"props":1618,"children":1619},{"style":205},[1620],{"type":36,"value":297},{"type":31,"tag":181,"props":1622,"children":1623},{"class":183,"line":236},[1624,1629,1633,1638,1642,1646,1650,1655,1659,1663,1667,1671],{"type":31,"tag":181,"props":1625,"children":1626},{"style":489},[1627],{"type":36,"value":1628},"  COALESCE",{"type":31,"tag":181,"props":1630,"children":1631},{"style":205},[1632],{"type":36,"value":813},{"type":31,"tag":181,"props":1634,"children":1635},{"style":489},[1636],{"type":36,"value":1637},"im_email",{"type":31,"tag":181,"props":1639,"children":1640},{"style":205},[1641],{"type":36,"value":390},{"type":31,"tag":181,"props":1643,"children":1644},{"style":489},[1645],{"type":36,"value":533},{"type":31,"tag":181,"props":1647,"children":1648},{"style":205},[1649],{"type":36,"value":46},{"type":31,"tag":181,"props":1651,"children":1652},{"style":489},[1653],{"type":36,"value":1654},"im_cookie",{"type":31,"tag":181,"props":1656,"children":1657},{"style":205},[1658],{"type":36,"value":390},{"type":31,"tag":181,"props":1660,"children":1661},{"style":489},[1662],{"type":36,"value":533},{"type":31,"tag":181,"props":1664,"children":1665},{"style":205},[1666],{"type":36,"value":823},{"type":31,"tag":181,"props":1668,"children":1669},{"style":188},[1670],{"type":36,"value":604},{"type":31,"tag":181,"props":1672,"children":1673},{"style":205},[1674],{"type":36,"value":1675}," canonical_id,\n",{"type":31,"tag":181,"props":1677,"children":1678},{"class":183,"line":259},[1679,1683,1687],{"type":31,"tag":181,"props":1680,"children":1681},{"style":489},[1682],{"type":36,"value":1608},{"type":31,"tag":181,"props":1684,"children":1685},{"style":205},[1686],{"type":36,"value":390},{"type":31,"tag":181,"props":1688,"children":1689},{"style":489},[1690],{"type":36,"value":1691},"event_timestamp\n",{"type":31,"tag":181,"props":1693,"children":1694},{"class":183,"line":281},[1695,1699,1704,1709],{"type":31,"tag":181,"props":1696,"children":1697},{"style":188},[1698],{"type":36,"value":430},{"type":31,"tag":181,"props":1700,"children":1701},{"style":205},[1702],{"type":36,"value":1703}," {{ ref(",{"type":31,"tag":181,"props":1705,"children":1706},{"style":456},[1707],{"type":36,"value":1708},"'stg_events'",{"type":31,"tag":181,"props":1710,"children":1711},{"style":205},[1712],{"type":36,"value":1713},") }} e\n",{"type":31,"tag":181,"props":1715,"children":1716},{"class":183,"line":300},[1717,1722,1726,1731],{"type":31,"tag":181,"props":1718,"children":1719},{"style":188},[1720],{"type":36,"value":1721},"LEFT JOIN",{"type":31,"tag":181,"props":1723,"children":1724},{"style":205},[1725],{"type":36,"value":1703},{"type":31,"tag":181,"props":1727,"children":1728},{"style":456},[1729],{"type":36,"value":1730},"'identity_map'",{"type":31,"tag":181,"props":1732,"children":1733},{"style":205},[1734],{"type":36,"value":1735},") }} im_email\n",{"type":31,"tag":181,"props":1737,"children":1738},{"class":183,"line":317},[1739,1744,1749,1753,1757],{"type":31,"tag":181,"props":1740,"children":1741},{"style":188},[1742],{"type":36,"value":1743},"  ON",{"type":31,"tag":181,"props":1745,"children":1746},{"style":489},[1747],{"type":36,"value":1748}," e",{"type":31,"tag":181,"props":1750,"children":1751},{"style":205},[1752],{"type":36,"value":390},{"type":31,"tag":181,"props":1754,"children":1755},{"style":489},[1756],{"type":36,"value":59},{"type":31,"tag":181,"props":1758,"children":1759},{"style":188},[1760],{"type":36,"value":1761}," IS NOT NULL\n",{"type":31,"tag":181,"props":1763,"children":1764},{"class":183,"line":331},[1765,1770,1775,1779,1783,1787],{"type":31,"tag":181,"props":1766,"children":1767},{"style":188},[1768],{"type":36,"value":1769},"  AND",{"type":31,"tag":181,"props":1771,"children":1772},{"style":489},[1773],{"type":36,"value":1774}," im_email",{"type":31,"tag":181,"props":1776,"children":1777},{"style":205},[1778],{"type":36,"value":390},{"type":31,"tag":181,"props":1780,"children":1781},{"style":489},[1782],{"type":36,"value":1165},{"type":31,"tag":181,"props":1784,"children":1785},{"style":188},[1786],{"type":36,"value":1028},{"type":31,"tag":181,"props":1788,"children":1789},{"style":456},[1790],{"type":36,"value":1791}," 'email_sha256'\n",{"type":31,"tag":181,"props":1793,"children":1794},{"class":183,"line":25},[1795,1799,1803,1807,1811,1815,1819,1823],{"type":31,"tag":181,"props":1796,"children":1797},{"style":188},[1798],{"type":36,"value":1769},{"type":31,"tag":181,"props":1800,"children":1801},{"style":489},[1802],{"type":36,"value":1774},{"type":31,"tag":181,"props":1804,"children":1805},{"style":205},[1806],{"type":36,"value":390},{"type":31,"tag":181,"props":1808,"children":1809},{"style":489},[1810],{"type":36,"value":1172},{"type":31,"tag":181,"props":1812,"children":1813},{"style":188},[1814],{"type":36,"value":1028},{"type":31,"tag":181,"props":1816,"children":1817},{"style":489},[1818],{"type":36,"value":1748},{"type":31,"tag":181,"props":1820,"children":1821},{"style":205},[1822],{"type":36,"value":390},{"type":31,"tag":181,"props":1824,"children":1825},{"style":489},[1826],{"type":36,"value":1827},"email_hash\n",{"type":31,"tag":181,"props":1829,"children":1830},{"class":183,"line":714},[1831,1835,1839,1843],{"type":31,"tag":181,"props":1832,"children":1833},{"style":188},[1834],{"type":36,"value":1721},{"type":31,"tag":181,"props":1836,"children":1837},{"style":205},[1838],{"type":36,"value":1703},{"type":31,"tag":181,"props":1840,"children":1841},{"style":456},[1842],{"type":36,"value":1730},{"type":31,"tag":181,"props":1844,"children":1845},{"style":205},[1846],{"type":36,"value":1847},") }} im_cookie\n",{"type":31,"tag":181,"props":1849,"children":1850},{"class":183,"line":723},[1851,1855,1859,1863,1868],{"type":31,"tag":181,"props":1852,"children":1853},{"style":188},[1854],{"type":36,"value":1743},{"type":31,"tag":181,"props":1856,"children":1857},{"style":489},[1858],{"type":36,"value":1748},{"type":31,"tag":181,"props":1860,"children":1861},{"style":205},[1862],{"type":36,"value":390},{"type":31,"tag":181,"props":1864,"children":1865},{"style":489},[1866],{"type":36,"value":1867},"cookie_id",{"type":31,"tag":181,"props":1869,"children":1870},{"style":188},[1871],{"type":36,"value":1761},{"type":31,"tag":181,"props":1873,"children":1874},{"class":183,"line":740},[1875,1879,1884,1888,1892,1896],{"type":31,"tag":181,"props":1876,"children":1877},{"style":188},[1878],{"type":36,"value":1769},{"type":31,"tag":181,"props":1880,"children":1881},{"style":489},[1882],{"type":36,"value":1883}," im_cookie",{"type":31,"tag":181,"props":1885,"children":1886},{"style":205},[1887],{"type":36,"value":390},{"type":31,"tag":181,"props":1889,"children":1890},{"style":489},[1891],{"type":36,"value":1165},{"type":31,"tag":181,"props":1893,"children":1894},{"style":188},[1895],{"type":36,"value":1028},{"type":31,"tag":181,"props":1897,"children":1898},{"style":456},[1899],{"type":36,"value":1900}," 'cookie'\n",{"type":31,"tag":181,"props":1902,"children":1903},{"class":183,"line":748},[1904,1908,1912,1916,1920,1924,1928,1932,1936],{"type":31,"tag":181,"props":1905,"children":1906},{"style":188},[1907],{"type":36,"value":1769},{"type":31,"tag":181,"props":1909,"children":1910},{"style":489},[1911],{"type":36,"value":1883},{"type":31,"tag":181,"props":1913,"children":1914},{"style":205},[1915],{"type":36,"value":390},{"type":31,"tag":181,"props":1917,"children":1918},{"style":489},[1919],{"type":36,"value":1172},{"type":31,"tag":181,"props":1921,"children":1922},{"style":188},[1923],{"type":36,"value":1028},{"type":31,"tag":181,"props":1925,"children":1926},{"style":489},[1927],{"type":36,"value":1748},{"type":31,"tag":181,"props":1929,"children":1930},{"style":205},[1931],{"type":36,"value":390},{"type":31,"tag":181,"props":1933,"children":1934},{"style":489},[1935],{"type":36,"value":1867},{"type":31,"tag":181,"props":1937,"children":1938},{"style":205},[1939],{"type":36,"value":497},{"type":31,"tag":32,"props":1941,"children":1942},{},[1943,1945,1951],{"type":36,"value":1944},"Esta lógica de join realiza hash matching determinístico. Para lo probabilístico, añaden un modelo separado ",{"type":31,"tag":39,"props":1946,"children":1948},{"className":1947},[],[1949],{"type":36,"value":1950},"fct_probabilistic_clusters",{"type":36,"value":390},{"type":31,"tag":63,"props":1953,"children":1955},{"id":1954},"consentimiento-y-privacidad-cumplimiento-gdpr-y-ccpa",[1956],{"type":36,"value":1957},"Consentimiento y privacidad: cumplimiento GDPR y CCPA",{"type":31,"tag":32,"props":1959,"children":1960},{},[1961,1963,1968],{"type":36,"value":1962},"La resolución de identidad está sujeta al Artículo 6 (base legal) del GDPR y a las reglas \"no vender\" de CCPA. El hash de email se considera ",{"type":31,"tag":75,"props":1964,"children":1965},{},[1966],{"type":36,"value":1967},"datos personales",{"type":36,"value":1969}," (decisión CJEU 2019), requiere consentimiento o interés legítimo.",{"type":31,"tag":32,"props":1971,"children":1972},{},[1973,1975,1981,1983,1988,1990,1996],{"type":36,"value":1974},"Bajo Consent Mode v2, si el usuario establece analytics_storage=denied, no pueden recopilar el hash de email. Solo pueden usar fingerprint IP+UA (bajo interés legítimo —pero la interpretación CJEU es controvertida). Mejor práctica: añadir columna ",{"type":31,"tag":39,"props":1976,"children":1978},{"className":1977},[],[1979],{"type":36,"value":1980},"consent_status",{"type":36,"value":1982}," a ",{"type":31,"tag":39,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":36,"value":155},{"type":36,"value":1989}," y escribir hash solo desde eventos con ",{"type":31,"tag":39,"props":1991,"children":1993},{"className":1992},[],[1994],{"type":36,"value":1995},"analytics_storage=granted",{"type":36,"value":390},{"type":31,"tag":32,"props":1998,"children":1999},{},[2000,2002,2007],{"type":36,"value":2001},"Para el derecho al olvido de CCPA, necesitan lógica de eliminación basada en ",{"type":31,"tag":39,"props":2003,"children":2005},{"className":2004},[],[2006],{"type":36,"value":533},{"type":36,"value":169},{"type":31,"tag":171,"props":2009,"children":2011},{"className":173,"code":2010,"language":175,"meta":15,"style":15},"DELETE FROM identity_map WHERE canonical_id = 'uuid-123';\nDELETE FROM events WHERE canonical_id = 'uuid-123';\n",[2012],{"type":31,"tag":39,"props":2013,"children":2014},{"__ignoreMap":15},[2015,2053],{"type":31,"tag":181,"props":2016,"children":2017},{"class":183,"line":184},[2018,2023,2027,2032,2036,2040,2044,2049],{"type":31,"tag":181,"props":2019,"children":2020},{"style":188},[2021],{"type":36,"value":2022},"DELETE",{"type":31,"tag":181,"props":2024,"children":2025},{"style":188},[2026],{"type":36,"value":1569},{"type":31,"tag":181,"props":2028,"children":2029},{"style":205},[2030],{"type":36,"value":2031}," identity_map ",{"type":31,"tag":181,"props":2033,"children":2034},{"style":188},[2035],{"type":36,"value":443},{"type":31,"tag":181,"props":2037,"children":2038},{"style":205},[2039],{"type":36,"value":701},{"type":31,"tag":181,"props":2041,"children":2042},{"style":188},[2043],{"type":36,"value":453},{"type":31,"tag":181,"props":2045,"children":2046},{"style":456},[2047],{"type":36,"value":2048}," 'uuid-123'",{"type":31,"tag":181,"props":2050,"children":2051},{"style":205},[2052],{"type":36,"value":497},{"type":31,"tag":181,"props":2054,"children":2055},{"class":183,"line":211},[2056,2060,2064,2069,2073,2077,2081,2085],{"type":31,"tag":181,"props":2057,"children":2058},{"style":188},[2059],{"type":36,"value":2022},{"type":31,"tag":181,"props":2061,"children":2062},{"style":188},[2063],{"type":36,"value":1569},{"type":31,"tag":181,"props":2065,"children":2066},{"style":205},[2067],{"type":36,"value":2068}," events ",{"type":31,"tag":181,"props":2070,"children":2071},{"style":188},[2072],{"type":36,"value":443},{"type":31,"tag":181,"props":2074,"children":2075},{"style":205},[2076],{"type":36,"value":701},{"type":31,"tag":181,"props":2078,"children":2079},{"style":188},[2080],{"type":36,"value":453},{"type":31,"tag":181,"props":2082,"children":2083},{"style":456},[2084],{"type":36,"value":2048},{"type":31,"tag":181,"props":2086,"children":2087},{"style":205},[2088],{"type":36,"value":497},{"type":31,"tag":32,"props":2090,"children":2091},{},[2092,2094,2100],{"type":36,"value":2093},"Para eliminación en cascada, usan constraints de clave externa (BigQuery no lo soporta nativamente, pero sí Postgres\u002FSnowflake). Alternativa: soft delete (",{"type":31,"tag":39,"props":2095,"children":2097},{"className":2096},[],[2098],{"type":36,"value":2099},"deleted_at TIMESTAMP",{"type":36,"value":2101},") y luego purga por lotes.",{"type":31,"tag":512,"props":2103,"children":2105},{"id":2104},"mapeo-de-vendor-tcf-22",[2106],{"type":36,"value":2107},"Mapeo de vendor TCF 2.2",{"type":31,"tag":32,"props":2109,"children":2110},{},[2111,2113,2119],{"type":36,"value":2112},"Bajo TCF 2.2 del IAB, la resolución de identidad cae bajo \"Purpose 1 —Store and\u002For access information on a device\". Si el usuario no aprueba el vendor en la lista, no pueden hacer linking cross-device. En proyectos de Roibase, parsean la cadena TCF en BigQuery y escriben ",{"type":31,"tag":39,"props":2114,"children":2116},{"className":2115},[],[2117],{"type":36,"value":2118},"vendor_consent",{"type":36,"value":2120}," como columna, luego aplican filtro de consentimiento al merge de identidad:",{"type":31,"tag":171,"props":2122,"children":2124},{"className":173,"code":2123,"language":175,"meta":15,"style":15},"WHERE vendor_consent LIKE '%vendor_id=123%'\n",[2125],{"type":31,"tag":39,"props":2126,"children":2127},{"__ignoreMap":15},[2128],{"type":31,"tag":181,"props":2129,"children":2130},{"class":183,"line":184},[2131,2135,2140,2145],{"type":31,"tag":181,"props":2132,"children":2133},{"style":188},[2134],{"type":36,"value":443},{"type":31,"tag":181,"props":2136,"children":2137},{"style":205},[2138],{"type":36,"value":2139}," vendor_consent ",{"type":31,"tag":181,"props":2141,"children":2142},{"style":188},[2143],{"type":36,"value":2144},"LIKE",{"type":31,"tag":181,"props":2146,"children":2147},{"style":456},[2148],{"type":36,"value":2149}," '%vendor_id=123%'\n",{"type":31,"tag":32,"props":2151,"children":2152},{},[2153],{"type":36,"value":2154},"Esta lógica previene que construyan graph de identidad sin consentimiento —equilibrio entre cumplimiento y calidad de datos.",{"type":31,"tag":63,"props":2156,"children":2158},{"id":2157},"integración-cdp-segment-mparticle-rudderstack",[2159],{"type":36,"value":2160},"Integración CDP: Segment, mParticle, Rudderstack",{"type":31,"tag":32,"props":2162,"children":2163},{},[2164,2166,2173,2175,2181,2183,2189,2190,2196],{"type":36,"value":2165},"Los CDP modernos ofrecen sus propios grafos de identidad, pero generalmente son una caja negra. Construir el suyo les da control sobre la lógica del grafo —especialmente crítico en proyectos de ",{"type":31,"tag":547,"props":2167,"children":2170},{"href":2168,"rel":2169},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fretention-engineering-cdp",[551],[2171],{"type":36,"value":2172},"CDP & Retention Engineering",{"type":36,"value":2174},". El ",{"type":31,"tag":39,"props":2176,"children":2178},{"className":2177},[],[2179],{"type":36,"value":2180},"identify()",{"type":36,"value":2182}," de Segment fusiona ",{"type":31,"tag":39,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":36,"value":2188},"userId",{"type":36,"value":131},{"type":31,"tag":39,"props":2191,"children":2193},{"className":2192},[],[2194],{"type":36,"value":2195},"anonymousId",{"type":36,"value":2197},", pero ¿qué señal tiene prioridad? En su lógica de resolución, la secuencia de prioridad es clara:",{"type":31,"tag":1113,"props":2199,"children":2200},{},[2201,2212,2222,2232,2243],{"type":31,"tag":1117,"props":2202,"children":2203},{},[2204,2210],{"type":31,"tag":39,"props":2205,"children":2207},{"className":2206},[],[2208],{"type":36,"value":2209},"customer_id",{"type":36,"value":2211}," (CRM) → más confiable",{"type":31,"tag":1117,"props":2213,"children":2214},{},[2215,2220],{"type":31,"tag":39,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":36,"value":1370},{"type":36,"value":2221}," → determinístico",{"type":31,"tag":1117,"props":2223,"children":2224},{},[2225,2230],{"type":31,"tag":39,"props":2226,"children":2228},{"className":2227},[],[2229],{"type":36,"value":44},{"type":36,"value":2231}," → cross-session pero no cross-device",{"type":31,"tag":1117,"props":2233,"children":2234},{},[2235,2241],{"type":31,"tag":39,"props":2236,"children":2238},{"className":2237},[],[2239],{"type":36,"value":2240},"cookie",{"type":36,"value":2242}," → TTL más corto",{"type":31,"tag":1117,"props":2244,"children":2245},{},[2246,2251],{"type":31,"tag":39,"props":2247,"children":2249},{"className":2248},[],[2250],{"type":36,"value":968},{"type":36,"value":2252}," → fallback probabilístico",{"type":31,"tag":32,"props":2254,"children":2255},{},[2256,2258,2264,2266,2271,2273,2279],{"type":36,"value":2257},"Codifican este orden en dbt con una cadena ",{"type":31,"tag":39,"props":2259,"children":2261},{"className":2260},[],[2262],{"type":36,"value":2263},"COALESCE()",{"type":36,"value":2265},". Solo envían al CDP el ",{"type":31,"tag":39,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":36,"value":533},{"type":36,"value":2272}," final y ",{"type":31,"tag":39,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":36,"value":2278},"confidence_score",{"type":36,"value":2280},", la lógica de merge permanece en sus manos.",{"type":31,"tag":32,"props":2282,"children":2283},{},[2284],{"type":36,"value":2285},"La resolución de identidad es la capa fundamental del stack de datos de marketing moderno. Hash matching proporciona certeza determinística, vinculación probabilística proporciona cobertura, household graph abre segmentación familiar. Cuando el pipeline server-side unifica estas seis señales respetando consentimiento y privacidad, la precisión de usuarios únicos mejora un 40%, desaparece la ilusión de retención falsa, los tests de incrementalidad se vuelven confiables. Construir su propia lógica de resolución con BigQuery + dbt + sGTM los libera de las cajas negras de vendors, manteniendo el control del grafo exactamente como necesitan.",{"type":31,"tag":2287,"props":2288,"children":2289},"style",{},[2290],{"type":36,"value":2291},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":15,"searchDepth":236,"depth":236,"links":2293},[2294,2295,2298,2301,2302,2305],{"id":65,"depth":211,"text":68},{"id":141,"depth":211,"text":144,"children":2296},[2297],{"id":514,"depth":236,"text":517},{"id":559,"depth":211,"text":562,"children":2299},[2300],{"id":1092,"depth":236,"text":1095},{"id":1103,"depth":211,"text":1106},{"id":1954,"depth":211,"text":1957,"children":2303},[2304],{"id":2104,"depth":236,"text":2107},{"id":2157,"depth":211,"text":2160},"markdown","content:es:data:resolucion-identidad-seis-senales-un-perfil.md","content","es\u002Fdata\u002Fresolucion-identidad-seis-senales-un-perfil.md","es\u002Fdata\u002Fresolucion-identidad-seis-senales-un-perfil","md",1785967496628]