[{"data":1,"prerenderedAt":1421},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer-identity":13},{"i18nKey":4,"paths":5},"data-003-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\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\u002Fidentity-resolution-sei-segnali-a-unica-identita-cliente","\u002Fru\u002Fdata\u002Fidentity-resolution-6-signalov-k-edinomu-identifikacionnomu-kodu-polzovatelya","\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":1415,"_id":1416,"_source":1417,"_file":1418,"_stem":1419,"_extension":1420},"data",false,"","Identity Resolution: Six Signals to Unified Customer Identity","Modern solution architectures transforming scattered signals into single customer identity through hash matching, probabilistic linking, and household identity.","2026-05-12",[21,22,23,24,25],"identity-resolution","hash-matching","probabilistic-linking","cdp","first-party-data",8,"Roibase",{"type":29,"children":30,"toc":1407},"root",[31,39,46,69,74,95,101,106,119,124,582,587,593,598,603,608,913,928,934,939,960,1278,1299,1305,1326,1346,1351,1357,1362,1375,1396,1401],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","The average e-commerce customer appears across 6 different devices and 11 touchpoints before deciding to purchase. GA4 records them as 4 different users, your CRM logs 2 separate leads, and your email platform registers 1 subscriber. In a post-cookie world, without stitching these fragments together, attribution becomes impossible, segmentation meaningless, and customer lifetime value incalculable. Identity resolution is the data engineering discipline that unifies these fragments—requiring a 3-layer architecture spanning from deterministic hash matching to probabilistic linking.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"hash-matching-deterministic-identity-backbone",[44],{"type":37,"value":45},"Hash Matching: Deterministic Identity Backbone",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,67],{"type":37,"value":50},"Deterministic matching operates on SHA-256 hashes. The email address \"",{"type":32,"tag":52,"props":53,"children":55},"a",{"href":54},"mailto:user@example.com",[56],{"type":37,"value":57},"user@example.com",{"type":37,"value":59},"\" becomes hash \"5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8\"—if the same hash exists across systems, it's the same person. You add ",{"type":32,"tag":61,"props":62,"children":64},"code",{"className":63},[],[65],{"type":37,"value":66},"user_data.email_sha256",{"type":37,"value":68}," to your server-side GTM event payload the moment a user logs in; in BigQuery, this hash unites a web session, CRM lead, and Klaviyo subscriber in a single row.",{"type":32,"tag":33,"props":70,"children":71},{},[72],{"type":37,"value":73},"Two critical considerations: hash salt strategy and collision risk. Hashing directly without salt creates rainbow table vulnerability, but in marketing data pipelines, salt must remain consistent across systems—otherwise the same email generates different hashes. Collision risk with SHA-256 is theoretical—there's no practical collision in a 2^256 space, but lower-entropy fields like phone numbers weaken determinism. This is why email + phone combinations form a stronger identity backbone.",{"type":32,"tag":33,"props":75,"children":76},{},[77,79,85,87,93],{"type":37,"value":78},"When pulling data from Klaviyo into BigQuery, add a ",{"type":32,"tag":61,"props":80,"children":82},{"className":81},[],[83],{"type":37,"value":84},"user_properties.email_sha256",{"type":37,"value":86}," column; in your dbt model, execute ",{"type":32,"tag":61,"props":88,"children":90},{"className":89},[],[91],{"type":37,"value":92},"LEFT JOIN web_events USING (email_sha256)",{"type":37,"value":94},". This merges anonymous web sessions with subscriber profiles into a single row. Snapshot table strategy matters—hash matches should be stored in daily snapshots because when a user changes email, historical matches shouldn't disappear.",{"type":32,"tag":40,"props":96,"children":98},{"id":97},"probabilistic-linking-fuzzy-logic-for-signal-fusion",[99],{"type":37,"value":100},"Probabilistic Linking: Fuzzy Logic for Signal Fusion",{"type":32,"tag":33,"props":102,"children":103},{},[104],{"type":37,"value":105},"Deterministic matching falls short on cookieless mobile web. A user logs out without logging in, never provides email, but an IP + user agent + timezone + language combination suggests an 87% probability it's the same person. This is where probabilistic identity graph enters—you Bayesian weight signal combinations.",{"type":32,"tag":33,"props":107,"children":108},{},[109,111,117],{"type":37,"value":110},"Six core signal layers exist: device fingerprint (canvas hash, WebGL renderer), network layer (IP subnet, ASN), behavioral pattern (session duration, path sequence), geolocation (GPS lat\u002Flong clustering), temporal signal (active hour pattern), and contextual metadata (referrer domain, UTM consistency). Each signal receives a 0–100 confidence score; if weighted sum exceeds 70, you assign a temporary ",{"type":32,"tag":61,"props":112,"children":114},{"className":113},[],[115],{"type":37,"value":116},"probabilistic_id",{"type":37,"value":118},".",{"type":32,"tag":33,"props":120,"children":121},{},[122],{"type":37,"value":123},"In BigQuery, model it like this:",{"type":32,"tag":125,"props":126,"children":130},"pre",{"className":127,"code":128,"language":129,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","WITH signal_scores AS (\n  SELECT\n    session_id,\n    device_fingerprint,\n    ip_subnet,\n    SUM(\n      CASE WHEN device_fingerprint_match THEN 40 ELSE 0 END +\n      CASE WHEN ip_subnet_match AND hour_diff \u003C 4 THEN 25 ELSE 0 END +\n      CASE WHEN behavior_vector_similarity > 0.8 THEN 20 ELSE 0 END\n    ) AS total_confidence\n  FROM event_stream\n  WHERE timestamp > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)\n)\nSELECT session_id, device_fingerprint, total_confidence,\n  CASE WHEN total_confidence >= 70 \n    THEN GENERATE_UUID() \n    ELSE NULL \n  END AS probabilistic_id\nFROM signal_scores\n","sql",[131],{"type":32,"tag":61,"props":132,"children":133},{"__ignoreMap":16},[134,162,171,180,189,198,213,262,324,381,399,413,462,470,484,517,531,549,568],{"type":32,"tag":135,"props":136,"children":139},"span",{"class":137,"line":138},"line",1,[140,146,152,157],{"type":32,"tag":135,"props":141,"children":143},{"style":142},"--shiki-default:#F97583",[144],{"type":37,"value":145},"WITH",{"type":32,"tag":135,"props":147,"children":149},{"style":148},"--shiki-default:#E1E4E8",[150],{"type":37,"value":151}," signal_scores ",{"type":32,"tag":135,"props":153,"children":154},{"style":142},[155],{"type":37,"value":156},"AS",{"type":32,"tag":135,"props":158,"children":159},{"style":148},[160],{"type":37,"value":161}," (\n",{"type":32,"tag":135,"props":163,"children":165},{"class":137,"line":164},2,[166],{"type":32,"tag":135,"props":167,"children":168},{"style":142},[169],{"type":37,"value":170},"  SELECT\n",{"type":32,"tag":135,"props":172,"children":174},{"class":137,"line":173},3,[175],{"type":32,"tag":135,"props":176,"children":177},{"style":148},[178],{"type":37,"value":179},"    session_id,\n",{"type":32,"tag":135,"props":181,"children":183},{"class":137,"line":182},4,[184],{"type":32,"tag":135,"props":185,"children":186},{"style":148},[187],{"type":37,"value":188},"    device_fingerprint,\n",{"type":32,"tag":135,"props":190,"children":192},{"class":137,"line":191},5,[193],{"type":32,"tag":135,"props":194,"children":195},{"style":148},[196],{"type":37,"value":197},"    ip_subnet,\n",{"type":32,"tag":135,"props":199,"children":201},{"class":137,"line":200},6,[202,208],{"type":32,"tag":135,"props":203,"children":205},{"style":204},"--shiki-default:#79B8FF",[206],{"type":37,"value":207},"    SUM",{"type":32,"tag":135,"props":209,"children":210},{"style":148},[211],{"type":37,"value":212},"(\n",{"type":32,"tag":135,"props":214,"children":216},{"class":137,"line":215},7,[217,222,227,232,237,242,247,252,257],{"type":32,"tag":135,"props":218,"children":219},{"style":142},[220],{"type":37,"value":221},"      CASE",{"type":32,"tag":135,"props":223,"children":224},{"style":142},[225],{"type":37,"value":226}," WHEN",{"type":32,"tag":135,"props":228,"children":229},{"style":148},[230],{"type":37,"value":231}," device_fingerprint_match ",{"type":32,"tag":135,"props":233,"children":234},{"style":142},[235],{"type":37,"value":236},"THEN",{"type":32,"tag":135,"props":238,"children":239},{"style":204},[240],{"type":37,"value":241}," 40",{"type":32,"tag":135,"props":243,"children":244},{"style":142},[245],{"type":37,"value":246}," ELSE",{"type":32,"tag":135,"props":248,"children":249},{"style":204},[250],{"type":37,"value":251}," 0",{"type":32,"tag":135,"props":253,"children":254},{"style":142},[255],{"type":37,"value":256}," END",{"type":32,"tag":135,"props":258,"children":259},{"style":142},[260],{"type":37,"value":261}," +\n",{"type":32,"tag":135,"props":263,"children":264},{"class":137,"line":26},[265,269,273,278,283,288,293,298,303,308,312,316,320],{"type":32,"tag":135,"props":266,"children":267},{"style":142},[268],{"type":37,"value":221},{"type":32,"tag":135,"props":270,"children":271},{"style":142},[272],{"type":37,"value":226},{"type":32,"tag":135,"props":274,"children":275},{"style":148},[276],{"type":37,"value":277}," ip_subnet_match ",{"type":32,"tag":135,"props":279,"children":280},{"style":142},[281],{"type":37,"value":282},"AND",{"type":32,"tag":135,"props":284,"children":285},{"style":148},[286],{"type":37,"value":287}," hour_diff ",{"type":32,"tag":135,"props":289,"children":290},{"style":142},[291],{"type":37,"value":292},"\u003C",{"type":32,"tag":135,"props":294,"children":295},{"style":204},[296],{"type":37,"value":297}," 4",{"type":32,"tag":135,"props":299,"children":300},{"style":142},[301],{"type":37,"value":302}," THEN",{"type":32,"tag":135,"props":304,"children":305},{"style":204},[306],{"type":37,"value":307}," 25",{"type":32,"tag":135,"props":309,"children":310},{"style":142},[311],{"type":37,"value":246},{"type":32,"tag":135,"props":313,"children":314},{"style":204},[315],{"type":37,"value":251},{"type":32,"tag":135,"props":317,"children":318},{"style":142},[319],{"type":37,"value":256},{"type":32,"tag":135,"props":321,"children":322},{"style":142},[323],{"type":37,"value":261},{"type":32,"tag":135,"props":325,"children":327},{"class":137,"line":326},9,[328,332,336,341,346,350,354,359,363,368,372,376],{"type":32,"tag":135,"props":329,"children":330},{"style":142},[331],{"type":37,"value":221},{"type":32,"tag":135,"props":333,"children":334},{"style":142},[335],{"type":37,"value":226},{"type":32,"tag":135,"props":337,"children":338},{"style":148},[339],{"type":37,"value":340}," behavior_vector_similarity ",{"type":32,"tag":135,"props":342,"children":343},{"style":142},[344],{"type":37,"value":345},">",{"type":32,"tag":135,"props":347,"children":348},{"style":204},[349],{"type":37,"value":251},{"type":32,"tag":135,"props":351,"children":352},{"style":148},[353],{"type":37,"value":118},{"type":32,"tag":135,"props":355,"children":356},{"style":204},[357],{"type":37,"value":358},"8",{"type":32,"tag":135,"props":360,"children":361},{"style":142},[362],{"type":37,"value":302},{"type":32,"tag":135,"props":364,"children":365},{"style":204},[366],{"type":37,"value":367}," 20",{"type":32,"tag":135,"props":369,"children":370},{"style":142},[371],{"type":37,"value":246},{"type":32,"tag":135,"props":373,"children":374},{"style":204},[375],{"type":37,"value":251},{"type":32,"tag":135,"props":377,"children":378},{"style":142},[379],{"type":37,"value":380}," END\n",{"type":32,"tag":135,"props":382,"children":384},{"class":137,"line":383},10,[385,390,394],{"type":32,"tag":135,"props":386,"children":387},{"style":148},[388],{"type":37,"value":389},"    ) ",{"type":32,"tag":135,"props":391,"children":392},{"style":142},[393],{"type":37,"value":156},{"type":32,"tag":135,"props":395,"children":396},{"style":148},[397],{"type":37,"value":398}," total_confidence\n",{"type":32,"tag":135,"props":400,"children":402},{"class":137,"line":401},11,[403,408],{"type":32,"tag":135,"props":404,"children":405},{"style":142},[406],{"type":37,"value":407},"  FROM",{"type":32,"tag":135,"props":409,"children":410},{"style":148},[411],{"type":37,"value":412}," event_stream\n",{"type":32,"tag":135,"props":414,"children":416},{"class":137,"line":415},12,[417,422,427,432,437,442,447,452,457],{"type":32,"tag":135,"props":418,"children":419},{"style":142},[420],{"type":37,"value":421},"  WHERE",{"type":32,"tag":135,"props":423,"children":424},{"style":142},[425],{"type":37,"value":426}," timestamp",{"type":32,"tag":135,"props":428,"children":429},{"style":142},[430],{"type":37,"value":431}," >",{"type":32,"tag":135,"props":433,"children":434},{"style":148},[435],{"type":37,"value":436}," TIMESTAMP_SUB(",{"type":32,"tag":135,"props":438,"children":439},{"style":204},[440],{"type":37,"value":441},"CURRENT_TIMESTAMP",{"type":32,"tag":135,"props":443,"children":444},{"style":148},[445],{"type":37,"value":446},"(), INTERVAL ",{"type":32,"tag":135,"props":448,"children":449},{"style":204},[450],{"type":37,"value":451},"7",{"type":32,"tag":135,"props":453,"children":454},{"style":142},[455],{"type":37,"value":456}," DAY",{"type":32,"tag":135,"props":458,"children":459},{"style":148},[460],{"type":37,"value":461},")\n",{"type":32,"tag":135,"props":463,"children":465},{"class":137,"line":464},13,[466],{"type":32,"tag":135,"props":467,"children":468},{"style":148},[469],{"type":37,"value":461},{"type":32,"tag":135,"props":471,"children":473},{"class":137,"line":472},14,[474,479],{"type":32,"tag":135,"props":475,"children":476},{"style":142},[477],{"type":37,"value":478},"SELECT",{"type":32,"tag":135,"props":480,"children":481},{"style":148},[482],{"type":37,"value":483}," session_id, device_fingerprint, total_confidence,\n",{"type":32,"tag":135,"props":485,"children":487},{"class":137,"line":486},15,[488,493,497,502,507,512],{"type":32,"tag":135,"props":489,"children":490},{"style":142},[491],{"type":37,"value":492},"  CASE",{"type":32,"tag":135,"props":494,"children":495},{"style":142},[496],{"type":37,"value":226},{"type":32,"tag":135,"props":498,"children":499},{"style":148},[500],{"type":37,"value":501}," total_confidence ",{"type":32,"tag":135,"props":503,"children":504},{"style":142},[505],{"type":37,"value":506},">=",{"type":32,"tag":135,"props":508,"children":509},{"style":204},[510],{"type":37,"value":511}," 70",{"type":32,"tag":135,"props":513,"children":514},{"style":148},[515],{"type":37,"value":516}," \n",{"type":32,"tag":135,"props":518,"children":520},{"class":137,"line":519},16,[521,526],{"type":32,"tag":135,"props":522,"children":523},{"style":142},[524],{"type":37,"value":525},"    THEN",{"type":32,"tag":135,"props":527,"children":528},{"style":148},[529],{"type":37,"value":530}," GENERATE_UUID() \n",{"type":32,"tag":135,"props":532,"children":534},{"class":137,"line":533},17,[535,540,545],{"type":32,"tag":135,"props":536,"children":537},{"style":142},[538],{"type":37,"value":539},"    ELSE",{"type":32,"tag":135,"props":541,"children":542},{"style":142},[543],{"type":37,"value":544}," NULL",{"type":32,"tag":135,"props":546,"children":547},{"style":148},[548],{"type":37,"value":516},{"type":32,"tag":135,"props":550,"children":552},{"class":137,"line":551},18,[553,558,563],{"type":32,"tag":135,"props":554,"children":555},{"style":142},[556],{"type":37,"value":557},"  END",{"type":32,"tag":135,"props":559,"children":560},{"style":142},[561],{"type":37,"value":562}," AS",{"type":32,"tag":135,"props":564,"children":565},{"style":148},[566],{"type":37,"value":567}," probabilistic_id\n",{"type":32,"tag":135,"props":569,"children":571},{"class":137,"line":570},19,[572,577],{"type":32,"tag":135,"props":573,"children":574},{"style":142},[575],{"type":37,"value":576},"FROM",{"type":32,"tag":135,"props":578,"children":579},{"style":148},[580],{"type":37,"value":581}," signal_scores\n",{"type":32,"tag":33,"props":583,"children":584},{},[585],{"type":37,"value":586},"The trade-off: false positive risk. Shared devices (office computers) or VPN usage can merge different people. Probabilistic IDs must always be validated against deterministic hashes—when a user logs in, a \"merge\" operation runs on the hash, correcting past probabilistic sessions.",{"type":32,"tag":40,"props":588,"children":590},{"id":589},"household-identity-device-cluster-to-home-unit",[591],{"type":37,"value":592},"Household Identity: Device Cluster to Home Unit",{"type":32,"tag":33,"props":594,"children":595},{},[596],{"type":37,"value":597},"The decision unit often isn't the individual—it's the household. Three devices share the same IP: MacBook (woman uses mornings), iPhone (throughout the day), iPad (child in evenings). Merging these as single \"individuals\" is wrong, but clustering as \"household\" is critical for segmentation—especially in durable goods (appliances, furniture) where purchase decisions are family-level.",{"type":32,"tag":33,"props":599,"children":600},{},[601],{"type":37,"value":602},"Household graph routes on router\u002Fmodem MAC address + IP subnet + GPS location. Network fingerprint, not device fingerprint, becomes the base because WiFi routers emit the same gateway MAC across all connected devices. Critical consideration: public WiFi filtering. Grouping 200 devices from a Starbucks IP as one \"household\" breaks the model. Filter using session count threshold (same IP, 50+ unique devices → blacklist) and dwelling time patterns (same IP, no 2+ hour sessions → retail location\u002Fcafe).",{"type":32,"tag":33,"props":604,"children":605},{},[606],{"type":37,"value":607},"Assign household ID in BigQuery like this:",{"type":32,"tag":125,"props":609,"children":611},{"className":127,"code":610,"language":129,"meta":16,"style":16},"CREATE OR REPLACE TABLE households AS\nWITH network_clusters AS (\n  SELECT ip_subnet, router_mac, GPS_lat, GPS_long,\n    APPROX_COUNT_DISTINCT(device_id) AS device_count,\n    AVG(session_duration_sec) AS avg_session\n  FROM sessions\n  WHERE DATE(timestamp) > DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)\n  GROUP BY 1,2,3,4\n  HAVING device_count BETWEEN 1 AND 8 AND avg_session > 120\n)\nSELECT *, GENERATE_UUID() AS household_id\nFROM network_clusters\n",[612],{"type":32,"tag":61,"props":613,"children":614},{"__ignoreMap":16},[615,639,659,672,694,716,728,777,818,868,875,901],{"type":32,"tag":135,"props":616,"children":617},{"class":137,"line":138},[618,623,628,634],{"type":32,"tag":135,"props":619,"children":620},{"style":142},[621],{"type":37,"value":622},"CREATE OR REPLACE",{"type":32,"tag":135,"props":624,"children":625},{"style":142},[626],{"type":37,"value":627}," TABLE",{"type":32,"tag":135,"props":629,"children":631},{"style":630},"--shiki-default:#B392F0",[632],{"type":37,"value":633}," households",{"type":32,"tag":135,"props":635,"children":636},{"style":142},[637],{"type":37,"value":638}," AS\n",{"type":32,"tag":135,"props":640,"children":641},{"class":137,"line":164},[642,646,651,655],{"type":32,"tag":135,"props":643,"children":644},{"style":142},[645],{"type":37,"value":145},{"type":32,"tag":135,"props":647,"children":648},{"style":148},[649],{"type":37,"value":650}," network_clusters ",{"type":32,"tag":135,"props":652,"children":653},{"style":142},[654],{"type":37,"value":156},{"type":32,"tag":135,"props":656,"children":657},{"style":148},[658],{"type":37,"value":161},{"type":32,"tag":135,"props":660,"children":661},{"class":137,"line":173},[662,667],{"type":32,"tag":135,"props":663,"children":664},{"style":142},[665],{"type":37,"value":666},"  SELECT",{"type":32,"tag":135,"props":668,"children":669},{"style":148},[670],{"type":37,"value":671}," ip_subnet, router_mac, GPS_lat, GPS_long,\n",{"type":32,"tag":135,"props":673,"children":674},{"class":137,"line":182},[675,680,685,689],{"type":32,"tag":135,"props":676,"children":677},{"style":204},[678],{"type":37,"value":679},"    APPROX_COUNT_DISTINCT",{"type":32,"tag":135,"props":681,"children":682},{"style":148},[683],{"type":37,"value":684},"(device_id) ",{"type":32,"tag":135,"props":686,"children":687},{"style":142},[688],{"type":37,"value":156},{"type":32,"tag":135,"props":690,"children":691},{"style":148},[692],{"type":37,"value":693}," device_count,\n",{"type":32,"tag":135,"props":695,"children":696},{"class":137,"line":191},[697,702,707,711],{"type":32,"tag":135,"props":698,"children":699},{"style":204},[700],{"type":37,"value":701},"    AVG",{"type":32,"tag":135,"props":703,"children":704},{"style":148},[705],{"type":37,"value":706},"(session_duration_sec) ",{"type":32,"tag":135,"props":708,"children":709},{"style":142},[710],{"type":37,"value":156},{"type":32,"tag":135,"props":712,"children":713},{"style":148},[714],{"type":37,"value":715}," avg_session\n",{"type":32,"tag":135,"props":717,"children":718},{"class":137,"line":200},[719,723],{"type":32,"tag":135,"props":720,"children":721},{"style":142},[722],{"type":37,"value":407},{"type":32,"tag":135,"props":724,"children":725},{"style":142},[726],{"type":37,"value":727}," sessions\n",{"type":32,"tag":135,"props":729,"children":730},{"class":137,"line":215},[731,735,740,745,750,755,759,764,769,773],{"type":32,"tag":135,"props":732,"children":733},{"style":142},[734],{"type":37,"value":421},{"type":32,"tag":135,"props":736,"children":737},{"style":142},[738],{"type":37,"value":739}," DATE",{"type":32,"tag":135,"props":741,"children":742},{"style":148},[743],{"type":37,"value":744},"(",{"type":32,"tag":135,"props":746,"children":747},{"style":142},[748],{"type":37,"value":749},"timestamp",{"type":32,"tag":135,"props":751,"children":752},{"style":148},[753],{"type":37,"value":754},") ",{"type":32,"tag":135,"props":756,"children":757},{"style":142},[758],{"type":37,"value":345},{"type":32,"tag":135,"props":760,"children":761},{"style":148},[762],{"type":37,"value":763}," DATE_SUB(CURRENT_DATE(), INTERVAL ",{"type":32,"tag":135,"props":765,"children":766},{"style":204},[767],{"type":37,"value":768},"30",{"type":32,"tag":135,"props":770,"children":771},{"style":142},[772],{"type":37,"value":456},{"type":32,"tag":135,"props":774,"children":775},{"style":148},[776],{"type":37,"value":461},{"type":32,"tag":135,"props":778,"children":779},{"class":137,"line":26},[780,785,790,795,800,804,809,813],{"type":32,"tag":135,"props":781,"children":782},{"style":142},[783],{"type":37,"value":784},"  GROUP BY",{"type":32,"tag":135,"props":786,"children":787},{"style":204},[788],{"type":37,"value":789}," 1",{"type":32,"tag":135,"props":791,"children":792},{"style":148},[793],{"type":37,"value":794},",",{"type":32,"tag":135,"props":796,"children":797},{"style":204},[798],{"type":37,"value":799},"2",{"type":32,"tag":135,"props":801,"children":802},{"style":148},[803],{"type":37,"value":794},{"type":32,"tag":135,"props":805,"children":806},{"style":204},[807],{"type":37,"value":808},"3",{"type":32,"tag":135,"props":810,"children":811},{"style":148},[812],{"type":37,"value":794},{"type":32,"tag":135,"props":814,"children":815},{"style":204},[816],{"type":37,"value":817},"4\n",{"type":32,"tag":135,"props":819,"children":820},{"class":137,"line":326},[821,826,831,836,840,845,850,854,859,863],{"type":32,"tag":135,"props":822,"children":823},{"style":142},[824],{"type":37,"value":825},"  HAVING",{"type":32,"tag":135,"props":827,"children":828},{"style":148},[829],{"type":37,"value":830}," device_count ",{"type":32,"tag":135,"props":832,"children":833},{"style":142},[834],{"type":37,"value":835},"BETWEEN",{"type":32,"tag":135,"props":837,"children":838},{"style":204},[839],{"type":37,"value":789},{"type":32,"tag":135,"props":841,"children":842},{"style":142},[843],{"type":37,"value":844}," AND",{"type":32,"tag":135,"props":846,"children":847},{"style":204},[848],{"type":37,"value":849}," 8",{"type":32,"tag":135,"props":851,"children":852},{"style":142},[853],{"type":37,"value":844},{"type":32,"tag":135,"props":855,"children":856},{"style":148},[857],{"type":37,"value":858}," avg_session ",{"type":32,"tag":135,"props":860,"children":861},{"style":142},[862],{"type":37,"value":345},{"type":32,"tag":135,"props":864,"children":865},{"style":204},[866],{"type":37,"value":867}," 120\n",{"type":32,"tag":135,"props":869,"children":870},{"class":137,"line":383},[871],{"type":32,"tag":135,"props":872,"children":873},{"style":148},[874],{"type":37,"value":461},{"type":32,"tag":135,"props":876,"children":877},{"class":137,"line":401},[878,882,887,892,896],{"type":32,"tag":135,"props":879,"children":880},{"style":142},[881],{"type":37,"value":478},{"type":32,"tag":135,"props":883,"children":884},{"style":142},[885],{"type":37,"value":886}," *",{"type":32,"tag":135,"props":888,"children":889},{"style":148},[890],{"type":37,"value":891},", GENERATE_UUID() ",{"type":32,"tag":135,"props":893,"children":894},{"style":142},[895],{"type":37,"value":156},{"type":32,"tag":135,"props":897,"children":898},{"style":148},[899],{"type":37,"value":900}," household_id\n",{"type":32,"tag":135,"props":902,"children":903},{"class":137,"line":415},[904,908],{"type":32,"tag":135,"props":905,"children":906},{"style":142},[907],{"type":37,"value":576},{"type":32,"tag":135,"props":909,"children":910},{"style":148},[911],{"type":37,"value":912}," network_clusters\n",{"type":32,"tag":33,"props":914,"children":915},{},[916,918,926],{"type":37,"value":917},"Household-level lifetime value makes more sense because appliance purchases aren't individual decisions—they're for the home. In ",{"type":32,"tag":52,"props":919,"children":923},{"href":920,"rel":921},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fretention-engineering-cdp",[922],"nofollow",[924],{"type":37,"value":925},"CDP & Retention Engineering",{"type":37,"value":927}," architectures, household segments deliver 23% higher ROAS in campaign targeting than individual segments—because instead of messaging one phone number across scattered devices, the household becomes a strategic unit.",{"type":32,"tag":40,"props":929,"children":931},{"id":930},"graph-stitching-identity-unification-over-time",[932],{"type":37,"value":933},"Graph Stitching: Identity Unification Over Time",{"type":32,"tag":33,"props":935,"children":936},{},[937],{"type":37,"value":938},"Identity graph isn't static—today a user is anonymous, tomorrow they provide email, 5 days later they log in, 2 months later they update phone. Every new signal \"stitches\" past fragments—meaning old probabilistic IDs merge to the new deterministic hash.",{"type":32,"tag":33,"props":940,"children":941},{},[942,944,950,952,958],{"type":37,"value":943},"Solve this event-driven: every ",{"type":32,"tag":61,"props":945,"children":947},{"className":946},[],[948],{"type":37,"value":949},"user_identified",{"type":37,"value":951}," event lands in Pub\u002FSub, a Cloud Function triggers, a ",{"type":32,"tag":61,"props":953,"children":955},{"className":954},[],[956],{"type":37,"value":957},"MERGE",{"type":37,"value":959}," statement runs in BigQuery. When a user logs in, their email hash arrives; all probabilistic IDs from the past 90 days with matching device fingerprint attach to this hash. Backfill reaches as far back as your attribution window—if you run 30-day conversion windows, stitch back 30 days.",{"type":32,"tag":125,"props":961,"children":963},{"className":127,"code":962,"language":129,"meta":16,"style":16},"MERGE INTO unified_identity AS target\nUSING (\n  SELECT probabilistic_id, email_sha256, MAX(timestamp) AS last_seen\n  FROM identification_events\n  WHERE event_name = 'user_login'\n  GROUP BY 1,2\n) AS source\nON target.probabilistic_id = source.probabilistic_id\nWHEN MATCHED THEN UPDATE SET \n  target.email_sha256 = source.email_sha256,\n  target.is_deterministic = TRUE,\n  target.stitched_at = CURRENT_TIMESTAMP()\n",[964],{"type":32,"tag":61,"props":965,"children":966},{"__ignoreMap":16},[967,993,1005,1043,1055,1078,1098,1114,1154,1185,1223,1248],{"type":32,"tag":135,"props":968,"children":969},{"class":137,"line":138},[970,974,979,984,988],{"type":32,"tag":135,"props":971,"children":972},{"style":142},[973],{"type":37,"value":957},{"type":32,"tag":135,"props":975,"children":976},{"style":142},[977],{"type":37,"value":978}," INTO",{"type":32,"tag":135,"props":980,"children":981},{"style":148},[982],{"type":37,"value":983}," unified_identity ",{"type":32,"tag":135,"props":985,"children":986},{"style":142},[987],{"type":37,"value":156},{"type":32,"tag":135,"props":989,"children":990},{"style":142},[991],{"type":37,"value":992}," target\n",{"type":32,"tag":135,"props":994,"children":995},{"class":137,"line":164},[996,1001],{"type":32,"tag":135,"props":997,"children":998},{"style":142},[999],{"type":37,"value":1000},"USING",{"type":32,"tag":135,"props":1002,"children":1003},{"style":148},[1004],{"type":37,"value":161},{"type":32,"tag":135,"props":1006,"children":1007},{"class":137,"line":173},[1008,1012,1017,1022,1026,1030,1034,1038],{"type":32,"tag":135,"props":1009,"children":1010},{"style":142},[1011],{"type":37,"value":666},{"type":32,"tag":135,"props":1013,"children":1014},{"style":148},[1015],{"type":37,"value":1016}," probabilistic_id, email_sha256, ",{"type":32,"tag":135,"props":1018,"children":1019},{"style":204},[1020],{"type":37,"value":1021},"MAX",{"type":32,"tag":135,"props":1023,"children":1024},{"style":148},[1025],{"type":37,"value":744},{"type":32,"tag":135,"props":1027,"children":1028},{"style":142},[1029],{"type":37,"value":749},{"type":32,"tag":135,"props":1031,"children":1032},{"style":148},[1033],{"type":37,"value":754},{"type":32,"tag":135,"props":1035,"children":1036},{"style":142},[1037],{"type":37,"value":156},{"type":32,"tag":135,"props":1039,"children":1040},{"style":148},[1041],{"type":37,"value":1042}," last_seen\n",{"type":32,"tag":135,"props":1044,"children":1045},{"class":137,"line":182},[1046,1050],{"type":32,"tag":135,"props":1047,"children":1048},{"style":142},[1049],{"type":37,"value":407},{"type":32,"tag":135,"props":1051,"children":1052},{"style":148},[1053],{"type":37,"value":1054}," identification_events\n",{"type":32,"tag":135,"props":1056,"children":1057},{"class":137,"line":191},[1058,1062,1067,1072],{"type":32,"tag":135,"props":1059,"children":1060},{"style":142},[1061],{"type":37,"value":421},{"type":32,"tag":135,"props":1063,"children":1064},{"style":148},[1065],{"type":37,"value":1066}," event_name ",{"type":32,"tag":135,"props":1068,"children":1069},{"style":142},[1070],{"type":37,"value":1071},"=",{"type":32,"tag":135,"props":1073,"children":1075},{"style":1074},"--shiki-default:#9ECBFF",[1076],{"type":37,"value":1077}," 'user_login'\n",{"type":32,"tag":135,"props":1079,"children":1080},{"class":137,"line":200},[1081,1085,1089,1093],{"type":32,"tag":135,"props":1082,"children":1083},{"style":142},[1084],{"type":37,"value":784},{"type":32,"tag":135,"props":1086,"children":1087},{"style":204},[1088],{"type":37,"value":789},{"type":32,"tag":135,"props":1090,"children":1091},{"style":148},[1092],{"type":37,"value":794},{"type":32,"tag":135,"props":1094,"children":1095},{"style":204},[1096],{"type":37,"value":1097},"2\n",{"type":32,"tag":135,"props":1099,"children":1100},{"class":137,"line":215},[1101,1105,1109],{"type":32,"tag":135,"props":1102,"children":1103},{"style":148},[1104],{"type":37,"value":754},{"type":32,"tag":135,"props":1106,"children":1107},{"style":142},[1108],{"type":37,"value":156},{"type":32,"tag":135,"props":1110,"children":1111},{"style":148},[1112],{"type":37,"value":1113}," source\n",{"type":32,"tag":135,"props":1115,"children":1116},{"class":137,"line":26},[1117,1122,1127,1131,1135,1140,1145,1149],{"type":32,"tag":135,"props":1118,"children":1119},{"style":142},[1120],{"type":37,"value":1121},"ON",{"type":32,"tag":135,"props":1123,"children":1124},{"style":204},[1125],{"type":37,"value":1126}," target",{"type":32,"tag":135,"props":1128,"children":1129},{"style":148},[1130],{"type":37,"value":118},{"type":32,"tag":135,"props":1132,"children":1133},{"style":204},[1134],{"type":37,"value":116},{"type":32,"tag":135,"props":1136,"children":1137},{"style":142},[1138],{"type":37,"value":1139}," =",{"type":32,"tag":135,"props":1141,"children":1142},{"style":204},[1143],{"type":37,"value":1144}," source",{"type":32,"tag":135,"props":1146,"children":1147},{"style":148},[1148],{"type":37,"value":118},{"type":32,"tag":135,"props":1150,"children":1151},{"style":204},[1152],{"type":37,"value":1153},"probabilistic_id\n",{"type":32,"tag":135,"props":1155,"children":1156},{"class":137,"line":326},[1157,1162,1167,1171,1176,1181],{"type":32,"tag":135,"props":1158,"children":1159},{"style":142},[1160],{"type":37,"value":1161},"WHEN",{"type":32,"tag":135,"props":1163,"children":1164},{"style":142},[1165],{"type":37,"value":1166}," MATCHED",{"type":32,"tag":135,"props":1168,"children":1169},{"style":142},[1170],{"type":37,"value":302},{"type":32,"tag":135,"props":1172,"children":1173},{"style":142},[1174],{"type":37,"value":1175}," UPDATE",{"type":32,"tag":135,"props":1177,"children":1178},{"style":142},[1179],{"type":37,"value":1180}," SET",{"type":32,"tag":135,"props":1182,"children":1183},{"style":148},[1184],{"type":37,"value":516},{"type":32,"tag":135,"props":1186,"children":1187},{"class":137,"line":383},[1188,1193,1197,1202,1206,1210,1214,1218],{"type":32,"tag":135,"props":1189,"children":1190},{"style":204},[1191],{"type":37,"value":1192},"  target",{"type":32,"tag":135,"props":1194,"children":1195},{"style":148},[1196],{"type":37,"value":118},{"type":32,"tag":135,"props":1198,"children":1199},{"style":204},[1200],{"type":37,"value":1201},"email_sha256",{"type":32,"tag":135,"props":1203,"children":1204},{"style":142},[1205],{"type":37,"value":1139},{"type":32,"tag":135,"props":1207,"children":1208},{"style":204},[1209],{"type":37,"value":1144},{"type":32,"tag":135,"props":1211,"children":1212},{"style":148},[1213],{"type":37,"value":118},{"type":32,"tag":135,"props":1215,"children":1216},{"style":204},[1217],{"type":37,"value":1201},{"type":32,"tag":135,"props":1219,"children":1220},{"style":148},[1221],{"type":37,"value":1222},",\n",{"type":32,"tag":135,"props":1224,"children":1225},{"class":137,"line":401},[1226,1230,1234,1239,1243],{"type":32,"tag":135,"props":1227,"children":1228},{"style":204},[1229],{"type":37,"value":1192},{"type":32,"tag":135,"props":1231,"children":1232},{"style":148},[1233],{"type":37,"value":118},{"type":32,"tag":135,"props":1235,"children":1236},{"style":204},[1237],{"type":37,"value":1238},"is_deterministic",{"type":32,"tag":135,"props":1240,"children":1241},{"style":142},[1242],{"type":37,"value":1139},{"type":32,"tag":135,"props":1244,"children":1245},{"style":148},[1246],{"type":37,"value":1247}," TRUE,\n",{"type":32,"tag":135,"props":1249,"children":1250},{"class":137,"line":415},[1251,1255,1259,1264,1268,1273],{"type":32,"tag":135,"props":1252,"children":1253},{"style":204},[1254],{"type":37,"value":1192},{"type":32,"tag":135,"props":1256,"children":1257},{"style":148},[1258],{"type":37,"value":118},{"type":32,"tag":135,"props":1260,"children":1261},{"style":204},[1262],{"type":37,"value":1263},"stitched_at",{"type":32,"tag":135,"props":1265,"children":1266},{"style":142},[1267],{"type":37,"value":1139},{"type":32,"tag":135,"props":1269,"children":1270},{"style":204},[1271],{"type":37,"value":1272}," CURRENT_TIMESTAMP",{"type":32,"tag":135,"props":1274,"children":1275},{"style":148},[1276],{"type":37,"value":1277},"()\n",{"type":32,"tag":33,"props":1279,"children":1280},{},[1281,1283,1289,1291,1297],{"type":37,"value":1282},"Stitching carries race condition risk—simultaneous logins from two devices can conflict merge attempts. Resolve using transaction locks or idempotency keys. Idempotency key is typically ",{"type":32,"tag":61,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":37,"value":1288},"device_id + timestamp_truncated_to_second",{"type":37,"value":1290},"—two ",{"type":32,"tag":61,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":37,"value":1296},"user_login",{"type":37,"value":1298}," events from the same device within the same second count as duplicate, triggering single merge.",{"type":32,"tag":40,"props":1300,"children":1302},{"id":1301},"privacy-compliance-hashed-pii-and-data-minimization",[1303],{"type":37,"value":1304},"Privacy + Compliance: Hashed PII and Data Minimization",{"type":32,"tag":33,"props":1306,"children":1307},{},[1308,1310,1316,1318,1324],{"type":37,"value":1309},"Identity resolution falls into \"automated decision making\" and \"profiling\" under GDPR and similar frameworks—meaning it requires explicit consent. Without ",{"type":32,"tag":61,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":37,"value":1315},"analytics_storage=granted",{"type":37,"value":1317}," from your Consent Management Platform (OneTrust, Cookiebot), you can't even collect hashes. Under Consent Mode v2, basic consent keeps ",{"type":32,"tag":61,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":37,"value":1323},"user_data",{"type":37,"value":1325}," empty; enhanced consent allows hash inclusion.",{"type":32,"tag":33,"props":1327,"children":1328},{},[1329,1331,1337,1339,1344],{"type":37,"value":1330},"Hashes aren't PII but are treated as pseudonymization—so GDPR's \"right to be forgotten\" requires hash deletion too. When a deletion request arrives in BigQuery, run ",{"type":32,"tag":61,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":37,"value":1336},"DELETE",{"type":37,"value":1338}," on ",{"type":32,"tag":61,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":37,"value":1201},{"type":37,"value":1345}," rows and propagate downstream to CDP and CRM. Hash mapping tables must be centralized—scattered hashes across systems instead derive from a single source of truth.",{"type":32,"tag":33,"props":1347,"children":1348},{},[1349],{"type":37,"value":1350},"Data minimization principles should cap identity graph at 90 days. Probabilistic IDs older than 90 days move to archive; only deterministic hashes stay long-term. This matters for both compliance and storage cost—BigQuery partition pruning on a rolling 90-day window cuts query cost by 60%.",{"type":32,"tag":40,"props":1352,"children":1354},{"id":1353},"production-pipeline-architecture-hybrid-batch-streaming",[1355],{"type":37,"value":1356},"Production Pipeline Architecture: Hybrid Batch + Streaming",{"type":32,"tag":33,"props":1358,"children":1359},{},[1360],{"type":37,"value":1361},"Identity resolution pipelines operate in two layers: streaming (real-time signal collection) and batch (nightly stitching). Streaming runs Pub\u002FSub → Dataflow → BigQuery write streaming insert, \u003C10 second latency. Batch runs dbt scheduled jobs at 04:00 AM, executing all graph stitching and household clustering.",{"type":32,"tag":33,"props":1363,"children":1364},{},[1365,1367,1373],{"type":37,"value":1366},"Streaming only collects signals—hash matching and probabilistic scoring don't run here because streaming-layer complex JOINs are expensive. Events write to Firestore with ",{"type":32,"tag":61,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":37,"value":1372},"event_id",{"type":37,"value":1374}," unique constraints preventing duplicates. Batch reads these events, transforms them in BigQuery into dimensional models. dbt macros chain hash generation, score calculation, and graph merge into a single pipeline.",{"type":32,"tag":33,"props":1376,"children":1377},{},[1378,1380,1386,1388,1394],{"type":37,"value":1379},"Monitor graph coverage: ",{"type":32,"tag":61,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":37,"value":1385},"identified_users \u002F total_active_users",{"type":37,"value":1387}," ratio. Below 40% signals weak deterministic capture—optimize login flow and focus lead forms on email capture. Above 75% is healthy. Define this metric as a dbt test in ",{"type":32,"tag":61,"props":1389,"children":1391},{"className":1390},[],[1392],{"type":37,"value":1393},"data_tests\u002Fidentity_coverage.sql",{"type":37,"value":1395}," and run before every deployment.",{"type":32,"tag":33,"props":1397,"children":1398},{},[1399],{"type":37,"value":1400},"Identity resolution is the backbone of modern marketing stacks. The post-cookie world made deterministic hashing the gold standard, but it's insufficient alone—probabilistic linking and household clustering build a 3-layer identity graph. When modeled in BigQuery with dbt, this pipeline becomes consent-aware, privacy-compliant, and production-ready, enabling attribution models, segmentation strategy, and lifetime value forecasts all grounded in a single unified customer view.",{"type":32,"tag":1402,"props":1403,"children":1404},"style",{},[1405],{"type":37,"value":1406},"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":173,"depth":173,"links":1408},[1409,1410,1411,1412,1413,1414],{"id":42,"depth":164,"text":45},{"id":97,"depth":164,"text":100},{"id":589,"depth":164,"text":592},{"id":930,"depth":164,"text":933},{"id":1301,"depth":164,"text":1304},{"id":1353,"depth":164,"text":1356},"markdown","content:en:data:identity-resolution-six-signals-to-unified-customer-identity.md","content","en\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer-identity.md","en\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer-identity","md",1778709810214]