[{"data":1,"prerenderedAt":2369},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fdata\u002Fidentity-resolution-unifying-customer-signals":13},{"i18nKey":4,"paths":5},"data-003-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fidentity-resolution-hash-matching-probabilistic","\u002Fen\u002Fdata\u002Fidentity-resolution-unifying-customer-signals","\u002Fes\u002Fdata\u002Fresolucion-de-identidad","\u002Ffr\u002Fdata\u002Fresolution-identite-6-signaux-identite-client-unique","\u002Fit\u002Fdata\u002Frisoluzione-identita-sei-segnali-unica-identita-cliente","\u002Fru\u002Fdata\u002Fidentity-resolution-odnoidentifikator","\u002Ftr\u002Fdata\u002Fidentity-resolution-6-sinyalden-tek-musteri-kimligine",{"_path":7,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":2363,"_id":2364,"_source":2365,"_file":2366,"_stem":2367,"_extension":2368},"data",false,"","Identity Resolution: From 6 Signals to a Single Customer Identity","Engineering customer identity unification using hash matching, probabilistic linking, and household clustering. BigQuery + CDP implementation guide.","2026-06-16",[21,22,23,24,25],"identity-resolution","customer-data-platform","hash-matching","probabilistic-linking","first-party-data",8,"Roibase",{"type":29,"children":30,"toc":2353},"root",[31,39,46,76,536,587,592,599,604,610,636,759,771,1658,1670,1675,1681,1686,1696,1706,1992,2012,2017,2023,2035,2199,2204,2216,2222,2237,2242,2287,2292,2298,2303,2324,2338,2342,2347],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Cookie lifespan has collapsed from an average of 28 days to 7. A user starts in a mobile app, completes a purchase on desktop web, re-engages from an email campaign — every touchpoint generates a different identifier. 40% of marketing data becomes orphan events: no user ID, no session ID, no conversion attribution. Identity resolution is the engineering discipline that stitches these fragments together. Not guesswork, but hash matching. Not intuition, but probabilistic graphs. Not assumption, but household clustering.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"deterministic-matching-hash-based-unification",[44],{"type":37,"value":45},"Deterministic Matching: Hash-Based Unification",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,57,59,66,68,74],{"type":37,"value":50},"Deterministic matching works when you ",{"type":32,"tag":52,"props":53,"children":54},"strong",{},[55],{"type":37,"value":56},"know with certainty",{"type":37,"value":58}," that two datapoints share the same identifier. An email SHA-256 hash, a phone number hash, a CRM ID. If your BigQuery event table has ",{"type":32,"tag":60,"props":61,"children":63},"code",{"className":62},[],[64],{"type":37,"value":65},"user_id",{"type":37,"value":67}," but web analytics has ",{"type":32,"tag":60,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"ga_client_id",{"type":37,"value":75},", you cannot JOIN them directly — you first need to find a bridge event where both were recorded and build a mapping table.",{"type":32,"tag":77,"props":78,"children":82},"pre",{"className":79,"code":80,"language":81,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","-- Deterministic identity stitching example\nCREATE OR REPLACE TABLE `project.dataset.identity_graph` AS\nWITH email_hashes AS (\n  SELECT DISTINCT\n    user_pseudo_id,\n    TO_HEX(SHA256(LOWER(TRIM(user_properties.email.value)))) AS email_hash\n  FROM `project.dataset.events_*`\n  WHERE user_properties.email.value IS NOT NULL\n),\ncrm_map AS (\n  SELECT\n    crm_id,\n    TO_HEX(SHA256(LOWER(TRIM(email)))) AS email_hash\n  FROM `project.crm.customers`\n)\nSELECT\n  e.user_pseudo_id,\n  c.crm_id,\n  e.email_hash\nFROM email_hashes e\nINNER JOIN crm_map c\n  ON e.email_hash = c.email_hash;\n","sql",[83],{"type":32,"tag":60,"props":84,"children":85},{"__ignoreMap":16},[86,98,134,159,168,177,244,258,292,301,318,327,336,369,382,391,400,423,445,462,476,490],{"type":32,"tag":87,"props":88,"children":91},"span",{"class":89,"line":90},"line",1,[92],{"type":32,"tag":87,"props":93,"children":95},{"style":94},"--shiki-default:#6A737D",[96],{"type":37,"value":97},"-- Deterministic identity stitching example\n",{"type":32,"tag":87,"props":99,"children":101},{"class":89,"line":100},2,[102,108,113,118,123,129],{"type":32,"tag":87,"props":103,"children":105},{"style":104},"--shiki-default:#F97583",[106],{"type":37,"value":107},"CREATE",{"type":32,"tag":87,"props":109,"children":110},{"style":104},[111],{"type":37,"value":112}," OR",{"type":32,"tag":87,"props":114,"children":115},{"style":104},[116],{"type":37,"value":117}," REPLACE",{"type":32,"tag":87,"props":119,"children":120},{"style":104},[121],{"type":37,"value":122}," TABLE",{"type":32,"tag":87,"props":124,"children":126},{"style":125},"--shiki-default:#9ECBFF",[127],{"type":37,"value":128}," `project.dataset.identity_graph`",{"type":32,"tag":87,"props":130,"children":131},{"style":104},[132],{"type":37,"value":133}," AS\n",{"type":32,"tag":87,"props":135,"children":137},{"class":89,"line":136},3,[138,143,149,154],{"type":32,"tag":87,"props":139,"children":140},{"style":104},[141],{"type":37,"value":142},"WITH",{"type":32,"tag":87,"props":144,"children":146},{"style":145},"--shiki-default:#E1E4E8",[147],{"type":37,"value":148}," email_hashes ",{"type":32,"tag":87,"props":150,"children":151},{"style":104},[152],{"type":37,"value":153},"AS",{"type":32,"tag":87,"props":155,"children":156},{"style":145},[157],{"type":37,"value":158}," (\n",{"type":32,"tag":87,"props":160,"children":162},{"class":89,"line":161},4,[163],{"type":32,"tag":87,"props":164,"children":165},{"style":104},[166],{"type":37,"value":167},"  SELECT DISTINCT\n",{"type":32,"tag":87,"props":169,"children":171},{"class":89,"line":170},5,[172],{"type":32,"tag":87,"props":173,"children":174},{"style":145},[175],{"type":37,"value":176},"    user_pseudo_id,\n",{"type":32,"tag":87,"props":178,"children":180},{"class":89,"line":179},6,[181,186,192,197,202,206,211,216,221,225,230,235,239],{"type":32,"tag":87,"props":182,"children":183},{"style":145},[184],{"type":37,"value":185},"    TO_HEX(SHA256(",{"type":32,"tag":87,"props":187,"children":189},{"style":188},"--shiki-default:#79B8FF",[190],{"type":37,"value":191},"LOWER",{"type":32,"tag":87,"props":193,"children":194},{"style":145},[195],{"type":37,"value":196},"(",{"type":32,"tag":87,"props":198,"children":199},{"style":188},[200],{"type":37,"value":201},"TRIM",{"type":32,"tag":87,"props":203,"children":204},{"style":145},[205],{"type":37,"value":196},{"type":32,"tag":87,"props":207,"children":208},{"style":188},[209],{"type":37,"value":210},"user_properties",{"type":32,"tag":87,"props":212,"children":213},{"style":145},[214],{"type":37,"value":215},".",{"type":32,"tag":87,"props":217,"children":218},{"style":188},[219],{"type":37,"value":220},"email",{"type":32,"tag":87,"props":222,"children":223},{"style":145},[224],{"type":37,"value":215},{"type":32,"tag":87,"props":226,"children":227},{"style":104},[228],{"type":37,"value":229},"value",{"type":32,"tag":87,"props":231,"children":232},{"style":145},[233],{"type":37,"value":234},")))) ",{"type":32,"tag":87,"props":236,"children":237},{"style":104},[238],{"type":37,"value":153},{"type":32,"tag":87,"props":240,"children":241},{"style":145},[242],{"type":37,"value":243}," email_hash\n",{"type":32,"tag":87,"props":245,"children":247},{"class":89,"line":246},7,[248,253],{"type":32,"tag":87,"props":249,"children":250},{"style":104},[251],{"type":37,"value":252},"  FROM",{"type":32,"tag":87,"props":254,"children":255},{"style":125},[256],{"type":37,"value":257}," `project.dataset.events_*`\n",{"type":32,"tag":87,"props":259,"children":260},{"class":89,"line":26},[261,266,271,275,279,283,287],{"type":32,"tag":87,"props":262,"children":263},{"style":104},[264],{"type":37,"value":265},"  WHERE",{"type":32,"tag":87,"props":267,"children":268},{"style":188},[269],{"type":37,"value":270}," user_properties",{"type":32,"tag":87,"props":272,"children":273},{"style":145},[274],{"type":37,"value":215},{"type":32,"tag":87,"props":276,"children":277},{"style":188},[278],{"type":37,"value":220},{"type":32,"tag":87,"props":280,"children":281},{"style":145},[282],{"type":37,"value":215},{"type":32,"tag":87,"props":284,"children":285},{"style":104},[286],{"type":37,"value":229},{"type":32,"tag":87,"props":288,"children":289},{"style":104},[290],{"type":37,"value":291}," IS NOT NULL\n",{"type":32,"tag":87,"props":293,"children":295},{"class":89,"line":294},9,[296],{"type":32,"tag":87,"props":297,"children":298},{"style":145},[299],{"type":37,"value":300},"),\n",{"type":32,"tag":87,"props":302,"children":304},{"class":89,"line":303},10,[305,310,314],{"type":32,"tag":87,"props":306,"children":307},{"style":145},[308],{"type":37,"value":309},"crm_map ",{"type":32,"tag":87,"props":311,"children":312},{"style":104},[313],{"type":37,"value":153},{"type":32,"tag":87,"props":315,"children":316},{"style":145},[317],{"type":37,"value":158},{"type":32,"tag":87,"props":319,"children":321},{"class":89,"line":320},11,[322],{"type":32,"tag":87,"props":323,"children":324},{"style":104},[325],{"type":37,"value":326},"  SELECT\n",{"type":32,"tag":87,"props":328,"children":330},{"class":89,"line":329},12,[331],{"type":32,"tag":87,"props":332,"children":333},{"style":145},[334],{"type":37,"value":335},"    crm_id,\n",{"type":32,"tag":87,"props":337,"children":339},{"class":89,"line":338},13,[340,344,348,352,356,361,365],{"type":32,"tag":87,"props":341,"children":342},{"style":145},[343],{"type":37,"value":185},{"type":32,"tag":87,"props":345,"children":346},{"style":188},[347],{"type":37,"value":191},{"type":32,"tag":87,"props":349,"children":350},{"style":145},[351],{"type":37,"value":196},{"type":32,"tag":87,"props":353,"children":354},{"style":188},[355],{"type":37,"value":201},{"type":32,"tag":87,"props":357,"children":358},{"style":145},[359],{"type":37,"value":360},"(email)))) ",{"type":32,"tag":87,"props":362,"children":363},{"style":104},[364],{"type":37,"value":153},{"type":32,"tag":87,"props":366,"children":367},{"style":145},[368],{"type":37,"value":243},{"type":32,"tag":87,"props":370,"children":372},{"class":89,"line":371},14,[373,377],{"type":32,"tag":87,"props":374,"children":375},{"style":104},[376],{"type":37,"value":252},{"type":32,"tag":87,"props":378,"children":379},{"style":125},[380],{"type":37,"value":381}," `project.crm.customers`\n",{"type":32,"tag":87,"props":383,"children":385},{"class":89,"line":384},15,[386],{"type":32,"tag":87,"props":387,"children":388},{"style":145},[389],{"type":37,"value":390},")\n",{"type":32,"tag":87,"props":392,"children":394},{"class":89,"line":393},16,[395],{"type":32,"tag":87,"props":396,"children":397},{"style":104},[398],{"type":37,"value":399},"SELECT\n",{"type":32,"tag":87,"props":401,"children":403},{"class":89,"line":402},17,[404,409,413,418],{"type":32,"tag":87,"props":405,"children":406},{"style":188},[407],{"type":37,"value":408},"  e",{"type":32,"tag":87,"props":410,"children":411},{"style":145},[412],{"type":37,"value":215},{"type":32,"tag":87,"props":414,"children":415},{"style":188},[416],{"type":37,"value":417},"user_pseudo_id",{"type":32,"tag":87,"props":419,"children":420},{"style":145},[421],{"type":37,"value":422},",\n",{"type":32,"tag":87,"props":424,"children":426},{"class":89,"line":425},18,[427,432,436,441],{"type":32,"tag":87,"props":428,"children":429},{"style":188},[430],{"type":37,"value":431},"  c",{"type":32,"tag":87,"props":433,"children":434},{"style":145},[435],{"type":37,"value":215},{"type":32,"tag":87,"props":437,"children":438},{"style":188},[439],{"type":37,"value":440},"crm_id",{"type":32,"tag":87,"props":442,"children":443},{"style":145},[444],{"type":37,"value":422},{"type":32,"tag":87,"props":446,"children":448},{"class":89,"line":447},19,[449,453,457],{"type":32,"tag":87,"props":450,"children":451},{"style":188},[452],{"type":37,"value":408},{"type":32,"tag":87,"props":454,"children":455},{"style":145},[456],{"type":37,"value":215},{"type":32,"tag":87,"props":458,"children":459},{"style":188},[460],{"type":37,"value":461},"email_hash\n",{"type":32,"tag":87,"props":463,"children":465},{"class":89,"line":464},20,[466,471],{"type":32,"tag":87,"props":467,"children":468},{"style":104},[469],{"type":37,"value":470},"FROM",{"type":32,"tag":87,"props":472,"children":473},{"style":145},[474],{"type":37,"value":475}," email_hashes e\n",{"type":32,"tag":87,"props":477,"children":479},{"class":89,"line":478},21,[480,485],{"type":32,"tag":87,"props":481,"children":482},{"style":104},[483],{"type":37,"value":484},"INNER JOIN",{"type":32,"tag":87,"props":486,"children":487},{"style":145},[488],{"type":37,"value":489}," crm_map c\n",{"type":32,"tag":87,"props":491,"children":493},{"class":89,"line":492},22,[494,499,504,508,513,518,523,527,531],{"type":32,"tag":87,"props":495,"children":496},{"style":104},[497],{"type":37,"value":498},"  ON",{"type":32,"tag":87,"props":500,"children":501},{"style":188},[502],{"type":37,"value":503}," e",{"type":32,"tag":87,"props":505,"children":506},{"style":145},[507],{"type":37,"value":215},{"type":32,"tag":87,"props":509,"children":510},{"style":188},[511],{"type":37,"value":512},"email_hash",{"type":32,"tag":87,"props":514,"children":515},{"style":104},[516],{"type":37,"value":517}," =",{"type":32,"tag":87,"props":519,"children":520},{"style":188},[521],{"type":37,"value":522}," c",{"type":32,"tag":87,"props":524,"children":525},{"style":145},[526],{"type":37,"value":215},{"type":32,"tag":87,"props":528,"children":529},{"style":188},[530],{"type":37,"value":512},{"type":32,"tag":87,"props":532,"children":533},{"style":145},[534],{"type":37,"value":535},";\n",{"type":32,"tag":33,"props":537,"children":538},{},[539,541,546,548,553,555,560,562,568,570,577,579,585],{"type":37,"value":540},"This query links the ",{"type":32,"tag":60,"props":542,"children":544},{"className":543},[],[545],{"type":37,"value":417},{"type":37,"value":547}," from Firebase Analytics to the ",{"type":32,"tag":60,"props":549,"children":551},{"className":550},[],[552],{"type":37,"value":440},{"type":37,"value":554}," from your CRM ",{"type":32,"tag":52,"props":556,"children":557},{},[558],{"type":37,"value":559},"via exact match",{"type":37,"value":561}," on the email hash. The email hash serves as the anchor identifier. Critical detail: ",{"type":32,"tag":60,"props":563,"children":565},{"className":564},[],[566],{"type":37,"value":567},"LOWER(TRIM())",{"type":37,"value":569}," — if a user entered \"",{"type":32,"tag":571,"props":572,"children":574},"a",{"href":573},"mailto:Ali@X.com",[575],{"type":37,"value":576},"Ali@X.com",{"type":37,"value":578},"\" but your CRM stores \"",{"type":32,"tag":571,"props":580,"children":582},{"href":581},"mailto:ali@x.com",[583],{"type":37,"value":584},"ali@x.com",{"type":37,"value":586},"\", the hash match will fail. Normalization is the first step of any identity pipeline.",{"type":32,"tag":33,"props":588,"children":589},{},[590],{"type":37,"value":591},"Deterministic matching has 100% precision but low recall — it only finds records where both systems possess the same identifier. A user who exited without submitting their email never enters this graph.",{"type":32,"tag":593,"props":594,"children":596},"h3",{"id":595},"hash-collision-and-privacy",[597],{"type":37,"value":598},"Hash Collision and Privacy",{"type":32,"tag":33,"props":600,"children":601},{},[602],{"type":37,"value":603},"SHA-256 collision probability is theoretically 2^-256 — effectively zero in practice. However, GDPR Article 32 does not equate hashing with anonymization; a hash alone is not sufficient. Email hash + IP + timestamp can lead to user re-identification. Hash tables must therefore be protected with encryption-at-rest and column-level access controls.",{"type":32,"tag":40,"props":605,"children":607},{"id":606},"probabilistic-linking-graph-based-probability-matching",[608],{"type":37,"value":609},"Probabilistic Linking: Graph-Based Probability Matching",{"type":32,"tag":33,"props":611,"children":612},{},[613,615,620,622,627,629,634],{"type":37,"value":614},"When deterministic joins fail, probabilistic matching takes over. You attempt to link two records with different identifiers using ",{"type":32,"tag":52,"props":616,"children":617},{},[618],{"type":37,"value":619},"behavioral similarity",{"type":37,"value":621},", ",{"type":32,"tag":52,"props":623,"children":624},{},[625],{"type":37,"value":626},"device fingerprint",{"type":37,"value":628},", and ",{"type":32,"tag":52,"props":630,"children":631},{},[632],{"type":37,"value":633},"timezone + user-agent",{"type":37,"value":635}," as weak signals. A machine learning model is not needed — a weighted scoring + threshold system is sufficient.",{"type":32,"tag":637,"props":638,"children":639},"table",{},[640,664],{"type":32,"tag":641,"props":642,"children":643},"thead",{},[644],{"type":32,"tag":645,"props":646,"children":647},"tr",{},[648,654,659],{"type":32,"tag":649,"props":650,"children":651},"th",{},[652],{"type":37,"value":653},"Signal",{"type":32,"tag":649,"props":655,"children":656},{},[657],{"type":37,"value":658},"Weight",{"type":32,"tag":649,"props":660,"children":661},{},[662],{"type":37,"value":663},"Example",{"type":32,"tag":665,"props":666,"children":667},"tbody",{},[668,687,705,723,741],{"type":32,"tag":645,"props":669,"children":670},{},[671,677,682],{"type":32,"tag":672,"props":673,"children":674},"td",{},[675],{"type":37,"value":676},"Same IP (within 24 hours)",{"type":32,"tag":672,"props":678,"children":679},{},[680],{"type":37,"value":681},"0.3",{"type":32,"tag":672,"props":683,"children":684},{},[685],{"type":37,"value":686},"192.168.1.10",{"type":32,"tag":645,"props":688,"children":689},{},[690,695,700],{"type":32,"tag":672,"props":691,"children":692},{},[693],{"type":37,"value":694},"Same User-Agent",{"type":32,"tag":672,"props":696,"children":697},{},[698],{"type":37,"value":699},"0.2",{"type":32,"tag":672,"props":701,"children":702},{},[703],{"type":37,"value":704},"Chrome 120 \u002F Mac",{"type":32,"tag":645,"props":706,"children":707},{},[708,713,718],{"type":32,"tag":672,"props":709,"children":710},{},[711],{"type":37,"value":712},"Same geographic location",{"type":32,"tag":672,"props":714,"children":715},{},[716],{"type":37,"value":717},"0.15",{"type":32,"tag":672,"props":719,"children":720},{},[721],{"type":37,"value":722},"Istanbul, Kadıköy",{"type":32,"tag":645,"props":724,"children":725},{},[726,731,736],{"type":32,"tag":672,"props":727,"children":728},{},[729],{"type":37,"value":730},"Same campaign click",{"type":32,"tag":672,"props":732,"children":733},{},[734],{"type":37,"value":735},"0.25",{"type":32,"tag":672,"props":737,"children":738},{},[739],{"type":37,"value":740},"utm_campaign=spring_sale",{"type":32,"tag":645,"props":742,"children":743},{},[744,749,754],{"type":32,"tag":672,"props":745,"children":746},{},[747],{"type":37,"value":748},"Same product view sequence",{"type":32,"tag":672,"props":750,"children":751},{},[752],{"type":37,"value":753},"0.1",{"type":32,"tag":672,"props":755,"children":756},{},[757],{"type":37,"value":758},"product_123 → product_456",{"type":32,"tag":33,"props":760,"children":761},{},[762,764,769],{"type":37,"value":763},"If the total score ≥ 0.7, the two sessions are ",{"type":32,"tag":52,"props":765,"children":766},{},[767],{"type":37,"value":768},"likely",{"type":37,"value":770}," the same person. Adjust this threshold based on your dataset — e-commerce may tolerate 0.65, fintech requires 0.85.",{"type":32,"tag":77,"props":772,"children":774},{"className":79,"code":773,"language":81,"meta":16,"style":16},"-- Probabilistic scoring example\nWITH sessions AS (\n  SELECT\n    session_id,\n    user_pseudo_id,\n    device.operating_system,\n    device.web_info.browser,\n    geo.city,\n    traffic_source.medium,\n    ARRAY_AGG(ecommerce.items.item_id ORDER BY event_timestamp) AS item_sequence\n  FROM `project.dataset.events_*`\n  WHERE event_name = 'page_view'\n  GROUP BY 1,2,3,4,5,6\n)\nSELECT\n  a.session_id AS session_a,\n  b.session_id AS session_b,\n  (CASE WHEN a.operating_system = b.operating_system THEN 0.2 ELSE 0 END +\n   CASE WHEN a.browser = b.browser THEN 0.2 ELSE 0 END +\n   CASE WHEN a.city = b.city THEN 0.15 ELSE 0 END +\n   CASE WHEN a.medium = b.medium THEN 0.25 ELSE 0 END +\n   CASE WHEN a.item_sequence = b.item_sequence THEN 0.2 ELSE 0 END\n  ) AS match_score\nFROM sessions a\nCROSS JOIN sessions b\nWHERE a.session_id \u003C b.session_id  -- self-join optimization\n  AND a.user_pseudo_id != b.user_pseudo_id\nHAVING match_score >= 0.7;\n",[775],{"type":32,"tag":60,"props":776,"children":777},{"__ignoreMap":16},[778,786,807,814,822,829,850,871,892,913,959,970,992,1051,1058,1065,1091,1116,1201,1274,1346,1418,1487,1505,1522,1540,1583,1622],{"type":32,"tag":87,"props":779,"children":780},{"class":89,"line":90},[781],{"type":32,"tag":87,"props":782,"children":783},{"style":94},[784],{"type":37,"value":785},"-- Probabilistic scoring example\n",{"type":32,"tag":87,"props":787,"children":788},{"class":89,"line":100},[789,793,798,803],{"type":32,"tag":87,"props":790,"children":791},{"style":104},[792],{"type":37,"value":142},{"type":32,"tag":87,"props":794,"children":795},{"style":104},[796],{"type":37,"value":797}," sessions",{"type":32,"tag":87,"props":799,"children":800},{"style":104},[801],{"type":37,"value":802}," AS",{"type":32,"tag":87,"props":804,"children":805},{"style":145},[806],{"type":37,"value":158},{"type":32,"tag":87,"props":808,"children":809},{"class":89,"line":136},[810],{"type":32,"tag":87,"props":811,"children":812},{"style":104},[813],{"type":37,"value":326},{"type":32,"tag":87,"props":815,"children":816},{"class":89,"line":161},[817],{"type":32,"tag":87,"props":818,"children":819},{"style":145},[820],{"type":37,"value":821},"    session_id,\n",{"type":32,"tag":87,"props":823,"children":824},{"class":89,"line":170},[825],{"type":32,"tag":87,"props":826,"children":827},{"style":145},[828],{"type":37,"value":176},{"type":32,"tag":87,"props":830,"children":831},{"class":89,"line":179},[832,837,841,846],{"type":32,"tag":87,"props":833,"children":834},{"style":188},[835],{"type":37,"value":836},"    device",{"type":32,"tag":87,"props":838,"children":839},{"style":145},[840],{"type":37,"value":215},{"type":32,"tag":87,"props":842,"children":843},{"style":188},[844],{"type":37,"value":845},"operating_system",{"type":32,"tag":87,"props":847,"children":848},{"style":145},[849],{"type":37,"value":422},{"type":32,"tag":87,"props":851,"children":852},{"class":89,"line":246},[853,857,861,866],{"type":32,"tag":87,"props":854,"children":855},{"style":188},[856],{"type":37,"value":836},{"type":32,"tag":87,"props":858,"children":859},{"style":145},[860],{"type":37,"value":215},{"type":32,"tag":87,"props":862,"children":863},{"style":188},[864],{"type":37,"value":865},"web_info",{"type":32,"tag":87,"props":867,"children":868},{"style":145},[869],{"type":37,"value":870},".browser,\n",{"type":32,"tag":87,"props":872,"children":873},{"class":89,"line":26},[874,879,883,888],{"type":32,"tag":87,"props":875,"children":876},{"style":188},[877],{"type":37,"value":878},"    geo",{"type":32,"tag":87,"props":880,"children":881},{"style":145},[882],{"type":37,"value":215},{"type":32,"tag":87,"props":884,"children":885},{"style":188},[886],{"type":37,"value":887},"city",{"type":32,"tag":87,"props":889,"children":890},{"style":145},[891],{"type":37,"value":422},{"type":32,"tag":87,"props":893,"children":894},{"class":89,"line":294},[895,900,904,909],{"type":32,"tag":87,"props":896,"children":897},{"style":188},[898],{"type":37,"value":899},"    traffic_source",{"type":32,"tag":87,"props":901,"children":902},{"style":145},[903],{"type":37,"value":215},{"type":32,"tag":87,"props":905,"children":906},{"style":188},[907],{"type":37,"value":908},"medium",{"type":32,"tag":87,"props":910,"children":911},{"style":145},[912],{"type":37,"value":422},{"type":32,"tag":87,"props":914,"children":915},{"class":89,"line":303},[916,921,926,930,935,940,945,950,954],{"type":32,"tag":87,"props":917,"children":918},{"style":145},[919],{"type":37,"value":920},"    ARRAY_AGG(",{"type":32,"tag":87,"props":922,"children":923},{"style":188},[924],{"type":37,"value":925},"ecommerce",{"type":32,"tag":87,"props":927,"children":928},{"style":145},[929],{"type":37,"value":215},{"type":32,"tag":87,"props":931,"children":932},{"style":188},[933],{"type":37,"value":934},"items",{"type":32,"tag":87,"props":936,"children":937},{"style":145},[938],{"type":37,"value":939},".item_id ",{"type":32,"tag":87,"props":941,"children":942},{"style":104},[943],{"type":37,"value":944},"ORDER BY",{"type":32,"tag":87,"props":946,"children":947},{"style":145},[948],{"type":37,"value":949}," event_timestamp) ",{"type":32,"tag":87,"props":951,"children":952},{"style":104},[953],{"type":37,"value":153},{"type":32,"tag":87,"props":955,"children":956},{"style":145},[957],{"type":37,"value":958}," item_sequence\n",{"type":32,"tag":87,"props":960,"children":961},{"class":89,"line":320},[962,966],{"type":32,"tag":87,"props":963,"children":964},{"style":104},[965],{"type":37,"value":252},{"type":32,"tag":87,"props":967,"children":968},{"style":125},[969],{"type":37,"value":257},{"type":32,"tag":87,"props":971,"children":972},{"class":89,"line":329},[973,977,982,987],{"type":32,"tag":87,"props":974,"children":975},{"style":104},[976],{"type":37,"value":265},{"type":32,"tag":87,"props":978,"children":979},{"style":145},[980],{"type":37,"value":981}," event_name ",{"type":32,"tag":87,"props":983,"children":984},{"style":104},[985],{"type":37,"value":986},"=",{"type":32,"tag":87,"props":988,"children":989},{"style":125},[990],{"type":37,"value":991}," 'page_view'\n",{"type":32,"tag":87,"props":993,"children":994},{"class":89,"line":338},[995,1000,1005,1010,1015,1019,1024,1028,1033,1037,1042,1046],{"type":32,"tag":87,"props":996,"children":997},{"style":104},[998],{"type":37,"value":999},"  GROUP BY",{"type":32,"tag":87,"props":1001,"children":1002},{"style":188},[1003],{"type":37,"value":1004}," 1",{"type":32,"tag":87,"props":1006,"children":1007},{"style":145},[1008],{"type":37,"value":1009},",",{"type":32,"tag":87,"props":1011,"children":1012},{"style":188},[1013],{"type":37,"value":1014},"2",{"type":32,"tag":87,"props":1016,"children":1017},{"style":145},[1018],{"type":37,"value":1009},{"type":32,"tag":87,"props":1020,"children":1021},{"style":188},[1022],{"type":37,"value":1023},"3",{"type":32,"tag":87,"props":1025,"children":1026},{"style":145},[1027],{"type":37,"value":1009},{"type":32,"tag":87,"props":1029,"children":1030},{"style":188},[1031],{"type":37,"value":1032},"4",{"type":32,"tag":87,"props":1034,"children":1035},{"style":145},[1036],{"type":37,"value":1009},{"type":32,"tag":87,"props":1038,"children":1039},{"style":188},[1040],{"type":37,"value":1041},"5",{"type":32,"tag":87,"props":1043,"children":1044},{"style":145},[1045],{"type":37,"value":1009},{"type":32,"tag":87,"props":1047,"children":1048},{"style":188},[1049],{"type":37,"value":1050},"6\n",{"type":32,"tag":87,"props":1052,"children":1053},{"class":89,"line":371},[1054],{"type":32,"tag":87,"props":1055,"children":1056},{"style":145},[1057],{"type":37,"value":390},{"type":32,"tag":87,"props":1059,"children":1060},{"class":89,"line":384},[1061],{"type":32,"tag":87,"props":1062,"children":1063},{"style":104},[1064],{"type":37,"value":399},{"type":32,"tag":87,"props":1066,"children":1067},{"class":89,"line":393},[1068,1073,1077,1082,1086],{"type":32,"tag":87,"props":1069,"children":1070},{"style":188},[1071],{"type":37,"value":1072},"  a",{"type":32,"tag":87,"props":1074,"children":1075},{"style":145},[1076],{"type":37,"value":215},{"type":32,"tag":87,"props":1078,"children":1079},{"style":188},[1080],{"type":37,"value":1081},"session_id",{"type":32,"tag":87,"props":1083,"children":1084},{"style":104},[1085],{"type":37,"value":802},{"type":32,"tag":87,"props":1087,"children":1088},{"style":145},[1089],{"type":37,"value":1090}," session_a,\n",{"type":32,"tag":87,"props":1092,"children":1093},{"class":89,"line":402},[1094,1099,1103,1107,1111],{"type":32,"tag":87,"props":1095,"children":1096},{"style":188},[1097],{"type":37,"value":1098},"  b",{"type":32,"tag":87,"props":1100,"children":1101},{"style":145},[1102],{"type":37,"value":215},{"type":32,"tag":87,"props":1104,"children":1105},{"style":188},[1106],{"type":37,"value":1081},{"type":32,"tag":87,"props":1108,"children":1109},{"style":104},[1110],{"type":37,"value":802},{"type":32,"tag":87,"props":1112,"children":1113},{"style":145},[1114],{"type":37,"value":1115}," session_b,\n",{"type":32,"tag":87,"props":1117,"children":1118},{"class":89,"line":425},[1119,1124,1129,1134,1139,1143,1147,1151,1156,1160,1164,1169,1174,1178,1182,1187,1191,1196],{"type":32,"tag":87,"props":1120,"children":1121},{"style":145},[1122],{"type":37,"value":1123},"  (",{"type":32,"tag":87,"props":1125,"children":1126},{"style":104},[1127],{"type":37,"value":1128},"CASE",{"type":32,"tag":87,"props":1130,"children":1131},{"style":104},[1132],{"type":37,"value":1133}," WHEN",{"type":32,"tag":87,"props":1135,"children":1136},{"style":188},[1137],{"type":37,"value":1138}," a",{"type":32,"tag":87,"props":1140,"children":1141},{"style":145},[1142],{"type":37,"value":215},{"type":32,"tag":87,"props":1144,"children":1145},{"style":188},[1146],{"type":37,"value":845},{"type":32,"tag":87,"props":1148,"children":1149},{"style":104},[1150],{"type":37,"value":517},{"type":32,"tag":87,"props":1152,"children":1153},{"style":188},[1154],{"type":37,"value":1155}," b",{"type":32,"tag":87,"props":1157,"children":1158},{"style":145},[1159],{"type":37,"value":215},{"type":32,"tag":87,"props":1161,"children":1162},{"style":188},[1163],{"type":37,"value":845},{"type":32,"tag":87,"props":1165,"children":1166},{"style":104},[1167],{"type":37,"value":1168}," THEN",{"type":32,"tag":87,"props":1170,"children":1171},{"style":188},[1172],{"type":37,"value":1173}," 0",{"type":32,"tag":87,"props":1175,"children":1176},{"style":145},[1177],{"type":37,"value":215},{"type":32,"tag":87,"props":1179,"children":1180},{"style":188},[1181],{"type":37,"value":1014},{"type":32,"tag":87,"props":1183,"children":1184},{"style":104},[1185],{"type":37,"value":1186}," ELSE",{"type":32,"tag":87,"props":1188,"children":1189},{"style":188},[1190],{"type":37,"value":1173},{"type":32,"tag":87,"props":1192,"children":1193},{"style":104},[1194],{"type":37,"value":1195}," END",{"type":32,"tag":87,"props":1197,"children":1198},{"style":104},[1199],{"type":37,"value":1200}," +\n",{"type":32,"tag":87,"props":1202,"children":1203},{"class":89,"line":447},[1204,1209,1213,1217,1221,1226,1230,1234,1238,1242,1246,1250,1254,1258,1262,1266,1270],{"type":32,"tag":87,"props":1205,"children":1206},{"style":104},[1207],{"type":37,"value":1208},"   CASE",{"type":32,"tag":87,"props":1210,"children":1211},{"style":104},[1212],{"type":37,"value":1133},{"type":32,"tag":87,"props":1214,"children":1215},{"style":188},[1216],{"type":37,"value":1138},{"type":32,"tag":87,"props":1218,"children":1219},{"style":145},[1220],{"type":37,"value":215},{"type":32,"tag":87,"props":1222,"children":1223},{"style":188},[1224],{"type":37,"value":1225},"browser",{"type":32,"tag":87,"props":1227,"children":1228},{"style":104},[1229],{"type":37,"value":517},{"type":32,"tag":87,"props":1231,"children":1232},{"style":188},[1233],{"type":37,"value":1155},{"type":32,"tag":87,"props":1235,"children":1236},{"style":145},[1237],{"type":37,"value":215},{"type":32,"tag":87,"props":1239,"children":1240},{"style":188},[1241],{"type":37,"value":1225},{"type":32,"tag":87,"props":1243,"children":1244},{"style":104},[1245],{"type":37,"value":1168},{"type":32,"tag":87,"props":1247,"children":1248},{"style":188},[1249],{"type":37,"value":1173},{"type":32,"tag":87,"props":1251,"children":1252},{"style":145},[1253],{"type":37,"value":215},{"type":32,"tag":87,"props":1255,"children":1256},{"style":188},[1257],{"type":37,"value":1014},{"type":32,"tag":87,"props":1259,"children":1260},{"style":104},[1261],{"type":37,"value":1186},{"type":32,"tag":87,"props":1263,"children":1264},{"style":188},[1265],{"type":37,"value":1173},{"type":32,"tag":87,"props":1267,"children":1268},{"style":104},[1269],{"type":37,"value":1195},{"type":32,"tag":87,"props":1271,"children":1272},{"style":104},[1273],{"type":37,"value":1200},{"type":32,"tag":87,"props":1275,"children":1276},{"class":89,"line":464},[1277,1281,1285,1289,1293,1297,1301,1305,1309,1313,1317,1321,1325,1330,1334,1338,1342],{"type":32,"tag":87,"props":1278,"children":1279},{"style":104},[1280],{"type":37,"value":1208},{"type":32,"tag":87,"props":1282,"children":1283},{"style":104},[1284],{"type":37,"value":1133},{"type":32,"tag":87,"props":1286,"children":1287},{"style":188},[1288],{"type":37,"value":1138},{"type":32,"tag":87,"props":1290,"children":1291},{"style":145},[1292],{"type":37,"value":215},{"type":32,"tag":87,"props":1294,"children":1295},{"style":188},[1296],{"type":37,"value":887},{"type":32,"tag":87,"props":1298,"children":1299},{"style":104},[1300],{"type":37,"value":517},{"type":32,"tag":87,"props":1302,"children":1303},{"style":188},[1304],{"type":37,"value":1155},{"type":32,"tag":87,"props":1306,"children":1307},{"style":145},[1308],{"type":37,"value":215},{"type":32,"tag":87,"props":1310,"children":1311},{"style":188},[1312],{"type":37,"value":887},{"type":32,"tag":87,"props":1314,"children":1315},{"style":104},[1316],{"type":37,"value":1168},{"type":32,"tag":87,"props":1318,"children":1319},{"style":188},[1320],{"type":37,"value":1173},{"type":32,"tag":87,"props":1322,"children":1323},{"style":145},[1324],{"type":37,"value":215},{"type":32,"tag":87,"props":1326,"children":1327},{"style":188},[1328],{"type":37,"value":1329},"15",{"type":32,"tag":87,"props":1331,"children":1332},{"style":104},[1333],{"type":37,"value":1186},{"type":32,"tag":87,"props":1335,"children":1336},{"style":188},[1337],{"type":37,"value":1173},{"type":32,"tag":87,"props":1339,"children":1340},{"style":104},[1341],{"type":37,"value":1195},{"type":32,"tag":87,"props":1343,"children":1344},{"style":104},[1345],{"type":37,"value":1200},{"type":32,"tag":87,"props":1347,"children":1348},{"class":89,"line":478},[1349,1353,1357,1361,1365,1369,1373,1377,1381,1385,1389,1393,1397,1402,1406,1410,1414],{"type":32,"tag":87,"props":1350,"children":1351},{"style":104},[1352],{"type":37,"value":1208},{"type":32,"tag":87,"props":1354,"children":1355},{"style":104},[1356],{"type":37,"value":1133},{"type":32,"tag":87,"props":1358,"children":1359},{"style":188},[1360],{"type":37,"value":1138},{"type":32,"tag":87,"props":1362,"children":1363},{"style":145},[1364],{"type":37,"value":215},{"type":32,"tag":87,"props":1366,"children":1367},{"style":188},[1368],{"type":37,"value":908},{"type":32,"tag":87,"props":1370,"children":1371},{"style":104},[1372],{"type":37,"value":517},{"type":32,"tag":87,"props":1374,"children":1375},{"style":188},[1376],{"type":37,"value":1155},{"type":32,"tag":87,"props":1378,"children":1379},{"style":145},[1380],{"type":37,"value":215},{"type":32,"tag":87,"props":1382,"children":1383},{"style":188},[1384],{"type":37,"value":908},{"type":32,"tag":87,"props":1386,"children":1387},{"style":104},[1388],{"type":37,"value":1168},{"type":32,"tag":87,"props":1390,"children":1391},{"style":188},[1392],{"type":37,"value":1173},{"type":32,"tag":87,"props":1394,"children":1395},{"style":145},[1396],{"type":37,"value":215},{"type":32,"tag":87,"props":1398,"children":1399},{"style":188},[1400],{"type":37,"value":1401},"25",{"type":32,"tag":87,"props":1403,"children":1404},{"style":104},[1405],{"type":37,"value":1186},{"type":32,"tag":87,"props":1407,"children":1408},{"style":188},[1409],{"type":37,"value":1173},{"type":32,"tag":87,"props":1411,"children":1412},{"style":104},[1413],{"type":37,"value":1195},{"type":32,"tag":87,"props":1415,"children":1416},{"style":104},[1417],{"type":37,"value":1200},{"type":32,"tag":87,"props":1419,"children":1420},{"class":89,"line":492},[1421,1425,1429,1433,1437,1442,1446,1450,1454,1458,1462,1466,1470,1474,1478,1482],{"type":32,"tag":87,"props":1422,"children":1423},{"style":104},[1424],{"type":37,"value":1208},{"type":32,"tag":87,"props":1426,"children":1427},{"style":104},[1428],{"type":37,"value":1133},{"type":32,"tag":87,"props":1430,"children":1431},{"style":188},[1432],{"type":37,"value":1138},{"type":32,"tag":87,"props":1434,"children":1435},{"style":145},[1436],{"type":37,"value":215},{"type":32,"tag":87,"props":1438,"children":1439},{"style":188},[1440],{"type":37,"value":1441},"item_sequence",{"type":32,"tag":87,"props":1443,"children":1444},{"style":104},[1445],{"type":37,"value":517},{"type":32,"tag":87,"props":1447,"children":1448},{"style":188},[1449],{"type":37,"value":1155},{"type":32,"tag":87,"props":1451,"children":1452},{"style":145},[1453],{"type":37,"value":215},{"type":32,"tag":87,"props":1455,"children":1456},{"style":188},[1457],{"type":37,"value":1441},{"type":32,"tag":87,"props":1459,"children":1460},{"style":104},[1461],{"type":37,"value":1168},{"type":32,"tag":87,"props":1463,"children":1464},{"style":188},[1465],{"type":37,"value":1173},{"type":32,"tag":87,"props":1467,"children":1468},{"style":145},[1469],{"type":37,"value":215},{"type":32,"tag":87,"props":1471,"children":1472},{"style":188},[1473],{"type":37,"value":1014},{"type":32,"tag":87,"props":1475,"children":1476},{"style":104},[1477],{"type":37,"value":1186},{"type":32,"tag":87,"props":1479,"children":1480},{"style":188},[1481],{"type":37,"value":1173},{"type":32,"tag":87,"props":1483,"children":1484},{"style":104},[1485],{"type":37,"value":1486}," END\n",{"type":32,"tag":87,"props":1488,"children":1490},{"class":89,"line":1489},23,[1491,1496,1500],{"type":32,"tag":87,"props":1492,"children":1493},{"style":145},[1494],{"type":37,"value":1495},"  ) ",{"type":32,"tag":87,"props":1497,"children":1498},{"style":104},[1499],{"type":37,"value":153},{"type":32,"tag":87,"props":1501,"children":1502},{"style":145},[1503],{"type":37,"value":1504}," match_score\n",{"type":32,"tag":87,"props":1506,"children":1508},{"class":89,"line":1507},24,[1509,1513,1517],{"type":32,"tag":87,"props":1510,"children":1511},{"style":104},[1512],{"type":37,"value":470},{"type":32,"tag":87,"props":1514,"children":1515},{"style":104},[1516],{"type":37,"value":797},{"type":32,"tag":87,"props":1518,"children":1519},{"style":145},[1520],{"type":37,"value":1521}," a\n",{"type":32,"tag":87,"props":1523,"children":1525},{"class":89,"line":1524},25,[1526,1531,1535],{"type":32,"tag":87,"props":1527,"children":1528},{"style":104},[1529],{"type":37,"value":1530},"CROSS JOIN",{"type":32,"tag":87,"props":1532,"children":1533},{"style":104},[1534],{"type":37,"value":797},{"type":32,"tag":87,"props":1536,"children":1537},{"style":145},[1538],{"type":37,"value":1539}," b\n",{"type":32,"tag":87,"props":1541,"children":1543},{"class":89,"line":1542},26,[1544,1549,1553,1557,1561,1566,1570,1574,1578],{"type":32,"tag":87,"props":1545,"children":1546},{"style":104},[1547],{"type":37,"value":1548},"WHERE",{"type":32,"tag":87,"props":1550,"children":1551},{"style":188},[1552],{"type":37,"value":1138},{"type":32,"tag":87,"props":1554,"children":1555},{"style":145},[1556],{"type":37,"value":215},{"type":32,"tag":87,"props":1558,"children":1559},{"style":188},[1560],{"type":37,"value":1081},{"type":32,"tag":87,"props":1562,"children":1563},{"style":104},[1564],{"type":37,"value":1565}," \u003C",{"type":32,"tag":87,"props":1567,"children":1568},{"style":188},[1569],{"type":37,"value":1155},{"type":32,"tag":87,"props":1571,"children":1572},{"style":145},[1573],{"type":37,"value":215},{"type":32,"tag":87,"props":1575,"children":1576},{"style":188},[1577],{"type":37,"value":1081},{"type":32,"tag":87,"props":1579,"children":1580},{"style":94},[1581],{"type":37,"value":1582},"  -- self-join optimization\n",{"type":32,"tag":87,"props":1584,"children":1586},{"class":89,"line":1585},27,[1587,1592,1596,1600,1604,1609,1613,1617],{"type":32,"tag":87,"props":1588,"children":1589},{"style":104},[1590],{"type":37,"value":1591},"  AND",{"type":32,"tag":87,"props":1593,"children":1594},{"style":188},[1595],{"type":37,"value":1138},{"type":32,"tag":87,"props":1597,"children":1598},{"style":145},[1599],{"type":37,"value":215},{"type":32,"tag":87,"props":1601,"children":1602},{"style":188},[1603],{"type":37,"value":417},{"type":32,"tag":87,"props":1605,"children":1606},{"style":104},[1607],{"type":37,"value":1608}," !=",{"type":32,"tag":87,"props":1610,"children":1611},{"style":188},[1612],{"type":37,"value":1155},{"type":32,"tag":87,"props":1614,"children":1615},{"style":145},[1616],{"type":37,"value":215},{"type":32,"tag":87,"props":1618,"children":1619},{"style":188},[1620],{"type":37,"value":1621},"user_pseudo_id\n",{"type":32,"tag":87,"props":1623,"children":1625},{"class":89,"line":1624},28,[1626,1631,1636,1641,1645,1649,1654],{"type":32,"tag":87,"props":1627,"children":1628},{"style":104},[1629],{"type":37,"value":1630},"HAVING",{"type":32,"tag":87,"props":1632,"children":1633},{"style":145},[1634],{"type":37,"value":1635}," match_score ",{"type":32,"tag":87,"props":1637,"children":1638},{"style":104},[1639],{"type":37,"value":1640},">=",{"type":32,"tag":87,"props":1642,"children":1643},{"style":188},[1644],{"type":37,"value":1173},{"type":32,"tag":87,"props":1646,"children":1647},{"style":145},[1648],{"type":37,"value":215},{"type":32,"tag":87,"props":1650,"children":1651},{"style":188},[1652],{"type":37,"value":1653},"7",{"type":32,"tag":87,"props":1655,"children":1656},{"style":145},[1657],{"type":37,"value":535},{"type":32,"tag":33,"props":1659,"children":1660},{},[1661,1663,1668],{"type":37,"value":1662},"This query compares ",{"type":32,"tag":52,"props":1664,"children":1665},{},[1666],{"type":37,"value":1667},"all session pairs",{"type":37,"value":1669}," — N² complexity. With 1M sessions, you face 500 billion comparisons. In production, partitioning is required: timestamp windows (7 days), geographic filters (same city), device type filtering (mobile-to-mobile only).",{"type":32,"tag":33,"props":1671,"children":1672},{},[1673],{"type":37,"value":1674},"Probabilistic links carry false positive rates of 5–15%. Downstream activation — CDP segment push, email campaigns — must flag these IDs as \"potential duplicate\" and handle them accordingly.",{"type":32,"tag":40,"props":1676,"children":1678},{"id":1677},"household-identity-same-device-different-users",[1679],{"type":37,"value":1680},"Household Identity: Same Device, Different Users",{"type":32,"tag":33,"props":1682,"children":1683},{},[1684],{"type":37,"value":1685},"A tablet or Smart TV is used by multiple people. Deterministic or probabilistic matching here collapses distinct family members into a single ID — leading to incorrect personalization. Household identity resolution distinguishes these scenarios.",{"type":32,"tag":33,"props":1687,"children":1688},{},[1689,1694],{"type":32,"tag":52,"props":1690,"children":1691},{},[1692],{"type":37,"value":1693},"Session-level fingerprinting:",{"type":37,"value":1695}," Users logging in at different times on the same device show distinct browsing patterns. The user searching for children's clothing at 8:00 AM differs from the one browsing electronics at 11:00 PM.",{"type":32,"tag":33,"props":1697,"children":1698},{},[1699,1704],{"type":32,"tag":52,"props":1700,"children":1701},{},[1702],{"type":37,"value":1703},"Behavioral clustering:",{"type":37,"value":1705}," Apply K-means or hierarchical clustering to sessions. If cluster centroids differ, you create separate \"virtual users\" under the same device_id.",{"type":32,"tag":77,"props":1707,"children":1709},{"className":79,"code":1708,"language":81,"meta":16,"style":16},"-- Feature extraction for household clustering\nCREATE OR REPLACE TABLE `project.dataset.household_features` AS\nSELECT\n  device_id,\n  EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp)) AS hour_of_day,\n  COUNT(DISTINCT CASE WHEN event_name = 'purchase' THEN ecommerce.transaction_id END) AS purchase_count,\n  APPROX_TOP_COUNT(ecommerce.items.item_category, 3) AS top_categories,\n  AVG(ecommerce.purchase_revenue_in_usd) AS avg_basket_value\nFROM `project.dataset.events_*`\nWHERE device_id IS NOT NULL\nGROUP BY device_id, hour_of_day;\n",[1710],{"type":32,"tag":60,"props":1711,"children":1712},{"__ignoreMap":16},[1713,1721,1749,1756,1764,1796,1871,1913,1951,1962,1979],{"type":32,"tag":87,"props":1714,"children":1715},{"class":89,"line":90},[1716],{"type":32,"tag":87,"props":1717,"children":1718},{"style":94},[1719],{"type":37,"value":1720},"-- Feature extraction for household clustering\n",{"type":32,"tag":87,"props":1722,"children":1723},{"class":89,"line":100},[1724,1728,1732,1736,1740,1745],{"type":32,"tag":87,"props":1725,"children":1726},{"style":104},[1727],{"type":37,"value":107},{"type":32,"tag":87,"props":1729,"children":1730},{"style":104},[1731],{"type":37,"value":112},{"type":32,"tag":87,"props":1733,"children":1734},{"style":104},[1735],{"type":37,"value":117},{"type":32,"tag":87,"props":1737,"children":1738},{"style":104},[1739],{"type":37,"value":122},{"type":32,"tag":87,"props":1741,"children":1742},{"style":125},[1743],{"type":37,"value":1744}," `project.dataset.household_features`",{"type":32,"tag":87,"props":1746,"children":1747},{"style":104},[1748],{"type":37,"value":133},{"type":32,"tag":87,"props":1750,"children":1751},{"class":89,"line":136},[1752],{"type":32,"tag":87,"props":1753,"children":1754},{"style":104},[1755],{"type":37,"value":399},{"type":32,"tag":87,"props":1757,"children":1758},{"class":89,"line":161},[1759],{"type":32,"tag":87,"props":1760,"children":1761},{"style":145},[1762],{"type":37,"value":1763},"  device_id,\n",{"type":32,"tag":87,"props":1765,"children":1766},{"class":89,"line":170},[1767,1772,1777,1782,1787,1791],{"type":32,"tag":87,"props":1768,"children":1769},{"style":145},[1770],{"type":37,"value":1771},"  EXTRACT(",{"type":32,"tag":87,"props":1773,"children":1774},{"style":104},[1775],{"type":37,"value":1776},"HOUR",{"type":32,"tag":87,"props":1778,"children":1779},{"style":104},[1780],{"type":37,"value":1781}," FROM",{"type":32,"tag":87,"props":1783,"children":1784},{"style":145},[1785],{"type":37,"value":1786}," TIMESTAMP_MICROS(event_timestamp)) ",{"type":32,"tag":87,"props":1788,"children":1789},{"style":104},[1790],{"type":37,"value":153},{"type":32,"tag":87,"props":1792,"children":1793},{"style":145},[1794],{"type":37,"value":1795}," hour_of_day,\n",{"type":32,"tag":87,"props":1797,"children":1798},{"class":89,"line":179},[1799,1804,1808,1813,1818,1822,1826,1830,1835,1839,1844,1848,1853,1857,1862,1866],{"type":32,"tag":87,"props":1800,"children":1801},{"style":188},[1802],{"type":37,"value":1803},"  COUNT",{"type":32,"tag":87,"props":1805,"children":1806},{"style":145},[1807],{"type":37,"value":196},{"type":32,"tag":87,"props":1809,"children":1810},{"style":104},[1811],{"type":37,"value":1812},"DISTINCT",{"type":32,"tag":87,"props":1814,"children":1815},{"style":104},[1816],{"type":37,"value":1817}," CASE",{"type":32,"tag":87,"props":1819,"children":1820},{"style":104},[1821],{"type":37,"value":1133},{"type":32,"tag":87,"props":1823,"children":1824},{"style":145},[1825],{"type":37,"value":981},{"type":32,"tag":87,"props":1827,"children":1828},{"style":104},[1829],{"type":37,"value":986},{"type":32,"tag":87,"props":1831,"children":1832},{"style":125},[1833],{"type":37,"value":1834}," 'purchase'",{"type":32,"tag":87,"props":1836,"children":1837},{"style":104},[1838],{"type":37,"value":1168},{"type":32,"tag":87,"props":1840,"children":1841},{"style":188},[1842],{"type":37,"value":1843}," ecommerce",{"type":32,"tag":87,"props":1845,"children":1846},{"style":145},[1847],{"type":37,"value":215},{"type":32,"tag":87,"props":1849,"children":1850},{"style":188},[1851],{"type":37,"value":1852},"transaction_id",{"type":32,"tag":87,"props":1854,"children":1855},{"style":104},[1856],{"type":37,"value":1195},{"type":32,"tag":87,"props":1858,"children":1859},{"style":145},[1860],{"type":37,"value":1861},") ",{"type":32,"tag":87,"props":1863,"children":1864},{"style":104},[1865],{"type":37,"value":153},{"type":32,"tag":87,"props":1867,"children":1868},{"style":145},[1869],{"type":37,"value":1870}," purchase_count,\n",{"type":32,"tag":87,"props":1872,"children":1873},{"class":89,"line":246},[1874,1879,1883,1887,1891,1896,1900,1904,1908],{"type":32,"tag":87,"props":1875,"children":1876},{"style":145},[1877],{"type":37,"value":1878},"  APPROX_TOP_COUNT(",{"type":32,"tag":87,"props":1880,"children":1881},{"style":188},[1882],{"type":37,"value":925},{"type":32,"tag":87,"props":1884,"children":1885},{"style":145},[1886],{"type":37,"value":215},{"type":32,"tag":87,"props":1888,"children":1889},{"style":188},[1890],{"type":37,"value":934},{"type":32,"tag":87,"props":1892,"children":1893},{"style":145},[1894],{"type":37,"value":1895},".item_category, ",{"type":32,"tag":87,"props":1897,"children":1898},{"style":188},[1899],{"type":37,"value":1023},{"type":32,"tag":87,"props":1901,"children":1902},{"style":145},[1903],{"type":37,"value":1861},{"type":32,"tag":87,"props":1905,"children":1906},{"style":104},[1907],{"type":37,"value":153},{"type":32,"tag":87,"props":1909,"children":1910},{"style":145},[1911],{"type":37,"value":1912}," top_categories,\n",{"type":32,"tag":87,"props":1914,"children":1915},{"class":89,"line":26},[1916,1921,1925,1929,1933,1938,1942,1946],{"type":32,"tag":87,"props":1917,"children":1918},{"style":188},[1919],{"type":37,"value":1920},"  AVG",{"type":32,"tag":87,"props":1922,"children":1923},{"style":145},[1924],{"type":37,"value":196},{"type":32,"tag":87,"props":1926,"children":1927},{"style":188},[1928],{"type":37,"value":925},{"type":32,"tag":87,"props":1930,"children":1931},{"style":145},[1932],{"type":37,"value":215},{"type":32,"tag":87,"props":1934,"children":1935},{"style":188},[1936],{"type":37,"value":1937},"purchase_revenue_in_usd",{"type":32,"tag":87,"props":1939,"children":1940},{"style":145},[1941],{"type":37,"value":1861},{"type":32,"tag":87,"props":1943,"children":1944},{"style":104},[1945],{"type":37,"value":153},{"type":32,"tag":87,"props":1947,"children":1948},{"style":145},[1949],{"type":37,"value":1950}," avg_basket_value\n",{"type":32,"tag":87,"props":1952,"children":1953},{"class":89,"line":294},[1954,1958],{"type":32,"tag":87,"props":1955,"children":1956},{"style":104},[1957],{"type":37,"value":470},{"type":32,"tag":87,"props":1959,"children":1960},{"style":125},[1961],{"type":37,"value":257},{"type":32,"tag":87,"props":1963,"children":1964},{"class":89,"line":303},[1965,1969,1974],{"type":32,"tag":87,"props":1966,"children":1967},{"style":104},[1968],{"type":37,"value":1548},{"type":32,"tag":87,"props":1970,"children":1971},{"style":145},[1972],{"type":37,"value":1973}," device_id ",{"type":32,"tag":87,"props":1975,"children":1976},{"style":104},[1977],{"type":37,"value":1978},"IS NOT NULL\n",{"type":32,"tag":87,"props":1980,"children":1981},{"class":89,"line":320},[1982,1987],{"type":32,"tag":87,"props":1983,"children":1984},{"style":104},[1985],{"type":37,"value":1986},"GROUP BY",{"type":32,"tag":87,"props":1988,"children":1989},{"style":145},[1990],{"type":37,"value":1991}," device_id, hour_of_day;\n",{"type":32,"tag":33,"props":1993,"children":1994},{},[1995,1997,2003,2004,2010],{"type":37,"value":1996},"After clustering, each device_id generates virtual IDs like ",{"type":32,"tag":60,"props":1998,"children":2000},{"className":1999},[],[2001],{"type":37,"value":2002},"household_user_1",{"type":37,"value":621},{"type":32,"tag":60,"props":2005,"children":2007},{"className":2006},[],[2008],{"type":37,"value":2009},"household_user_2",{"type":37,"value":2011},". These do not sync to your CRM — they exist only in analytics and personalization layers.",{"type":32,"tag":33,"props":2013,"children":2014},{},[2015],{"type":37,"value":2016},"Household resolution precision is low — 30% error margins are normal. This is why it's rarely used outside e-commerce (particularly not in SaaS or fintech).",{"type":32,"tag":40,"props":2018,"children":2020},{"id":2019},"identity-graph-architecture-and-maintenance",[2021],{"type":37,"value":2022},"Identity Graph Architecture and Maintenance",{"type":32,"tag":33,"props":2024,"children":2025},{},[2026,2028,2033],{"type":37,"value":2027},"All matching results consolidate into a single ",{"type":32,"tag":52,"props":2029,"children":2030},{},[2031],{"type":37,"value":2032},"identity graph",{"type":37,"value":2034}," table. This table holds all known aliases for each user: email hash, CRM ID, ga_client_id, Firebase ID, advertising ID.",{"type":32,"tag":637,"props":2036,"children":2037},{},[2038,2074],{"type":32,"tag":641,"props":2039,"children":2040},{},[2041],{"type":32,"tag":645,"props":2042,"children":2043},{},[2044,2049,2054,2059,2064,2069],{"type":32,"tag":649,"props":2045,"children":2046},{},[2047],{"type":37,"value":2048},"canonical_id",{"type":32,"tag":649,"props":2050,"children":2051},{},[2052],{"type":37,"value":2053},"identifier_type",{"type":32,"tag":649,"props":2055,"children":2056},{},[2057],{"type":37,"value":2058},"identifier_value",{"type":32,"tag":649,"props":2060,"children":2061},{},[2062],{"type":37,"value":2063},"match_method",{"type":32,"tag":649,"props":2065,"children":2066},{},[2067],{"type":37,"value":2068},"confidence",{"type":32,"tag":649,"props":2070,"children":2071},{},[2072],{"type":37,"value":2073},"updated_at",{"type":32,"tag":665,"props":2075,"children":2076},{},[2077,2109,2138,2169],{"type":32,"tag":645,"props":2078,"children":2079},{},[2080,2085,2089,2094,2099,2104],{"type":32,"tag":672,"props":2081,"children":2082},{},[2083],{"type":37,"value":2084},"user_0001",{"type":32,"tag":672,"props":2086,"children":2087},{},[2088],{"type":37,"value":512},{"type":32,"tag":672,"props":2090,"children":2091},{},[2092],{"type":37,"value":2093},"a1b2c3...",{"type":32,"tag":672,"props":2095,"children":2096},{},[2097],{"type":37,"value":2098},"deterministic",{"type":32,"tag":672,"props":2100,"children":2101},{},[2102],{"type":37,"value":2103},"1.0",{"type":32,"tag":672,"props":2105,"children":2106},{},[2107],{"type":37,"value":2108},"2026-06-15",{"type":32,"tag":645,"props":2110,"children":2111},{},[2112,2116,2120,2125,2129,2133],{"type":32,"tag":672,"props":2113,"children":2114},{},[2115],{"type":37,"value":2084},{"type":32,"tag":672,"props":2117,"children":2118},{},[2119],{"type":37,"value":73},{"type":32,"tag":672,"props":2121,"children":2122},{},[2123],{"type":37,"value":2124},"GA1.2.123",{"type":32,"tag":672,"props":2126,"children":2127},{},[2128],{"type":37,"value":2098},{"type":32,"tag":672,"props":2130,"children":2131},{},[2132],{"type":37,"value":2103},{"type":32,"tag":672,"props":2134,"children":2135},{},[2136],{"type":37,"value":2137},"2026-06-14",{"type":32,"tag":645,"props":2139,"children":2140},{},[2141,2145,2150,2155,2160,2165],{"type":32,"tag":672,"props":2142,"children":2143},{},[2144],{"type":37,"value":2084},{"type":32,"tag":672,"props":2146,"children":2147},{},[2148],{"type":37,"value":2149},"firebase_id",{"type":32,"tag":672,"props":2151,"children":2152},{},[2153],{"type":37,"value":2154},"xyz789",{"type":32,"tag":672,"props":2156,"children":2157},{},[2158],{"type":37,"value":2159},"probabilistic",{"type":32,"tag":672,"props":2161,"children":2162},{},[2163],{"type":37,"value":2164},"0.75",{"type":32,"tag":672,"props":2166,"children":2167},{},[2168],{"type":37,"value":19},{"type":32,"tag":645,"props":2170,"children":2171},{},[2172,2177,2181,2186,2190,2194],{"type":32,"tag":672,"props":2173,"children":2174},{},[2175],{"type":37,"value":2176},"user_0002",{"type":32,"tag":672,"props":2178,"children":2179},{},[2180],{"type":37,"value":440},{"type":32,"tag":672,"props":2182,"children":2183},{},[2184],{"type":37,"value":2185},"CRM-456",{"type":32,"tag":672,"props":2187,"children":2188},{},[2189],{"type":37,"value":2098},{"type":32,"tag":672,"props":2191,"children":2192},{},[2193],{"type":37,"value":2103},{"type":32,"tag":672,"props":2195,"children":2196},{},[2197],{"type":37,"value":2198},"2026-06-10",{"type":32,"tag":33,"props":2200,"children":2201},{},[2202],{"type":37,"value":2203},"The graph is updated incrementally — each day, new events are scanned and new matches are added. Old links weaken via confidence decay: a probabilistic link from 90 days ago drops from 0.75 to 0.50.",{"type":32,"tag":33,"props":2205,"children":2206},{},[2207,2209,2214],{"type":37,"value":2208},"If you model your graph as a ",{"type":32,"tag":52,"props":2210,"children":2211},{},[2212],{"type":37,"value":2213},"directed acyclic graph (DAG)",{"type":37,"value":2215},", you can detect loops. A cycle like User A → User B → User C → User A signals a data error requiring manual review.",{"type":32,"tag":40,"props":2217,"children":2219},{"id":2218},"cdp-integration-and-activation-pipeline",[2220],{"type":37,"value":2221},"CDP Integration and Activation Pipeline",{"type":32,"tag":33,"props":2223,"children":2224},{},[2225,2227,2235],{"type":37,"value":2226},"The identity graph alone is incomplete — it feeds into a CDP. A CDP architecture following ",{"type":32,"tag":571,"props":2228,"children":2232},{"href":2229,"rel":2230},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fretention-engineering-cdp",[2231],"nofollow",[2233],{"type":37,"value":2234},"CDP & Retention Engineering",{"type":37,"value":2236}," takes the canonical_id from the graph, merges all touchpoints under that ID, and passes it to the segment engine.",{"type":32,"tag":33,"props":2238,"children":2239},{},[2240],{"type":37,"value":2241},"Activation proceeds as follows:",{"type":32,"tag":2243,"props":2244,"children":2245},"ol",{},[2246,2257,2267,2277],{"type":32,"tag":2247,"props":2248,"children":2249},"li",{},[2250,2255],{"type":32,"tag":52,"props":2251,"children":2252},{},[2253],{"type":37,"value":2254},"Segment definition:",{"type":37,"value":2256}," \"3+ sessions in last 30 days, added to cart but no purchase\" → defined as a BigQuery view.",{"type":32,"tag":2247,"props":2258,"children":2259},{},[2260,2265],{"type":32,"tag":52,"props":2261,"children":2262},{},[2263],{"type":37,"value":2264},"Identity resolution:",{"type":37,"value":2266}," The view looks up the canonical_id for each user_pseudo_id.",{"type":32,"tag":2247,"props":2268,"children":2269},{},[2270,2275],{"type":32,"tag":52,"props":2271,"children":2272},{},[2273],{"type":37,"value":2274},"Channel sync:",{"type":37,"value":2276}," All email hashes under that canonical_id push to Meta CAPI; phone hashes push to Google Customer Match.",{"type":32,"tag":2247,"props":2278,"children":2279},{},[2280,2285],{"type":32,"tag":52,"props":2281,"children":2282},{},[2283],{"type":37,"value":2284},"Attribution:",{"type":37,"value":2286}," When a conversion event arrives, the canonical_id traces all touchpoints via the graph.",{"type":32,"tag":33,"props":2288,"children":2289},{},[2290],{"type":37,"value":2291},"Without a CDP, identity resolution remains incomplete — the graph only answers \"who matches with whom,\" not \"what action should I take on this user.\"",{"type":32,"tag":40,"props":2293,"children":2295},{"id":2294},"privacy-compliance-and-consent-propagation",[2296],{"type":37,"value":2297},"Privacy Compliance and Consent Propagation",{"type":32,"tag":33,"props":2299,"children":2300},{},[2301],{"type":37,"value":2302},"Identity resolution justifies itself under GDPR Article 6(1)(f) — \"legitimate interest\" — but if a user has not given explicit consent, identifiers derived from this graph cannot fuel remarketing campaigns. Integration with a Consent Management Platform (CMP) is mandatory.",{"type":32,"tag":33,"props":2304,"children":2305},{},[2306,2308,2314,2316,2322],{"type":37,"value":2307},"Each canonical_id maintains consent status: ",{"type":32,"tag":60,"props":2309,"children":2311},{"className":2310},[],[2312],{"type":37,"value":2313},"{ analytics: true, marketing: false, personalization: true }",{"type":37,"value":2315},". Identifiers derived from the graph inherit this flag — if User A's email_hash has ",{"type":32,"tag":60,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":37,"value":2321},"marketing: false",{"type":37,"value":2323},", then User B's ga_client_id (linked to User A probabilistically) also cannot enter marketing segments.",{"type":32,"tag":33,"props":2325,"children":2326},{},[2327,2329,2336],{"type":37,"value":2328},"Under TCF 2.2, vendor consent propagation becomes more complex: if a user consented to Meta but not Google, graph sync becomes selective. This architecture is part of the ",{"type":32,"tag":571,"props":2330,"children":2333},{"href":2331,"rel":2332},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Ffirstparty",[2231],[2334],{"type":37,"value":2335},"First-Party Data & Measurement Architecture",{"type":37,"value":2337}," process — consent signals are injected into the event pipeline at the start, and graph update jobs read these signals.",{"type":32,"tag":2339,"props":2340,"children":2341},"hr",{},[],{"type":32,"tag":33,"props":2343,"children":2344},{},[2345],{"type":37,"value":2346},"Identity resolution is not simply a technical JOIN operation — it is the critical layer connecting marketing data to decision-making. Solving exact matches via hash matching, weak signals via probabilistic scoring, and shared devices via household clustering demands engineering discipline. Keeping the graph current, aligning it with consent propagation, and feeding it to a CDP activation pipeline comprise the production side of this discipline. In a cookieless era, customer identity is not guessed — it is constructed from six disparate signals unified into one.",{"type":32,"tag":2348,"props":2349,"children":2350},"style",{},[2351],{"type":37,"value":2352},"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":16,"searchDepth":136,"depth":136,"links":2354},[2355,2358,2359,2360,2361,2362],{"id":42,"depth":100,"text":45,"children":2356},[2357],{"id":595,"depth":136,"text":598},{"id":606,"depth":100,"text":609},{"id":1677,"depth":100,"text":1680},{"id":2019,"depth":100,"text":2022},{"id":2218,"depth":100,"text":2221},{"id":2294,"depth":100,"text":2297},"markdown","content:en:data:identity-resolution-unifying-customer-signals.md","content","en\u002Fdata\u002Fidentity-resolution-unifying-customer-signals.md","en\u002Fdata\u002Fidentity-resolution-unifying-customer-signals","md",1782079487648]