[{"data":1,"prerenderedAt":2305},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fdata\u002Frisoluzione-identita-sei-segnali-a-profilo-cliente-unico":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":10,"_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":2299,"_id":2300,"_source":2301,"_file":2302,"_stem":2303,"_extension":2304},"data",false,"","Risoluzione dell'identità: da sei segnali a un profilo cliente unico","Hash matching, probabilistic linking e household identity: come unificare touchpoint dispersi in un profilo cliente coeso. Pipeline server-side e schema pratico.","2026-07-19",[20,21,22,23,24],"identity-resolution","hash-matching","probabilistic-linking","cdp","first-party-data",9,"Roibase",{"type":28,"children":29,"toc":2285},"root",[30,62,69,115,120,139,145,158,170,338,391,403,498,511,518,549,555,567,572,1038,1058,1083,1089,1094,1100,1105,1247,1260,1569,1581,1934,1946,1952,1964,1990,2001,2082,2095,2101,2114,2143,2148,2154,2191,2246,2274,2279],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35,38,45,47,53,54,60],{"type":36,"value":37},"text","Un utente clicca sulla campagna dallo smartphone, aggiunge il prodotto al carrello dal desktop, completa l'acquisto in negozio. Tre segnali, tre identità distinte: ",{"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 risoluzione dell'identità è la pipeline dati che unifica questi frammenti in un profilo cliente coeso. Nell'era post-cookie — Consent Mode v2, iOS ATT, CCPA — l'architettura di risoluzione delle identità basata su dati first-party server-side non è più una raccomandazione, ma un imperativo.",{"type":31,"tag":63,"props":64,"children":66},"h2",{"id":65},"perché-sei-segnali-distinti",[67],{"type":36,"value":68},"Perché sei segnali distinti",{"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},"Lo stack di marketing moderno raccoglie segnali di identità su sei livelli: ",{"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},"device ID",{"type":36,"value":87}," (IDFA\u002FGAID), ",{"type":31,"tag":75,"props":89,"children":90},{},[91],{"type":36,"value":92},"authenticated hash",{"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 CRM\u002FCDP), ",{"type":31,"tag":75,"props":103,"children":104},{},[105],{"type":36,"value":106},"IP+user-agent fingerprint",{"type":36,"value":46},{"type":31,"tag":75,"props":109,"children":110},{},[111],{"type":36,"value":112},"household graph",{"type":36,"value":114},". Ognuno entra in gioco in momenti diversi del ciclo di vita.",{"type":31,"tag":32,"props":116,"children":117},{},[118],{"type":36,"value":119},"Il browser cookie si attiva al primo touchpoint; il device ID sull'app mobile; l'authenticated hash quando si raccoglie email o numero di telefono; il customer ID dopo il checkout; il fingerprint per il matching probabilistico senza consenso; l'household graph raggruppa i dispositivi connessi dallo stesso router. Il problema: questi sei segnali vivono in tabelle separate, con TTL diversi (cookie 90 giorni, IDFA perpetuo, email hash fino all'eliminazione del cliente). Senza risoluzione, ogni canale conta l'utente separatamente — il marketing mix model doppia il conteggio, i test di incrementalità sovrastimano, le coorti di retention mostrano retenzione artificialmente bassa.",{"type":31,"tag":32,"props":121,"children":122},{},[123,125,130,132,137],{"type":36,"value":124},"La logica di risoluzione poggia su due metodi: ",{"type":31,"tag":75,"props":126,"children":127},{},[128],{"type":36,"value":129},"deterministico (hash matching)",{"type":36,"value":131}," e ",{"type":31,"tag":75,"props":133,"children":134},{},[135],{"type":36,"value":136},"probabilistico (graph linking)",{"type":36,"value":138},". Deterministico: l'hash SHA-256 dell'email unisce un evento browser con una transazione backend — certezza al 100%. Probabilistico: se lo stesso IP+user-agent appare in due eventi entro 24 ore, la probabilità che sia lo stesso utente è 73% (ad esempio di soglia). Senza risoluzione, il conteggio degli utenti unici si gonfia del 40-80% (a seconda del mix di categoria e dispositivi).",{"type":31,"tag":63,"props":140,"children":142},{"id":141},"hash-matching-convertire-email-e-telefono-in-chiave-identitaria",[143],{"type":36,"value":144},"Hash matching: convertire email e telefono in chiave identitaria",{"type":31,"tag":32,"props":146,"children":147},{},[148,150,156],{"type":36,"value":149},"L'hash matching è la spina dorsale della risoluzione dell'identità server-side. Nel momento in cui l'utente fornisce email o telefono, il client-side o sGTM genera uno hash SHA-256, che viene scritto nella tabella ",{"type":31,"tag":39,"props":151,"children":153},{"className":152},[],[154],{"type":36,"value":155},"identity_map",{"type":36,"value":157},". In tutti gli eventi anonimi successivi, cercate il cookie o device ID per recuperare l'hash.",{"type":31,"tag":32,"props":159,"children":160},{},[161,163,168],{"type":36,"value":162},"Schema semplice di ",{"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},"Quando un utente digita ",{"type":31,"tag":39,"props":344,"children":346},{"className":345},[],[347],{"type":36,"value":348},"user@example.com",{"type":36,"value":350}," in un form di registrazione, sGTM lo trasforma in hash SHA-256 e fa un ",{"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},". Se nella stessa sessione esiste il cookie ",{"type":31,"tag":39,"props":368,"children":370},{"className":369},[],[371],{"type":36,"value":372},"_ga=GA1.1.xyz",{"type":36,"value":374},", aggiungete una seconda riga: ",{"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},". Così due segnali converge sotto ",{"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},"Nella sessione successiva, l'utente torna con solo ",{"type":31,"tag":39,"props":397,"children":399},{"className":398},[],[400],{"type":36,"value":372},{"type":36,"value":402},", senza inserire l'email. Fate una query su 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},"Ritorno: ",{"type":31,"tag":39,"props":504,"children":506},{"className":505},[],[507],{"type":36,"value":508},"uuid-123",{"type":36,"value":510},". Assegnate l'evento a questo ID — lo stesso utente è identificato anche senza l'hash email. La precisione dell'hash matching è del 100% perché una collisione crittografica è teoricamente impossibile. Però c'è il problema della copertura: se l'utente non fornisce l'email, non c'è hash, allora passate al probabilistico.",{"type":31,"tag":512,"props":513,"children":515},"h3",{"id":514},"rischio-di-collisione-e-salt",[516],{"type":36,"value":517},"Rischio di collisione e salt",{"type":31,"tag":32,"props":519,"children":520},{},[521,523,528,530,536,538,547],{"type":36,"value":522},"Il rischio di collisione SHA-256 è teorico: 1 su 2^128 tentativi. Ma in produzione il vero problema è che ",{"type":31,"tag":75,"props":524,"children":525},{},[526],{"type":36,"value":527},"lo stesso email potrebbe essere legato a canonical_id diversi",{"type":36,"value":529}," (errore manuale, residui da migrazione precedente). Per questo aggiungete ",{"type":31,"tag":39,"props":531,"children":533},{"className":532},[],[534],{"type":36,"value":535},"UNIQUE INDEX (signal_type, signal_value)",{"type":36,"value":537},". L'uso del salt (email + stringa segreta, poi hash) non aumenta il rischio di collisione, ma nella ",{"type":31,"tag":539,"props":540,"children":544},"a",{"href":541,"rel":542},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Ffirstparty",[543],"nofollow",[545],{"type":36,"value":546},"progettazione dell'architettura first-party",{"type":36,"value":548}," aggiunge uno strato di privacy — ruotando il salt, i vecchi hash diventano invalidi, utile per il \"right to be forgotten\" GDPR.",{"type":31,"tag":63,"props":550,"children":552},{"id":551},"probabilistic-linking-ip-user-agent-e-device-graph",[553],{"type":36,"value":554},"Probabilistic linking: IP, user-agent e device graph",{"type":31,"tag":32,"props":556,"children":557},{},[558,560,565],{"type":36,"value":559},"Se l'utente naviga in modalità anonima, non ci sono segnali deterministici. Qui entrate in gioco con ",{"type":31,"tag":75,"props":561,"children":562},{},[563],{"type":36,"value":564},"probabilistic graph",{"type":36,"value":566},": IP + user-agent + prossimità temporale per produrre un punteggio di \"probabilmente è lo stesso utente\". Esempio: stesso IP, stesso user-agent, a distanza di 15 minuti, due eventi — probabilità 85% che sia lo stesso utente.",{"type":31,"tag":32,"props":568,"children":569},{},[570],{"type":36,"value":571},"Logica semplice di probabilistic merge:",{"type":31,"tag":171,"props":573,"children":575},{"className":173,"code":574,"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",[576],{"type":31,"tag":39,"props":577,"children":578},{"__ignoreMap":15},[579,601,609,617,625,633,641,668,681,704,713,730,738,747,770,792,825,838,851,903,912,921,943,971,984],{"type":31,"tag":181,"props":580,"children":581},{"class":183,"line":184},[582,587,592,597],{"type":31,"tag":181,"props":583,"children":584},{"style":188},[585],{"type":36,"value":586},"WITH",{"type":31,"tag":181,"props":588,"children":589},{"style":205},[590],{"type":36,"value":591}," anon_events ",{"type":31,"tag":181,"props":593,"children":594},{"style":188},[595],{"type":36,"value":596},"AS",{"type":31,"tag":181,"props":598,"children":599},{"style":205},[600],{"type":36,"value":208},{"type":31,"tag":181,"props":602,"children":603},{"class":183,"line":211},[604],{"type":31,"tag":181,"props":605,"children":606},{"style":188},[607],{"type":36,"value":608},"  SELECT\n",{"type":31,"tag":181,"props":610,"children":611},{"class":183,"line":236},[612],{"type":31,"tag":181,"props":613,"children":614},{"style":205},[615],{"type":36,"value":616},"    event_id,\n",{"type":31,"tag":181,"props":618,"children":619},{"class":183,"line":259},[620],{"type":31,"tag":181,"props":621,"children":622},{"style":205},[623],{"type":36,"value":624},"    ip_address,\n",{"type":31,"tag":181,"props":626,"children":627},{"class":183,"line":281},[628],{"type":31,"tag":181,"props":629,"children":630},{"style":205},[631],{"type":36,"value":632},"    user_agent,\n",{"type":31,"tag":181,"props":634,"children":635},{"class":183,"line":300},[636],{"type":31,"tag":181,"props":637,"children":638},{"style":205},[639],{"type":36,"value":640},"    event_timestamp,\n",{"type":31,"tag":181,"props":642,"children":643},{"class":183,"line":317},[644,649,654,659,663],{"type":31,"tag":181,"props":645,"children":646},{"style":205},[647],{"type":36,"value":648},"    FARM_FINGERPRINT(",{"type":31,"tag":181,"props":650,"children":651},{"style":489},[652],{"type":36,"value":653},"CONCAT",{"type":31,"tag":181,"props":655,"children":656},{"style":205},[657],{"type":36,"value":658},"(ip_address, user_agent)) ",{"type":31,"tag":181,"props":660,"children":661},{"style":188},[662],{"type":36,"value":596},{"type":31,"tag":181,"props":664,"children":665},{"style":205},[666],{"type":36,"value":667}," fingerprint\n",{"type":31,"tag":181,"props":669,"children":670},{"class":183,"line":331},[671,676],{"type":31,"tag":181,"props":672,"children":673},{"style":188},[674],{"type":36,"value":675},"  FROM",{"type":31,"tag":181,"props":677,"children":678},{"style":205},[679],{"type":36,"value":680}," events\n",{"type":31,"tag":181,"props":682,"children":683},{"class":183,"line":25},[684,689,694,699],{"type":31,"tag":181,"props":685,"children":686},{"style":188},[687],{"type":36,"value":688},"  WHERE",{"type":31,"tag":181,"props":690,"children":691},{"style":205},[692],{"type":36,"value":693}," canonical_id ",{"type":31,"tag":181,"props":695,"children":696},{"style":188},[697],{"type":36,"value":698},"IS",{"type":31,"tag":181,"props":700,"children":701},{"style":188},[702],{"type":36,"value":703}," NULL\n",{"type":31,"tag":181,"props":705,"children":707},{"class":183,"line":706},10,[708],{"type":31,"tag":181,"props":709,"children":710},{"style":205},[711],{"type":36,"value":712},"),\n",{"type":31,"tag":181,"props":714,"children":716},{"class":183,"line":715},11,[717,722,726],{"type":31,"tag":181,"props":718,"children":719},{"style":205},[720],{"type":36,"value":721},"clusters ",{"type":31,"tag":181,"props":723,"children":724},{"style":188},[725],{"type":36,"value":596},{"type":31,"tag":181,"props":727,"children":728},{"style":205},[729],{"type":36,"value":208},{"type":31,"tag":181,"props":731,"children":733},{"class":183,"line":732},12,[734],{"type":31,"tag":181,"props":735,"children":736},{"style":188},[737],{"type":36,"value":608},{"type":31,"tag":181,"props":739,"children":741},{"class":183,"line":740},13,[742],{"type":31,"tag":181,"props":743,"children":744},{"style":205},[745],{"type":36,"value":746},"    fingerprint,\n",{"type":31,"tag":181,"props":748,"children":750},{"class":183,"line":749},14,[751,756,761,765],{"type":31,"tag":181,"props":752,"children":753},{"style":489},[754],{"type":36,"value":755},"    MIN",{"type":31,"tag":181,"props":757,"children":758},{"style":205},[759],{"type":36,"value":760},"(event_timestamp) ",{"type":31,"tag":181,"props":762,"children":763},{"style":188},[764],{"type":36,"value":596},{"type":31,"tag":181,"props":766,"children":767},{"style":205},[768],{"type":36,"value":769}," first_event,\n",{"type":31,"tag":181,"props":771,"children":773},{"class":183,"line":772},15,[774,779,783,787],{"type":31,"tag":181,"props":775,"children":776},{"style":489},[777],{"type":36,"value":778},"    MAX",{"type":31,"tag":181,"props":780,"children":781},{"style":205},[782],{"type":36,"value":760},{"type":31,"tag":181,"props":784,"children":785},{"style":188},[786],{"type":36,"value":596},{"type":31,"tag":181,"props":788,"children":789},{"style":205},[790],{"type":36,"value":791}," last_event,\n",{"type":31,"tag":181,"props":793,"children":795},{"class":183,"line":794},16,[796,801,806,811,816,820],{"type":31,"tag":181,"props":797,"children":798},{"style":489},[799],{"type":36,"value":800},"    COUNT",{"type":31,"tag":181,"props":802,"children":803},{"style":205},[804],{"type":36,"value":805},"(",{"type":31,"tag":181,"props":807,"children":808},{"style":188},[809],{"type":36,"value":810},"*",{"type":31,"tag":181,"props":812,"children":813},{"style":205},[814],{"type":36,"value":815},") ",{"type":31,"tag":181,"props":817,"children":818},{"style":188},[819],{"type":36,"value":596},{"type":31,"tag":181,"props":821,"children":822},{"style":205},[823],{"type":36,"value":824}," event_count\n",{"type":31,"tag":181,"props":826,"children":828},{"class":183,"line":827},17,[829,833],{"type":31,"tag":181,"props":830,"children":831},{"style":188},[832],{"type":36,"value":675},{"type":31,"tag":181,"props":834,"children":835},{"style":205},[836],{"type":36,"value":837}," anon_events\n",{"type":31,"tag":181,"props":839,"children":841},{"class":183,"line":840},18,[842,847],{"type":31,"tag":181,"props":843,"children":844},{"style":188},[845],{"type":36,"value":846},"  GROUP BY",{"type":31,"tag":181,"props":848,"children":849},{"style":205},[850],{"type":36,"value":667},{"type":31,"tag":181,"props":852,"children":854},{"class":183,"line":853},19,[855,860,865,870,875,880,884,889,893,898],{"type":31,"tag":181,"props":856,"children":857},{"style":188},[858],{"type":36,"value":859},"  HAVING",{"type":31,"tag":181,"props":861,"children":862},{"style":205},[863],{"type":36,"value":864}," TIMESTAMP_DIFF(",{"type":31,"tag":181,"props":866,"children":867},{"style":489},[868],{"type":36,"value":869},"MAX",{"type":31,"tag":181,"props":871,"children":872},{"style":205},[873],{"type":36,"value":874},"(event_timestamp), ",{"type":31,"tag":181,"props":876,"children":877},{"style":489},[878],{"type":36,"value":879},"MIN",{"type":31,"tag":181,"props":881,"children":882},{"style":205},[883],{"type":36,"value":874},{"type":31,"tag":181,"props":885,"children":886},{"style":188},[887],{"type":36,"value":888},"HOUR",{"type":31,"tag":181,"props":890,"children":891},{"style":205},[892],{"type":36,"value":815},{"type":31,"tag":181,"props":894,"children":895},{"style":188},[896],{"type":36,"value":897},"\u003C",{"type":31,"tag":181,"props":899,"children":900},{"style":489},[901],{"type":36,"value":902}," 24\n",{"type":31,"tag":181,"props":904,"children":906},{"class":183,"line":905},20,[907],{"type":31,"tag":181,"props":908,"children":909},{"style":205},[910],{"type":36,"value":911},")\n",{"type":31,"tag":181,"props":913,"children":915},{"class":183,"line":914},21,[916],{"type":31,"tag":181,"props":917,"children":918},{"style":188},[919],{"type":36,"value":920},"SELECT\n",{"type":31,"tag":181,"props":922,"children":924},{"class":183,"line":923},22,[925,930,934,939],{"type":31,"tag":181,"props":926,"children":927},{"style":489},[928],{"type":36,"value":929},"  a",{"type":31,"tag":181,"props":931,"children":932},{"style":205},[933],{"type":36,"value":390},{"type":31,"tag":181,"props":935,"children":936},{"style":489},[937],{"type":36,"value":938},"event_id",{"type":31,"tag":181,"props":940,"children":941},{"style":205},[942],{"type":36,"value":297},{"type":31,"tag":181,"props":944,"children":946},{"class":183,"line":945},23,[947,952,956,961,966],{"type":31,"tag":181,"props":948,"children":949},{"style":489},[950],{"type":36,"value":951},"  c",{"type":31,"tag":181,"props":953,"children":954},{"style":205},[955],{"type":36,"value":390},{"type":31,"tag":181,"props":957,"children":958},{"style":489},[959],{"type":36,"value":960},"fingerprint",{"type":31,"tag":181,"props":962,"children":963},{"style":188},[964],{"type":36,"value":965}," AS",{"type":31,"tag":181,"props":967,"children":968},{"style":205},[969],{"type":36,"value":970}," probable_cluster_id\n",{"type":31,"tag":181,"props":972,"children":974},{"class":183,"line":973},24,[975,979],{"type":31,"tag":181,"props":976,"children":977},{"style":188},[978],{"type":36,"value":430},{"type":31,"tag":181,"props":980,"children":981},{"style":205},[982],{"type":36,"value":983}," anon_events a\n",{"type":31,"tag":181,"props":985,"children":987},{"class":183,"line":986},25,[988,993,998,1003,1008,1012,1016,1021,1026,1030,1034],{"type":31,"tag":181,"props":989,"children":990},{"style":188},[991],{"type":36,"value":992},"JOIN",{"type":31,"tag":181,"props":994,"children":995},{"style":205},[996],{"type":36,"value":997}," clusters c ",{"type":31,"tag":181,"props":999,"children":1000},{"style":188},[1001],{"type":36,"value":1002},"ON",{"type":31,"tag":181,"props":1004,"children":1005},{"style":489},[1006],{"type":36,"value":1007}," a",{"type":31,"tag":181,"props":1009,"children":1010},{"style":205},[1011],{"type":36,"value":390},{"type":31,"tag":181,"props":1013,"children":1014},{"style":489},[1015],{"type":36,"value":960},{"type":31,"tag":181,"props":1017,"children":1018},{"style":188},[1019],{"type":36,"value":1020}," =",{"type":31,"tag":181,"props":1022,"children":1023},{"style":489},[1024],{"type":36,"value":1025}," c",{"type":31,"tag":181,"props":1027,"children":1028},{"style":205},[1029],{"type":36,"value":390},{"type":31,"tag":181,"props":1031,"children":1032},{"style":489},[1033],{"type":36,"value":960},{"type":31,"tag":181,"props":1035,"children":1036},{"style":205},[1037],{"type":36,"value":497},{"type":31,"tag":32,"props":1039,"children":1040},{},[1041,1043,1049,1051,1057],{"type":36,"value":1042},"Questa query raggruppa gli eventi per hash IP+UA entro 24 ore. Potete usare il cluster ID come ",{"type":31,"tag":39,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":36,"value":1048},"canonical_id",{"type":36,"value":1050}," temporaneo, ma aggiungete un confidence score: ",{"type":31,"tag":39,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":36,"value":1056},"event_count > 3 AND time_span \u003C 1 HOUR → confidence=0.9",{"type":36,"value":390},{"type":31,"tag":32,"props":1059,"children":1060},{},[1061,1066,1068,1074,1076,1081],{"type":31,"tag":75,"props":1062,"children":1063},{},[1064],{"type":36,"value":1065},"Household graph:",{"type":36,"value":1067}," Se da uno stesso IP arrivano user-agent diversi (laptop, tablet, telefono), è probabilmente la stessa abitazione. Qui create un ",{"type":31,"tag":39,"props":1069,"children":1071},{"className":1070},[],[1072],{"type":36,"value":1073},"household_id",{"type":36,"value":1075}," e lo inserite sotto il ",{"type":31,"tag":39,"props":1077,"children":1079},{"className":1078},[],[1080],{"type":36,"value":1048},{"type":36,"value":1082}," individuale. Ad esempio, una sottoscrizione Amazon Prime: 1 abbonamento, 6 profili — la risoluzione dell'identità aggrega a livello household.",{"type":31,"tag":512,"props":1084,"children":1086},{"id":1085},"false-positive",[1087],{"type":36,"value":1088},"False positive",{"type":31,"tag":32,"props":1090,"children":1091},{},[1092],{"type":36,"value":1093},"Nel probabilistic linking il rischio di falsi positivi è reale. Lo stesso IP+user-agent può provenire da due utenti diversi (WiFi ufficio, biblioteca). Se la soglia è troppo bassa (50% confidence), vedrete il 15-25% di falsi positivi. Best practice del settore: soglia di confidenza > 75%, finestra temporale di 1 ora, minimo 2 event match. Vendor come LiveRamp usano database a grafo (Neo4j) e combinano 30+ segnali asserendo > 95% di accuratezza — ma nel vostro pipeline first-party, 2-3 segnali vi danno l'80% di accuratezza, che è sufficiente.",{"type":31,"tag":63,"props":1095,"children":1097},{"id":1096},"pipeline-server-side-sgtm-bigquery-dbt",[1098],{"type":36,"value":1099},"Pipeline server-side: sGTM + BigQuery + dbt",{"type":31,"tag":32,"props":1101,"children":1102},{},[1103],{"type":36,"value":1104},"La risoluzione dell'identità in produzione segue questo flusso:",{"type":31,"tag":1106,"props":1107,"children":1108},"ol",{},[1109,1128,1168,1193,1216],{"type":31,"tag":1110,"props":1111,"children":1112},"li",{},[1113,1118,1120,1126],{"type":31,"tag":75,"props":1114,"children":1115},{},[1116],{"type":36,"value":1117},"Ingestion sGTM:",{"type":36,"value":1119}," L'evento client-side GTM va a sGTM, sGTM aggiunge l'hash SHA-256 se c'è email, scrive l'evento raw in BigQuery (",{"type":31,"tag":39,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":36,"value":1125},"events_raw",{"type":36,"value":1127},").",{"type":31,"tag":1110,"props":1129,"children":1130},{},[1131,1136,1138,1144,1146,1151,1153,1159,1160,1166],{"type":31,"tag":75,"props":1132,"children":1133},{},[1134],{"type":36,"value":1135},"Staging model dbt:",{"type":36,"value":1137}," La tabella ",{"type":31,"tag":39,"props":1139,"children":1141},{"className":1140},[],[1142],{"type":36,"value":1143},"stg_events",{"type":36,"value":1145}," produce eventi ripuliti da ",{"type":31,"tag":39,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":36,"value":1125},{"type":36,"value":1152},", le colonne ",{"type":31,"tag":39,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":36,"value":1158},"signal_type",{"type":36,"value":131},{"type":31,"tag":39,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":36,"value":1165},"signal_value",{"type":36,"value":1167}," vengono parsed.",{"type":31,"tag":1110,"props":1169,"children":1170},{},[1171,1176,1178,1184,1186,1191],{"type":31,"tag":75,"props":1172,"children":1173},{},[1174],{"type":36,"value":1175},"Merge identity_map dbt:",{"type":36,"value":1177}," Quando appare un nuovo hash, si fa un ",{"type":31,"tag":39,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":36,"value":1183},"MERGE",{"type":36,"value":1185}," in ",{"type":31,"tag":39,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":36,"value":155},{"type":36,"value":1192}," (logica upsert).",{"type":31,"tag":1110,"props":1194,"children":1195},{},[1196,1201,1203,1208,1210,1215],{"type":31,"tag":75,"props":1197,"children":1198},{},[1199],{"type":36,"value":1200},"Arricchimento canonical_id dbt:",{"type":36,"value":1202}," Ogni evento viene joinato con ",{"type":31,"tag":39,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":36,"value":155},{"type":36,"value":1209},", lookup di ",{"type":31,"tag":39,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":36,"value":1048},{"type":36,"value":390},{"type":31,"tag":1110,"props":1217,"children":1218},{},[1219,1224,1226,1232,1233,1239,1241,1246],{"type":31,"tag":75,"props":1220,"children":1221},{},[1222],{"type":36,"value":1223},"Aggregazione dbt:",{"type":36,"value":1225}," Le metriche a livello utente (",{"type":31,"tag":39,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":36,"value":1231},"user_ltv",{"type":36,"value":46},{"type":31,"tag":39,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":36,"value":1238},"session_count",{"type":36,"value":1240},") vengono aggregate per ",{"type":31,"tag":39,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":36,"value":1048},{"type":36,"value":390},{"type":31,"tag":32,"props":1248,"children":1249},{},[1250,1252,1258],{"type":36,"value":1251},"Frammento di modello dbt di esempio (",{"type":31,"tag":39,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":36,"value":1257},"models\u002Fstaging\u002Fstg_events.sql",{"type":36,"value":1259},"):",{"type":31,"tag":171,"props":1261,"children":1263},{"className":173,"code":1262,"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",[1264],{"type":31,"tag":39,"props":1265,"children":1266},{"__ignoreMap":15},[1267,1289,1298,1318,1325,1332,1339,1387,1432,1440,1470,1488,1532,1540,1547],{"type":31,"tag":181,"props":1268,"children":1269},{"class":183,"line":184},[1270,1275,1279,1284],{"type":31,"tag":181,"props":1271,"children":1272},{"style":205},[1273],{"type":36,"value":1274},"{{ config(materialized",{"type":31,"tag":181,"props":1276,"children":1277},{"style":188},[1278],{"type":36,"value":453},{"type":31,"tag":181,"props":1280,"children":1281},{"style":456},[1282],{"type":36,"value":1283},"'incremental'",{"type":31,"tag":181,"props":1285,"children":1286},{"style":205},[1287],{"type":36,"value":1288},") }}\n",{"type":31,"tag":181,"props":1290,"children":1291},{"class":183,"line":211},[1292],{"type":31,"tag":181,"props":1293,"children":1295},{"emptyLinePlaceholder":1294},true,[1296],{"type":36,"value":1297},"\n",{"type":31,"tag":181,"props":1299,"children":1300},{"class":183,"line":236},[1301,1305,1310,1314],{"type":31,"tag":181,"props":1302,"children":1303},{"style":188},[1304],{"type":36,"value":586},{"type":31,"tag":181,"props":1306,"children":1307},{"style":205},[1308],{"type":36,"value":1309}," events_with_signals ",{"type":31,"tag":181,"props":1311,"children":1312},{"style":188},[1313],{"type":36,"value":596},{"type":31,"tag":181,"props":1315,"children":1316},{"style":205},[1317],{"type":36,"value":208},{"type":31,"tag":181,"props":1319,"children":1320},{"class":183,"line":259},[1321],{"type":31,"tag":181,"props":1322,"children":1323},{"style":188},[1324],{"type":36,"value":608},{"type":31,"tag":181,"props":1326,"children":1327},{"class":183,"line":281},[1328],{"type":31,"tag":181,"props":1329,"children":1330},{"style":205},[1331],{"type":36,"value":616},{"type":31,"tag":181,"props":1333,"children":1334},{"class":183,"line":300},[1335],{"type":31,"tag":181,"props":1336,"children":1337},{"style":205},[1338],{"type":36,"value":640},{"type":31,"tag":181,"props":1340,"children":1341},{"class":183,"line":317},[1342,1347,1351,1356,1360,1365,1369,1374,1378,1382],{"type":31,"tag":181,"props":1343,"children":1344},{"style":489},[1345],{"type":36,"value":1346},"    COALESCE",{"type":31,"tag":181,"props":1348,"children":1349},{"style":205},[1350],{"type":36,"value":805},{"type":31,"tag":181,"props":1352,"children":1353},{"style":489},[1354],{"type":36,"value":1355},"user_properties",{"type":31,"tag":181,"props":1357,"children":1358},{"style":205},[1359],{"type":36,"value":390},{"type":31,"tag":181,"props":1361,"children":1362},{"style":489},[1363],{"type":36,"value":1364},"email_sha256",{"type":31,"tag":181,"props":1366,"children":1367},{"style":205},[1368],{"type":36,"value":46},{"type":31,"tag":181,"props":1370,"children":1371},{"style":188},[1372],{"type":36,"value":1373},"NULL",{"type":31,"tag":181,"props":1375,"children":1376},{"style":205},[1377],{"type":36,"value":815},{"type":31,"tag":181,"props":1379,"children":1380},{"style":188},[1381],{"type":36,"value":596},{"type":31,"tag":181,"props":1383,"children":1384},{"style":205},[1385],{"type":36,"value":1386}," email_hash,\n",{"type":31,"tag":181,"props":1388,"children":1389},{"class":183,"line":331},[1390,1394,1398,1402,1406,1411,1415,1419,1423,1427],{"type":31,"tag":181,"props":1391,"children":1392},{"style":489},[1393],{"type":36,"value":1346},{"type":31,"tag":181,"props":1395,"children":1396},{"style":205},[1397],{"type":36,"value":805},{"type":31,"tag":181,"props":1399,"children":1400},{"style":489},[1401],{"type":36,"value":1355},{"type":31,"tag":181,"props":1403,"children":1404},{"style":205},[1405],{"type":36,"value":390},{"type":31,"tag":181,"props":1407,"children":1408},{"style":489},[1409],{"type":36,"value":1410},"ga_client_id",{"type":31,"tag":181,"props":1412,"children":1413},{"style":205},[1414],{"type":36,"value":46},{"type":31,"tag":181,"props":1416,"children":1417},{"style":188},[1418],{"type":36,"value":1373},{"type":31,"tag":181,"props":1420,"children":1421},{"style":205},[1422],{"type":36,"value":815},{"type":31,"tag":181,"props":1424,"children":1425},{"style":188},[1426],{"type":36,"value":596},{"type":31,"tag":181,"props":1428,"children":1429},{"style":205},[1430],{"type":36,"value":1431}," cookie_id,\n",{"type":31,"tag":181,"props":1433,"children":1434},{"class":183,"line":25},[1435],{"type":31,"tag":181,"props":1436,"children":1437},{"style":205},[1438],{"type":36,"value":1439},"    event_params\n",{"type":31,"tag":181,"props":1441,"children":1442},{"class":183,"line":706},[1443,1447,1452,1457,1461,1466],{"type":31,"tag":181,"props":1444,"children":1445},{"style":188},[1446],{"type":36,"value":675},{"type":31,"tag":181,"props":1448,"children":1449},{"style":205},[1450],{"type":36,"value":1451}," {{ source(",{"type":31,"tag":181,"props":1453,"children":1454},{"style":456},[1455],{"type":36,"value":1456},"'bigquery'",{"type":31,"tag":181,"props":1458,"children":1459},{"style":205},[1460],{"type":36,"value":46},{"type":31,"tag":181,"props":1462,"children":1463},{"style":456},[1464],{"type":36,"value":1465},"'events_raw'",{"type":31,"tag":181,"props":1467,"children":1468},{"style":205},[1469],{"type":36,"value":1288},{"type":31,"tag":181,"props":1471,"children":1472},{"class":183,"line":715},[1473,1478,1483],{"type":31,"tag":181,"props":1474,"children":1475},{"style":205},[1476],{"type":36,"value":1477},"  {% ",{"type":31,"tag":181,"props":1479,"children":1480},{"style":188},[1481],{"type":36,"value":1482},"if",{"type":31,"tag":181,"props":1484,"children":1485},{"style":205},[1486],{"type":36,"value":1487}," is_incremental() %}\n",{"type":31,"tag":181,"props":1489,"children":1490},{"class":183,"line":732},[1491,1495,1500,1505,1510,1514,1519,1523,1527],{"type":31,"tag":181,"props":1492,"children":1493},{"style":188},[1494],{"type":36,"value":688},{"type":31,"tag":181,"props":1496,"children":1497},{"style":205},[1498],{"type":36,"value":1499}," event_timestamp ",{"type":31,"tag":181,"props":1501,"children":1502},{"style":188},[1503],{"type":36,"value":1504},">",{"type":31,"tag":181,"props":1506,"children":1507},{"style":205},[1508],{"type":36,"value":1509}," (",{"type":31,"tag":181,"props":1511,"children":1512},{"style":188},[1513],{"type":36,"value":417},{"type":31,"tag":181,"props":1515,"children":1516},{"style":489},[1517],{"type":36,"value":1518}," MAX",{"type":31,"tag":181,"props":1520,"children":1521},{"style":205},[1522],{"type":36,"value":760},{"type":31,"tag":181,"props":1524,"children":1525},{"style":188},[1526],{"type":36,"value":430},{"type":31,"tag":181,"props":1528,"children":1529},{"style":205},[1530],{"type":36,"value":1531}," {{ this }})\n",{"type":31,"tag":181,"props":1533,"children":1534},{"class":183,"line":740},[1535],{"type":31,"tag":181,"props":1536,"children":1537},{"style":205},[1538],{"type":36,"value":1539},"  {% endif %}\n",{"type":31,"tag":181,"props":1541,"children":1542},{"class":183,"line":749},[1543],{"type":31,"tag":181,"props":1544,"children":1545},{"style":205},[1546],{"type":36,"value":911},{"type":31,"tag":181,"props":1548,"children":1549},{"class":183,"line":772},[1550,1554,1559,1564],{"type":31,"tag":181,"props":1551,"children":1552},{"style":188},[1553],{"type":36,"value":417},{"type":31,"tag":181,"props":1555,"children":1556},{"style":188},[1557],{"type":36,"value":1558}," *",{"type":31,"tag":181,"props":1560,"children":1561},{"style":188},[1562],{"type":36,"value":1563}," FROM",{"type":31,"tag":181,"props":1565,"children":1566},{"style":205},[1567],{"type":36,"value":1568}," events_with_signals;\n",{"type":31,"tag":32,"props":1570,"children":1571},{},[1572,1574,1580],{"type":36,"value":1573},"Il modello incrementale gira ogni ora e elabora l'ultimo batch. La logica di merge dell'identità sta in un modello separato (",{"type":31,"tag":39,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":36,"value":1579},"models\u002Fcore\u002Ffct_identity_resolved.sql",{"type":36,"value":1259},{"type":31,"tag":171,"props":1582,"children":1584},{"className":173,"code":1583,"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",[1585],{"type":31,"tag":39,"props":1586,"children":1587},{"__ignoreMap":15},[1588,1595,1615,1670,1686,1708,1730,1756,1786,1822,1842,1866,1895],{"type":31,"tag":181,"props":1589,"children":1590},{"class":183,"line":184},[1591],{"type":31,"tag":181,"props":1592,"children":1593},{"style":188},[1594],{"type":36,"value":920},{"type":31,"tag":181,"props":1596,"children":1597},{"class":183,"line":211},[1598,1603,1607,1611],{"type":31,"tag":181,"props":1599,"children":1600},{"style":489},[1601],{"type":36,"value":1602},"  e",{"type":31,"tag":181,"props":1604,"children":1605},{"style":205},[1606],{"type":36,"value":390},{"type":31,"tag":181,"props":1608,"children":1609},{"style":489},[1610],{"type":36,"value":938},{"type":31,"tag":181,"props":1612,"children":1613},{"style":205},[1614],{"type":36,"value":297},{"type":31,"tag":181,"props":1616,"children":1617},{"class":183,"line":236},[1618,1623,1627,1632,1636,1640,1644,1649,1653,1657,1661,1665],{"type":31,"tag":181,"props":1619,"children":1620},{"style":489},[1621],{"type":36,"value":1622},"  COALESCE",{"type":31,"tag":181,"props":1624,"children":1625},{"style":205},[1626],{"type":36,"value":805},{"type":31,"tag":181,"props":1628,"children":1629},{"style":489},[1630],{"type":36,"value":1631},"im_email",{"type":31,"tag":181,"props":1633,"children":1634},{"style":205},[1635],{"type":36,"value":390},{"type":31,"tag":181,"props":1637,"children":1638},{"style":489},[1639],{"type":36,"value":1048},{"type":31,"tag":181,"props":1641,"children":1642},{"style":205},[1643],{"type":36,"value":46},{"type":31,"tag":181,"props":1645,"children":1646},{"style":489},[1647],{"type":36,"value":1648},"im_cookie",{"type":31,"tag":181,"props":1650,"children":1651},{"style":205},[1652],{"type":36,"value":390},{"type":31,"tag":181,"props":1654,"children":1655},{"style":489},[1656],{"type":36,"value":1048},{"type":31,"tag":181,"props":1658,"children":1659},{"style":205},[1660],{"type":36,"value":815},{"type":31,"tag":181,"props":1662,"children":1663},{"style":188},[1664],{"type":36,"value":596},{"type":31,"tag":181,"props":1666,"children":1667},{"style":205},[1668],{"type":36,"value":1669}," canonical_id,\n",{"type":31,"tag":181,"props":1671,"children":1672},{"class":183,"line":259},[1673,1677,1681],{"type":31,"tag":181,"props":1674,"children":1675},{"style":489},[1676],{"type":36,"value":1602},{"type":31,"tag":181,"props":1678,"children":1679},{"style":205},[1680],{"type":36,"value":390},{"type":31,"tag":181,"props":1682,"children":1683},{"style":489},[1684],{"type":36,"value":1685},"event_timestamp\n",{"type":31,"tag":181,"props":1687,"children":1688},{"class":183,"line":281},[1689,1693,1698,1703],{"type":31,"tag":181,"props":1690,"children":1691},{"style":188},[1692],{"type":36,"value":430},{"type":31,"tag":181,"props":1694,"children":1695},{"style":205},[1696],{"type":36,"value":1697}," {{ ref(",{"type":31,"tag":181,"props":1699,"children":1700},{"style":456},[1701],{"type":36,"value":1702},"'stg_events'",{"type":31,"tag":181,"props":1704,"children":1705},{"style":205},[1706],{"type":36,"value":1707},") }} e\n",{"type":31,"tag":181,"props":1709,"children":1710},{"class":183,"line":300},[1711,1716,1720,1725],{"type":31,"tag":181,"props":1712,"children":1713},{"style":188},[1714],{"type":36,"value":1715},"LEFT JOIN",{"type":31,"tag":181,"props":1717,"children":1718},{"style":205},[1719],{"type":36,"value":1697},{"type":31,"tag":181,"props":1721,"children":1722},{"style":456},[1723],{"type":36,"value":1724},"'identity_map'",{"type":31,"tag":181,"props":1726,"children":1727},{"style":205},[1728],{"type":36,"value":1729},") }} im_email\n",{"type":31,"tag":181,"props":1731,"children":1732},{"class":183,"line":317},[1733,1738,1743,1747,1751],{"type":31,"tag":181,"props":1734,"children":1735},{"style":188},[1736],{"type":36,"value":1737},"  ON",{"type":31,"tag":181,"props":1739,"children":1740},{"style":489},[1741],{"type":36,"value":1742}," e",{"type":31,"tag":181,"props":1744,"children":1745},{"style":205},[1746],{"type":36,"value":390},{"type":31,"tag":181,"props":1748,"children":1749},{"style":489},[1750],{"type":36,"value":59},{"type":31,"tag":181,"props":1752,"children":1753},{"style":188},[1754],{"type":36,"value":1755}," IS NOT NULL\n",{"type":31,"tag":181,"props":1757,"children":1758},{"class":183,"line":331},[1759,1764,1769,1773,1777,1781],{"type":31,"tag":181,"props":1760,"children":1761},{"style":188},[1762],{"type":36,"value":1763},"  AND",{"type":31,"tag":181,"props":1765,"children":1766},{"style":489},[1767],{"type":36,"value":1768}," im_email",{"type":31,"tag":181,"props":1770,"children":1771},{"style":205},[1772],{"type":36,"value":390},{"type":31,"tag":181,"props":1774,"children":1775},{"style":489},[1776],{"type":36,"value":1158},{"type":31,"tag":181,"props":1778,"children":1779},{"style":188},[1780],{"type":36,"value":1020},{"type":31,"tag":181,"props":1782,"children":1783},{"style":456},[1784],{"type":36,"value":1785}," 'email_sha256'\n",{"type":31,"tag":181,"props":1787,"children":1788},{"class":183,"line":25},[1789,1793,1797,1801,1805,1809,1813,1817],{"type":31,"tag":181,"props":1790,"children":1791},{"style":188},[1792],{"type":36,"value":1763},{"type":31,"tag":181,"props":1794,"children":1795},{"style":489},[1796],{"type":36,"value":1768},{"type":31,"tag":181,"props":1798,"children":1799},{"style":205},[1800],{"type":36,"value":390},{"type":31,"tag":181,"props":1802,"children":1803},{"style":489},[1804],{"type":36,"value":1165},{"type":31,"tag":181,"props":1806,"children":1807},{"style":188},[1808],{"type":36,"value":1020},{"type":31,"tag":181,"props":1810,"children":1811},{"style":489},[1812],{"type":36,"value":1742},{"type":31,"tag":181,"props":1814,"children":1815},{"style":205},[1816],{"type":36,"value":390},{"type":31,"tag":181,"props":1818,"children":1819},{"style":489},[1820],{"type":36,"value":1821},"email_hash\n",{"type":31,"tag":181,"props":1823,"children":1824},{"class":183,"line":706},[1825,1829,1833,1837],{"type":31,"tag":181,"props":1826,"children":1827},{"style":188},[1828],{"type":36,"value":1715},{"type":31,"tag":181,"props":1830,"children":1831},{"style":205},[1832],{"type":36,"value":1697},{"type":31,"tag":181,"props":1834,"children":1835},{"style":456},[1836],{"type":36,"value":1724},{"type":31,"tag":181,"props":1838,"children":1839},{"style":205},[1840],{"type":36,"value":1841},") }} im_cookie\n",{"type":31,"tag":181,"props":1843,"children":1844},{"class":183,"line":715},[1845,1849,1853,1857,1862],{"type":31,"tag":181,"props":1846,"children":1847},{"style":188},[1848],{"type":36,"value":1737},{"type":31,"tag":181,"props":1850,"children":1851},{"style":489},[1852],{"type":36,"value":1742},{"type":31,"tag":181,"props":1854,"children":1855},{"style":205},[1856],{"type":36,"value":390},{"type":31,"tag":181,"props":1858,"children":1859},{"style":489},[1860],{"type":36,"value":1861},"cookie_id",{"type":31,"tag":181,"props":1863,"children":1864},{"style":188},[1865],{"type":36,"value":1755},{"type":31,"tag":181,"props":1867,"children":1868},{"class":183,"line":732},[1869,1873,1878,1882,1886,1890],{"type":31,"tag":181,"props":1870,"children":1871},{"style":188},[1872],{"type":36,"value":1763},{"type":31,"tag":181,"props":1874,"children":1875},{"style":489},[1876],{"type":36,"value":1877}," im_cookie",{"type":31,"tag":181,"props":1879,"children":1880},{"style":205},[1881],{"type":36,"value":390},{"type":31,"tag":181,"props":1883,"children":1884},{"style":489},[1885],{"type":36,"value":1158},{"type":31,"tag":181,"props":1887,"children":1888},{"style":188},[1889],{"type":36,"value":1020},{"type":31,"tag":181,"props":1891,"children":1892},{"style":456},[1893],{"type":36,"value":1894}," 'cookie'\n",{"type":31,"tag":181,"props":1896,"children":1897},{"class":183,"line":740},[1898,1902,1906,1910,1914,1918,1922,1926,1930],{"type":31,"tag":181,"props":1899,"children":1900},{"style":188},[1901],{"type":36,"value":1763},{"type":31,"tag":181,"props":1903,"children":1904},{"style":489},[1905],{"type":36,"value":1877},{"type":31,"tag":181,"props":1907,"children":1908},{"style":205},[1909],{"type":36,"value":390},{"type":31,"tag":181,"props":1911,"children":1912},{"style":489},[1913],{"type":36,"value":1165},{"type":31,"tag":181,"props":1915,"children":1916},{"style":188},[1917],{"type":36,"value":1020},{"type":31,"tag":181,"props":1919,"children":1920},{"style":489},[1921],{"type":36,"value":1742},{"type":31,"tag":181,"props":1923,"children":1924},{"style":205},[1925],{"type":36,"value":390},{"type":31,"tag":181,"props":1927,"children":1928},{"style":489},[1929],{"type":36,"value":1861},{"type":31,"tag":181,"props":1931,"children":1932},{"style":205},[1933],{"type":36,"value":497},{"type":31,"tag":32,"props":1935,"children":1936},{},[1937,1939,1945],{"type":36,"value":1938},"Questa logica di join esegue il hash matching deterministico. Per il probabilistico, aggiungete un modello separato ",{"type":31,"tag":39,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":36,"value":1944},"fct_probabilistic_clusters",{"type":36,"value":390},{"type":31,"tag":63,"props":1947,"children":1949},{"id":1948},"consenso-e-privacy-conformità-gdpr-ccpa",[1950],{"type":36,"value":1951},"Consenso e privacy: conformità GDPR, CCPA",{"type":31,"tag":32,"props":1953,"children":1954},{},[1955,1957,1962],{"type":36,"value":1956},"La risoluzione dell'identità è soggetta all'Articolo 6 GDPR (base legale) e alle norme CCPA \"do not sell\". L'hash email è considerato ",{"type":31,"tag":75,"props":1958,"children":1959},{},[1960],{"type":36,"value":1961},"personal data",{"type":36,"value":1963}," (sentenza CJEU 2019), per cui occorre consenso o interest legittimo.",{"type":31,"tag":32,"props":1965,"children":1966},{},[1967,1969,1975,1976,1981,1983,1989],{"type":36,"value":1968},"Sotto Consent Mode v2, se l'utente imposta analytics_storage=denied, non potete raccogliere l'hash email. In questo caso potete usare solo fingerprint IP+UA (base di interest legittimo — ma l'interpretazione CJEU è controversa). Best practice: aggiungete la colonna ",{"type":31,"tag":39,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":36,"value":1974},"consent_status",{"type":36,"value":1185},{"type":31,"tag":39,"props":1977,"children":1979},{"className":1978},[],[1980],{"type":36,"value":155},{"type":36,"value":1982}," e scrivete l'hash solo da eventi con ",{"type":31,"tag":39,"props":1984,"children":1986},{"className":1985},[],[1987],{"type":36,"value":1988},"analytics_storage=granted",{"type":36,"value":390},{"type":31,"tag":32,"props":1991,"children":1992},{},[1993,1995,2000],{"type":36,"value":1994},"Per il \"right to delete\" CCPA, serviva logica di cancellazione per ",{"type":31,"tag":39,"props":1996,"children":1998},{"className":1997},[],[1999],{"type":36,"value":1048},{"type":36,"value":169},{"type":31,"tag":171,"props":2002,"children":2004},{"className":173,"code":2003,"language":175,"meta":15,"style":15},"DELETE FROM identity_map WHERE canonical_id = 'uuid-123';\nDELETE FROM events WHERE canonical_id = 'uuid-123';\n",[2005],{"type":31,"tag":39,"props":2006,"children":2007},{"__ignoreMap":15},[2008,2046],{"type":31,"tag":181,"props":2009,"children":2010},{"class":183,"line":184},[2011,2016,2020,2025,2029,2033,2037,2042],{"type":31,"tag":181,"props":2012,"children":2013},{"style":188},[2014],{"type":36,"value":2015},"DELETE",{"type":31,"tag":181,"props":2017,"children":2018},{"style":188},[2019],{"type":36,"value":1563},{"type":31,"tag":181,"props":2021,"children":2022},{"style":205},[2023],{"type":36,"value":2024}," identity_map ",{"type":31,"tag":181,"props":2026,"children":2027},{"style":188},[2028],{"type":36,"value":443},{"type":31,"tag":181,"props":2030,"children":2031},{"style":205},[2032],{"type":36,"value":693},{"type":31,"tag":181,"props":2034,"children":2035},{"style":188},[2036],{"type":36,"value":453},{"type":31,"tag":181,"props":2038,"children":2039},{"style":456},[2040],{"type":36,"value":2041}," 'uuid-123'",{"type":31,"tag":181,"props":2043,"children":2044},{"style":205},[2045],{"type":36,"value":497},{"type":31,"tag":181,"props":2047,"children":2048},{"class":183,"line":211},[2049,2053,2057,2062,2066,2070,2074,2078],{"type":31,"tag":181,"props":2050,"children":2051},{"style":188},[2052],{"type":36,"value":2015},{"type":31,"tag":181,"props":2054,"children":2055},{"style":188},[2056],{"type":36,"value":1563},{"type":31,"tag":181,"props":2058,"children":2059},{"style":205},[2060],{"type":36,"value":2061}," events ",{"type":31,"tag":181,"props":2063,"children":2064},{"style":188},[2065],{"type":36,"value":443},{"type":31,"tag":181,"props":2067,"children":2068},{"style":205},[2069],{"type":36,"value":693},{"type":31,"tag":181,"props":2071,"children":2072},{"style":188},[2073],{"type":36,"value":453},{"type":31,"tag":181,"props":2075,"children":2076},{"style":456},[2077],{"type":36,"value":2041},{"type":31,"tag":181,"props":2079,"children":2080},{"style":205},[2081],{"type":36,"value":497},{"type":31,"tag":32,"props":2083,"children":2084},{},[2085,2087,2093],{"type":36,"value":2086},"Per cancellazione a cascata usate foreign key constraint (BigQuery non lo supporta nativamente, ma Postgres\u002FSnowflake sì). Alternativa: soft delete (",{"type":31,"tag":39,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":36,"value":2092},"deleted_at TIMESTAMP",{"type":36,"value":2094},") e purge batch successiva.",{"type":31,"tag":512,"props":2096,"children":2098},{"id":2097},"mapping-vendor-tcf-22",[2099],{"type":36,"value":2100},"Mapping vendor TCF 2.2",{"type":31,"tag":32,"props":2102,"children":2103},{},[2104,2106,2112],{"type":36,"value":2105},"Sotto IAB TCF 2.2, la risoluzione dell'identità rientra in \"Purpose 1 — Store and\u002For access information on a device\". Se l'utente non ha approvato il vostro vendor nella vendor list, non potete fare linking cross-device. Nei progetti Roibase, parsed la stringa TCF in BigQuery e scriviamo ",{"type":31,"tag":39,"props":2107,"children":2109},{"className":2108},[],[2110],{"type":36,"value":2111},"vendor_consent",{"type":36,"value":2113},", poi applichiamo il filtro durante il merge dell'identità:",{"type":31,"tag":171,"props":2115,"children":2117},{"className":173,"code":2116,"language":175,"meta":15,"style":15},"WHERE vendor_consent LIKE '%vendor_id=123%'\n",[2118],{"type":31,"tag":39,"props":2119,"children":2120},{"__ignoreMap":15},[2121],{"type":31,"tag":181,"props":2122,"children":2123},{"class":183,"line":184},[2124,2128,2133,2138],{"type":31,"tag":181,"props":2125,"children":2126},{"style":188},[2127],{"type":36,"value":443},{"type":31,"tag":181,"props":2129,"children":2130},{"style":205},[2131],{"type":36,"value":2132}," vendor_consent ",{"type":31,"tag":181,"props":2134,"children":2135},{"style":188},[2136],{"type":36,"value":2137},"LIKE",{"type":31,"tag":181,"props":2139,"children":2140},{"style":456},[2141],{"type":36,"value":2142}," '%vendor_id=123%'\n",{"type":31,"tag":32,"props":2144,"children":2145},{},[2146],{"type":36,"value":2147},"Questa logica impedisce di costruire il grafo dell'identità senza consenso — equilibrio tra compliance e qualità dei dati.",{"type":31,"tag":63,"props":2149,"children":2151},{"id":2150},"integrazione-cdp-segment-mparticle-rudderstack",[2152],{"type":36,"value":2153},"Integrazione CDP: Segment, mParticle, Rudderstack",{"type":31,"tag":32,"props":2155,"children":2156},{},[2157,2159,2166,2168,2174,2176,2182,2183,2189],{"type":36,"value":2158},"I CDP moderni espongono i loro graph dell'identità, ma spesso come scatola nera. Costruendo la vostra pipeline, controllate la logica del graph — specialmente critico nel progetto ",{"type":31,"tag":539,"props":2160,"children":2163},{"href":2161,"rel":2162},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fretention-engineering-cdp",[543],[2164],{"type":36,"value":2165},"CDP & Retention Engineering",{"type":36,"value":2167},". La chiamata ",{"type":31,"tag":39,"props":2169,"children":2171},{"className":2170},[],[2172],{"type":36,"value":2173},"identify()",{"type":36,"value":2175}," di Segment unisce ",{"type":31,"tag":39,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":36,"value":2181},"userId",{"type":36,"value":131},{"type":31,"tag":39,"props":2184,"children":2186},{"className":2185},[],[2187],{"type":36,"value":2188},"anonymousId",{"type":36,"value":2190},", ma quale segnale ha priorità? Nel vostro resolution logic la sequenza di priorità è trasparente:",{"type":31,"tag":1106,"props":2192,"children":2193},{},[2194,2205,2215,2225,2236],{"type":31,"tag":1110,"props":2195,"children":2196},{},[2197,2203],{"type":31,"tag":39,"props":2198,"children":2200},{"className":2199},[],[2201],{"type":36,"value":2202},"customer_id",{"type":36,"value":2204}," (CRM) → più affidabile",{"type":31,"tag":1110,"props":2206,"children":2207},{},[2208,2213],{"type":31,"tag":39,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":36,"value":1364},{"type":36,"value":2214}," → deterministico",{"type":31,"tag":1110,"props":2216,"children":2217},{},[2218,2223],{"type":31,"tag":39,"props":2219,"children":2221},{"className":2220},[],[2222],{"type":36,"value":44},{"type":36,"value":2224}," → cross-session ma non cross-device",{"type":31,"tag":1110,"props":2226,"children":2227},{},[2228,2234],{"type":31,"tag":39,"props":2229,"children":2231},{"className":2230},[],[2232],{"type":36,"value":2233},"cookie",{"type":36,"value":2235}," → TTL più breve",{"type":31,"tag":1110,"props":2237,"children":2238},{},[2239,2244],{"type":31,"tag":39,"props":2240,"children":2242},{"className":2241},[],[2243],{"type":36,"value":960},{"type":36,"value":2245}," → fallback probabilistico",{"type":31,"tag":32,"props":2247,"children":2248},{},[2249,2251,2257,2259,2264,2266,2272],{"type":36,"value":2250},"Codificate questa priorità in dbt con una catena ",{"type":31,"tag":39,"props":2252,"children":2254},{"className":2253},[],[2255],{"type":36,"value":2256},"COALESCE()",{"type":36,"value":2258},". Al CDP inviate solo il ",{"type":31,"tag":39,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":36,"value":1048},{"type":36,"value":2265}," finale e il ",{"type":31,"tag":39,"props":2267,"children":2269},{"className":2268},[],[2270],{"type":36,"value":2271},"confidence_score",{"type":36,"value":2273},", la logica di merge resta vostre.",{"type":31,"tag":32,"props":2275,"children":2276},{},[2277],{"type":36,"value":2278},"La risoluzione dell'identità è lo strato fondamentale dello stack dati di marketing moderno. L'hash matching offre certezza deterministica, il probabilistic linking copertura, l'household graph segmentazione a livello familiare. Quando una pipeline server-side unifica questi sei segnali in conformità alle normative su consenso e privacy, l'accuratezza dell'utente unico sale del 40%, le coorti di retention perdono il bias, i test di incrementalità diventano affidabili. Costruendo la vostra logica di risoluzione con BigQuery + dbt + sGTM, gestite il grafo come volete senza dipendere dalla scatola nera di un vendor.",{"type":31,"tag":2280,"props":2281,"children":2282},"style",{},[2283],{"type":36,"value":2284},"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":2286},[2287,2288,2291,2294,2295,2298],{"id":65,"depth":211,"text":68},{"id":141,"depth":211,"text":144,"children":2289},[2290],{"id":514,"depth":236,"text":517},{"id":551,"depth":211,"text":554,"children":2292},[2293],{"id":1085,"depth":236,"text":1088},{"id":1096,"depth":211,"text":1099},{"id":1948,"depth":211,"text":1951,"children":2296},[2297],{"id":2097,"depth":236,"text":2100},{"id":2150,"depth":211,"text":2153},"markdown","content:it:data:risoluzione-identita-sei-segnali-a-profilo-cliente-unico.md","content","it\u002Fdata\u002Frisoluzione-identita-sei-segnali-a-profilo-cliente-unico.md","it\u002Fdata\u002Frisoluzione-identita-sei-segnali-a-profilo-cliente-unico","md",1785967492663]