[{"data":1,"prerenderedAt":1274},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-unified-customer-id":13},{"i18nKey":4,"paths":5},"data-003-2026-08",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fidentity-resolution-sechs-signale-zu-einer-kundenidentitaet","\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-unified-customer-id","\u002Fes\u002Fdata\u002Fresolucion-de-identidad","\u002Ffr\u002Fdata\u002Fresolution-identites-6-signaux-vers-un-profil-client-unique","\u002Fit\u002Fdata\u002Frisoluzione-identita-sei-segnali-unificati","\u002Fru\u002Fdata\u002Fidentity-resolution-six-signals-to-single-customer-identity","\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":1268,"_id":1269,"_source":1270,"_file":1271,"_stem":1272,"_extension":1273},"data",false,"","Identity Resolution: Unifying Six Signals Into One Customer Identity","Hash matching, probabilistic linking, and household identity—connecting fragmented signals and binding marketing data to decision engines.","2026-08-04",[21,22,23,24,25],"identity-resolution","hash-matching","probabilistic-linking","cdp","first-party-data",8,"Roibase",{"type":29,"children":30,"toc":1256},"root",[31,39,46,51,89,102,109,450,463,469,474,479,484,614,630,636,641,646,651,657,1049,1070,1076,1081,1094,1108,1144,1150,1155,1184,1197,1203,1208,1229,1234,1238,1250],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","A user browses the web anonymously, logs into a mobile app, signs up for a newsletter with a different email, pays with a credit card in-store. Each touchpoint is a separate signal—but to optimize your marketing budget, you must stitch them into a single customer identity. In 2026, cookies are gone, device proliferation is surging, and consent rates hover between 40–60 percent. Identity resolution is no longer nice-to-have; it's the load-bearing pillar of your measurement architecture.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"hash-matching-converting-email-and-phone-into-a-data-graph",[44],{"type":37,"value":45},"Hash Matching: Converting Email and Phone Into a Data Graph",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Hash matching is the method where you hash user PII (email, phone) with SHA-256 and send it to platform graphs (Google PAIR, Meta Advanced Matching, LiveRamp). Raw PII never touches the browser—it's hashed server-side in GTM or a CDP and passed to Measurement Protocol.",{"type":32,"tag":33,"props":52,"children":53},{},[54,56,63,65,71,73,79,81,87],{"type":37,"value":55},"Example flow: a user enters ",{"type":32,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":37,"value":62},"jane.doe@example.com",{"type":37,"value":64}," at checkout. In your server-side container, JavaScript produces ",{"type":32,"tag":57,"props":66,"children":68},{"className":67},[],[69],{"type":37,"value":70},"sha256('jane.doe@example.com')",{"type":37,"value":72}," → ",{"type":32,"tag":57,"props":74,"children":76},{"className":75},[],[77],{"type":37,"value":78},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",{"type":37,"value":80},", which is appended to the Google Analytics 4 ",{"type":32,"tag":57,"props":82,"children":84},{"className":83},[],[85],{"type":37,"value":86},"user_id",{"type":37,"value":88}," parameter. Google compares this hash against its own identity graph—if the user has previously signed into Google Ads, a match occurs and enters the cross-device attribution chain.",{"type":32,"tag":33,"props":90,"children":91},{},[92,94,100],{"type":37,"value":93},"SHA-256 is one-way, but without salt, it's vulnerable to rainbow tables. In production, use ",{"type":32,"tag":57,"props":95,"children":97},{"className":96},[],[98],{"type":37,"value":99},"sha256(email + pepper)",{"type":37,"value":101}," (pepper: a global secret key, stored in environment variables). In Meta Advanced Matching, the hash + country code combination lifts match rates by 12–18 percent (Meta 2025 benchmark). Hash matching's ceiling is consent—under GDPR, if a user hasn't ticked the \"I consent\" box, you cannot send even the hash.",{"type":32,"tag":103,"props":104,"children":106},"h3",{"id":105},"hash-matching-bigquery-pipeline-example",[107],{"type":37,"value":108},"Hash Matching BigQuery Pipeline Example",{"type":32,"tag":110,"props":111,"children":115},"pre",{"className":112,"code":113,"language":114,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","-- dbt model: hash_user_pii.sql\nWITH raw_signups AS (\n  SELECT\n    user_id,\n    LOWER(TRIM(email)) AS email_normalized,\n    REGEXP_REPLACE(phone, r'[^\\d]', '') AS phone_normalized,\n    created_at\n  FROM {{ ref('raw_user_signups') }}\n)\nSELECT\n  user_id,\n  TO_HEX(SHA256(CONCAT(email_normalized, '{{env_var(\"HASH_PEPPER\")}}'))) AS email_hash,\n  TO_HEX(SHA256(CONCAT(phone_normalized, '{{env_var(\"HASH_PEPPER\")}}'))) AS phone_hash,\n  created_at\nFROM raw_signups\nWHERE email_normalized IS NOT NULL\n  AND LENGTH(phone_normalized) >= 10\n","sql",[116],{"type":32,"tag":57,"props":117,"children":118},{"__ignoreMap":16},[119,131,157,166,175,209,248,257,280,289,298,307,345,379,388,402,421],{"type":32,"tag":120,"props":121,"children":124},"span",{"class":122,"line":123},"line",1,[125],{"type":32,"tag":120,"props":126,"children":128},{"style":127},"--shiki-default:#6A737D",[129],{"type":37,"value":130},"-- dbt model: hash_user_pii.sql\n",{"type":32,"tag":120,"props":132,"children":134},{"class":122,"line":133},2,[135,141,147,152],{"type":32,"tag":120,"props":136,"children":138},{"style":137},"--shiki-default:#F97583",[139],{"type":37,"value":140},"WITH",{"type":32,"tag":120,"props":142,"children":144},{"style":143},"--shiki-default:#E1E4E8",[145],{"type":37,"value":146}," raw_signups ",{"type":32,"tag":120,"props":148,"children":149},{"style":137},[150],{"type":37,"value":151},"AS",{"type":32,"tag":120,"props":153,"children":154},{"style":143},[155],{"type":37,"value":156}," (\n",{"type":32,"tag":120,"props":158,"children":160},{"class":122,"line":159},3,[161],{"type":32,"tag":120,"props":162,"children":163},{"style":137},[164],{"type":37,"value":165},"  SELECT\n",{"type":32,"tag":120,"props":167,"children":169},{"class":122,"line":168},4,[170],{"type":32,"tag":120,"props":171,"children":172},{"style":143},[173],{"type":37,"value":174},"    user_id,\n",{"type":32,"tag":120,"props":176,"children":178},{"class":122,"line":177},5,[179,185,190,195,200,204],{"type":32,"tag":120,"props":180,"children":182},{"style":181},"--shiki-default:#79B8FF",[183],{"type":37,"value":184},"    LOWER",{"type":32,"tag":120,"props":186,"children":187},{"style":143},[188],{"type":37,"value":189},"(",{"type":32,"tag":120,"props":191,"children":192},{"style":181},[193],{"type":37,"value":194},"TRIM",{"type":32,"tag":120,"props":196,"children":197},{"style":143},[198],{"type":37,"value":199},"(email)) ",{"type":32,"tag":120,"props":201,"children":202},{"style":137},[203],{"type":37,"value":151},{"type":32,"tag":120,"props":205,"children":206},{"style":143},[207],{"type":37,"value":208}," email_normalized,\n",{"type":32,"tag":120,"props":210,"children":212},{"class":122,"line":211},6,[213,218,224,229,234,239,243],{"type":32,"tag":120,"props":214,"children":215},{"style":143},[216],{"type":37,"value":217},"    REGEXP_REPLACE(phone, r",{"type":32,"tag":120,"props":219,"children":221},{"style":220},"--shiki-default:#9ECBFF",[222],{"type":37,"value":223},"'[^\\d]'",{"type":32,"tag":120,"props":225,"children":226},{"style":143},[227],{"type":37,"value":228},", ",{"type":32,"tag":120,"props":230,"children":231},{"style":220},[232],{"type":37,"value":233},"''",{"type":32,"tag":120,"props":235,"children":236},{"style":143},[237],{"type":37,"value":238},") ",{"type":32,"tag":120,"props":240,"children":241},{"style":137},[242],{"type":37,"value":151},{"type":32,"tag":120,"props":244,"children":245},{"style":143},[246],{"type":37,"value":247}," phone_normalized,\n",{"type":32,"tag":120,"props":249,"children":251},{"class":122,"line":250},7,[252],{"type":32,"tag":120,"props":253,"children":254},{"style":143},[255],{"type":37,"value":256},"    created_at\n",{"type":32,"tag":120,"props":258,"children":259},{"class":122,"line":26},[260,265,270,275],{"type":32,"tag":120,"props":261,"children":262},{"style":137},[263],{"type":37,"value":264},"  FROM",{"type":32,"tag":120,"props":266,"children":267},{"style":143},[268],{"type":37,"value":269}," {{ ref(",{"type":32,"tag":120,"props":271,"children":272},{"style":220},[273],{"type":37,"value":274},"'raw_user_signups'",{"type":32,"tag":120,"props":276,"children":277},{"style":143},[278],{"type":37,"value":279},") }}\n",{"type":32,"tag":120,"props":281,"children":283},{"class":122,"line":282},9,[284],{"type":32,"tag":120,"props":285,"children":286},{"style":143},[287],{"type":37,"value":288},")\n",{"type":32,"tag":120,"props":290,"children":292},{"class":122,"line":291},10,[293],{"type":32,"tag":120,"props":294,"children":295},{"style":137},[296],{"type":37,"value":297},"SELECT\n",{"type":32,"tag":120,"props":299,"children":301},{"class":122,"line":300},11,[302],{"type":32,"tag":120,"props":303,"children":304},{"style":143},[305],{"type":37,"value":306},"  user_id,\n",{"type":32,"tag":120,"props":308,"children":310},{"class":122,"line":309},12,[311,316,321,326,331,336,340],{"type":32,"tag":120,"props":312,"children":313},{"style":143},[314],{"type":37,"value":315},"  TO_HEX(SHA256(",{"type":32,"tag":120,"props":317,"children":318},{"style":181},[319],{"type":37,"value":320},"CONCAT",{"type":32,"tag":120,"props":322,"children":323},{"style":143},[324],{"type":37,"value":325},"(email_normalized, ",{"type":32,"tag":120,"props":327,"children":328},{"style":220},[329],{"type":37,"value":330},"'{{env_var(\"HASH_PEPPER\")}}'",{"type":32,"tag":120,"props":332,"children":333},{"style":143},[334],{"type":37,"value":335},"))) ",{"type":32,"tag":120,"props":337,"children":338},{"style":137},[339],{"type":37,"value":151},{"type":32,"tag":120,"props":341,"children":342},{"style":143},[343],{"type":37,"value":344}," email_hash,\n",{"type":32,"tag":120,"props":346,"children":348},{"class":122,"line":347},13,[349,353,357,362,366,370,374],{"type":32,"tag":120,"props":350,"children":351},{"style":143},[352],{"type":37,"value":315},{"type":32,"tag":120,"props":354,"children":355},{"style":181},[356],{"type":37,"value":320},{"type":32,"tag":120,"props":358,"children":359},{"style":143},[360],{"type":37,"value":361},"(phone_normalized, ",{"type":32,"tag":120,"props":363,"children":364},{"style":220},[365],{"type":37,"value":330},{"type":32,"tag":120,"props":367,"children":368},{"style":143},[369],{"type":37,"value":335},{"type":32,"tag":120,"props":371,"children":372},{"style":137},[373],{"type":37,"value":151},{"type":32,"tag":120,"props":375,"children":376},{"style":143},[377],{"type":37,"value":378}," phone_hash,\n",{"type":32,"tag":120,"props":380,"children":382},{"class":122,"line":381},14,[383],{"type":32,"tag":120,"props":384,"children":385},{"style":143},[386],{"type":37,"value":387},"  created_at\n",{"type":32,"tag":120,"props":389,"children":391},{"class":122,"line":390},15,[392,397],{"type":32,"tag":120,"props":393,"children":394},{"style":137},[395],{"type":37,"value":396},"FROM",{"type":32,"tag":120,"props":398,"children":399},{"style":143},[400],{"type":37,"value":401}," raw_signups\n",{"type":32,"tag":120,"props":403,"children":405},{"class":122,"line":404},16,[406,411,416],{"type":32,"tag":120,"props":407,"children":408},{"style":137},[409],{"type":37,"value":410},"WHERE",{"type":32,"tag":120,"props":412,"children":413},{"style":143},[414],{"type":37,"value":415}," email_normalized ",{"type":32,"tag":120,"props":417,"children":418},{"style":137},[419],{"type":37,"value":420},"IS NOT NULL\n",{"type":32,"tag":120,"props":422,"children":424},{"class":122,"line":423},17,[425,430,435,440,445],{"type":32,"tag":120,"props":426,"children":427},{"style":137},[428],{"type":37,"value":429},"  AND",{"type":32,"tag":120,"props":431,"children":432},{"style":137},[433],{"type":37,"value":434}," LENGTH",{"type":32,"tag":120,"props":436,"children":437},{"style":143},[438],{"type":37,"value":439},"(phone_normalized) ",{"type":32,"tag":120,"props":441,"children":442},{"style":137},[443],{"type":37,"value":444},">=",{"type":32,"tag":120,"props":446,"children":447},{"style":181},[448],{"type":37,"value":449}," 10\n",{"type":32,"tag":33,"props":451,"children":452},{},[453,455,461],{"type":37,"value":454},"This dbt model is parametrized, the pepper is stored in an environment variable, and downstream it's added to sGTM events in the ",{"type":32,"tag":57,"props":456,"children":458},{"className":457},[],[459],{"type":37,"value":460},"user_data",{"type":37,"value":462}," object. Without salt, the PII hash is reversible—pepper is mandatory in production.",{"type":32,"tag":40,"props":464,"children":466},{"id":465},"probabilistic-linking-fingerprint-and-behavioral-graph",[467],{"type":37,"value":468},"Probabilistic Linking: Fingerprint and Behavioral Graph",{"type":32,"tag":33,"props":470,"children":471},{},[472],{"type":37,"value":473},"When deterministic match (email\u002Fphone) is absent, probabilistic linking takes over. You cluster users using device fingerprint (User-Agent, IP, screen resolution, timezone), event sequence patterns, and session duration. If confidence scores drop below 60 percent, stop linking—false positives flow directly into your marketing budget.",{"type":32,"tag":33,"props":475,"children":476},{},[477],{"type":37,"value":478},"Example scenario: two different devices (iPhone Safari, MacBook Chrome) log into your e-commerce site from the same IP within 30 minutes, both browse the same product category, and drop at checkout. The probabilistic engine tags these two sessions as \"same household user\" with 78 percent confidence. If the iPhone user later completes purchase, confidence rises to 95 percent and they're merged in the identity graph.",{"type":32,"tag":33,"props":480,"children":481},{},[482],{"type":37,"value":483},"Solutions like LiveRamp IdentityLink and The Trade Desk Unified ID 2.0 use hybrid probabilistic + deterministic approaches. The UID2 framework combines email hash + bidstream signals to produce a score (UID2 spec 2025). If you're building your own probabilistic pipeline, experiment with DBscan or hierarchical clustering—but in production, interpretability is critical; rule-based scoring beats blackbox ML.",{"type":32,"tag":485,"props":486,"children":487},"table",{},[488,517],{"type":32,"tag":489,"props":490,"children":491},"thead",{},[492],{"type":32,"tag":493,"props":494,"children":495},"tr",{},[496,502,507,512],{"type":32,"tag":497,"props":498,"children":499},"th",{},[500],{"type":37,"value":501},"Signal Type",{"type":32,"tag":497,"props":503,"children":504},{},[505],{"type":37,"value":506},"Match Confidence",{"type":32,"tag":497,"props":508,"children":509},{},[510],{"type":37,"value":511},"Privacy Risk",{"type":32,"tag":497,"props":513,"children":514},{},[515],{"type":37,"value":516},"Use Case",{"type":32,"tag":518,"props":519,"children":520},"tbody",{},[521,545,568,591],{"type":32,"tag":493,"props":522,"children":523},{},[524,530,535,540],{"type":32,"tag":525,"props":526,"children":527},"td",{},[528],{"type":37,"value":529},"Email hash (SHA-256 + pepper)",{"type":32,"tag":525,"props":531,"children":532},{},[533],{"type":37,"value":534},"92–98%",{"type":32,"tag":525,"props":536,"children":537},{},[538],{"type":37,"value":539},"Low (consent required)",{"type":32,"tag":525,"props":541,"children":542},{},[543],{"type":37,"value":544},"Cross-device GA4, Meta CAPI",{"type":32,"tag":493,"props":546,"children":547},{},[548,553,558,563],{"type":32,"tag":525,"props":549,"children":550},{},[551],{"type":37,"value":552},"Phone hash (SHA-256 + pepper)",{"type":32,"tag":525,"props":554,"children":555},{},[556],{"type":37,"value":557},"88–94%",{"type":32,"tag":525,"props":559,"children":560},{},[561],{"type":37,"value":562},"Medium (explicit consent needed)",{"type":32,"tag":525,"props":564,"children":565},{},[566],{"type":37,"value":567},"CRM → ad platform sync",{"type":32,"tag":493,"props":569,"children":570},{},[571,576,581,586],{"type":32,"tag":525,"props":572,"children":573},{},[574],{"type":37,"value":575},"IP + User-Agent",{"type":32,"tag":525,"props":577,"children":578},{},[579],{"type":37,"value":580},"55–70%",{"type":32,"tag":525,"props":582,"children":583},{},[584],{"type":37,"value":585},"High (fingerprinting)",{"type":32,"tag":525,"props":587,"children":588},{},[589],{"type":37,"value":590},"Fraud detection, bot filtering",{"type":32,"tag":493,"props":592,"children":593},{},[594,599,604,609],{"type":32,"tag":525,"props":595,"children":596},{},[597],{"type":37,"value":598},"Behavioral sequence (event pattern)",{"type":32,"tag":525,"props":600,"children":601},{},[602],{"type":37,"value":603},"60–80%",{"type":32,"tag":525,"props":605,"children":606},{},[607],{"type":37,"value":608},"Low (anonymized)",{"type":32,"tag":525,"props":610,"children":611},{},[612],{"type":37,"value":613},"Session stitching, journey mapping",{"type":32,"tag":33,"props":615,"children":616},{},[617,619,628],{"type":37,"value":618},"If you run probabilistic linking in the ",{"type":32,"tag":620,"props":621,"children":625},"a",{"href":622,"rel":623},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fretention-engineering-cdp",[624],"nofollow",[626],{"type":37,"value":627},"CDP & Retention Engineering",{"type":37,"value":629}," layer, you can house an anonymized identity graph in your data lake—compliance with data protection regulations becomes straightforward.",{"type":32,"tag":40,"props":631,"children":633},{"id":632},"household-identity-location-based-identity-not-device-based",[634],{"type":37,"value":635},"Household Identity: Location-Based Identity, Not Device-Based",{"type":32,"tag":33,"props":637,"children":638},{},[639],{"type":37,"value":640},"Grouping all devices in a home (smart TV, tablet, phone, laptop) under a single household ID is critical—especially in FMCG, telecom, and fintech. You're not identifying a single user; you're defining a \"household unit\" with purchasing power.",{"type":32,"tag":33,"props":642,"children":643},{},[644],{"type":37,"value":645},"Google's PAIR (Publisher Advertiser Identity Reconciliation) protocol supports household graphs—devices on the same Wi-Fi network (IP + location + timezone match) are aggregated into an advertising signal. But PAIR is consent-dependent: if a user hasn't set \"ad_storage=granted\" in Consent Mode v2, no household ID is created.",{"type":32,"tag":33,"props":647,"children":648},{},[649],{"type":37,"value":650},"Practical example: a family subscribes to Netflix; mom and dad use separate profiles, kids watch cartoons on the TV. An OTT advertising platform (Roku, Samsung Ads) assigns all three profiles a single household ID and caps ad frequency at the household level, not the device level. Even if the same 30-second ad reaches 15 impressions across devices, the household sees it a maximum of 5 times per week.",{"type":32,"tag":103,"props":652,"children":654},{"id":653},"household-id-rule-based-pipeline-example",[655],{"type":37,"value":656},"Household ID Rule-Based Pipeline Example",{"type":32,"tag":110,"props":658,"children":660},{"className":112,"code":659,"language":114,"meta":16,"style":16},"-- dbt model: household_identity_graph.sql\nWITH device_sessions AS (\n  SELECT\n    device_id,\n    ip_address,\n    timezone,\n    CAST(TIMESTAMP_TRUNC(session_start, HOUR) AS STRING) AS session_hour,\n    user_agent\n  FROM {{ ref('raw_sessions') }}\n  WHERE session_start >= CURRENT_DATE() - 7\n),\nhousehold_candidates AS (\n  SELECT\n    ip_address,\n    timezone,\n    session_hour,\n    ARRAY_AGG(DISTINCT device_id) AS devices\n  FROM device_sessions\n  GROUP BY ip_address, timezone, session_hour\n  HAVING COUNT(DISTINCT device_id) > 1\n)\nSELECT\n  FARM_FINGERPRINT(CONCAT(ip_address, timezone)) AS household_id,\n  devices,\n  ARRAY_LENGTH(devices) AS device_count\nFROM household_candidates\n",[661],{"type":32,"tag":57,"props":662,"children":663},{"__ignoreMap":16},[664,672,692,699,707,715,723,763,771,791,823,831,847,854,861,868,876,903,916,930,966,974,982,1009,1018,1036],{"type":32,"tag":120,"props":665,"children":666},{"class":122,"line":123},[667],{"type":32,"tag":120,"props":668,"children":669},{"style":127},[670],{"type":37,"value":671},"-- dbt model: household_identity_graph.sql\n",{"type":32,"tag":120,"props":673,"children":674},{"class":122,"line":133},[675,679,684,688],{"type":32,"tag":120,"props":676,"children":677},{"style":137},[678],{"type":37,"value":140},{"type":32,"tag":120,"props":680,"children":681},{"style":143},[682],{"type":37,"value":683}," device_sessions ",{"type":32,"tag":120,"props":685,"children":686},{"style":137},[687],{"type":37,"value":151},{"type":32,"tag":120,"props":689,"children":690},{"style":143},[691],{"type":37,"value":156},{"type":32,"tag":120,"props":693,"children":694},{"class":122,"line":159},[695],{"type":32,"tag":120,"props":696,"children":697},{"style":137},[698],{"type":37,"value":165},{"type":32,"tag":120,"props":700,"children":701},{"class":122,"line":168},[702],{"type":32,"tag":120,"props":703,"children":704},{"style":143},[705],{"type":37,"value":706},"    device_id,\n",{"type":32,"tag":120,"props":708,"children":709},{"class":122,"line":177},[710],{"type":32,"tag":120,"props":711,"children":712},{"style":143},[713],{"type":37,"value":714},"    ip_address,\n",{"type":32,"tag":120,"props":716,"children":717},{"class":122,"line":211},[718],{"type":32,"tag":120,"props":719,"children":720},{"style":143},[721],{"type":37,"value":722},"    timezone,\n",{"type":32,"tag":120,"props":724,"children":725},{"class":122,"line":250},[726,731,736,741,745,749,754,758],{"type":32,"tag":120,"props":727,"children":728},{"style":181},[729],{"type":37,"value":730},"    CAST",{"type":32,"tag":120,"props":732,"children":733},{"style":143},[734],{"type":37,"value":735},"(TIMESTAMP_TRUNC(session_start, ",{"type":32,"tag":120,"props":737,"children":738},{"style":137},[739],{"type":37,"value":740},"HOUR",{"type":32,"tag":120,"props":742,"children":743},{"style":143},[744],{"type":37,"value":238},{"type":32,"tag":120,"props":746,"children":747},{"style":137},[748],{"type":37,"value":151},{"type":32,"tag":120,"props":750,"children":751},{"style":143},[752],{"type":37,"value":753}," STRING) ",{"type":32,"tag":120,"props":755,"children":756},{"style":137},[757],{"type":37,"value":151},{"type":32,"tag":120,"props":759,"children":760},{"style":143},[761],{"type":37,"value":762}," session_hour,\n",{"type":32,"tag":120,"props":764,"children":765},{"class":122,"line":26},[766],{"type":32,"tag":120,"props":767,"children":768},{"style":143},[769],{"type":37,"value":770},"    user_agent\n",{"type":32,"tag":120,"props":772,"children":773},{"class":122,"line":282},[774,778,782,787],{"type":32,"tag":120,"props":775,"children":776},{"style":137},[777],{"type":37,"value":264},{"type":32,"tag":120,"props":779,"children":780},{"style":143},[781],{"type":37,"value":269},{"type":32,"tag":120,"props":783,"children":784},{"style":220},[785],{"type":37,"value":786},"'raw_sessions'",{"type":32,"tag":120,"props":788,"children":789},{"style":143},[790],{"type":37,"value":279},{"type":32,"tag":120,"props":792,"children":793},{"class":122,"line":291},[794,799,804,808,813,818],{"type":32,"tag":120,"props":795,"children":796},{"style":137},[797],{"type":37,"value":798},"  WHERE",{"type":32,"tag":120,"props":800,"children":801},{"style":143},[802],{"type":37,"value":803}," session_start ",{"type":32,"tag":120,"props":805,"children":806},{"style":137},[807],{"type":37,"value":444},{"type":32,"tag":120,"props":809,"children":810},{"style":143},[811],{"type":37,"value":812}," CURRENT_DATE() ",{"type":32,"tag":120,"props":814,"children":815},{"style":137},[816],{"type":37,"value":817},"-",{"type":32,"tag":120,"props":819,"children":820},{"style":181},[821],{"type":37,"value":822}," 7\n",{"type":32,"tag":120,"props":824,"children":825},{"class":122,"line":300},[826],{"type":32,"tag":120,"props":827,"children":828},{"style":143},[829],{"type":37,"value":830},"),\n",{"type":32,"tag":120,"props":832,"children":833},{"class":122,"line":309},[834,839,843],{"type":32,"tag":120,"props":835,"children":836},{"style":143},[837],{"type":37,"value":838},"household_candidates ",{"type":32,"tag":120,"props":840,"children":841},{"style":137},[842],{"type":37,"value":151},{"type":32,"tag":120,"props":844,"children":845},{"style":143},[846],{"type":37,"value":156},{"type":32,"tag":120,"props":848,"children":849},{"class":122,"line":347},[850],{"type":32,"tag":120,"props":851,"children":852},{"style":137},[853],{"type":37,"value":165},{"type":32,"tag":120,"props":855,"children":856},{"class":122,"line":381},[857],{"type":32,"tag":120,"props":858,"children":859},{"style":143},[860],{"type":37,"value":714},{"type":32,"tag":120,"props":862,"children":863},{"class":122,"line":390},[864],{"type":32,"tag":120,"props":865,"children":866},{"style":143},[867],{"type":37,"value":722},{"type":32,"tag":120,"props":869,"children":870},{"class":122,"line":404},[871],{"type":32,"tag":120,"props":872,"children":873},{"style":143},[874],{"type":37,"value":875},"    session_hour,\n",{"type":32,"tag":120,"props":877,"children":878},{"class":122,"line":423},[879,884,889,894,898],{"type":32,"tag":120,"props":880,"children":881},{"style":143},[882],{"type":37,"value":883},"    ARRAY_AGG(",{"type":32,"tag":120,"props":885,"children":886},{"style":137},[887],{"type":37,"value":888},"DISTINCT",{"type":32,"tag":120,"props":890,"children":891},{"style":143},[892],{"type":37,"value":893}," device_id) ",{"type":32,"tag":120,"props":895,"children":896},{"style":137},[897],{"type":37,"value":151},{"type":32,"tag":120,"props":899,"children":900},{"style":143},[901],{"type":37,"value":902}," devices\n",{"type":32,"tag":120,"props":904,"children":906},{"class":122,"line":905},18,[907,911],{"type":32,"tag":120,"props":908,"children":909},{"style":137},[910],{"type":37,"value":264},{"type":32,"tag":120,"props":912,"children":913},{"style":143},[914],{"type":37,"value":915}," device_sessions\n",{"type":32,"tag":120,"props":917,"children":919},{"class":122,"line":918},19,[920,925],{"type":32,"tag":120,"props":921,"children":922},{"style":137},[923],{"type":37,"value":924},"  GROUP BY",{"type":32,"tag":120,"props":926,"children":927},{"style":143},[928],{"type":37,"value":929}," ip_address, timezone, session_hour\n",{"type":32,"tag":120,"props":931,"children":933},{"class":122,"line":932},20,[934,939,944,948,952,956,961],{"type":32,"tag":120,"props":935,"children":936},{"style":137},[937],{"type":37,"value":938},"  HAVING",{"type":32,"tag":120,"props":940,"children":941},{"style":181},[942],{"type":37,"value":943}," COUNT",{"type":32,"tag":120,"props":945,"children":946},{"style":143},[947],{"type":37,"value":189},{"type":32,"tag":120,"props":949,"children":950},{"style":137},[951],{"type":37,"value":888},{"type":32,"tag":120,"props":953,"children":954},{"style":143},[955],{"type":37,"value":893},{"type":32,"tag":120,"props":957,"children":958},{"style":137},[959],{"type":37,"value":960},">",{"type":32,"tag":120,"props":962,"children":963},{"style":181},[964],{"type":37,"value":965}," 1\n",{"type":32,"tag":120,"props":967,"children":969},{"class":122,"line":968},21,[970],{"type":32,"tag":120,"props":971,"children":972},{"style":143},[973],{"type":37,"value":288},{"type":32,"tag":120,"props":975,"children":977},{"class":122,"line":976},22,[978],{"type":32,"tag":120,"props":979,"children":980},{"style":137},[981],{"type":37,"value":297},{"type":32,"tag":120,"props":983,"children":985},{"class":122,"line":984},23,[986,991,995,1000,1004],{"type":32,"tag":120,"props":987,"children":988},{"style":143},[989],{"type":37,"value":990},"  FARM_FINGERPRINT(",{"type":32,"tag":120,"props":992,"children":993},{"style":181},[994],{"type":37,"value":320},{"type":32,"tag":120,"props":996,"children":997},{"style":143},[998],{"type":37,"value":999},"(ip_address, timezone)) ",{"type":32,"tag":120,"props":1001,"children":1002},{"style":137},[1003],{"type":37,"value":151},{"type":32,"tag":120,"props":1005,"children":1006},{"style":143},[1007],{"type":37,"value":1008}," household_id,\n",{"type":32,"tag":120,"props":1010,"children":1012},{"class":122,"line":1011},24,[1013],{"type":32,"tag":120,"props":1014,"children":1015},{"style":143},[1016],{"type":37,"value":1017},"  devices,\n",{"type":32,"tag":120,"props":1019,"children":1021},{"class":122,"line":1020},25,[1022,1027,1031],{"type":32,"tag":120,"props":1023,"children":1024},{"style":143},[1025],{"type":37,"value":1026},"  ARRAY_LENGTH(devices) ",{"type":32,"tag":120,"props":1028,"children":1029},{"style":137},[1030],{"type":37,"value":151},{"type":32,"tag":120,"props":1032,"children":1033},{"style":143},[1034],{"type":37,"value":1035}," device_count\n",{"type":32,"tag":120,"props":1037,"children":1039},{"class":122,"line":1038},26,[1040,1044],{"type":32,"tag":120,"props":1041,"children":1042},{"style":137},[1043],{"type":37,"value":396},{"type":32,"tag":120,"props":1045,"children":1046},{"style":143},[1047],{"type":37,"value":1048}," household_candidates\n",{"type":32,"tag":33,"props":1050,"children":1051},{},[1052,1054,1060,1062,1068],{"type":37,"value":1053},"This model groups devices from the same IP + timezone pair within a 1-hour time window. In production, replace ",{"type":32,"tag":57,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":37,"value":1059},"session_hour",{"type":37,"value":1061}," with a 4-hour window (higher probability devices in a home are active simultaneously). For fraud protection, filter out households where ",{"type":32,"tag":57,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":37,"value":1067},"device_count",{"type":37,"value":1069}," > 10.",{"type":32,"tag":40,"props":1071,"children":1073},{"id":1072},"identity-graph-synchronization-from-data-lake-to-ad-platform",[1074],{"type":37,"value":1075},"Identity Graph Synchronization: From Data Lake to Ad Platform",{"type":32,"tag":33,"props":1077,"children":1078},{},[1079],{"type":37,"value":1080},"You maintain the identity graph from hash matching and probabilistic linking in BigQuery, but Google Ads, Meta, Klaviyo, and other platforms run their own identity systems. Without a sync layer, identity resolution remains dead data.",{"type":32,"tag":33,"props":1082,"children":1083},{},[1084,1086,1092],{"type":37,"value":1085},"Orchestration flow: every night at 02:00, an Airflow DAG runs, pulls records updated in the last 7 days from BigQuery's ",{"type":32,"tag":57,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":37,"value":1091},"identity_graph",{"type":37,"value":1093}," table, POSTs email hashes to Google Ads Customer Match API and phone hashes to Meta Conversions API. Rate-limit handling is mandatory—Google Customer Match accepts 500K rows daily, Meta CAPI 1M events daily (2025 standard tier).",{"type":32,"tag":33,"props":1095,"children":1096},{},[1097,1099,1106],{"type":37,"value":1098},"Google Ads Customer Match requires a minimum of 1,000 matched users (audience threshold). When you upload email hashes, Google compares them against its graph; match rates typically land between 40–70 percent (quality of provided emails matters). Unmatched hashes don't enter the system—this is why data quality in your ",{"type":32,"tag":620,"props":1100,"children":1103},{"href":1101,"rel":1102},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Ffirstparty",[624],[1104],{"type":37,"value":1105},"First-Party Data & Measurement Architecture",{"type":37,"value":1107}," layer must be guaranteed upstream.",{"type":32,"tag":33,"props":1109,"children":1110},{},[1111,1113,1119,1121,1127,1129,1134,1136,1142],{"type":37,"value":1112},"In Meta Conversions API, beyond hash matching you can also send ",{"type":32,"tag":57,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":37,"value":1118},"fbc",{"type":37,"value":1120}," (Facebook Click ID) and ",{"type":32,"tag":57,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":37,"value":1126},"fbp",{"type":37,"value":1128}," (Facebook Browser ID) cookies. If a user clicked a Meta ad and landed on your site, the ",{"type":32,"tag":57,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":37,"value":1118},{"type":37,"value":1135}," parameter is in the URL (",{"type":32,"tag":57,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":37,"value":1141},"fbclid=",{"type":37,"value":1143},"); capture this server-side and include it in your CAPI event—attribution window extends to 28 days and match rates lift 18–25 percent (Meta 2025 internal benchmark).",{"type":32,"tag":40,"props":1145,"children":1147},{"id":1146},"privacy-compliance-identity-resolutions-boundaries",[1148],{"type":37,"value":1149},"Privacy + Compliance: Identity Resolution's Boundaries",{"type":32,"tag":33,"props":1151,"children":1152},{},[1153],{"type":37,"value":1154},"If you build identity resolution without GDPR, CCPA, and other privacy law compliance, your data pipeline carries legal risk. The core rule: you cannot hash user data without explicit consent (GDPR Article 6). Integration with a Consent Management Platform (OneTrust, Cookiebot) is non-negotiable.",{"type":32,"tag":33,"props":1156,"children":1157},{},[1158,1160,1166,1168,1174,1176,1182],{"type":37,"value":1159},"In Consent Mode v2, if a user sets \"ad_storage=denied\", you have no permission to send PII to Google or hash it. In your server-side GTM, listen for the ",{"type":32,"tag":57,"props":1161,"children":1163},{"className":1162},[],[1164],{"type":37,"value":1165},"consent",{"type":37,"value":1167}," event; do not invoke ",{"type":32,"tag":57,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":37,"value":1173},"sha256()",{"type":37,"value":1175}," until consent is granted. The same rule applies to Meta CAPI—set the ",{"type":32,"tag":57,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":37,"value":1181},"data_processing_options",{"type":37,"value":1183}," parameter to \"LDU\" (Limited Data Use) mode.",{"type":32,"tag":33,"props":1185,"children":1186},{},[1187,1189,1195],{"type":37,"value":1188},"Under CCPA, when a \"Do Not Sell\" signal arrives, remove the user from your identity graph and delete their hashed PII from platform APIs. Google Customer Match and Meta Custom Audience both offer deletion APIs—they remove the hash from their systems within 48 hours (CCPA compliance SLA). Maintain a ",{"type":32,"tag":57,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":37,"value":1194},"user_deletion_requests",{"type":37,"value":1196}," table in BigQuery; every night, clean your identity graph against it.",{"type":32,"tag":40,"props":1198,"children":1200},{"id":1199},"observability-debugging-identity-resolution",[1201],{"type":37,"value":1202},"Observability: Debugging Identity Resolution",{"type":32,"tag":33,"props":1204,"children":1205},{},[1206],{"type":37,"value":1207},"Once identity graph enters production, the biggest challenge becomes answering \"why didn't these two devices merge?\" Without monitoring, you cannot debug.",{"type":32,"tag":33,"props":1209,"children":1210},{},[1211,1213,1219,1221,1227],{"type":37,"value":1212},"Create an ",{"type":32,"tag":57,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":37,"value":1218},"identity_resolution_log",{"type":37,"value":1220}," table in BigQuery that records metadata for every merge operation: which signals were used (email_hash, phone_hash, ip_fingerprint), what was the confidence score, when was it merged, which downstream platform received it. Use dbt tests to control data quality—for example, alert if a single ",{"type":32,"tag":57,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":37,"value":1226},"household_id",{"type":37,"value":1228}," contains more than 50 devices (bot traffic or proxy server).",{"type":32,"tag":33,"props":1230,"children":1231},{},[1232],{"type":37,"value":1233},"In Google Analytics 4, open the User-ID report and watch the cross-device user count. If your identity resolution pipeline is working, \"users (cross-device)\" should be 15–30 percent lower than \"total users\" (true user count is less than device count). If this gap isn't closing, there's a data leak in hash matching or probabilistic linking—check consent events or hash pepper.",{"type":32,"tag":1235,"props":1236,"children":1237},"hr",{},[],{"type":32,"tag":33,"props":1239,"children":1240},{},[1241,1243,1248],{"type":37,"value":1242},"Build identity resolution not as a one-time project but as a continuously optimized data pipeline. Combine hash matching + probabilistic linking + household identity to stitch fragmented signals, but design compliance into the foundation—otherwise your data lake becomes a liability. First step: create an ",{"type":32,"tag":57,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":37,"value":1091},{"type":37,"value":1249}," table in BigQuery, build your hash pipeline in dbt, sync to Google Ads Customer Match with Airflow. Next step: tighten your confidence score threshold to 70 percent, measure false positive rate, then expand to Meta and Klaviyo. Without identity resolution, 22–35 percent of your marketing spend leaks into misattribution (Forrester 2025)—build the graph now to claw it back.",{"type":32,"tag":1251,"props":1252,"children":1253},"style",{},[1254],{"type":37,"value":1255},"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":159,"depth":159,"links":1257},[1258,1261,1262,1265,1266,1267],{"id":42,"depth":133,"text":45,"children":1259},[1260],{"id":105,"depth":159,"text":108},{"id":465,"depth":133,"text":468},{"id":632,"depth":133,"text":635,"children":1263},[1264],{"id":653,"depth":159,"text":656},{"id":1072,"depth":133,"text":1075},{"id":1146,"depth":133,"text":1149},{"id":1199,"depth":133,"text":1202},"markdown","content:en:data:identity-resolution-six-signals-unified-customer-id.md","content","en\u002Fdata\u002Fidentity-resolution-six-signals-unified-customer-id.md","en\u002Fdata\u002Fidentity-resolution-six-signals-unified-customer-id","md",1785967475210]