[{"data":1,"prerenderedAt":2394},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fdata\u002Frisoluzione-identita-6-segnali-a-profilo-unico":12},{"i18nKey":4,"paths":5},"data-003-2026-05",{"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-six-signals-to-unified-customer-identity","\u002Fes\u002Fdata\u002Fresolucion-de-identidad-de-6-senales-a-perfil-unico","\u002Ffr\u002Fdata\u002Fresolution-identite-6-signaux-vers-une-identite-client-unifiee","\u002Fit\u002Fdata\u002Frisoluzione-identita-6-segnali-a-profilo-unico","\u002Fru\u002Fdata\u002Fidentity-resolution-6-signalov-k-edinomu-identifikacionnomu-kodu-polzovatelya",{"_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":2388,"_id":2389,"_source":2390,"_file":2391,"_stem":2392,"_extension":2393},"data",false,"","Identity Resolution: Da 6 Segnali a Profilo Cliente Unico","Architettura tecnica di hash matching, probabilistic linking e household identity per unificare segnali dispersi in un profilo cliente coeso.","2026-05-31",[20,21,22,23,24],"identity-resolution","cdp","first-party-data","probabilistic-matching","hash-matching",8,"Roibase",{"type":28,"children":29,"toc":2380},"root",[30,38,45,75,406,434,469,475,480,493,1029,1049,1069,1075,1088,1100,1264,1297,1312,1318,1347,1352,1638,1643,1649,1654,1659,1694,1700,1705,2298,2334,2348,2374],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35],{"type":36,"value":37},"text","Un utente si registra via email, ordina dall'app mobile, il giorno dopo apre una richiesta di supporto dal browser desktop. Cookie ID, device ID, hashed email, IP, session ID, user ID — sei segnali diversi. Senza identity resolution, sembrano sei \"clienti\" differenti. L'attribuzione pubblicitaria viene calcolata male, il modello LTV resta distorto, il segnale di retention va perso. User ID merge di Google Analytics 4 unisce solo le sessioni autenticate, non il comportamento anonimo. I CDP promettono \"probabilistic stitching\" ma non mostrano le strutture dati sottostanti. Per portare un identity graph in production, hai bisogno di hash matching, probabilistic linking e household identity che lavorino insieme.",{"type":31,"tag":39,"props":40,"children":42},"h2",{"id":41},"hash-matching-lomero-della-fusione-deterministica",[43],{"type":36,"value":44},"Hash Matching: L'Omero della Fusione Deterministica",{"type":31,"tag":32,"props":46,"children":47},{},[48,50,57,59,65,67,73],{"type":36,"value":49},"Hash matching crea una connessione \"certa\" tra due segnali abbinando gli hash SHA-256 dello stesso indirizzo email o numero di telefono. Quando l'utente si registra sul sito web inviando ",{"type":31,"tag":51,"props":52,"children":54},"code",{"className":53},[],[55],{"type":36,"value":56},"user@example.com",{"type":36,"value":58},", hash il valore con SHA-256 e scrivilo nella tabella ",{"type":31,"tag":51,"props":60,"children":62},{"className":61},[],[63],{"type":36,"value":64},"identity_signals",{"type":36,"value":66}," di BigQuery come colonna ",{"type":31,"tag":51,"props":68,"children":70},{"className":69},[],[71],{"type":36,"value":72},"hashed_email",{"type":36,"value":74},". Quando lo stesso indirizzo email accede dall'app mobile, l'hash sarà identico e potrai unire i due record.",{"type":31,"tag":76,"props":77,"children":81},"pre",{"className":78,"code":79,"language":80,"meta":15,"style":15},"language-sql shiki shiki-themes github-dark","-- Esempio di match deterministico in BigQuery\nCREATE OR REPLACE TABLE `project.dataset.merged_identities` AS\nSELECT\n  web.anonymous_id AS web_cookie_id,\n  mobile.device_id AS mobile_device_id,\n  web.hashed_email,\n  MIN(web.first_seen_timestamp) AS first_seen\nFROM `project.dataset.web_events` web\nINNER JOIN `project.dataset.mobile_events` mobile\n  ON web.hashed_email = mobile.hashed_email\nWHERE web.hashed_email IS NOT NULL\nGROUP BY 1,2,3;\n","sql",[82],{"type":31,"tag":51,"props":83,"children":84},{"__ignoreMap":15},[85,97,133,142,173,200,221,264,282,301,342,368],{"type":31,"tag":86,"props":87,"children":90},"span",{"class":88,"line":89},"line",1,[91],{"type":31,"tag":86,"props":92,"children":94},{"style":93},"--shiki-default:#6A737D",[95],{"type":36,"value":96},"-- Esempio di match deterministico in BigQuery\n",{"type":31,"tag":86,"props":98,"children":100},{"class":88,"line":99},2,[101,107,112,117,122,128],{"type":31,"tag":86,"props":102,"children":104},{"style":103},"--shiki-default:#F97583",[105],{"type":36,"value":106},"CREATE",{"type":31,"tag":86,"props":108,"children":109},{"style":103},[110],{"type":36,"value":111}," OR",{"type":31,"tag":86,"props":113,"children":114},{"style":103},[115],{"type":36,"value":116}," REPLACE",{"type":31,"tag":86,"props":118,"children":119},{"style":103},[120],{"type":36,"value":121}," TABLE",{"type":31,"tag":86,"props":123,"children":125},{"style":124},"--shiki-default:#9ECBFF",[126],{"type":36,"value":127}," `project.dataset.merged_identities`",{"type":31,"tag":86,"props":129,"children":130},{"style":103},[131],{"type":36,"value":132}," AS\n",{"type":31,"tag":86,"props":134,"children":136},{"class":88,"line":135},3,[137],{"type":31,"tag":86,"props":138,"children":139},{"style":103},[140],{"type":36,"value":141},"SELECT\n",{"type":31,"tag":86,"props":143,"children":145},{"class":88,"line":144},4,[146,152,158,163,168],{"type":31,"tag":86,"props":147,"children":149},{"style":148},"--shiki-default:#79B8FF",[150],{"type":36,"value":151},"  web",{"type":31,"tag":86,"props":153,"children":155},{"style":154},"--shiki-default:#E1E4E8",[156],{"type":36,"value":157},".",{"type":31,"tag":86,"props":159,"children":160},{"style":148},[161],{"type":36,"value":162},"anonymous_id",{"type":31,"tag":86,"props":164,"children":165},{"style":103},[166],{"type":36,"value":167}," AS",{"type":31,"tag":86,"props":169,"children":170},{"style":154},[171],{"type":36,"value":172}," web_cookie_id,\n",{"type":31,"tag":86,"props":174,"children":176},{"class":88,"line":175},5,[177,182,186,191,195],{"type":31,"tag":86,"props":178,"children":179},{"style":148},[180],{"type":36,"value":181},"  mobile",{"type":31,"tag":86,"props":183,"children":184},{"style":154},[185],{"type":36,"value":157},{"type":31,"tag":86,"props":187,"children":188},{"style":148},[189],{"type":36,"value":190},"device_id",{"type":31,"tag":86,"props":192,"children":193},{"style":103},[194],{"type":36,"value":167},{"type":31,"tag":86,"props":196,"children":197},{"style":154},[198],{"type":36,"value":199}," mobile_device_id,\n",{"type":31,"tag":86,"props":201,"children":203},{"class":88,"line":202},6,[204,208,212,216],{"type":31,"tag":86,"props":205,"children":206},{"style":148},[207],{"type":36,"value":151},{"type":31,"tag":86,"props":209,"children":210},{"style":154},[211],{"type":36,"value":157},{"type":31,"tag":86,"props":213,"children":214},{"style":148},[215],{"type":36,"value":72},{"type":31,"tag":86,"props":217,"children":218},{"style":154},[219],{"type":36,"value":220},",\n",{"type":31,"tag":86,"props":222,"children":224},{"class":88,"line":223},7,[225,230,235,240,244,249,254,259],{"type":31,"tag":86,"props":226,"children":227},{"style":148},[228],{"type":36,"value":229},"  MIN",{"type":31,"tag":86,"props":231,"children":232},{"style":154},[233],{"type":36,"value":234},"(",{"type":31,"tag":86,"props":236,"children":237},{"style":148},[238],{"type":36,"value":239},"web",{"type":31,"tag":86,"props":241,"children":242},{"style":154},[243],{"type":36,"value":157},{"type":31,"tag":86,"props":245,"children":246},{"style":148},[247],{"type":36,"value":248},"first_seen_timestamp",{"type":31,"tag":86,"props":250,"children":251},{"style":154},[252],{"type":36,"value":253},") ",{"type":31,"tag":86,"props":255,"children":256},{"style":103},[257],{"type":36,"value":258},"AS",{"type":31,"tag":86,"props":260,"children":261},{"style":154},[262],{"type":36,"value":263}," first_seen\n",{"type":31,"tag":86,"props":265,"children":266},{"class":88,"line":25},[267,272,277],{"type":31,"tag":86,"props":268,"children":269},{"style":103},[270],{"type":36,"value":271},"FROM",{"type":31,"tag":86,"props":273,"children":274},{"style":124},[275],{"type":36,"value":276}," `project.dataset.web_events`",{"type":31,"tag":86,"props":278,"children":279},{"style":154},[280],{"type":36,"value":281}," web\n",{"type":31,"tag":86,"props":283,"children":285},{"class":88,"line":284},9,[286,291,296],{"type":31,"tag":86,"props":287,"children":288},{"style":103},[289],{"type":36,"value":290},"INNER JOIN",{"type":31,"tag":86,"props":292,"children":293},{"style":124},[294],{"type":36,"value":295}," `project.dataset.mobile_events`",{"type":31,"tag":86,"props":297,"children":298},{"style":154},[299],{"type":36,"value":300}," mobile\n",{"type":31,"tag":86,"props":302,"children":304},{"class":88,"line":303},10,[305,310,315,319,323,328,333,337],{"type":31,"tag":86,"props":306,"children":307},{"style":103},[308],{"type":36,"value":309},"  ON",{"type":31,"tag":86,"props":311,"children":312},{"style":148},[313],{"type":36,"value":314}," web",{"type":31,"tag":86,"props":316,"children":317},{"style":154},[318],{"type":36,"value":157},{"type":31,"tag":86,"props":320,"children":321},{"style":148},[322],{"type":36,"value":72},{"type":31,"tag":86,"props":324,"children":325},{"style":103},[326],{"type":36,"value":327}," =",{"type":31,"tag":86,"props":329,"children":330},{"style":148},[331],{"type":36,"value":332}," mobile",{"type":31,"tag":86,"props":334,"children":335},{"style":154},[336],{"type":36,"value":157},{"type":31,"tag":86,"props":338,"children":339},{"style":148},[340],{"type":36,"value":341},"hashed_email\n",{"type":31,"tag":86,"props":343,"children":345},{"class":88,"line":344},11,[346,351,355,359,363],{"type":31,"tag":86,"props":347,"children":348},{"style":103},[349],{"type":36,"value":350},"WHERE",{"type":31,"tag":86,"props":352,"children":353},{"style":148},[354],{"type":36,"value":314},{"type":31,"tag":86,"props":356,"children":357},{"style":154},[358],{"type":36,"value":157},{"type":31,"tag":86,"props":360,"children":361},{"style":148},[362],{"type":36,"value":72},{"type":31,"tag":86,"props":364,"children":365},{"style":103},[366],{"type":36,"value":367}," IS NOT NULL\n",{"type":31,"tag":86,"props":369,"children":371},{"class":88,"line":370},12,[372,377,382,387,392,396,401],{"type":31,"tag":86,"props":373,"children":374},{"style":103},[375],{"type":36,"value":376},"GROUP BY",{"type":31,"tag":86,"props":378,"children":379},{"style":148},[380],{"type":36,"value":381}," 1",{"type":31,"tag":86,"props":383,"children":384},{"style":154},[385],{"type":36,"value":386},",",{"type":31,"tag":86,"props":388,"children":389},{"style":148},[390],{"type":36,"value":391},"2",{"type":31,"tag":86,"props":393,"children":394},{"style":154},[395],{"type":36,"value":386},{"type":31,"tag":86,"props":397,"children":398},{"style":148},[399],{"type":36,"value":400},"3",{"type":31,"tag":86,"props":402,"children":403},{"style":154},[404],{"type":36,"value":405},";\n",{"type":31,"tag":32,"props":407,"children":408},{},[409,411,416,418,424,426,432],{"type":36,"value":410},"La query unisce il cookie ID web con il device ID mobile attraverso l'hashed email. L'",{"type":31,"tag":51,"props":412,"children":414},{"className":413},[],[415],{"type":36,"value":290},{"type":36,"value":417}," è deterministico — arrivano solo i match certi. Per consolidare i segnali abbinati sotto un unico ",{"type":31,"tag":51,"props":419,"children":421},{"className":420},[],[422],{"type":36,"value":423},"canonical_user_id",{"type":36,"value":425},", usa ",{"type":31,"tag":51,"props":427,"children":429},{"className":428},[],[430],{"type":36,"value":431},"ROW_NUMBER()",{"type":36,"value":433}," o UUID generation. Il limite dell'hash matching: se l'utente cambia email (vecchio account + nuovo account), rimangono due identity separate. Qui entra in gioco il layer probabilistico.",{"type":31,"tag":32,"props":435,"children":436},{},[437,439,444,446,452,453,459,461,467],{"type":36,"value":438},"Hash matching è conforme a GDPR e KVKK perché non memorizzi l'email in chiaro — l'hash è unidirezionale e non reversibile. Tuttavia è vulnerabile agli attacchi di rainbow table, quindi accanto agli hash email aggiungi segnali secondari come device fingerprint o IP range. Una singola colonna hash non è sufficiente — mantieni ",{"type":31,"tag":51,"props":440,"children":442},{"className":441},[],[443],{"type":36,"value":72},{"type":36,"value":445},", ",{"type":31,"tag":51,"props":447,"children":449},{"className":448},[],[450],{"type":36,"value":451},"hashed_phone",{"type":36,"value":445},{"type":31,"tag":51,"props":454,"children":456},{"className":455},[],[457],{"type":36,"value":458},"hashed_customer_id",{"type":36,"value":460}," come colonne separate. Particiona la tabella per ",{"type":31,"tag":51,"props":462,"children":464},{"className":463},[],[465],{"type":36,"value":466},"DATE(timestamp)",{"type":36,"value":468}," — l'identity resolution è generalmente incrementale e uno scan full history è costoso.",{"type":31,"tag":39,"props":470,"children":472},{"id":471},"probabilistic-linking-gestire-lincertezza-con-i-punteggi",[473],{"type":36,"value":474},"Probabilistic Linking: Gestire l'Incertezza con i Punteggi",{"type":31,"tag":32,"props":476,"children":477},{},[478],{"type":36,"value":479},"Se l'utente naviga senza registrarsi, non c'è hashed email — hai cookie ID, IP, user agent, timestamp della sessione. Il matching probabilistico assegna una \"probabilità di essere la stessa persona\" a questi segnali ponderandoli. Se il punteggio supera una soglia (ad es. 0.85), unisci i due record; se è inferiore, mantienili separati. Vendor come LiveRamp, Merkle e Neustar vendono questi punteggi, ma puoi costruire un modello basato su regole nel tuo data warehouse.",{"type":31,"tag":32,"props":481,"children":482},{},[483,485,491],{"type":36,"value":484},"Logica di esempio: stesso IP + stesso fingerprint browser (canvas hash) + sessione entro 5 minuti → punteggio di corrispondenza 90%. Stesso IP + browser diverso + differenza di 2 ore → punteggio 40%. Se la soglia è 0.7, il primo paio si unisce, il secondo no. Puoi modellarlo in BigQuery con blocchi ",{"type":31,"tag":51,"props":486,"children":488},{"className":487},[],[489],{"type":36,"value":490},"CASE WHEN",{"type":36,"value":492},":",{"type":31,"tag":76,"props":494,"children":496},{"className":78,"code":495,"language":80,"meta":15,"style":15},"SELECT\n  a.session_id AS session_a,\n  b.session_id AS session_b,\n  CASE\n    WHEN a.ip_address = b.ip_address\n      AND a.canvas_hash = b.canvas_hash\n      AND TIMESTAMP_DIFF(b.timestamp, a.timestamp, MINUTE) \u003C= 5\n    THEN 0.90\n    WHEN a.ip_address = b.ip_address\n      AND TIMESTAMP_DIFF(b.timestamp, a.timestamp, HOUR) \u003C= 2\n    THEN 0.40\n    ELSE 0.0\n  END AS match_score\nFROM `project.dataset.anonymous_sessions` a\nCROSS JOIN `project.dataset.anonymous_sessions` b\nWHERE a.session_id \u003C b.session_id\n  AND a.ip_address = b.ip_address\nQUALIFY match_score >= 0.70;\n",[497],{"type":31,"tag":51,"props":498,"children":499},{"__ignoreMap":15},[500,507,533,558,566,606,644,710,732,767,828,848,869,887,905,923,961,998],{"type":31,"tag":86,"props":501,"children":502},{"class":88,"line":89},[503],{"type":31,"tag":86,"props":504,"children":505},{"style":103},[506],{"type":36,"value":141},{"type":31,"tag":86,"props":508,"children":509},{"class":88,"line":99},[510,515,519,524,528],{"type":31,"tag":86,"props":511,"children":512},{"style":148},[513],{"type":36,"value":514},"  a",{"type":31,"tag":86,"props":516,"children":517},{"style":154},[518],{"type":36,"value":157},{"type":31,"tag":86,"props":520,"children":521},{"style":148},[522],{"type":36,"value":523},"session_id",{"type":31,"tag":86,"props":525,"children":526},{"style":103},[527],{"type":36,"value":167},{"type":31,"tag":86,"props":529,"children":530},{"style":154},[531],{"type":36,"value":532}," session_a,\n",{"type":31,"tag":86,"props":534,"children":535},{"class":88,"line":135},[536,541,545,549,553],{"type":31,"tag":86,"props":537,"children":538},{"style":148},[539],{"type":36,"value":540},"  b",{"type":31,"tag":86,"props":542,"children":543},{"style":154},[544],{"type":36,"value":157},{"type":31,"tag":86,"props":546,"children":547},{"style":148},[548],{"type":36,"value":523},{"type":31,"tag":86,"props":550,"children":551},{"style":103},[552],{"type":36,"value":167},{"type":31,"tag":86,"props":554,"children":555},{"style":154},[556],{"type":36,"value":557}," session_b,\n",{"type":31,"tag":86,"props":559,"children":560},{"class":88,"line":144},[561],{"type":31,"tag":86,"props":562,"children":563},{"style":103},[564],{"type":36,"value":565},"  CASE\n",{"type":31,"tag":86,"props":567,"children":568},{"class":88,"line":175},[569,574,579,583,588,592,597,601],{"type":31,"tag":86,"props":570,"children":571},{"style":103},[572],{"type":36,"value":573},"    WHEN",{"type":31,"tag":86,"props":575,"children":576},{"style":148},[577],{"type":36,"value":578}," a",{"type":31,"tag":86,"props":580,"children":581},{"style":154},[582],{"type":36,"value":157},{"type":31,"tag":86,"props":584,"children":585},{"style":148},[586],{"type":36,"value":587},"ip_address",{"type":31,"tag":86,"props":589,"children":590},{"style":103},[591],{"type":36,"value":327},{"type":31,"tag":86,"props":593,"children":594},{"style":148},[595],{"type":36,"value":596}," b",{"type":31,"tag":86,"props":598,"children":599},{"style":154},[600],{"type":36,"value":157},{"type":31,"tag":86,"props":602,"children":603},{"style":148},[604],{"type":36,"value":605},"ip_address\n",{"type":31,"tag":86,"props":607,"children":608},{"class":88,"line":202},[609,614,618,622,627,631,635,639],{"type":31,"tag":86,"props":610,"children":611},{"style":103},[612],{"type":36,"value":613},"      AND",{"type":31,"tag":86,"props":615,"children":616},{"style":148},[617],{"type":36,"value":578},{"type":31,"tag":86,"props":619,"children":620},{"style":154},[621],{"type":36,"value":157},{"type":31,"tag":86,"props":623,"children":624},{"style":148},[625],{"type":36,"value":626},"canvas_hash",{"type":31,"tag":86,"props":628,"children":629},{"style":103},[630],{"type":36,"value":327},{"type":31,"tag":86,"props":632,"children":633},{"style":148},[634],{"type":36,"value":596},{"type":31,"tag":86,"props":636,"children":637},{"style":154},[638],{"type":36,"value":157},{"type":31,"tag":86,"props":640,"children":641},{"style":148},[642],{"type":36,"value":643},"canvas_hash\n",{"type":31,"tag":86,"props":645,"children":646},{"class":88,"line":223},[647,651,656,661,665,670,674,679,683,687,691,696,700,705],{"type":31,"tag":86,"props":648,"children":649},{"style":103},[650],{"type":36,"value":613},{"type":31,"tag":86,"props":652,"children":653},{"style":154},[654],{"type":36,"value":655}," TIMESTAMP_DIFF(",{"type":31,"tag":86,"props":657,"children":658},{"style":148},[659],{"type":36,"value":660},"b",{"type":31,"tag":86,"props":662,"children":663},{"style":154},[664],{"type":36,"value":157},{"type":31,"tag":86,"props":666,"children":667},{"style":148},[668],{"type":36,"value":669},"timestamp",{"type":31,"tag":86,"props":671,"children":672},{"style":154},[673],{"type":36,"value":445},{"type":31,"tag":86,"props":675,"children":676},{"style":148},[677],{"type":36,"value":678},"a",{"type":31,"tag":86,"props":680,"children":681},{"style":154},[682],{"type":36,"value":157},{"type":31,"tag":86,"props":684,"children":685},{"style":148},[686],{"type":36,"value":669},{"type":31,"tag":86,"props":688,"children":689},{"style":154},[690],{"type":36,"value":445},{"type":31,"tag":86,"props":692,"children":693},{"style":103},[694],{"type":36,"value":695},"MINUTE",{"type":31,"tag":86,"props":697,"children":698},{"style":154},[699],{"type":36,"value":253},{"type":31,"tag":86,"props":701,"children":702},{"style":103},[703],{"type":36,"value":704},"\u003C=",{"type":31,"tag":86,"props":706,"children":707},{"style":148},[708],{"type":36,"value":709}," 5\n",{"type":31,"tag":86,"props":711,"children":712},{"class":88,"line":25},[713,718,723,727],{"type":31,"tag":86,"props":714,"children":715},{"style":103},[716],{"type":36,"value":717},"    THEN",{"type":31,"tag":86,"props":719,"children":720},{"style":148},[721],{"type":36,"value":722}," 0",{"type":31,"tag":86,"props":724,"children":725},{"style":154},[726],{"type":36,"value":157},{"type":31,"tag":86,"props":728,"children":729},{"style":148},[730],{"type":36,"value":731},"90\n",{"type":31,"tag":86,"props":733,"children":734},{"class":88,"line":284},[735,739,743,747,751,755,759,763],{"type":31,"tag":86,"props":736,"children":737},{"style":103},[738],{"type":36,"value":573},{"type":31,"tag":86,"props":740,"children":741},{"style":148},[742],{"type":36,"value":578},{"type":31,"tag":86,"props":744,"children":745},{"style":154},[746],{"type":36,"value":157},{"type":31,"tag":86,"props":748,"children":749},{"style":148},[750],{"type":36,"value":587},{"type":31,"tag":86,"props":752,"children":753},{"style":103},[754],{"type":36,"value":327},{"type":31,"tag":86,"props":756,"children":757},{"style":148},[758],{"type":36,"value":596},{"type":31,"tag":86,"props":760,"children":761},{"style":154},[762],{"type":36,"value":157},{"type":31,"tag":86,"props":764,"children":765},{"style":148},[766],{"type":36,"value":605},{"type":31,"tag":86,"props":768,"children":769},{"class":88,"line":303},[770,774,778,782,786,790,794,798,802,806,810,815,819,823],{"type":31,"tag":86,"props":771,"children":772},{"style":103},[773],{"type":36,"value":613},{"type":31,"tag":86,"props":775,"children":776},{"style":154},[777],{"type":36,"value":655},{"type":31,"tag":86,"props":779,"children":780},{"style":148},[781],{"type":36,"value":660},{"type":31,"tag":86,"props":783,"children":784},{"style":154},[785],{"type":36,"value":157},{"type":31,"tag":86,"props":787,"children":788},{"style":148},[789],{"type":36,"value":669},{"type":31,"tag":86,"props":791,"children":792},{"style":154},[793],{"type":36,"value":445},{"type":31,"tag":86,"props":795,"children":796},{"style":148},[797],{"type":36,"value":678},{"type":31,"tag":86,"props":799,"children":800},{"style":154},[801],{"type":36,"value":157},{"type":31,"tag":86,"props":803,"children":804},{"style":148},[805],{"type":36,"value":669},{"type":31,"tag":86,"props":807,"children":808},{"style":154},[809],{"type":36,"value":445},{"type":31,"tag":86,"props":811,"children":812},{"style":103},[813],{"type":36,"value":814},"HOUR",{"type":31,"tag":86,"props":816,"children":817},{"style":154},[818],{"type":36,"value":253},{"type":31,"tag":86,"props":820,"children":821},{"style":103},[822],{"type":36,"value":704},{"type":31,"tag":86,"props":824,"children":825},{"style":148},[826],{"type":36,"value":827}," 2\n",{"type":31,"tag":86,"props":829,"children":830},{"class":88,"line":344},[831,835,839,843],{"type":31,"tag":86,"props":832,"children":833},{"style":103},[834],{"type":36,"value":717},{"type":31,"tag":86,"props":836,"children":837},{"style":148},[838],{"type":36,"value":722},{"type":31,"tag":86,"props":840,"children":841},{"style":154},[842],{"type":36,"value":157},{"type":31,"tag":86,"props":844,"children":845},{"style":148},[846],{"type":36,"value":847},"40\n",{"type":31,"tag":86,"props":849,"children":850},{"class":88,"line":370},[851,856,860,864],{"type":31,"tag":86,"props":852,"children":853},{"style":103},[854],{"type":36,"value":855},"    ELSE",{"type":31,"tag":86,"props":857,"children":858},{"style":148},[859],{"type":36,"value":722},{"type":31,"tag":86,"props":861,"children":862},{"style":154},[863],{"type":36,"value":157},{"type":31,"tag":86,"props":865,"children":866},{"style":148},[867],{"type":36,"value":868},"0\n",{"type":31,"tag":86,"props":870,"children":872},{"class":88,"line":871},13,[873,878,882],{"type":31,"tag":86,"props":874,"children":875},{"style":103},[876],{"type":36,"value":877},"  END",{"type":31,"tag":86,"props":879,"children":880},{"style":103},[881],{"type":36,"value":167},{"type":31,"tag":86,"props":883,"children":884},{"style":154},[885],{"type":36,"value":886}," match_score\n",{"type":31,"tag":86,"props":888,"children":890},{"class":88,"line":889},14,[891,895,900],{"type":31,"tag":86,"props":892,"children":893},{"style":103},[894],{"type":36,"value":271},{"type":31,"tag":86,"props":896,"children":897},{"style":124},[898],{"type":36,"value":899}," `project.dataset.anonymous_sessions`",{"type":31,"tag":86,"props":901,"children":902},{"style":154},[903],{"type":36,"value":904}," a\n",{"type":31,"tag":86,"props":906,"children":908},{"class":88,"line":907},15,[909,914,918],{"type":31,"tag":86,"props":910,"children":911},{"style":103},[912],{"type":36,"value":913},"CROSS JOIN",{"type":31,"tag":86,"props":915,"children":916},{"style":124},[917],{"type":36,"value":899},{"type":31,"tag":86,"props":919,"children":920},{"style":154},[921],{"type":36,"value":922}," b\n",{"type":31,"tag":86,"props":924,"children":926},{"class":88,"line":925},16,[927,931,935,939,943,948,952,956],{"type":31,"tag":86,"props":928,"children":929},{"style":103},[930],{"type":36,"value":350},{"type":31,"tag":86,"props":932,"children":933},{"style":148},[934],{"type":36,"value":578},{"type":31,"tag":86,"props":936,"children":937},{"style":154},[938],{"type":36,"value":157},{"type":31,"tag":86,"props":940,"children":941},{"style":148},[942],{"type":36,"value":523},{"type":31,"tag":86,"props":944,"children":945},{"style":103},[946],{"type":36,"value":947}," \u003C",{"type":31,"tag":86,"props":949,"children":950},{"style":148},[951],{"type":36,"value":596},{"type":31,"tag":86,"props":953,"children":954},{"style":154},[955],{"type":36,"value":157},{"type":31,"tag":86,"props":957,"children":958},{"style":148},[959],{"type":36,"value":960},"session_id\n",{"type":31,"tag":86,"props":962,"children":964},{"class":88,"line":963},17,[965,970,974,978,982,986,990,994],{"type":31,"tag":86,"props":966,"children":967},{"style":103},[968],{"type":36,"value":969},"  AND",{"type":31,"tag":86,"props":971,"children":972},{"style":148},[973],{"type":36,"value":578},{"type":31,"tag":86,"props":975,"children":976},{"style":154},[977],{"type":36,"value":157},{"type":31,"tag":86,"props":979,"children":980},{"style":148},[981],{"type":36,"value":587},{"type":31,"tag":86,"props":983,"children":984},{"style":103},[985],{"type":36,"value":327},{"type":31,"tag":86,"props":987,"children":988},{"style":148},[989],{"type":36,"value":596},{"type":31,"tag":86,"props":991,"children":992},{"style":154},[993],{"type":36,"value":157},{"type":31,"tag":86,"props":995,"children":996},{"style":148},[997],{"type":36,"value":605},{"type":31,"tag":86,"props":999,"children":1001},{"class":88,"line":1000},18,[1002,1007,1012,1016,1020,1025],{"type":31,"tag":86,"props":1003,"children":1004},{"style":154},[1005],{"type":36,"value":1006},"QUALIFY match_score ",{"type":31,"tag":86,"props":1008,"children":1009},{"style":103},[1010],{"type":36,"value":1011},">=",{"type":31,"tag":86,"props":1013,"children":1014},{"style":148},[1015],{"type":36,"value":722},{"type":31,"tag":86,"props":1017,"children":1018},{"style":154},[1019],{"type":36,"value":157},{"type":31,"tag":86,"props":1021,"children":1022},{"style":148},[1023],{"type":36,"value":1024},"70",{"type":31,"tag":86,"props":1026,"children":1027},{"style":154},[1028],{"type":36,"value":405},{"type":31,"tag":32,"props":1030,"children":1031},{},[1032,1034,1039,1041,1047],{"type":36,"value":1033},"La query esegue un ",{"type":31,"tag":51,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":36,"value":913},{"type":36,"value":1040}," — il costo esplode con milioni di righe. In production serve bucketing e window functions: particiona gli IP range per prefisso (ad es. ",{"type":31,"tag":51,"props":1042,"children":1044},{"className":1043},[],[1045],{"type":36,"value":1046},"\u002F24",{"type":36,"value":1048}," CIDR), confronta ogni sessione solo con le ultime 100. Il rischio del matching probabilistico è il falso positivo — due utenti diversi dallo stesso IP (Wi-Fi aziendale, VPN condivisa) nello stesso momento potrebbero essere erroneamente uniti. Perciò mantieni la soglia tra 0.85-0.90 e convalida con segnali cross-device.",{"type":31,"tag":32,"props":1050,"children":1051},{},[1052,1054,1060,1062,1067],{"type":36,"value":1053},"Un modello probabilistico basato su machine learning è più sofisticato: regressione logistica o gradient boosting per la classificazione binaria \"stesso utente\". Feature set: distanza Hamming dell'IP, somiglianza Levenshtein dello user agent, offset timezone, conteggio sessioni. I dati di training sono etichettati — esempi positivi dalle coppie di ",{"type":31,"tag":51,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":36,"value":1059},"user_id",{"type":36,"value":1061}," noti, esempi negativi da ",{"type":31,"tag":51,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":36,"value":1059},{"type":36,"value":1068}," diversi. Il modello restituisce un punteggio 0-1, la soglia rimane un tuning manuale. Costruire questo richiede una pipeline Vertex AI o Sagemaker — data engineering + ML engineering lavorano insieme.",{"type":31,"tag":39,"props":1070,"children":1072},{"id":1071},"household-identity-stesso-tetto-utenti-diversi",[1073],{"type":36,"value":1074},"Household Identity: Stesso Tetto, Utenti Diversi",{"type":31,"tag":32,"props":1076,"children":1077},{},[1078,1080,1086],{"type":36,"value":1079},"Nel layer di household identity dell'identity resolution: raggruppi gli utenti diversi dallo stesso IP o indirizzo fisico e li tratti come \"unità familiare\" per il targeting di marketing. Ad esempio, su un sito di e-commerce, la mamma guarda abbigliamento per bambini e il papà compra elettronica — due user ID diversi ma stesso indirizzo di spedizione. Il household graph li unisce sotto un ",{"type":31,"tag":51,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":36,"value":1085},"household_id",{"type":36,"value":1087},". Su piattaforme pubblicitarie (Facebook Ads, Google Ads) questo si chiama household targeting, ma devi modellarlo nei tuoi first-party data.",{"type":31,"tag":32,"props":1089,"children":1090},{},[1091,1093,1099],{"type":36,"value":1092},"Normalizza l'indirizzo di spedizione in BigQuery: rimuovi maiuscole\u002Fminuscole, spazi, variazioni nel numero dell'appartamento. Poi esegui l'hash e usalo come ",{"type":31,"tag":51,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":36,"value":1098},"household_key",{"type":36,"value":492},{"type":31,"tag":76,"props":1101,"children":1103},{"className":78,"code":1102,"language":80,"meta":15,"style":15},"CREATE OR REPLACE TABLE `project.dataset.household_mapping` AS\nSELECT\n  user_id,\n  TO_HEX(SHA256(\n    LOWER(REGEXP_REPLACE(CONCAT(street, city, postal_code), r'\\s+', ''))\n  )) AS household_key\nFROM `project.dataset.user_addresses`\nWHERE street IS NOT NULL AND postal_code IS NOT NULL;\n",[1104],{"type":31,"tag":51,"props":1105,"children":1106},{"__ignoreMap":15},[1107,1135,1142,1150,1158,1200,1217,1229],{"type":31,"tag":86,"props":1108,"children":1109},{"class":88,"line":89},[1110,1114,1118,1122,1126,1131],{"type":31,"tag":86,"props":1111,"children":1112},{"style":103},[1113],{"type":36,"value":106},{"type":31,"tag":86,"props":1115,"children":1116},{"style":103},[1117],{"type":36,"value":111},{"type":31,"tag":86,"props":1119,"children":1120},{"style":103},[1121],{"type":36,"value":116},{"type":31,"tag":86,"props":1123,"children":1124},{"style":103},[1125],{"type":36,"value":121},{"type":31,"tag":86,"props":1127,"children":1128},{"style":124},[1129],{"type":36,"value":1130}," `project.dataset.household_mapping`",{"type":31,"tag":86,"props":1132,"children":1133},{"style":103},[1134],{"type":36,"value":132},{"type":31,"tag":86,"props":1136,"children":1137},{"class":88,"line":99},[1138],{"type":31,"tag":86,"props":1139,"children":1140},{"style":103},[1141],{"type":36,"value":141},{"type":31,"tag":86,"props":1143,"children":1144},{"class":88,"line":135},[1145],{"type":31,"tag":86,"props":1146,"children":1147},{"style":154},[1148],{"type":36,"value":1149},"  user_id,\n",{"type":31,"tag":86,"props":1151,"children":1152},{"class":88,"line":144},[1153],{"type":31,"tag":86,"props":1154,"children":1155},{"style":154},[1156],{"type":36,"value":1157},"  TO_HEX(SHA256(\n",{"type":31,"tag":86,"props":1159,"children":1160},{"class":88,"line":175},[1161,1166,1171,1176,1181,1186,1190,1195],{"type":31,"tag":86,"props":1162,"children":1163},{"style":148},[1164],{"type":36,"value":1165},"    LOWER",{"type":31,"tag":86,"props":1167,"children":1168},{"style":154},[1169],{"type":36,"value":1170},"(REGEXP_REPLACE(",{"type":31,"tag":86,"props":1172,"children":1173},{"style":148},[1174],{"type":36,"value":1175},"CONCAT",{"type":31,"tag":86,"props":1177,"children":1178},{"style":154},[1179],{"type":36,"value":1180},"(street, city, postal_code), r",{"type":31,"tag":86,"props":1182,"children":1183},{"style":124},[1184],{"type":36,"value":1185},"'\\s+'",{"type":31,"tag":86,"props":1187,"children":1188},{"style":154},[1189],{"type":36,"value":445},{"type":31,"tag":86,"props":1191,"children":1192},{"style":124},[1193],{"type":36,"value":1194},"''",{"type":31,"tag":86,"props":1196,"children":1197},{"style":154},[1198],{"type":36,"value":1199},"))\n",{"type":31,"tag":86,"props":1201,"children":1202},{"class":88,"line":202},[1203,1208,1212],{"type":31,"tag":86,"props":1204,"children":1205},{"style":154},[1206],{"type":36,"value":1207},"  )) ",{"type":31,"tag":86,"props":1209,"children":1210},{"style":103},[1211],{"type":36,"value":258},{"type":31,"tag":86,"props":1213,"children":1214},{"style":154},[1215],{"type":36,"value":1216}," household_key\n",{"type":31,"tag":86,"props":1218,"children":1219},{"class":88,"line":223},[1220,1224],{"type":31,"tag":86,"props":1221,"children":1222},{"style":103},[1223],{"type":36,"value":271},{"type":31,"tag":86,"props":1225,"children":1226},{"style":124},[1227],{"type":36,"value":1228}," `project.dataset.user_addresses`\n",{"type":31,"tag":86,"props":1230,"children":1231},{"class":88,"line":25},[1232,1236,1241,1246,1251,1256,1260],{"type":31,"tag":86,"props":1233,"children":1234},{"style":103},[1235],{"type":36,"value":350},{"type":31,"tag":86,"props":1237,"children":1238},{"style":154},[1239],{"type":36,"value":1240}," street ",{"type":31,"tag":86,"props":1242,"children":1243},{"style":103},[1244],{"type":36,"value":1245},"IS NOT NULL",{"type":31,"tag":86,"props":1247,"children":1248},{"style":103},[1249],{"type":36,"value":1250}," AND",{"type":31,"tag":86,"props":1252,"children":1253},{"style":154},[1254],{"type":36,"value":1255}," postal_code ",{"type":31,"tag":86,"props":1257,"children":1258},{"style":103},[1259],{"type":36,"value":1245},{"type":31,"tag":86,"props":1261,"children":1262},{"style":154},[1263],{"type":36,"value":405},{"type":31,"tag":32,"props":1265,"children":1266},{},[1267,1269,1274,1276,1281,1283,1288,1290,1295],{"type":36,"value":1268},"Questa tabella fornisce il mapping ",{"type":31,"tag":51,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":36,"value":1059},{"type":36,"value":1275}," → ",{"type":31,"tag":51,"props":1277,"children":1279},{"className":1278},[],[1280],{"type":36,"value":1098},{"type":36,"value":1282},". Raggruppa gli utenti con lo stesso ",{"type":31,"tag":51,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":36,"value":1098},{"type":36,"value":1289}," e assegna loro un ",{"type":31,"tag":51,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":36,"value":1085},{"type":36,"value":1296},". L'household identity differisce dall'identity cross-device — non sono i dispositivi di una stessa persona, sono le persone della stessa casa. Il rischio privacy è alto: unire due adulti sotto lo stesso household può violare il principio di minimizzazione dei dati (KVKK art. 5). Usa il graph household solo per analisi aggregate e targeting anonimo, non per consolidamento di profili individuali.",{"type":31,"tag":32,"props":1298,"children":1299},{},[1300,1302,1310],{"type":36,"value":1301},"Aggiungi segnali al graph household: hash SSID Wi-Fi (se l'app mobile ha il permesso), Bluetooth beacon (nei negozi fisici), metodo di pagamento condiviso (stessa carta di credito). Questi segnali sono PII e richiedono storage hash + crittografato. I sistemi CDP (Segment, mParticle, RudderStack) offrono resolution household come \"relationship graph\", ma costruendo il modello manualmente in BigQuery ottieni maggior controllo — vedi quale segnale ha quale peso. La ricerca ",{"type":31,"tag":678,"props":1303,"children":1307},{"href":1304,"rel":1305},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fretention-engineering-cdp",[1306],"nofollow",[1308],{"type":36,"value":1309},"CDP & Retention Engineering",{"type":36,"value":1311}," di Roibase integra questo layer nella pipeline di produzione.",{"type":31,"tag":39,"props":1313,"children":1315},{"id":1314},"graph-database-vs-relational-quale-è-più-veloce",[1316],{"type":36,"value":1317},"Graph Database vs Relational: Quale è Più Veloce",{"type":31,"tag":32,"props":1319,"children":1320},{},[1321,1323,1329,1331,1337,1339,1345],{"type":36,"value":1322},"Puoi mantenere il graph identity in BigQuery come data warehouse relazionale, ma interrogare le catene \"A → B → C\" (closure transitiva) è costoso. Un graph database (Neo4j, Amazon Neptune, TigerGraph) lo fa in una struttura nodo\u002Farco — la query \"trova tutti i dispositivi dell'utente X\" con ",{"type":31,"tag":51,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":36,"value":1328},"MATCH (u:User)-[:HAS_DEVICE]->(d:Device)",{"type":36,"value":1330}," restituisce in millisecondi. In BigQuery la stessa query richiede ",{"type":31,"tag":51,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":36,"value":1336},"RECURSIVE CTE",{"type":36,"value":1338}," o ",{"type":31,"tag":51,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":36,"value":1344},"ARRAY_AGG",{"type":36,"value":1346}," e il consumo di slot cresce su tabelle grandi.",{"type":31,"tag":32,"props":1348,"children":1349},{},[1350],{"type":36,"value":1351},"Trade-off: il graph database è velocissimo ma lo schema è fragile, il modello nodo\u002Fedge è diverso dalla sintassi SQL familiare. Il warehouse relazionale è più lento ma con dbt il version control, i test e la documentazione sono semplici. La maggior parte dei deployment di produzione usa un approccio ibrido: crea la tabella identity mapping con batch giornaliero in BigQuery via dbt, sincronizzala in Neo4j, esegui lookup real-time da Neo4j. Pipeline esempio: modello dbt → view BigQuery → Cloud Function trigger → Neo4j Cypher INSERT.",{"type":31,"tag":76,"props":1353,"children":1355},{"className":78,"code":1354,"language":80,"meta":15,"style":15},"-- BigQuery recursive CTE per closure transitiva (lento)\nWITH RECURSIVE identity_chain AS (\n  SELECT signal_a, signal_b, 1 AS depth\n  FROM `project.dataset.identity_edges`\n  UNION ALL\n  SELECT ic.signal_a, e.signal_b, ic.depth + 1\n  FROM identity_chain ic\n  JOIN `project.dataset.identity_edges` e\n    ON ic.signal_b = e.signal_a\n  WHERE ic.depth \u003C 5\n)\nSELECT DISTINCT signal_a, signal_b\nFROM identity_chain;\n",[1356],{"type":31,"tag":51,"props":1357,"children":1358},{"__ignoreMap":15},[1359,1367,1394,1421,1434,1442,1509,1521,1539,1577,1605,1613,1626],{"type":31,"tag":86,"props":1360,"children":1361},{"class":88,"line":89},[1362],{"type":31,"tag":86,"props":1363,"children":1364},{"style":93},[1365],{"type":36,"value":1366},"-- BigQuery recursive CTE per closure transitiva (lento)\n",{"type":31,"tag":86,"props":1368,"children":1369},{"class":88,"line":99},[1370,1375,1380,1385,1389],{"type":31,"tag":86,"props":1371,"children":1372},{"style":103},[1373],{"type":36,"value":1374},"WITH",{"type":31,"tag":86,"props":1376,"children":1377},{"style":103},[1378],{"type":36,"value":1379}," RECURSIVE",{"type":31,"tag":86,"props":1381,"children":1382},{"style":154},[1383],{"type":36,"value":1384}," identity_chain ",{"type":31,"tag":86,"props":1386,"children":1387},{"style":103},[1388],{"type":36,"value":258},{"type":31,"tag":86,"props":1390,"children":1391},{"style":154},[1392],{"type":36,"value":1393}," (\n",{"type":31,"tag":86,"props":1395,"children":1396},{"class":88,"line":135},[1397,1402,1407,1412,1416],{"type":31,"tag":86,"props":1398,"children":1399},{"style":103},[1400],{"type":36,"value":1401},"  SELECT",{"type":31,"tag":86,"props":1403,"children":1404},{"style":154},[1405],{"type":36,"value":1406}," signal_a, signal_b, ",{"type":31,"tag":86,"props":1408,"children":1409},{"style":148},[1410],{"type":36,"value":1411},"1",{"type":31,"tag":86,"props":1413,"children":1414},{"style":103},[1415],{"type":36,"value":167},{"type":31,"tag":86,"props":1417,"children":1418},{"style":154},[1419],{"type":36,"value":1420}," depth\n",{"type":31,"tag":86,"props":1422,"children":1423},{"class":88,"line":144},[1424,1429],{"type":31,"tag":86,"props":1425,"children":1426},{"style":103},[1427],{"type":36,"value":1428},"  FROM",{"type":31,"tag":86,"props":1430,"children":1431},{"style":124},[1432],{"type":36,"value":1433}," `project.dataset.identity_edges`\n",{"type":31,"tag":86,"props":1435,"children":1436},{"class":88,"line":175},[1437],{"type":31,"tag":86,"props":1438,"children":1439},{"style":103},[1440],{"type":36,"value":1441},"  UNION ALL\n",{"type":31,"tag":86,"props":1443,"children":1444},{"class":88,"line":202},[1445,1449,1454,1458,1463,1467,1472,1476,1481,1485,1490,1494,1499,1504],{"type":31,"tag":86,"props":1446,"children":1447},{"style":103},[1448],{"type":36,"value":1401},{"type":31,"tag":86,"props":1450,"children":1451},{"style":148},[1452],{"type":36,"value":1453}," ic",{"type":31,"tag":86,"props":1455,"children":1456},{"style":154},[1457],{"type":36,"value":157},{"type":31,"tag":86,"props":1459,"children":1460},{"style":148},[1461],{"type":36,"value":1462},"signal_a",{"type":31,"tag":86,"props":1464,"children":1465},{"style":154},[1466],{"type":36,"value":445},{"type":31,"tag":86,"props":1468,"children":1469},{"style":148},[1470],{"type":36,"value":1471},"e",{"type":31,"tag":86,"props":1473,"children":1474},{"style":154},[1475],{"type":36,"value":157},{"type":31,"tag":86,"props":1477,"children":1478},{"style":148},[1479],{"type":36,"value":1480},"signal_b",{"type":31,"tag":86,"props":1482,"children":1483},{"style":154},[1484],{"type":36,"value":445},{"type":31,"tag":86,"props":1486,"children":1487},{"style":148},[1488],{"type":36,"value":1489},"ic",{"type":31,"tag":86,"props":1491,"children":1492},{"style":154},[1493],{"type":36,"value":157},{"type":31,"tag":86,"props":1495,"children":1496},{"style":148},[1497],{"type":36,"value":1498},"depth",{"type":31,"tag":86,"props":1500,"children":1501},{"style":103},[1502],{"type":36,"value":1503}," +",{"type":31,"tag":86,"props":1505,"children":1506},{"style":148},[1507],{"type":36,"value":1508}," 1\n",{"type":31,"tag":86,"props":1510,"children":1511},{"class":88,"line":223},[1512,1516],{"type":31,"tag":86,"props":1513,"children":1514},{"style":103},[1515],{"type":36,"value":1428},{"type":31,"tag":86,"props":1517,"children":1518},{"style":154},[1519],{"type":36,"value":1520}," identity_chain ic\n",{"type":31,"tag":86,"props":1522,"children":1523},{"class":88,"line":25},[1524,1529,1534],{"type":31,"tag":86,"props":1525,"children":1526},{"style":103},[1527],{"type":36,"value":1528},"  JOIN",{"type":31,"tag":86,"props":1530,"children":1531},{"style":124},[1532],{"type":36,"value":1533}," `project.dataset.identity_edges`",{"type":31,"tag":86,"props":1535,"children":1536},{"style":154},[1537],{"type":36,"value":1538}," e\n",{"type":31,"tag":86,"props":1540,"children":1541},{"class":88,"line":284},[1542,1547,1551,1555,1559,1563,1568,1572],{"type":31,"tag":86,"props":1543,"children":1544},{"style":103},[1545],{"type":36,"value":1546},"    ON",{"type":31,"tag":86,"props":1548,"children":1549},{"style":148},[1550],{"type":36,"value":1453},{"type":31,"tag":86,"props":1552,"children":1553},{"style":154},[1554],{"type":36,"value":157},{"type":31,"tag":86,"props":1556,"children":1557},{"style":148},[1558],{"type":36,"value":1480},{"type":31,"tag":86,"props":1560,"children":1561},{"style":103},[1562],{"type":36,"value":327},{"type":31,"tag":86,"props":1564,"children":1565},{"style":148},[1566],{"type":36,"value":1567}," e",{"type":31,"tag":86,"props":1569,"children":1570},{"style":154},[1571],{"type":36,"value":157},{"type":31,"tag":86,"props":1573,"children":1574},{"style":148},[1575],{"type":36,"value":1576},"signal_a\n",{"type":31,"tag":86,"props":1578,"children":1579},{"class":88,"line":303},[1580,1585,1589,1593,1597,1601],{"type":31,"tag":86,"props":1581,"children":1582},{"style":103},[1583],{"type":36,"value":1584},"  WHERE",{"type":31,"tag":86,"props":1586,"children":1587},{"style":148},[1588],{"type":36,"value":1453},{"type":31,"tag":86,"props":1590,"children":1591},{"style":154},[1592],{"type":36,"value":157},{"type":31,"tag":86,"props":1594,"children":1595},{"style":148},[1596],{"type":36,"value":1498},{"type":31,"tag":86,"props":1598,"children":1599},{"style":103},[1600],{"type":36,"value":947},{"type":31,"tag":86,"props":1602,"children":1603},{"style":148},[1604],{"type":36,"value":709},{"type":31,"tag":86,"props":1606,"children":1607},{"class":88,"line":344},[1608],{"type":31,"tag":86,"props":1609,"children":1610},{"style":154},[1611],{"type":36,"value":1612},")\n",{"type":31,"tag":86,"props":1614,"children":1615},{"class":88,"line":370},[1616,1621],{"type":31,"tag":86,"props":1617,"children":1618},{"style":103},[1619],{"type":36,"value":1620},"SELECT DISTINCT",{"type":31,"tag":86,"props":1622,"children":1623},{"style":154},[1624],{"type":36,"value":1625}," signal_a, signal_b\n",{"type":31,"tag":86,"props":1627,"children":1628},{"class":88,"line":871},[1629,1633],{"type":31,"tag":86,"props":1630,"children":1631},{"style":103},[1632],{"type":36,"value":271},{"type":31,"tag":86,"props":1634,"children":1635},{"style":154},[1636],{"type":36,"value":1637}," identity_chain;\n",{"type":31,"tag":32,"props":1639,"children":1640},{},[1641],{"type":36,"value":1642},"La query traccia catene fino a 5 passi (depth) al massimo. Senza controllo depth c'è rischio di ciclo infinito — se A → B → A esiste un loop. Il graph database gestisce i cicli built-in, BigQuery richiede una WHERE condition manuale. Se il graph identity raggiunge 10M+ edge, un sistema dedicato come Neo4j è più mantenibile. Sotto 1M edge, BigQuery + dbt è sufficiente.",{"type":31,"tag":39,"props":1644,"children":1646},{"id":1645},"privacy-e-consenso-i-confini-legali-del-graph-identity",[1647],{"type":36,"value":1648},"Privacy e Consenso: I Confini Legali del Graph Identity",{"type":31,"tag":32,"props":1650,"children":1651},{},[1652],{"type":36,"value":1653},"L'identity resolution rientra nella definizione di \"profiling\" secondo GDPR art. 4(4). Senza consenso esplicito dell'utente, linking deterministico + probabilistico è un rischio legale. Consent Mode v2 (Google) separa \"analytics_storage\" e \"ad_storage\" ma la stitching identity potrebbe richiedere una categoria \"personalization_storage\" aggiuntiva. In TCF 2.2, hai bisogno di Purpose 1 (device storage) + Purpose 9 (personalized ads) — senza entrambi, anche l'hash matching è illegittimo.",{"type":31,"tag":32,"props":1655,"children":1656},{},[1657],{"type":36,"value":1658},"L'email hashata resta \"dati pseudonimici\" secondo GDPR (Considerando 26) — rimane dato personale. Se si può ricavare il plaintext tramite rainbow table o reverse lookup, non è \"anonimizzazione\" ma \"pseudonimizzazione\". Aggiungi salt agli hash (email + secret site-specific → SHA-256) e conserva il salt in HSM (Hardware Security Module) o Secret Manager. Se l'utente richiede \"unlinking\" (GDPR art. 18 restriction), elimina l'edge dal graph identity e spezza la connessione deterministica.",{"type":31,"tag":32,"props":1660,"children":1661},{},[1662,1664,1670,1672,1677,1679,1685,1687,1693],{"type":36,"value":1663},"KVKK art. 7 richiede \"consenso esplicito\": \"Il consenso relativo al trattamento dei dati personali deve essere specifico, informato e basato sulla libera volontà.\" L'stitching identity deve essere scritto esplicitamente nel modulo di consenso — frasi generiche come \"migliore esperienza\" non bastano. Se l'utente revoca il consenso (flag ",{"type":31,"tag":51,"props":1665,"children":1667},{"className":1666},[],[1668],{"type":36,"value":1669},"consent_revoked_at",{"type":36,"value":1671}," timestamp), elimina tutti gli edge dal graph per quel ",{"type":31,"tag":51,"props":1673,"children":1675},{"className":1674},[],[1676],{"type":36,"value":1059},{"type":36,"value":1678}," e contrassegna ",{"type":31,"tag":51,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":36,"value":1684},"deleted_at",{"type":36,"value":1686},". In BigQuery puoi fare soft delete — invece della cancellazione fisica, applica il filtro ",{"type":31,"tag":51,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":36,"value":1692},"WHERE deleted_at IS NULL",{"type":36,"value":157},{"type":31,"tag":39,"props":1695,"children":1697},{"id":1696},"applicazione-pipeline-identity-incrementale-con-dbt",[1698],{"type":36,"value":1699},"Applicazione: Pipeline Identity Incrementale con dbt",{"type":31,"tag":32,"props":1701,"children":1702},{},[1703],{"type":36,"value":1704},"In produzione l'identity resolution non è batch una volta, ma incrementale — aggiungi quotidianamente nuovi segnali, aggiorna il graph esistente. Puoi farlo con un modello incrementale dbt:",{"type":31,"tag":76,"props":1706,"children":1708},{"className":78,"code":1707,"language":80,"meta":15,"style":15},"{{\n  config(\n    materialized='incremental',\n    unique_key='edge_id',\n    partition_by={'field': 'created_date', 'data_type': 'date'},\n    cluster_by=['signal_a_type', 'signal_b_type']\n  )\n}}\n\nWITH new_edges AS (\n  SELECT\n    GENERATE_UUID() AS edge_id,\n    a.signal_id AS signal_a,\n    a.signal_type AS signal_a_type,\n    b.signal_id AS signal_b,\n    b.signal_type AS signal_b_type,\n    0.95 AS match_score,\n    CURRENT_DATE() AS created_date\n  FROM {{ ref('stg_hashed_emails') }} a\n  JOIN {{ ref('stg_device_ids') }} b\n    ON a.hashed_email = b.hashed_email\n  WHERE a.created_at >= CURRENT_DATE() - 1\n)\n\nSELECT * FROM new_edges\n\n{% if is_incremental() %}\nWHERE edge_id NOT IN (SELECT edge_id FROM {{ this }})\n{% endif %}\n",[1709],{"type":31,"tag":51,"props":1710,"children":1711},{"__ignoreMap":15},[1712,1720,1728,1750,1771,1826,1843,1851,1859,1868,1888,1896,1913,1939,1964,1989,2013,2039,2056,2079,2101,2137,2177,2185,2193,2217,2225,2244,2289],{"type":31,"tag":86,"props":1713,"children":1714},{"class":88,"line":89},[1715],{"type":31,"tag":86,"props":1716,"children":1717},{"style":154},[1718],{"type":36,"value":1719},"{{\n",{"type":31,"tag":86,"props":1721,"children":1722},{"class":88,"line":99},[1723],{"type":31,"tag":86,"props":1724,"children":1725},{"style":154},[1726],{"type":36,"value":1727},"  config(\n",{"type":31,"tag":86,"props":1729,"children":1730},{"class":88,"line":135},[1731,1736,1741,1746],{"type":31,"tag":86,"props":1732,"children":1733},{"style":154},[1734],{"type":36,"value":1735},"    materialized",{"type":31,"tag":86,"props":1737,"children":1738},{"style":103},[1739],{"type":36,"value":1740},"=",{"type":31,"tag":86,"props":1742,"children":1743},{"style":124},[1744],{"type":36,"value":1745},"'incremental'",{"type":31,"tag":86,"props":1747,"children":1748},{"style":154},[1749],{"type":36,"value":220},{"type":31,"tag":86,"props":1751,"children":1752},{"class":88,"line":144},[1753,1758,1762,1767],{"type":31,"tag":86,"props":1754,"children":1755},{"style":154},[1756],{"type":36,"value":1757},"    unique_key",{"type":31,"tag":86,"props":1759,"children":1760},{"style":103},[1761],{"type":36,"value":1740},{"type":31,"tag":86,"props":1763,"children":1764},{"style":124},[1765],{"type":36,"value":1766},"'edge_id'",{"type":31,"tag":86,"props":1768,"children":1769},{"style":154},[1770],{"type":36,"value":220},{"type":31,"tag":86,"props":1772,"children":1773},{"class":88,"line":175},[1774,1779,1783,1788,1793,1798,1803,1807,1812,1816,1821],{"type":31,"tag":86,"props":1775,"children":1776},{"style":154},[1777],{"type":36,"value":1778},"    partition_by",{"type":31,"tag":86,"props":1780,"children":1781},{"style":103},[1782],{"type":36,"value":1740},{"type":31,"tag":86,"props":1784,"children":1785},{"style":154},[1786],{"type":36,"value":1787},"{",{"type":31,"tag":86,"props":1789,"children":1790},{"style":124},[1791],{"type":36,"value":1792},"'field'",{"type":31,"tag":86,"props":1794,"children":1795},{"style":154},[1796],{"type":36,"value":1797},": ",{"type":31,"tag":86,"props":1799,"children":1800},{"style":124},[1801],{"type":36,"value":1802},"'created_date'",{"type":31,"tag":86,"props":1804,"children":1805},{"style":154},[1806],{"type":36,"value":445},{"type":31,"tag":86,"props":1808,"children":1809},{"style":124},[1810],{"type":36,"value":1811},"'data_type'",{"type":31,"tag":86,"props":1813,"children":1814},{"style":154},[1815],{"type":36,"value":1797},{"type":31,"tag":86,"props":1817,"children":1818},{"style":124},[1819],{"type":36,"value":1820},"'date'",{"type":31,"tag":86,"props":1822,"children":1823},{"style":154},[1824],{"type":36,"value":1825},"},\n",{"type":31,"tag":86,"props":1827,"children":1828},{"class":88,"line":202},[1829,1834,1838],{"type":31,"tag":86,"props":1830,"children":1831},{"style":154},[1832],{"type":36,"value":1833},"    cluster_by",{"type":31,"tag":86,"props":1835,"children":1836},{"style":103},[1837],{"type":36,"value":1740},{"type":31,"tag":86,"props":1839,"children":1840},{"style":154},[1841],{"type":36,"value":1842},"['signal_a_type', 'signal_b_type']\n",{"type":31,"tag":86,"props":1844,"children":1845},{"class":88,"line":223},[1846],{"type":31,"tag":86,"props":1847,"children":1848},{"style":154},[1849],{"type":36,"value":1850},"  )\n",{"type":31,"tag":86,"props":1852,"children":1853},{"class":88,"line":25},[1854],{"type":31,"tag":86,"props":1855,"children":1856},{"style":154},[1857],{"type":36,"value":1858},"}}\n",{"type":31,"tag":86,"props":1860,"children":1861},{"class":88,"line":284},[1862],{"type":31,"tag":86,"props":1863,"children":1865},{"emptyLinePlaceholder":1864},true,[1866],{"type":36,"value":1867},"\n",{"type":31,"tag":86,"props":1869,"children":1870},{"class":88,"line":303},[1871,1875,1880,1884],{"type":31,"tag":86,"props":1872,"children":1873},{"style":103},[1874],{"type":36,"value":1374},{"type":31,"tag":86,"props":1876,"children":1877},{"style":154},[1878],{"type":36,"value":1879}," new_edges ",{"type":31,"tag":86,"props":1881,"children":1882},{"style":103},[1883],{"type":36,"value":258},{"type":31,"tag":86,"props":1885,"children":1886},{"style":154},[1887],{"type":36,"value":1393},{"type":31,"tag":86,"props":1889,"children":1890},{"class":88,"line":344},[1891],{"type":31,"tag":86,"props":1892,"children":1893},{"style":103},[1894],{"type":36,"value":1895},"  SELECT\n",{"type":31,"tag":86,"props":1897,"children":1898},{"class":88,"line":370},[1899,1904,1908],{"type":31,"tag":86,"props":1900,"children":1901},{"style":154},[1902],{"type":36,"value":1903},"    GENERATE_UUID() ",{"type":31,"tag":86,"props":1905,"children":1906},{"style":103},[1907],{"type":36,"value":258},{"type":31,"tag":86,"props":1909,"children":1910},{"style":154},[1911],{"type":36,"value":1912}," edge_id,\n",{"type":31,"tag":86,"props":1914,"children":1915},{"class":88,"line":871},[1916,1921,1925,1930,1934],{"type":31,"tag":86,"props":1917,"children":1918},{"style":148},[1919],{"type":36,"value":1920},"    a",{"type":31,"tag":86,"props":1922,"children":1923},{"style":154},[1924],{"type":36,"value":157},{"type":31,"tag":86,"props":1926,"children":1927},{"style":148},[1928],{"type":36,"value":1929},"signal_id",{"type":31,"tag":86,"props":1931,"children":1932},{"style":103},[1933],{"type":36,"value":167},{"type":31,"tag":86,"props":1935,"children":1936},{"style":154},[1937],{"type":36,"value":1938}," signal_a,\n",{"type":31,"tag":86,"props":1940,"children":1941},{"class":88,"line":889},[1942,1946,1950,1955,1959],{"type":31,"tag":86,"props":1943,"children":1944},{"style":148},[1945],{"type":36,"value":1920},{"type":31,"tag":86,"props":1947,"children":1948},{"style":154},[1949],{"type":36,"value":157},{"type":31,"tag":86,"props":1951,"children":1952},{"style":148},[1953],{"type":36,"value":1954},"signal_type",{"type":31,"tag":86,"props":1956,"children":1957},{"style":103},[1958],{"type":36,"value":167},{"type":31,"tag":86,"props":1960,"children":1961},{"style":154},[1962],{"type":36,"value":1963}," signal_a_type,\n",{"type":31,"tag":86,"props":1965,"children":1966},{"class":88,"line":907},[1967,1972,1976,1980,1984],{"type":31,"tag":86,"props":1968,"children":1969},{"style":148},[1970],{"type":36,"value":1971},"    b",{"type":31,"tag":86,"props":1973,"children":1974},{"style":154},[1975],{"type":36,"value":157},{"type":31,"tag":86,"props":1977,"children":1978},{"style":148},[1979],{"type":36,"value":1929},{"type":31,"tag":86,"props":1981,"children":1982},{"style":103},[1983],{"type":36,"value":167},{"type":31,"tag":86,"props":1985,"children":1986},{"style":154},[1987],{"type":36,"value":1988}," signal_b,\n",{"type":31,"tag":86,"props":1990,"children":1991},{"class":88,"line":925},[1992,1996,2000,2004,2008],{"type":31,"tag":86,"props":1993,"children":1994},{"style":148},[1995],{"type":36,"value":1971},{"type":31,"tag":86,"props":1997,"children":1998},{"style":154},[1999],{"type":36,"value":157},{"type":31,"tag":86,"props":2001,"children":2002},{"style":148},[2003],{"type":36,"value":1954},{"type":31,"tag":86,"props":2005,"children":2006},{"style":103},[2007],{"type":36,"value":167},{"type":31,"tag":86,"props":2009,"children":2010},{"style":154},[2011],{"type":36,"value":2012}," signal_b_type,\n",{"type":31,"tag":86,"props":2014,"children":2015},{"class":88,"line":963},[2016,2021,2025,2030,2034],{"type":31,"tag":86,"props":2017,"children":2018},{"style":148},[2019],{"type":36,"value":2020},"    0",{"type":31,"tag":86,"props":2022,"children":2023},{"style":154},[2024],{"type":36,"value":157},{"type":31,"tag":86,"props":2026,"children":2027},{"style":148},[2028],{"type":36,"value":2029},"95",{"type":31,"tag":86,"props":2031,"children":2032},{"style":103},[2033],{"type":36,"value":167},{"type":31,"tag":86,"props":2035,"children":2036},{"style":154},[2037],{"type":36,"value":2038}," match_score,\n",{"type":31,"tag":86,"props":2040,"children":2041},{"class":88,"line":1000},[2042,2047,2051],{"type":31,"tag":86,"props":2043,"children":2044},{"style":154},[2045],{"type":36,"value":2046},"    CURRENT_DATE() ",{"type":31,"tag":86,"props":2048,"children":2049},{"style":103},[2050],{"type":36,"value":258},{"type":31,"tag":86,"props":2052,"children":2053},{"style":154},[2054],{"type":36,"value":2055}," created_date\n",{"type":31,"tag":86,"props":2057,"children":2059},{"class":88,"line":2058},19,[2060,2064,2069,2074],{"type":31,"tag":86,"props":2061,"children":2062},{"style":103},[2063],{"type":36,"value":1428},{"type":31,"tag":86,"props":2065,"children":2066},{"style":154},[2067],{"type":36,"value":2068}," {{ ref(",{"type":31,"tag":86,"props":2070,"children":2071},{"style":124},[2072],{"type":36,"value":2073},"'stg_hashed_emails'",{"type":31,"tag":86,"props":2075,"children":2076},{"style":154},[2077],{"type":36,"value":2078},") }} a\n",{"type":31,"tag":86,"props":2080,"children":2082},{"class":88,"line":2081},20,[2083,2087,2091,2096],{"type":31,"tag":86,"props":2084,"children":2085},{"style":103},[2086],{"type":36,"value":1528},{"type":31,"tag":86,"props":2088,"children":2089},{"style":154},[2090],{"type":36,"value":2068},{"type":31,"tag":86,"props":2092,"children":2093},{"style":124},[2094],{"type":36,"value":2095},"'stg_device_ids'",{"type":31,"tag":86,"props":2097,"children":2098},{"style":154},[2099],{"type":36,"value":2100},") }} b\n",{"type":31,"tag":86,"props":2102,"children":2104},{"class":88,"line":2103},21,[2105,2109,2113,2117,2121,2125,2129,2133],{"type":31,"tag":86,"props":2106,"children":2107},{"style":103},[2108],{"type":36,"value":1546},{"type":31,"tag":86,"props":2110,"children":2111},{"style":148},[2112],{"type":36,"value":578},{"type":31,"tag":86,"props":2114,"children":2115},{"style":154},[2116],{"type":36,"value":157},{"type":31,"tag":86,"props":2118,"children":2119},{"style":148},[2120],{"type":36,"value":72},{"type":31,"tag":86,"props":2122,"children":2123},{"style":103},[2124],{"type":36,"value":327},{"type":31,"tag":86,"props":2126,"children":2127},{"style":148},[2128],{"type":36,"value":596},{"type":31,"tag":86,"props":2130,"children":2131},{"style":154},[2132],{"type":36,"value":157},{"type":31,"tag":86,"props":2134,"children":2135},{"style":148},[2136],{"type":36,"value":341},{"type":31,"tag":86,"props":2138,"children":2140},{"class":88,"line":2139},22,[2141,2145,2149,2153,2158,2163,2168,2173],{"type":31,"tag":86,"props":2142,"children":2143},{"style":103},[2144],{"type":36,"value":1584},{"type":31,"tag":86,"props":2146,"children":2147},{"style":148},[2148],{"type":36,"value":578},{"type":31,"tag":86,"props":2150,"children":2151},{"style":154},[2152],{"type":36,"value":157},{"type":31,"tag":86,"props":2154,"children":2155},{"style":148},[2156],{"type":36,"value":2157},"created_at",{"type":31,"tag":86,"props":2159,"children":2160},{"style":103},[2161],{"type":36,"value":2162}," >=",{"type":31,"tag":86,"props":2164,"children":2165},{"style":154},[2166],{"type":36,"value":2167}," CURRENT_DATE() ",{"type":31,"tag":86,"props":2169,"children":2170},{"style":103},[2171],{"type":36,"value":2172},"-",{"type":31,"tag":86,"props":2174,"children":2175},{"style":148},[2176],{"type":36,"value":1508},{"type":31,"tag":86,"props":2178,"children":2180},{"class":88,"line":2179},23,[2181],{"type":31,"tag":86,"props":2182,"children":2183},{"style":154},[2184],{"type":36,"value":1612},{"type":31,"tag":86,"props":2186,"children":2188},{"class":88,"line":2187},24,[2189],{"type":31,"tag":86,"props":2190,"children":2191},{"emptyLinePlaceholder":1864},[2192],{"type":36,"value":1867},{"type":31,"tag":86,"props":2194,"children":2196},{"class":88,"line":2195},25,[2197,2202,2207,2212],{"type":31,"tag":86,"props":2198,"children":2199},{"style":103},[2200],{"type":36,"value":2201},"SELECT",{"type":31,"tag":86,"props":2203,"children":2204},{"style":103},[2205],{"type":36,"value":2206}," *",{"type":31,"tag":86,"props":2208,"children":2209},{"style":103},[2210],{"type":36,"value":2211}," FROM",{"type":31,"tag":86,"props":2213,"children":2214},{"style":154},[2215],{"type":36,"value":2216}," new_edges\n",{"type":31,"tag":86,"props":2218,"children":2220},{"class":88,"line":2219},26,[2221],{"type":31,"tag":86,"props":2222,"children":2223},{"emptyLinePlaceholder":1864},[2224],{"type":36,"value":1867},{"type":31,"tag":86,"props":2226,"children":2228},{"class":88,"line":2227},27,[2229,2234,2239],{"type":31,"tag":86,"props":2230,"children":2231},{"style":154},[2232],{"type":36,"value":2233},"{% ",{"type":31,"tag":86,"props":2235,"children":2236},{"style":103},[2237],{"type":36,"value":2238},"if",{"type":31,"tag":86,"props":2240,"children":2241},{"style":154},[2242],{"type":36,"value":2243}," is_incremental() %}\n",{"type":31,"tag":86,"props":2245,"children":2247},{"class":88,"line":2246},28,[2248,2252,2257,2262,2267,2272,2276,2280,2284],{"type":31,"tag":86,"props":2249,"children":2250},{"style":103},[2251],{"type":36,"value":350},{"type":31,"tag":86,"props":2253,"children":2254},{"style":154},[2255],{"type":36,"value":2256}," edge_id ",{"type":31,"tag":86,"props":2258,"children":2259},{"style":103},[2260],{"type":36,"value":2261},"NOT",{"type":31,"tag":86,"props":2263,"children":2264},{"style":103},[2265],{"type":36,"value":2266}," IN",{"type":31,"tag":86,"props":2268,"children":2269},{"style":154},[2270],{"type":36,"value":2271}," (",{"type":31,"tag":86,"props":2273,"children":2274},{"style":103},[2275],{"type":36,"value":2201},{"type":31,"tag":86,"props":2277,"children":2278},{"style":154},[2279],{"type":36,"value":2256},{"type":31,"tag":86,"props":2281,"children":2282},{"style":103},[2283],{"type":36,"value":271},{"type":31,"tag":86,"props":2285,"children":2286},{"style":154},[2287],{"type":36,"value":2288}," {{ this }})\n",{"type":31,"tag":86,"props":2290,"children":2292},{"class":88,"line":2291},29,[2293],{"type":31,"tag":86,"props":2294,"children":2295},{"style":154},[2296],{"type":36,"value":2297},"{% endif %}\n",{"type":31,"tag":32,"props":2299,"children":2300},{},[2301,2303,2309,2311,2317,2319,2324,2326,2332],{"type":36,"value":2302},"Ad ogni esecuzione il modello aggiunge gli ultimi 1 giorno di nuovi abbinamenti email-device. ",{"type":31,"tag":51,"props":2304,"children":2306},{"className":2305},[],[2307],{"type":36,"value":2308},"unique_key",{"type":36,"value":2310}," previene i duplicati, ",{"type":31,"tag":51,"props":2312,"children":2314},{"className":2313},[],[2315],{"type":36,"value":2316},"partition_by",{"type":36,"value":2318}," non tocca le partition precedenti. Cluster per ",{"type":31,"tag":51,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":36,"value":1954},{"type":36,"value":2325}," perché le query sono generalmente filtrate per tipo — \"tutti gli abbinamenti email→cookie\". Monitora con test dbt: se esiste un edge con ",{"type":31,"tag":51,"props":2327,"children":2329},{"className":2328},[],[2330],{"type":36,"value":2331},"match_score \u003C 0.70",{"type":36,"value":2333},", il test fallisce e il deploy si arresta.",{"type":31,"tag":32,"props":2335,"children":2336},{},[2337,2339,2346],{"type":36,"value":2338},"Una pipeline identity senza data quality test non va in produzione — gli abbinamenti sbagliati corrompono il calcolo LTV, il modello di attribuzione, la segmentazione. La ricerca ",{"type":31,"tag":678,"props":2340,"children":2343},{"href":2341,"rel":2342},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Ffirstparty",[1306],[2344],{"type":36,"value":2345},"First-Party Data & Measurement Architecture",{"type":36,"value":2347}," di Roibase integra questa pipeline con consent layer, server-side GTM e CDP.",{"type":31,"tag":32,"props":2349,"children":2350},{},[2351,2353,2358,2360,2366,2367,2372],{"type":36,"value":2352},"Poi arriva il downstream: segment builder, recommendation engine, LTV prediction, MMM — tutti leggono ",{"type":31,"tag":51,"props":2354,"children":2356},{"className":2355},[],[2357],{"type":36,"value":423},{"type":36,"value":2359}," per aggregare metriche. Se il graph è costruito correttamente, consolidi 6 segnali in 1 utente e guadagni ",{"type":31,"tag":2361,"props":2362,"children":2363},"strong",{},[2364],{"type":36,"value":2365},"+30-40% precision su LTV",{"type":36,"value":445},{"type":31,"tag":2361,"props":2368,"children":2369},{},[2370],{"type":36,"value":2371},"+25% finestra di attribuzione",{"type":36,"value":2373}," (benchmark GA4, 2",{"type":31,"tag":2375,"props":2376,"children":2377},"style",{},[2378],{"type":36,"value":2379},"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":135,"depth":135,"links":2381},[2382,2383,2384,2385,2386,2387],{"id":41,"depth":99,"text":44},{"id":471,"depth":99,"text":474},{"id":1071,"depth":99,"text":1074},{"id":1314,"depth":99,"text":1317},{"id":1645,"depth":99,"text":1648},{"id":1696,"depth":99,"text":1699},"markdown","content:it:data:risoluzione-identita-6-segnali-a-profilo-unico.md","content","it\u002Fdata\u002Frisoluzione-identita-6-segnali-a-profilo-unico.md","it\u002Fdata\u002Frisoluzione-identita-6-segnali-a-profilo-unico","md",1782050763853]