[{"data":1,"prerenderedAt":2381},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer":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":13,"_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":2375,"_id":2376,"_source":2377,"_file":2378,"_stem":2379,"_extension":2380},"\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer","data",false,"","Identity Resolution: From 6 Signals to a Single Customer Identity","Technical architecture for unifying fragmented signals into one customer profile using hash matching, probabilistic linking, and household identity.","2026-05-31",[21,22,23,24,25],"identity-resolution","cdp","first-party-data","probabilistic-matching","hash-matching",8,"Roibase",{"type":29,"children":30,"toc":2367},"root",[31,39,46,76,407,435,470,476,481,494,1030,1057,1077,1083,1096,1109,1273,1306,1321,1327,1356,1361,1647,1652,1658,1663,1668,1703,1709,1714,2307,2335,2349,2361],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","A user registers via email, places an order from a mobile app, opens a support ticket from a desktop browser the next day. Cookie ID, device ID, hashed email, IP, session ID, user ID — six different signals. Without identity resolution, they look like six different \"customers.\" Attribution gets miscalculated, LTV models stay skewed, retention signals disappear. Google Analytics 4's User ID merge only unifies authenticated sessions; anonymous behavior stays disconnected. CDPs sell probabilistic stitching but don't show the table structures. To move an identity graph to production, you need hash matching, probabilistic linking, and household identity working together.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"hash-matching-the-backbone-of-deterministic-unification",[44],{"type":37,"value":45},"Hash Matching: The Backbone of Deterministic Unification",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74],{"type":37,"value":50},"Hash matching creates a \"certain\" link between two signals by matching SHA-256 hashes of the same email or phone number. When a user registers on your website and sends ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"user@example.com",{"type":37,"value":59},", hash that value with SHA-256 and write it to BigQuery as a ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"hashed_email",{"type":37,"value":67}," column in your ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"identity_signals",{"type":37,"value":75}," table. When the same email logs in from the mobile app, its hashed value will match, and you merge the two records.",{"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 match example 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",[83],{"type":32,"tag":52,"props":84,"children":85},{"__ignoreMap":16},[86,98,134,143,174,201,222,265,283,302,343,369],{"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 match example in BigQuery\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.merged_identities`",{"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],{"type":32,"tag":87,"props":139,"children":140},{"style":104},[141],{"type":37,"value":142},"SELECT\n",{"type":32,"tag":87,"props":144,"children":146},{"class":89,"line":145},4,[147,153,159,164,169],{"type":32,"tag":87,"props":148,"children":150},{"style":149},"--shiki-default:#79B8FF",[151],{"type":37,"value":152},"  web",{"type":32,"tag":87,"props":154,"children":156},{"style":155},"--shiki-default:#E1E4E8",[157],{"type":37,"value":158},".",{"type":32,"tag":87,"props":160,"children":161},{"style":149},[162],{"type":37,"value":163},"anonymous_id",{"type":32,"tag":87,"props":165,"children":166},{"style":104},[167],{"type":37,"value":168}," AS",{"type":32,"tag":87,"props":170,"children":171},{"style":155},[172],{"type":37,"value":173}," web_cookie_id,\n",{"type":32,"tag":87,"props":175,"children":177},{"class":89,"line":176},5,[178,183,187,192,196],{"type":32,"tag":87,"props":179,"children":180},{"style":149},[181],{"type":37,"value":182},"  mobile",{"type":32,"tag":87,"props":184,"children":185},{"style":155},[186],{"type":37,"value":158},{"type":32,"tag":87,"props":188,"children":189},{"style":149},[190],{"type":37,"value":191},"device_id",{"type":32,"tag":87,"props":193,"children":194},{"style":104},[195],{"type":37,"value":168},{"type":32,"tag":87,"props":197,"children":198},{"style":155},[199],{"type":37,"value":200}," mobile_device_id,\n",{"type":32,"tag":87,"props":202,"children":204},{"class":89,"line":203},6,[205,209,213,217],{"type":32,"tag":87,"props":206,"children":207},{"style":149},[208],{"type":37,"value":152},{"type":32,"tag":87,"props":210,"children":211},{"style":155},[212],{"type":37,"value":158},{"type":32,"tag":87,"props":214,"children":215},{"style":149},[216],{"type":37,"value":65},{"type":32,"tag":87,"props":218,"children":219},{"style":155},[220],{"type":37,"value":221},",\n",{"type":32,"tag":87,"props":223,"children":225},{"class":89,"line":224},7,[226,231,236,241,245,250,255,260],{"type":32,"tag":87,"props":227,"children":228},{"style":149},[229],{"type":37,"value":230},"  MIN",{"type":32,"tag":87,"props":232,"children":233},{"style":155},[234],{"type":37,"value":235},"(",{"type":32,"tag":87,"props":237,"children":238},{"style":149},[239],{"type":37,"value":240},"web",{"type":32,"tag":87,"props":242,"children":243},{"style":155},[244],{"type":37,"value":158},{"type":32,"tag":87,"props":246,"children":247},{"style":149},[248],{"type":37,"value":249},"first_seen_timestamp",{"type":32,"tag":87,"props":251,"children":252},{"style":155},[253],{"type":37,"value":254},") ",{"type":32,"tag":87,"props":256,"children":257},{"style":104},[258],{"type":37,"value":259},"AS",{"type":32,"tag":87,"props":261,"children":262},{"style":155},[263],{"type":37,"value":264}," first_seen\n",{"type":32,"tag":87,"props":266,"children":267},{"class":89,"line":26},[268,273,278],{"type":32,"tag":87,"props":269,"children":270},{"style":104},[271],{"type":37,"value":272},"FROM",{"type":32,"tag":87,"props":274,"children":275},{"style":125},[276],{"type":37,"value":277}," `project.dataset.web_events`",{"type":32,"tag":87,"props":279,"children":280},{"style":155},[281],{"type":37,"value":282}," web\n",{"type":32,"tag":87,"props":284,"children":286},{"class":89,"line":285},9,[287,292,297],{"type":32,"tag":87,"props":288,"children":289},{"style":104},[290],{"type":37,"value":291},"INNER JOIN",{"type":32,"tag":87,"props":293,"children":294},{"style":125},[295],{"type":37,"value":296}," `project.dataset.mobile_events`",{"type":32,"tag":87,"props":298,"children":299},{"style":155},[300],{"type":37,"value":301}," mobile\n",{"type":32,"tag":87,"props":303,"children":305},{"class":89,"line":304},10,[306,311,316,320,324,329,334,338],{"type":32,"tag":87,"props":307,"children":308},{"style":104},[309],{"type":37,"value":310},"  ON",{"type":32,"tag":87,"props":312,"children":313},{"style":149},[314],{"type":37,"value":315}," web",{"type":32,"tag":87,"props":317,"children":318},{"style":155},[319],{"type":37,"value":158},{"type":32,"tag":87,"props":321,"children":322},{"style":149},[323],{"type":37,"value":65},{"type":32,"tag":87,"props":325,"children":326},{"style":104},[327],{"type":37,"value":328}," =",{"type":32,"tag":87,"props":330,"children":331},{"style":149},[332],{"type":37,"value":333}," mobile",{"type":32,"tag":87,"props":335,"children":336},{"style":155},[337],{"type":37,"value":158},{"type":32,"tag":87,"props":339,"children":340},{"style":149},[341],{"type":37,"value":342},"hashed_email\n",{"type":32,"tag":87,"props":344,"children":346},{"class":89,"line":345},11,[347,352,356,360,364],{"type":32,"tag":87,"props":348,"children":349},{"style":104},[350],{"type":37,"value":351},"WHERE",{"type":32,"tag":87,"props":353,"children":354},{"style":149},[355],{"type":37,"value":315},{"type":32,"tag":87,"props":357,"children":358},{"style":155},[359],{"type":37,"value":158},{"type":32,"tag":87,"props":361,"children":362},{"style":149},[363],{"type":37,"value":65},{"type":32,"tag":87,"props":365,"children":366},{"style":104},[367],{"type":37,"value":368}," IS NOT NULL\n",{"type":32,"tag":87,"props":370,"children":372},{"class":89,"line":371},12,[373,378,383,388,393,397,402],{"type":32,"tag":87,"props":374,"children":375},{"style":104},[376],{"type":37,"value":377},"GROUP BY",{"type":32,"tag":87,"props":379,"children":380},{"style":149},[381],{"type":37,"value":382}," 1",{"type":32,"tag":87,"props":384,"children":385},{"style":155},[386],{"type":37,"value":387},",",{"type":32,"tag":87,"props":389,"children":390},{"style":149},[391],{"type":37,"value":392},"2",{"type":32,"tag":87,"props":394,"children":395},{"style":155},[396],{"type":37,"value":387},{"type":32,"tag":87,"props":398,"children":399},{"style":149},[400],{"type":37,"value":401},"3",{"type":32,"tag":87,"props":403,"children":404},{"style":155},[405],{"type":37,"value":406},";\n",{"type":32,"tag":33,"props":408,"children":409},{},[410,412,417,419,425,427,433],{"type":37,"value":411},"This query joins web cookie IDs with mobile device IDs over hashed email. The ",{"type":32,"tag":52,"props":413,"children":415},{"className":414},[],[416],{"type":37,"value":291},{"type":37,"value":418}," is deterministic — only exact matches come through. To group matched signals under the same ",{"type":32,"tag":52,"props":420,"children":422},{"className":421},[],[423],{"type":37,"value":424},"canonical_user_id",{"type":37,"value":426},", use ",{"type":32,"tag":52,"props":428,"children":430},{"className":429},[],[431],{"type":37,"value":432},"ROW_NUMBER()",{"type":37,"value":434}," or UUID generation. Hash matching's limitation: if a user changes email (old account + new account), they stay as two separate identities. Probabilistic layer handles that.",{"type":32,"tag":33,"props":436,"children":437},{},[438,440,445,447,453,454,460,462,468],{"type":37,"value":439},"Hash matching is GDPR and KVKK compliant because you're not storing plaintext email — hash is one-way, irreversible. But it's vulnerable to rainbow table attacks, so add secondary signals alongside email hashes: device fingerprint or IP range. Don't rely on a single hash column — maintain ",{"type":32,"tag":52,"props":441,"children":443},{"className":442},[],[444],{"type":37,"value":65},{"type":37,"value":446},", ",{"type":32,"tag":52,"props":448,"children":450},{"className":449},[],[451],{"type":37,"value":452},"hashed_phone",{"type":37,"value":446},{"type":32,"tag":52,"props":455,"children":457},{"className":456},[],[458],{"type":37,"value":459},"hashed_customer_id",{"type":37,"value":461}," as separate columns. Partition tables by ",{"type":32,"tag":52,"props":463,"children":465},{"className":464},[],[466],{"type":37,"value":467},"DATE(timestamp)",{"type":37,"value":469}," — identity resolution is usually incremental; full-scan history is expensive.",{"type":32,"tag":40,"props":471,"children":473},{"id":472},"probabilistic-linking-managing-uncertainty-with-scores",[474],{"type":37,"value":475},"Probabilistic Linking: Managing Uncertainty with Scores",{"type":32,"tag":33,"props":477,"children":478},{},[479],{"type":37,"value":480},"If a user browses without registering, there's no hashed email — only cookie ID, IP, user agent, session timestamp. Probabilistic matching weights these signals to produce an \"likelihood of being the same person\" score. If the score exceeds a threshold (e.g., 0.85), link the two records; otherwise, keep them separate. Vendors like LiveRamp, Merkle, and Neustar sell these scores, but you can build a rule-based model in your own warehouse.",{"type":32,"tag":33,"props":482,"children":483},{},[484,486,492],{"type":37,"value":485},"Example logic: Same IP + same browser fingerprint (canvas hash) + within 5 minutes → 90% match score. Same IP + different browser + 2-hour gap → 40% score. If your threshold is 0.7, the first pair links; the second stays unlinked. In BigQuery, model this with ",{"type":32,"tag":52,"props":487,"children":489},{"className":488},[],[490],{"type":37,"value":491},"CASE WHEN",{"type":37,"value":493}," blocks:",{"type":32,"tag":77,"props":495,"children":497},{"className":79,"code":496,"language":81,"meta":16,"style":16},"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",[498],{"type":32,"tag":52,"props":499,"children":500},{"__ignoreMap":16},[501,508,534,559,567,607,645,711,733,768,829,849,870,888,906,924,962,999],{"type":32,"tag":87,"props":502,"children":503},{"class":89,"line":90},[504],{"type":32,"tag":87,"props":505,"children":506},{"style":104},[507],{"type":37,"value":142},{"type":32,"tag":87,"props":509,"children":510},{"class":89,"line":100},[511,516,520,525,529],{"type":32,"tag":87,"props":512,"children":513},{"style":149},[514],{"type":37,"value":515},"  a",{"type":32,"tag":87,"props":517,"children":518},{"style":155},[519],{"type":37,"value":158},{"type":32,"tag":87,"props":521,"children":522},{"style":149},[523],{"type":37,"value":524},"session_id",{"type":32,"tag":87,"props":526,"children":527},{"style":104},[528],{"type":37,"value":168},{"type":32,"tag":87,"props":530,"children":531},{"style":155},[532],{"type":37,"value":533}," session_a,\n",{"type":32,"tag":87,"props":535,"children":536},{"class":89,"line":136},[537,542,546,550,554],{"type":32,"tag":87,"props":538,"children":539},{"style":149},[540],{"type":37,"value":541},"  b",{"type":32,"tag":87,"props":543,"children":544},{"style":155},[545],{"type":37,"value":158},{"type":32,"tag":87,"props":547,"children":548},{"style":149},[549],{"type":37,"value":524},{"type":32,"tag":87,"props":551,"children":552},{"style":104},[553],{"type":37,"value":168},{"type":32,"tag":87,"props":555,"children":556},{"style":155},[557],{"type":37,"value":558}," session_b,\n",{"type":32,"tag":87,"props":560,"children":561},{"class":89,"line":145},[562],{"type":32,"tag":87,"props":563,"children":564},{"style":104},[565],{"type":37,"value":566},"  CASE\n",{"type":32,"tag":87,"props":568,"children":569},{"class":89,"line":176},[570,575,580,584,589,593,598,602],{"type":32,"tag":87,"props":571,"children":572},{"style":104},[573],{"type":37,"value":574},"    WHEN",{"type":32,"tag":87,"props":576,"children":577},{"style":149},[578],{"type":37,"value":579}," a",{"type":32,"tag":87,"props":581,"children":582},{"style":155},[583],{"type":37,"value":158},{"type":32,"tag":87,"props":585,"children":586},{"style":149},[587],{"type":37,"value":588},"ip_address",{"type":32,"tag":87,"props":590,"children":591},{"style":104},[592],{"type":37,"value":328},{"type":32,"tag":87,"props":594,"children":595},{"style":149},[596],{"type":37,"value":597}," b",{"type":32,"tag":87,"props":599,"children":600},{"style":155},[601],{"type":37,"value":158},{"type":32,"tag":87,"props":603,"children":604},{"style":149},[605],{"type":37,"value":606},"ip_address\n",{"type":32,"tag":87,"props":608,"children":609},{"class":89,"line":203},[610,615,619,623,628,632,636,640],{"type":32,"tag":87,"props":611,"children":612},{"style":104},[613],{"type":37,"value":614},"      AND",{"type":32,"tag":87,"props":616,"children":617},{"style":149},[618],{"type":37,"value":579},{"type":32,"tag":87,"props":620,"children":621},{"style":155},[622],{"type":37,"value":158},{"type":32,"tag":87,"props":624,"children":625},{"style":149},[626],{"type":37,"value":627},"canvas_hash",{"type":32,"tag":87,"props":629,"children":630},{"style":104},[631],{"type":37,"value":328},{"type":32,"tag":87,"props":633,"children":634},{"style":149},[635],{"type":37,"value":597},{"type":32,"tag":87,"props":637,"children":638},{"style":155},[639],{"type":37,"value":158},{"type":32,"tag":87,"props":641,"children":642},{"style":149},[643],{"type":37,"value":644},"canvas_hash\n",{"type":32,"tag":87,"props":646,"children":647},{"class":89,"line":224},[648,652,657,662,666,671,675,680,684,688,692,697,701,706],{"type":32,"tag":87,"props":649,"children":650},{"style":104},[651],{"type":37,"value":614},{"type":32,"tag":87,"props":653,"children":654},{"style":155},[655],{"type":37,"value":656}," TIMESTAMP_DIFF(",{"type":32,"tag":87,"props":658,"children":659},{"style":149},[660],{"type":37,"value":661},"b",{"type":32,"tag":87,"props":663,"children":664},{"style":155},[665],{"type":37,"value":158},{"type":32,"tag":87,"props":667,"children":668},{"style":149},[669],{"type":37,"value":670},"timestamp",{"type":32,"tag":87,"props":672,"children":673},{"style":155},[674],{"type":37,"value":446},{"type":32,"tag":87,"props":676,"children":677},{"style":149},[678],{"type":37,"value":679},"a",{"type":32,"tag":87,"props":681,"children":682},{"style":155},[683],{"type":37,"value":158},{"type":32,"tag":87,"props":685,"children":686},{"style":149},[687],{"type":37,"value":670},{"type":32,"tag":87,"props":689,"children":690},{"style":155},[691],{"type":37,"value":446},{"type":32,"tag":87,"props":693,"children":694},{"style":104},[695],{"type":37,"value":696},"MINUTE",{"type":32,"tag":87,"props":698,"children":699},{"style":155},[700],{"type":37,"value":254},{"type":32,"tag":87,"props":702,"children":703},{"style":104},[704],{"type":37,"value":705},"\u003C=",{"type":32,"tag":87,"props":707,"children":708},{"style":149},[709],{"type":37,"value":710}," 5\n",{"type":32,"tag":87,"props":712,"children":713},{"class":89,"line":26},[714,719,724,728],{"type":32,"tag":87,"props":715,"children":716},{"style":104},[717],{"type":37,"value":718},"    THEN",{"type":32,"tag":87,"props":720,"children":721},{"style":149},[722],{"type":37,"value":723}," 0",{"type":32,"tag":87,"props":725,"children":726},{"style":155},[727],{"type":37,"value":158},{"type":32,"tag":87,"props":729,"children":730},{"style":149},[731],{"type":37,"value":732},"90\n",{"type":32,"tag":87,"props":734,"children":735},{"class":89,"line":285},[736,740,744,748,752,756,760,764],{"type":32,"tag":87,"props":737,"children":738},{"style":104},[739],{"type":37,"value":574},{"type":32,"tag":87,"props":741,"children":742},{"style":149},[743],{"type":37,"value":579},{"type":32,"tag":87,"props":745,"children":746},{"style":155},[747],{"type":37,"value":158},{"type":32,"tag":87,"props":749,"children":750},{"style":149},[751],{"type":37,"value":588},{"type":32,"tag":87,"props":753,"children":754},{"style":104},[755],{"type":37,"value":328},{"type":32,"tag":87,"props":757,"children":758},{"style":149},[759],{"type":37,"value":597},{"type":32,"tag":87,"props":761,"children":762},{"style":155},[763],{"type":37,"value":158},{"type":32,"tag":87,"props":765,"children":766},{"style":149},[767],{"type":37,"value":606},{"type":32,"tag":87,"props":769,"children":770},{"class":89,"line":304},[771,775,779,783,787,791,795,799,803,807,811,816,820,824],{"type":32,"tag":87,"props":772,"children":773},{"style":104},[774],{"type":37,"value":614},{"type":32,"tag":87,"props":776,"children":777},{"style":155},[778],{"type":37,"value":656},{"type":32,"tag":87,"props":780,"children":781},{"style":149},[782],{"type":37,"value":661},{"type":32,"tag":87,"props":784,"children":785},{"style":155},[786],{"type":37,"value":158},{"type":32,"tag":87,"props":788,"children":789},{"style":149},[790],{"type":37,"value":670},{"type":32,"tag":87,"props":792,"children":793},{"style":155},[794],{"type":37,"value":446},{"type":32,"tag":87,"props":796,"children":797},{"style":149},[798],{"type":37,"value":679},{"type":32,"tag":87,"props":800,"children":801},{"style":155},[802],{"type":37,"value":158},{"type":32,"tag":87,"props":804,"children":805},{"style":149},[806],{"type":37,"value":670},{"type":32,"tag":87,"props":808,"children":809},{"style":155},[810],{"type":37,"value":446},{"type":32,"tag":87,"props":812,"children":813},{"style":104},[814],{"type":37,"value":815},"HOUR",{"type":32,"tag":87,"props":817,"children":818},{"style":155},[819],{"type":37,"value":254},{"type":32,"tag":87,"props":821,"children":822},{"style":104},[823],{"type":37,"value":705},{"type":32,"tag":87,"props":825,"children":826},{"style":149},[827],{"type":37,"value":828}," 2\n",{"type":32,"tag":87,"props":830,"children":831},{"class":89,"line":345},[832,836,840,844],{"type":32,"tag":87,"props":833,"children":834},{"style":104},[835],{"type":37,"value":718},{"type":32,"tag":87,"props":837,"children":838},{"style":149},[839],{"type":37,"value":723},{"type":32,"tag":87,"props":841,"children":842},{"style":155},[843],{"type":37,"value":158},{"type":32,"tag":87,"props":845,"children":846},{"style":149},[847],{"type":37,"value":848},"40\n",{"type":32,"tag":87,"props":850,"children":851},{"class":89,"line":371},[852,857,861,865],{"type":32,"tag":87,"props":853,"children":854},{"style":104},[855],{"type":37,"value":856},"    ELSE",{"type":32,"tag":87,"props":858,"children":859},{"style":149},[860],{"type":37,"value":723},{"type":32,"tag":87,"props":862,"children":863},{"style":155},[864],{"type":37,"value":158},{"type":32,"tag":87,"props":866,"children":867},{"style":149},[868],{"type":37,"value":869},"0\n",{"type":32,"tag":87,"props":871,"children":873},{"class":89,"line":872},13,[874,879,883],{"type":32,"tag":87,"props":875,"children":876},{"style":104},[877],{"type":37,"value":878},"  END",{"type":32,"tag":87,"props":880,"children":881},{"style":104},[882],{"type":37,"value":168},{"type":32,"tag":87,"props":884,"children":885},{"style":155},[886],{"type":37,"value":887}," match_score\n",{"type":32,"tag":87,"props":889,"children":891},{"class":89,"line":890},14,[892,896,901],{"type":32,"tag":87,"props":893,"children":894},{"style":104},[895],{"type":37,"value":272},{"type":32,"tag":87,"props":897,"children":898},{"style":125},[899],{"type":37,"value":900}," `project.dataset.anonymous_sessions`",{"type":32,"tag":87,"props":902,"children":903},{"style":155},[904],{"type":37,"value":905}," a\n",{"type":32,"tag":87,"props":907,"children":909},{"class":89,"line":908},15,[910,915,919],{"type":32,"tag":87,"props":911,"children":912},{"style":104},[913],{"type":37,"value":914},"CROSS JOIN",{"type":32,"tag":87,"props":916,"children":917},{"style":125},[918],{"type":37,"value":900},{"type":32,"tag":87,"props":920,"children":921},{"style":155},[922],{"type":37,"value":923}," b\n",{"type":32,"tag":87,"props":925,"children":927},{"class":89,"line":926},16,[928,932,936,940,944,949,953,957],{"type":32,"tag":87,"props":929,"children":930},{"style":104},[931],{"type":37,"value":351},{"type":32,"tag":87,"props":933,"children":934},{"style":149},[935],{"type":37,"value":579},{"type":32,"tag":87,"props":937,"children":938},{"style":155},[939],{"type":37,"value":158},{"type":32,"tag":87,"props":941,"children":942},{"style":149},[943],{"type":37,"value":524},{"type":32,"tag":87,"props":945,"children":946},{"style":104},[947],{"type":37,"value":948}," \u003C",{"type":32,"tag":87,"props":950,"children":951},{"style":149},[952],{"type":37,"value":597},{"type":32,"tag":87,"props":954,"children":955},{"style":155},[956],{"type":37,"value":158},{"type":32,"tag":87,"props":958,"children":959},{"style":149},[960],{"type":37,"value":961},"session_id\n",{"type":32,"tag":87,"props":963,"children":965},{"class":89,"line":964},17,[966,971,975,979,983,987,991,995],{"type":32,"tag":87,"props":967,"children":968},{"style":104},[969],{"type":37,"value":970},"  AND",{"type":32,"tag":87,"props":972,"children":973},{"style":149},[974],{"type":37,"value":579},{"type":32,"tag":87,"props":976,"children":977},{"style":155},[978],{"type":37,"value":158},{"type":32,"tag":87,"props":980,"children":981},{"style":149},[982],{"type":37,"value":588},{"type":32,"tag":87,"props":984,"children":985},{"style":104},[986],{"type":37,"value":328},{"type":32,"tag":87,"props":988,"children":989},{"style":149},[990],{"type":37,"value":597},{"type":32,"tag":87,"props":992,"children":993},{"style":155},[994],{"type":37,"value":158},{"type":32,"tag":87,"props":996,"children":997},{"style":149},[998],{"type":37,"value":606},{"type":32,"tag":87,"props":1000,"children":1002},{"class":89,"line":1001},18,[1003,1008,1013,1017,1021,1026],{"type":32,"tag":87,"props":1004,"children":1005},{"style":155},[1006],{"type":37,"value":1007},"QUALIFY match_score ",{"type":32,"tag":87,"props":1009,"children":1010},{"style":104},[1011],{"type":37,"value":1012},">=",{"type":32,"tag":87,"props":1014,"children":1015},{"style":149},[1016],{"type":37,"value":723},{"type":32,"tag":87,"props":1018,"children":1019},{"style":155},[1020],{"type":37,"value":158},{"type":32,"tag":87,"props":1022,"children":1023},{"style":149},[1024],{"type":37,"value":1025},"70",{"type":32,"tag":87,"props":1027,"children":1028},{"style":155},[1029],{"type":37,"value":406},{"type":32,"tag":33,"props":1031,"children":1032},{},[1033,1035,1040,1042,1048,1050,1055],{"type":37,"value":1034},"This ",{"type":32,"tag":52,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":37,"value":914},{"type":37,"value":1041}," gets expensive on millions of rows. In production, you need windowing or bucketing: partition IP ranges by prefix (e.g., ",{"type":32,"tag":52,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":37,"value":1047},"\u002F24",{"type":37,"value":1049}," CIDR), compare each session to the last 100 using ",{"type":32,"tag":52,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":37,"value":432},{"type":37,"value":1056},". Probabilistic matching's risk is false positives — two different users on the same IP (office Wi-Fi, shared VPN) at the same time can incorrectly merge. Keep your score threshold between 0.85–0.90 and validate with cross-device signals.",{"type":32,"tag":33,"props":1058,"children":1059},{},[1060,1062,1068,1070,1075],{"type":37,"value":1061},"A machine-learning probabilistic model is more sophisticated: logistic regression or gradient boosting for binary \"same user\" classification. Feature set: IP Hamming distance, user agent Levenshtein similarity, timezone offset, session count. Training data is labeled — positive examples from known ",{"type":32,"tag":52,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":37,"value":1067},"user_id",{"type":37,"value":1069}," pairs, negative from different ",{"type":32,"tag":52,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":37,"value":1067},{"type":37,"value":1076}," pairs. The model outputs a 0–1 score; threshold is manual tuning again. Building this requires a Vertex AI or SageMaker pipeline — data engineering and ML engineering work together.",{"type":32,"tag":40,"props":1078,"children":1080},{"id":1079},"household-identity-same-home-different-users",[1081],{"type":37,"value":1082},"Household Identity: Same Home, Different Users",{"type":32,"tag":33,"props":1084,"children":1085},{},[1086,1088,1094],{"type":37,"value":1087},"Household identity adds another layer: grouping different users at the same IP or physical address so you can target them as a \"family unit\" for marketing. For example, on an e-commerce site, a mother browses children's clothes, a father buys electronics — two different user IDs but the same shipping address. A household graph merges them under ",{"type":32,"tag":52,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":37,"value":1093},"household_id",{"type":37,"value":1095},". Ad platforms (Facebook Ads, Google Ads) sell household targeting, but you must model this relationship in your own first-party data.",{"type":32,"tag":33,"props":1097,"children":1098},{},[1099,1101,1107],{"type":37,"value":1100},"Normalize shipping addresses in BigQuery: clean case differences, spaces, apartment number variations. Then hash and use as ",{"type":32,"tag":52,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":37,"value":1106},"household_key",{"type":37,"value":1108},":",{"type":32,"tag":77,"props":1110,"children":1112},{"className":79,"code":1111,"language":81,"meta":16,"style":16},"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",[1113],{"type":32,"tag":52,"props":1114,"children":1115},{"__ignoreMap":16},[1116,1144,1151,1159,1167,1209,1226,1238],{"type":32,"tag":87,"props":1117,"children":1118},{"class":89,"line":90},[1119,1123,1127,1131,1135,1140],{"type":32,"tag":87,"props":1120,"children":1121},{"style":104},[1122],{"type":37,"value":107},{"type":32,"tag":87,"props":1124,"children":1125},{"style":104},[1126],{"type":37,"value":112},{"type":32,"tag":87,"props":1128,"children":1129},{"style":104},[1130],{"type":37,"value":117},{"type":32,"tag":87,"props":1132,"children":1133},{"style":104},[1134],{"type":37,"value":122},{"type":32,"tag":87,"props":1136,"children":1137},{"style":125},[1138],{"type":37,"value":1139}," `project.dataset.household_mapping`",{"type":32,"tag":87,"props":1141,"children":1142},{"style":104},[1143],{"type":37,"value":133},{"type":32,"tag":87,"props":1145,"children":1146},{"class":89,"line":100},[1147],{"type":32,"tag":87,"props":1148,"children":1149},{"style":104},[1150],{"type":37,"value":142},{"type":32,"tag":87,"props":1152,"children":1153},{"class":89,"line":136},[1154],{"type":32,"tag":87,"props":1155,"children":1156},{"style":155},[1157],{"type":37,"value":1158},"  user_id,\n",{"type":32,"tag":87,"props":1160,"children":1161},{"class":89,"line":145},[1162],{"type":32,"tag":87,"props":1163,"children":1164},{"style":155},[1165],{"type":37,"value":1166},"  TO_HEX(SHA256(\n",{"type":32,"tag":87,"props":1168,"children":1169},{"class":89,"line":176},[1170,1175,1180,1185,1190,1195,1199,1204],{"type":32,"tag":87,"props":1171,"children":1172},{"style":149},[1173],{"type":37,"value":1174},"    LOWER",{"type":32,"tag":87,"props":1176,"children":1177},{"style":155},[1178],{"type":37,"value":1179},"(REGEXP_REPLACE(",{"type":32,"tag":87,"props":1181,"children":1182},{"style":149},[1183],{"type":37,"value":1184},"CONCAT",{"type":32,"tag":87,"props":1186,"children":1187},{"style":155},[1188],{"type":37,"value":1189},"(street, city, postal_code), r",{"type":32,"tag":87,"props":1191,"children":1192},{"style":125},[1193],{"type":37,"value":1194},"'\\s+'",{"type":32,"tag":87,"props":1196,"children":1197},{"style":155},[1198],{"type":37,"value":446},{"type":32,"tag":87,"props":1200,"children":1201},{"style":125},[1202],{"type":37,"value":1203},"''",{"type":32,"tag":87,"props":1205,"children":1206},{"style":155},[1207],{"type":37,"value":1208},"))\n",{"type":32,"tag":87,"props":1210,"children":1211},{"class":89,"line":203},[1212,1217,1221],{"type":32,"tag":87,"props":1213,"children":1214},{"style":155},[1215],{"type":37,"value":1216},"  )) ",{"type":32,"tag":87,"props":1218,"children":1219},{"style":104},[1220],{"type":37,"value":259},{"type":32,"tag":87,"props":1222,"children":1223},{"style":155},[1224],{"type":37,"value":1225}," household_key\n",{"type":32,"tag":87,"props":1227,"children":1228},{"class":89,"line":224},[1229,1233],{"type":32,"tag":87,"props":1230,"children":1231},{"style":104},[1232],{"type":37,"value":272},{"type":32,"tag":87,"props":1234,"children":1235},{"style":125},[1236],{"type":37,"value":1237}," `project.dataset.user_addresses`\n",{"type":32,"tag":87,"props":1239,"children":1240},{"class":89,"line":26},[1241,1245,1250,1255,1260,1265,1269],{"type":32,"tag":87,"props":1242,"children":1243},{"style":104},[1244],{"type":37,"value":351},{"type":32,"tag":87,"props":1246,"children":1247},{"style":155},[1248],{"type":37,"value":1249}," street ",{"type":32,"tag":87,"props":1251,"children":1252},{"style":104},[1253],{"type":37,"value":1254},"IS NOT NULL",{"type":32,"tag":87,"props":1256,"children":1257},{"style":104},[1258],{"type":37,"value":1259}," AND",{"type":32,"tag":87,"props":1261,"children":1262},{"style":155},[1263],{"type":37,"value":1264}," postal_code ",{"type":32,"tag":87,"props":1266,"children":1267},{"style":104},[1268],{"type":37,"value":1254},{"type":32,"tag":87,"props":1270,"children":1271},{"style":155},[1272],{"type":37,"value":406},{"type":32,"tag":33,"props":1274,"children":1275},{},[1276,1278,1283,1285,1290,1292,1297,1299,1304],{"type":37,"value":1277},"This table gives you ",{"type":32,"tag":52,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":37,"value":1067},{"type":37,"value":1284}," → ",{"type":32,"tag":52,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":37,"value":1106},{"type":37,"value":1291}," mapping. Group users under the same ",{"type":32,"tag":52,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":37,"value":1106},{"type":37,"value":1298}," and assign them a ",{"type":32,"tag":52,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":37,"value":1093},{"type":37,"value":1305},". Household identity differs from cross-device identity — it's not the same person's devices; it's multiple people in one home. Privacy risk is high: merging two different adults under one household violates data minimization (KVKK Art. 5). Use household graphs only for aggregate analysis and anonymous targeting, not individual profile merging.",{"type":32,"tag":33,"props":1307,"children":1308},{},[1309,1311,1319],{"type":37,"value":1310},"Strengthen the household graph with additional signals: Wi-Fi SSID hash (if mobile app permits), Bluetooth beacon (physical store), shared payment method (same credit card). These signals are PII, so hash + encrypted storage are necessary. CDPs (Segment, mParticle, RudderStack) offer household resolution as a \"relationship graph,\" but building a manual model in BigQuery gives you more control — you see which signals carry what weight. Roibase's ",{"type":32,"tag":679,"props":1312,"children":1316},{"href":1313,"rel":1314},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fretention-engineering-cdp",[1315],"nofollow",[1317],{"type":37,"value":1318},"CDP & Retention Engineering",{"type":37,"value":1320}," integrates this layer into a production pipeline.",{"type":32,"tag":40,"props":1322,"children":1324},{"id":1323},"graph-database-vs-relational-which-is-faster",[1325],{"type":37,"value":1326},"Graph Database vs Relational: Which Is Faster",{"type":32,"tag":33,"props":1328,"children":1329},{},[1330,1332,1338,1340,1346,1348,1354],{"type":37,"value":1331},"Storing an identity graph in BigQuery like a relational warehouse works, but querying transitive closure — \"find all devices linked to user A\" — gets expensive. A graph database (Neo4j, Amazon Neptune, TigerGraph) handles this with node\u002Fedge structure: \"find all user's devices\" becomes ",{"type":32,"tag":52,"props":1333,"children":1335},{"className":1334},[],[1336],{"type":37,"value":1337},"MATCH (u:User)-[:HAS_DEVICE]->(d:Device)",{"type":37,"value":1339}," in milliseconds. The same query in BigQuery uses ",{"type":32,"tag":52,"props":1341,"children":1343},{"className":1342},[],[1344],{"type":37,"value":1345},"RECURSIVE CTE",{"type":37,"value":1347}," or ",{"type":32,"tag":52,"props":1349,"children":1351},{"className":1350},[],[1352],{"type":37,"value":1353},"ARRAY_AGG",{"type":37,"value":1355},", which burns more slots on large tables.",{"type":32,"tag":33,"props":1357,"children":1358},{},[1359],{"type":37,"value":1360},"Tradeoff: Graph DB is very fast but schema changes are hard, and the node\u002Fedge model differs from SQL your team knows. Relational warehouse is slower but dbt makes version control, testing, and documentation easy. Most production setups use hybrid: create identity mappings daily in BigQuery with dbt, sync to Neo4j, do real-time lookups from Neo4j. Example pipeline: dbt model → BigQuery view → Cloud Function trigger → Neo4j Cypher INSERT.",{"type":32,"tag":77,"props":1362,"children":1364},{"className":79,"code":1363,"language":81,"meta":16,"style":16},"-- BigQuery recursive CTE for transitive closure (slow)\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",[1365],{"type":32,"tag":52,"props":1366,"children":1367},{"__ignoreMap":16},[1368,1376,1403,1430,1443,1451,1518,1530,1548,1586,1614,1622,1635],{"type":32,"tag":87,"props":1369,"children":1370},{"class":89,"line":90},[1371],{"type":32,"tag":87,"props":1372,"children":1373},{"style":94},[1374],{"type":37,"value":1375},"-- BigQuery recursive CTE for transitive closure (slow)\n",{"type":32,"tag":87,"props":1377,"children":1378},{"class":89,"line":100},[1379,1384,1389,1394,1398],{"type":32,"tag":87,"props":1380,"children":1381},{"style":104},[1382],{"type":37,"value":1383},"WITH",{"type":32,"tag":87,"props":1385,"children":1386},{"style":104},[1387],{"type":37,"value":1388}," RECURSIVE",{"type":32,"tag":87,"props":1390,"children":1391},{"style":155},[1392],{"type":37,"value":1393}," identity_chain ",{"type":32,"tag":87,"props":1395,"children":1396},{"style":104},[1397],{"type":37,"value":259},{"type":32,"tag":87,"props":1399,"children":1400},{"style":155},[1401],{"type":37,"value":1402}," (\n",{"type":32,"tag":87,"props":1404,"children":1405},{"class":89,"line":136},[1406,1411,1416,1421,1425],{"type":32,"tag":87,"props":1407,"children":1408},{"style":104},[1409],{"type":37,"value":1410},"  SELECT",{"type":32,"tag":87,"props":1412,"children":1413},{"style":155},[1414],{"type":37,"value":1415}," signal_a, signal_b, ",{"type":32,"tag":87,"props":1417,"children":1418},{"style":149},[1419],{"type":37,"value":1420},"1",{"type":32,"tag":87,"props":1422,"children":1423},{"style":104},[1424],{"type":37,"value":168},{"type":32,"tag":87,"props":1426,"children":1427},{"style":155},[1428],{"type":37,"value":1429}," depth\n",{"type":32,"tag":87,"props":1431,"children":1432},{"class":89,"line":145},[1433,1438],{"type":32,"tag":87,"props":1434,"children":1435},{"style":104},[1436],{"type":37,"value":1437},"  FROM",{"type":32,"tag":87,"props":1439,"children":1440},{"style":125},[1441],{"type":37,"value":1442}," `project.dataset.identity_edges`\n",{"type":32,"tag":87,"props":1444,"children":1445},{"class":89,"line":176},[1446],{"type":32,"tag":87,"props":1447,"children":1448},{"style":104},[1449],{"type":37,"value":1450},"  UNION ALL\n",{"type":32,"tag":87,"props":1452,"children":1453},{"class":89,"line":203},[1454,1458,1463,1467,1472,1476,1481,1485,1490,1494,1499,1503,1508,1513],{"type":32,"tag":87,"props":1455,"children":1456},{"style":104},[1457],{"type":37,"value":1410},{"type":32,"tag":87,"props":1459,"children":1460},{"style":149},[1461],{"type":37,"value":1462}," ic",{"type":32,"tag":87,"props":1464,"children":1465},{"style":155},[1466],{"type":37,"value":158},{"type":32,"tag":87,"props":1468,"children":1469},{"style":149},[1470],{"type":37,"value":1471},"signal_a",{"type":32,"tag":87,"props":1473,"children":1474},{"style":155},[1475],{"type":37,"value":446},{"type":32,"tag":87,"props":1477,"children":1478},{"style":149},[1479],{"type":37,"value":1480},"e",{"type":32,"tag":87,"props":1482,"children":1483},{"style":155},[1484],{"type":37,"value":158},{"type":32,"tag":87,"props":1486,"children":1487},{"style":149},[1488],{"type":37,"value":1489},"signal_b",{"type":32,"tag":87,"props":1491,"children":1492},{"style":155},[1493],{"type":37,"value":446},{"type":32,"tag":87,"props":1495,"children":1496},{"style":149},[1497],{"type":37,"value":1498},"ic",{"type":32,"tag":87,"props":1500,"children":1501},{"style":155},[1502],{"type":37,"value":158},{"type":32,"tag":87,"props":1504,"children":1505},{"style":149},[1506],{"type":37,"value":1507},"depth",{"type":32,"tag":87,"props":1509,"children":1510},{"style":104},[1511],{"type":37,"value":1512}," +",{"type":32,"tag":87,"props":1514,"children":1515},{"style":149},[1516],{"type":37,"value":1517}," 1\n",{"type":32,"tag":87,"props":1519,"children":1520},{"class":89,"line":224},[1521,1525],{"type":32,"tag":87,"props":1522,"children":1523},{"style":104},[1524],{"type":37,"value":1437},{"type":32,"tag":87,"props":1526,"children":1527},{"style":155},[1528],{"type":37,"value":1529}," identity_chain ic\n",{"type":32,"tag":87,"props":1531,"children":1532},{"class":89,"line":26},[1533,1538,1543],{"type":32,"tag":87,"props":1534,"children":1535},{"style":104},[1536],{"type":37,"value":1537},"  JOIN",{"type":32,"tag":87,"props":1539,"children":1540},{"style":125},[1541],{"type":37,"value":1542}," `project.dataset.identity_edges`",{"type":32,"tag":87,"props":1544,"children":1545},{"style":155},[1546],{"type":37,"value":1547}," e\n",{"type":32,"tag":87,"props":1549,"children":1550},{"class":89,"line":285},[1551,1556,1560,1564,1568,1572,1577,1581],{"type":32,"tag":87,"props":1552,"children":1553},{"style":104},[1554],{"type":37,"value":1555},"    ON",{"type":32,"tag":87,"props":1557,"children":1558},{"style":149},[1559],{"type":37,"value":1462},{"type":32,"tag":87,"props":1561,"children":1562},{"style":155},[1563],{"type":37,"value":158},{"type":32,"tag":87,"props":1565,"children":1566},{"style":149},[1567],{"type":37,"value":1489},{"type":32,"tag":87,"props":1569,"children":1570},{"style":104},[1571],{"type":37,"value":328},{"type":32,"tag":87,"props":1573,"children":1574},{"style":149},[1575],{"type":37,"value":1576}," e",{"type":32,"tag":87,"props":1578,"children":1579},{"style":155},[1580],{"type":37,"value":158},{"type":32,"tag":87,"props":1582,"children":1583},{"style":149},[1584],{"type":37,"value":1585},"signal_a\n",{"type":32,"tag":87,"props":1587,"children":1588},{"class":89,"line":304},[1589,1594,1598,1602,1606,1610],{"type":32,"tag":87,"props":1590,"children":1591},{"style":104},[1592],{"type":37,"value":1593},"  WHERE",{"type":32,"tag":87,"props":1595,"children":1596},{"style":149},[1597],{"type":37,"value":1462},{"type":32,"tag":87,"props":1599,"children":1600},{"style":155},[1601],{"type":37,"value":158},{"type":32,"tag":87,"props":1603,"children":1604},{"style":149},[1605],{"type":37,"value":1507},{"type":32,"tag":87,"props":1607,"children":1608},{"style":104},[1609],{"type":37,"value":948},{"type":32,"tag":87,"props":1611,"children":1612},{"style":149},[1613],{"type":37,"value":710},{"type":32,"tag":87,"props":1615,"children":1616},{"class":89,"line":345},[1617],{"type":32,"tag":87,"props":1618,"children":1619},{"style":155},[1620],{"type":37,"value":1621},")\n",{"type":32,"tag":87,"props":1623,"children":1624},{"class":89,"line":371},[1625,1630],{"type":32,"tag":87,"props":1626,"children":1627},{"style":104},[1628],{"type":37,"value":1629},"SELECT DISTINCT",{"type":32,"tag":87,"props":1631,"children":1632},{"style":155},[1633],{"type":37,"value":1634}," signal_a, signal_b\n",{"type":32,"tag":87,"props":1636,"children":1637},{"class":89,"line":872},[1638,1642],{"type":32,"tag":87,"props":1639,"children":1640},{"style":104},[1641],{"type":37,"value":272},{"type":32,"tag":87,"props":1643,"children":1644},{"style":155},[1645],{"type":37,"value":1646}," identity_chain;\n",{"type":32,"tag":33,"props":1648,"children":1649},{},[1650],{"type":37,"value":1651},"This query follows chains up to 5 hops (depth). Without depth control, you risk infinite loops — A → B → A cycles. Graph DB handles loop control natively; in BigQuery, you need manual WHERE conditions. If your identity graph reaches 10M+ edges, a dedicated system like Neo4j becomes more maintainable. Below 1M edges, BigQuery + dbt is sufficient.",{"type":32,"tag":40,"props":1653,"children":1655},{"id":1654},"privacy-and-consent-the-legal-boundaries-of-identity-graphs",[1656],{"type":37,"value":1657},"Privacy and Consent: The Legal Boundaries of Identity Graphs",{"type":32,"tag":33,"props":1659,"children":1660},{},[1661],{"type":37,"value":1662},"Identity resolution falls under GDPR's definition of \"profiling\" (Art. 4(4)). Linking deterministically and probabilistically without user consent is a legal risk. Google's Consent Mode v2 splits \"analytics_storage\" and \"ad_storage\" but identity stitching may need an additional \"personalization_storage\" category. Under TCF 2.2, you need Purpose 1 (device storage) + Purpose 9 (personalized ads) — you can't stitch without both. TCF 2.2 requires explicit opt-in before collection.",{"type":32,"tag":33,"props":1664,"children":1665},{},[1666],{"type":37,"value":1667},"A hashed email counts as \"pseudonymous data\" under GDPR (Recital 26) — it remains personal data. If it can be de-hashed via rainbow table or reverse lookup, it's \"pseudonymization,\" not \"anonymization.\" Add salt to hashes (email + site-specific secret → SHA-256) and store the salt in HSM or Secret Manager. If a user requests \"restriction\" (GDPR Art. 18), delete the edge from the identity graph and break the deterministic link.",{"type":32,"tag":33,"props":1669,"children":1670},{},[1671,1673,1679,1681,1686,1688,1694,1696,1702],{"type":37,"value":1672},"KVKK Art. 7 requires explicit consent: \"Consent shall be any freely given, specific, informed and unambiguous indication of the data subject's wishes.\" Identity stitching must be named explicitly in the consent form — generic \"better experience\" phrasing isn't enough. If a user withdraws consent (",{"type":32,"tag":52,"props":1674,"children":1676},{"className":1675},[],[1677],{"type":37,"value":1678},"consent_revoked_at",{"type":37,"value":1680}," timestamp), delete all edges for that ",{"type":32,"tag":52,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":37,"value":1067},{"type":37,"value":1687}," from the identity graph and set a ",{"type":32,"tag":52,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":37,"value":1693},"deleted_at",{"type":37,"value":1695}," flag. Use soft delete in BigQuery — instead of physical deletion, filter with ",{"type":32,"tag":52,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":37,"value":1701},"WHERE deleted_at IS NULL",{"type":37,"value":158},{"type":32,"tag":40,"props":1704,"children":1706},{"id":1705},"implementation-incremental-identity-pipeline-with-dbt",[1707],{"type":37,"value":1708},"Implementation: Incremental Identity Pipeline with dbt",{"type":32,"tag":33,"props":1710,"children":1711},{},[1712],{"type":37,"value":1713},"In production, identity resolution runs incremental, not batch — add new signals daily and update the existing graph. Build this with a dbt incremental model:",{"type":32,"tag":77,"props":1715,"children":1717},{"className":79,"code":1716,"language":81,"meta":16,"style":16},"{{\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",[1718],{"type":32,"tag":52,"props":1719,"children":1720},{"__ignoreMap":16},[1721,1729,1737,1759,1780,1835,1852,1860,1868,1877,1897,1905,1922,1948,1973,1998,2022,2048,2065,2088,2110,2146,2186,2194,2202,2226,2234,2253,2298],{"type":32,"tag":87,"props":1722,"children":1723},{"class":89,"line":90},[1724],{"type":32,"tag":87,"props":1725,"children":1726},{"style":155},[1727],{"type":37,"value":1728},"{{\n",{"type":32,"tag":87,"props":1730,"children":1731},{"class":89,"line":100},[1732],{"type":32,"tag":87,"props":1733,"children":1734},{"style":155},[1735],{"type":37,"value":1736},"  config(\n",{"type":32,"tag":87,"props":1738,"children":1739},{"class":89,"line":136},[1740,1745,1750,1755],{"type":32,"tag":87,"props":1741,"children":1742},{"style":155},[1743],{"type":37,"value":1744},"    materialized",{"type":32,"tag":87,"props":1746,"children":1747},{"style":104},[1748],{"type":37,"value":1749},"=",{"type":32,"tag":87,"props":1751,"children":1752},{"style":125},[1753],{"type":37,"value":1754},"'incremental'",{"type":32,"tag":87,"props":1756,"children":1757},{"style":155},[1758],{"type":37,"value":221},{"type":32,"tag":87,"props":1760,"children":1761},{"class":89,"line":145},[1762,1767,1771,1776],{"type":32,"tag":87,"props":1763,"children":1764},{"style":155},[1765],{"type":37,"value":1766},"    unique_key",{"type":32,"tag":87,"props":1768,"children":1769},{"style":104},[1770],{"type":37,"value":1749},{"type":32,"tag":87,"props":1772,"children":1773},{"style":125},[1774],{"type":37,"value":1775},"'edge_id'",{"type":32,"tag":87,"props":1777,"children":1778},{"style":155},[1779],{"type":37,"value":221},{"type":32,"tag":87,"props":1781,"children":1782},{"class":89,"line":176},[1783,1788,1792,1797,1802,1807,1812,1816,1821,1825,1830],{"type":32,"tag":87,"props":1784,"children":1785},{"style":155},[1786],{"type":37,"value":1787},"    partition_by",{"type":32,"tag":87,"props":1789,"children":1790},{"style":104},[1791],{"type":37,"value":1749},{"type":32,"tag":87,"props":1793,"children":1794},{"style":155},[1795],{"type":37,"value":1796},"{",{"type":32,"tag":87,"props":1798,"children":1799},{"style":125},[1800],{"type":37,"value":1801},"'field'",{"type":32,"tag":87,"props":1803,"children":1804},{"style":155},[1805],{"type":37,"value":1806},": ",{"type":32,"tag":87,"props":1808,"children":1809},{"style":125},[1810],{"type":37,"value":1811},"'created_date'",{"type":32,"tag":87,"props":1813,"children":1814},{"style":155},[1815],{"type":37,"value":446},{"type":32,"tag":87,"props":1817,"children":1818},{"style":125},[1819],{"type":37,"value":1820},"'data_type'",{"type":32,"tag":87,"props":1822,"children":1823},{"style":155},[1824],{"type":37,"value":1806},{"type":32,"tag":87,"props":1826,"children":1827},{"style":125},[1828],{"type":37,"value":1829},"'date'",{"type":32,"tag":87,"props":1831,"children":1832},{"style":155},[1833],{"type":37,"value":1834},"},\n",{"type":32,"tag":87,"props":1836,"children":1837},{"class":89,"line":203},[1838,1843,1847],{"type":32,"tag":87,"props":1839,"children":1840},{"style":155},[1841],{"type":37,"value":1842},"    cluster_by",{"type":32,"tag":87,"props":1844,"children":1845},{"style":104},[1846],{"type":37,"value":1749},{"type":32,"tag":87,"props":1848,"children":1849},{"style":155},[1850],{"type":37,"value":1851},"['signal_a_type', 'signal_b_type']\n",{"type":32,"tag":87,"props":1853,"children":1854},{"class":89,"line":224},[1855],{"type":32,"tag":87,"props":1856,"children":1857},{"style":155},[1858],{"type":37,"value":1859},"  )\n",{"type":32,"tag":87,"props":1861,"children":1862},{"class":89,"line":26},[1863],{"type":32,"tag":87,"props":1864,"children":1865},{"style":155},[1866],{"type":37,"value":1867},"}}\n",{"type":32,"tag":87,"props":1869,"children":1870},{"class":89,"line":285},[1871],{"type":32,"tag":87,"props":1872,"children":1874},{"emptyLinePlaceholder":1873},true,[1875],{"type":37,"value":1876},"\n",{"type":32,"tag":87,"props":1878,"children":1879},{"class":89,"line":304},[1880,1884,1889,1893],{"type":32,"tag":87,"props":1881,"children":1882},{"style":104},[1883],{"type":37,"value":1383},{"type":32,"tag":87,"props":1885,"children":1886},{"style":155},[1887],{"type":37,"value":1888}," new_edges ",{"type":32,"tag":87,"props":1890,"children":1891},{"style":104},[1892],{"type":37,"value":259},{"type":32,"tag":87,"props":1894,"children":1895},{"style":155},[1896],{"type":37,"value":1402},{"type":32,"tag":87,"props":1898,"children":1899},{"class":89,"line":345},[1900],{"type":32,"tag":87,"props":1901,"children":1902},{"style":104},[1903],{"type":37,"value":1904},"  SELECT\n",{"type":32,"tag":87,"props":1906,"children":1907},{"class":89,"line":371},[1908,1913,1917],{"type":32,"tag":87,"props":1909,"children":1910},{"style":155},[1911],{"type":37,"value":1912},"    GENERATE_UUID() ",{"type":32,"tag":87,"props":1914,"children":1915},{"style":104},[1916],{"type":37,"value":259},{"type":32,"tag":87,"props":1918,"children":1919},{"style":155},[1920],{"type":37,"value":1921}," edge_id,\n",{"type":32,"tag":87,"props":1923,"children":1924},{"class":89,"line":872},[1925,1930,1934,1939,1943],{"type":32,"tag":87,"props":1926,"children":1927},{"style":149},[1928],{"type":37,"value":1929},"    a",{"type":32,"tag":87,"props":1931,"children":1932},{"style":155},[1933],{"type":37,"value":158},{"type":32,"tag":87,"props":1935,"children":1936},{"style":149},[1937],{"type":37,"value":1938},"signal_id",{"type":32,"tag":87,"props":1940,"children":1941},{"style":104},[1942],{"type":37,"value":168},{"type":32,"tag":87,"props":1944,"children":1945},{"style":155},[1946],{"type":37,"value":1947}," signal_a,\n",{"type":32,"tag":87,"props":1949,"children":1950},{"class":89,"line":890},[1951,1955,1959,1964,1968],{"type":32,"tag":87,"props":1952,"children":1953},{"style":149},[1954],{"type":37,"value":1929},{"type":32,"tag":87,"props":1956,"children":1957},{"style":155},[1958],{"type":37,"value":158},{"type":32,"tag":87,"props":1960,"children":1961},{"style":149},[1962],{"type":37,"value":1963},"signal_type",{"type":32,"tag":87,"props":1965,"children":1966},{"style":104},[1967],{"type":37,"value":168},{"type":32,"tag":87,"props":1969,"children":1970},{"style":155},[1971],{"type":37,"value":1972}," signal_a_type,\n",{"type":32,"tag":87,"props":1974,"children":1975},{"class":89,"line":908},[1976,1981,1985,1989,1993],{"type":32,"tag":87,"props":1977,"children":1978},{"style":149},[1979],{"type":37,"value":1980},"    b",{"type":32,"tag":87,"props":1982,"children":1983},{"style":155},[1984],{"type":37,"value":158},{"type":32,"tag":87,"props":1986,"children":1987},{"style":149},[1988],{"type":37,"value":1938},{"type":32,"tag":87,"props":1990,"children":1991},{"style":104},[1992],{"type":37,"value":168},{"type":32,"tag":87,"props":1994,"children":1995},{"style":155},[1996],{"type":37,"value":1997}," signal_b,\n",{"type":32,"tag":87,"props":1999,"children":2000},{"class":89,"line":926},[2001,2005,2009,2013,2017],{"type":32,"tag":87,"props":2002,"children":2003},{"style":149},[2004],{"type":37,"value":1980},{"type":32,"tag":87,"props":2006,"children":2007},{"style":155},[2008],{"type":37,"value":158},{"type":32,"tag":87,"props":2010,"children":2011},{"style":149},[2012],{"type":37,"value":1963},{"type":32,"tag":87,"props":2014,"children":2015},{"style":104},[2016],{"type":37,"value":168},{"type":32,"tag":87,"props":2018,"children":2019},{"style":155},[2020],{"type":37,"value":2021}," signal_b_type,\n",{"type":32,"tag":87,"props":2023,"children":2024},{"class":89,"line":964},[2025,2030,2034,2039,2043],{"type":32,"tag":87,"props":2026,"children":2027},{"style":149},[2028],{"type":37,"value":2029},"    0",{"type":32,"tag":87,"props":2031,"children":2032},{"style":155},[2033],{"type":37,"value":158},{"type":32,"tag":87,"props":2035,"children":2036},{"style":149},[2037],{"type":37,"value":2038},"95",{"type":32,"tag":87,"props":2040,"children":2041},{"style":104},[2042],{"type":37,"value":168},{"type":32,"tag":87,"props":2044,"children":2045},{"style":155},[2046],{"type":37,"value":2047}," match_score,\n",{"type":32,"tag":87,"props":2049,"children":2050},{"class":89,"line":1001},[2051,2056,2060],{"type":32,"tag":87,"props":2052,"children":2053},{"style":155},[2054],{"type":37,"value":2055},"    CURRENT_DATE() ",{"type":32,"tag":87,"props":2057,"children":2058},{"style":104},[2059],{"type":37,"value":259},{"type":32,"tag":87,"props":2061,"children":2062},{"style":155},[2063],{"type":37,"value":2064}," created_date\n",{"type":32,"tag":87,"props":2066,"children":2068},{"class":89,"line":2067},19,[2069,2073,2078,2083],{"type":32,"tag":87,"props":2070,"children":2071},{"style":104},[2072],{"type":37,"value":1437},{"type":32,"tag":87,"props":2074,"children":2075},{"style":155},[2076],{"type":37,"value":2077}," {{ ref(",{"type":32,"tag":87,"props":2079,"children":2080},{"style":125},[2081],{"type":37,"value":2082},"'stg_hashed_emails'",{"type":32,"tag":87,"props":2084,"children":2085},{"style":155},[2086],{"type":37,"value":2087},") }} a\n",{"type":32,"tag":87,"props":2089,"children":2091},{"class":89,"line":2090},20,[2092,2096,2100,2105],{"type":32,"tag":87,"props":2093,"children":2094},{"style":104},[2095],{"type":37,"value":1537},{"type":32,"tag":87,"props":2097,"children":2098},{"style":155},[2099],{"type":37,"value":2077},{"type":32,"tag":87,"props":2101,"children":2102},{"style":125},[2103],{"type":37,"value":2104},"'stg_device_ids'",{"type":32,"tag":87,"props":2106,"children":2107},{"style":155},[2108],{"type":37,"value":2109},") }} b\n",{"type":32,"tag":87,"props":2111,"children":2113},{"class":89,"line":2112},21,[2114,2118,2122,2126,2130,2134,2138,2142],{"type":32,"tag":87,"props":2115,"children":2116},{"style":104},[2117],{"type":37,"value":1555},{"type":32,"tag":87,"props":2119,"children":2120},{"style":149},[2121],{"type":37,"value":579},{"type":32,"tag":87,"props":2123,"children":2124},{"style":155},[2125],{"type":37,"value":158},{"type":32,"tag":87,"props":2127,"children":2128},{"style":149},[2129],{"type":37,"value":65},{"type":32,"tag":87,"props":2131,"children":2132},{"style":104},[2133],{"type":37,"value":328},{"type":32,"tag":87,"props":2135,"children":2136},{"style":149},[2137],{"type":37,"value":597},{"type":32,"tag":87,"props":2139,"children":2140},{"style":155},[2141],{"type":37,"value":158},{"type":32,"tag":87,"props":2143,"children":2144},{"style":149},[2145],{"type":37,"value":342},{"type":32,"tag":87,"props":2147,"children":2149},{"class":89,"line":2148},22,[2150,2154,2158,2162,2167,2172,2177,2182],{"type":32,"tag":87,"props":2151,"children":2152},{"style":104},[2153],{"type":37,"value":1593},{"type":32,"tag":87,"props":2155,"children":2156},{"style":149},[2157],{"type":37,"value":579},{"type":32,"tag":87,"props":2159,"children":2160},{"style":155},[2161],{"type":37,"value":158},{"type":32,"tag":87,"props":2163,"children":2164},{"style":149},[2165],{"type":37,"value":2166},"created_at",{"type":32,"tag":87,"props":2168,"children":2169},{"style":104},[2170],{"type":37,"value":2171}," >=",{"type":32,"tag":87,"props":2173,"children":2174},{"style":155},[2175],{"type":37,"value":2176}," CURRENT_DATE() ",{"type":32,"tag":87,"props":2178,"children":2179},{"style":104},[2180],{"type":37,"value":2181},"-",{"type":32,"tag":87,"props":2183,"children":2184},{"style":149},[2185],{"type":37,"value":1517},{"type":32,"tag":87,"props":2187,"children":2189},{"class":89,"line":2188},23,[2190],{"type":32,"tag":87,"props":2191,"children":2192},{"style":155},[2193],{"type":37,"value":1621},{"type":32,"tag":87,"props":2195,"children":2197},{"class":89,"line":2196},24,[2198],{"type":32,"tag":87,"props":2199,"children":2200},{"emptyLinePlaceholder":1873},[2201],{"type":37,"value":1876},{"type":32,"tag":87,"props":2203,"children":2205},{"class":89,"line":2204},25,[2206,2211,2216,2221],{"type":32,"tag":87,"props":2207,"children":2208},{"style":104},[2209],{"type":37,"value":2210},"SELECT",{"type":32,"tag":87,"props":2212,"children":2213},{"style":104},[2214],{"type":37,"value":2215}," *",{"type":32,"tag":87,"props":2217,"children":2218},{"style":104},[2219],{"type":37,"value":2220}," FROM",{"type":32,"tag":87,"props":2222,"children":2223},{"style":155},[2224],{"type":37,"value":2225}," new_edges\n",{"type":32,"tag":87,"props":2227,"children":2229},{"class":89,"line":2228},26,[2230],{"type":32,"tag":87,"props":2231,"children":2232},{"emptyLinePlaceholder":1873},[2233],{"type":37,"value":1876},{"type":32,"tag":87,"props":2235,"children":2237},{"class":89,"line":2236},27,[2238,2243,2248],{"type":32,"tag":87,"props":2239,"children":2240},{"style":155},[2241],{"type":37,"value":2242},"{% ",{"type":32,"tag":87,"props":2244,"children":2245},{"style":104},[2246],{"type":37,"value":2247},"if",{"type":32,"tag":87,"props":2249,"children":2250},{"style":155},[2251],{"type":37,"value":2252}," is_incremental() %}\n",{"type":32,"tag":87,"props":2254,"children":2256},{"class":89,"line":2255},28,[2257,2261,2266,2271,2276,2281,2285,2289,2293],{"type":32,"tag":87,"props":2258,"children":2259},{"style":104},[2260],{"type":37,"value":351},{"type":32,"tag":87,"props":2262,"children":2263},{"style":155},[2264],{"type":37,"value":2265}," edge_id ",{"type":32,"tag":87,"props":2267,"children":2268},{"style":104},[2269],{"type":37,"value":2270},"NOT",{"type":32,"tag":87,"props":2272,"children":2273},{"style":104},[2274],{"type":37,"value":2275}," IN",{"type":32,"tag":87,"props":2277,"children":2278},{"style":155},[2279],{"type":37,"value":2280}," (",{"type":32,"tag":87,"props":2282,"children":2283},{"style":104},[2284],{"type":37,"value":2210},{"type":32,"tag":87,"props":2286,"children":2287},{"style":155},[2288],{"type":37,"value":2265},{"type":32,"tag":87,"props":2290,"children":2291},{"style":104},[2292],{"type":37,"value":272},{"type":32,"tag":87,"props":2294,"children":2295},{"style":155},[2296],{"type":37,"value":2297}," {{ this }})\n",{"type":32,"tag":87,"props":2299,"children":2301},{"class":89,"line":2300},29,[2302],{"type":32,"tag":87,"props":2303,"children":2304},{"style":155},[2305],{"type":37,"value":2306},"{% endif %}\n",{"type":32,"tag":33,"props":2308,"children":2309},{},[2310,2312,2318,2320,2326,2328,2333],{"type":37,"value":2311},"Each run adds new email-to-device matches from the last day. ",{"type":32,"tag":52,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":37,"value":2317},"unique_key",{"type":37,"value":2319}," prevents duplicates; ",{"type":32,"tag":52,"props":2321,"children":2323},{"className":2322},[],[2324],{"type":37,"value":2325},"partition_by",{"type":37,"value":2327}," leaves older partitions untouched. Cluster on ",{"type":32,"tag":52,"props":2329,"children":2331},{"className":2330},[],[2332],{"type":37,"value":1963},{"type":37,"value":2334}," because queries typically filter by type (\"all email-to-cookie links\"). Use dbt tests to monitor edge count — if any edge scores below 0.70, the test fails and deployment stops.",{"type":32,"tag":33,"props":2336,"children":2337},{},[2338,2340,2347],{"type":37,"value":2339},"Never deploy an identity pipeline to production without data quality tests — wrong merges corrupt LTV calculations, attribution models, and segmentation. Roibase's ",{"type":32,"tag":679,"props":2341,"children":2344},{"href":2342,"rel":2343},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Ffirstparty",[1315],[2345],{"type":37,"value":2346},"First-Party Data & Measurement Architecture",{"type":37,"value":2348}," integrates this pipeline with consent layers, server-side GTM, and CDPs.",{"type":32,"tag":33,"props":2350,"children":2351},{},[2352,2354,2359],{"type":37,"value":2353},"Next: distribute the identity graph downstream to segment builders, recommendation engines, LTV prediction, and MMM systems — all querying ",{"type":32,"tag":52,"props":2355,"children":2357},{"className":2356},[],[2358],{"type":37,"value":424},{"type":37,"value":2360}," for aggregate metrics. When the graph is correct, you collapse 6 signals into 1 user, lifting LTV precision 30–40% and expanding attribution window 25% (Google Analytics 4 benchmark, 2025). Hash matching gives deterministic foundation, probabilistic linking manages uncertainty, household identity opens family-level targeting — run all three together and extract maximum value from first-party data.",{"type":32,"tag":2362,"props":2363,"children":2364},"style",{},[2365],{"type":37,"value":2366},"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":2368},[2369,2370,2371,2372,2373,2374],{"id":42,"depth":100,"text":45},{"id":472,"depth":100,"text":475},{"id":1079,"depth":100,"text":1082},{"id":1323,"depth":100,"text":1326},{"id":1654,"depth":100,"text":1657},{"id":1705,"depth":100,"text":1708},"markdown","content:en:data:identity-resolution-six-signals-to-unified-customer.md","content","en\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer.md","en\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer","md",1782079496299]