[{"data":1,"prerenderedAt":2312},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fru\u002Fdata\u002Frazreshenie-identichnosti-6-signalov-v-yedin-profil":12},{"i18nKey":4,"paths":5},"data-003-2026-07",{"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-unifying-6-signals-into-single-customer-identity","\u002Fes\u002Fdata\u002Fresolucion-identidad-seis-senales-un-perfil","\u002Ffr\u002Fdata\u002Fresolution-identite-6-signaux-vers-profil-client-unique","\u002Fit\u002Fdata\u002Frisoluzione-identita-sei-segnali-a-profilo-cliente-unico","\u002Fru\u002Fdata\u002Frazreshenie-identichnosti-6-signalov-v-yedin-profil",{"_path":11,"_dir":13,"_draft":14,"_partial":14,"_locale":15,"title":16,"description":17,"publishedAt":18,"modifiedAt":18,"category":13,"i18nKey":4,"tags":19,"readingTime":25,"author":26,"body":27,"_type":2306,"_id":2307,"_source":2308,"_file":2309,"_stem":2310,"_extension":2311},"data",false,"","Разрешение идентичности: 6 сигналов в единый профиль клиента","Как объединить рассеянные touchpoint'ы в единую идентичность через hash matching, probabilistic linking и household identity? Server-side pipeline и практическая схема.","2026-07-19",[20,21,22,23,24],"identity-resolution","hash-matching","probabilistic-linking","cdp","first-party-data",9,"Roibase",{"type":28,"children":29,"toc":2292},"root",[30,62,69,115,120,139,145,158,170,338,391,403,498,511,518,549,555,567,572,1039,1059,1084,1090,1095,1101,1106,1247,1260,1569,1581,1934,1946,1952,1964,1998,2009,2090,2103,2109,2122,2151,2156,2162,2199,2254,2281,2286],{"type":31,"tag":32,"props":33,"children":34},"element","p",{},[35,38,45,47,53,54,60],{"type":36,"value":37},"text","Пользователь кликает на кампанию со смартфона, добавляет товар в корзину с десктопа, совершает покупку в магазине. Три события — три разные идентичности: ",{"type":31,"tag":39,"props":40,"children":42},"code",{"className":41},[],[43],{"type":36,"value":44},"device_id",{"type":36,"value":46},", ",{"type":31,"tag":39,"props":48,"children":50},{"className":49},[],[51],{"type":36,"value":52},"cookie_hash",{"type":36,"value":46},{"type":31,"tag":39,"props":55,"children":57},{"className":56},[],[58],{"type":36,"value":59},"email_hash",{"type":36,"value":61},". Identity resolution — это data pipeline, который объединяет эти фрагменты в один профиль клиента. В постпеченьевскую эпоху (Consent Mode v2, iOS ATT, CCPA) server-side идентификация на базе first-party данных — это уже не рекомендация, а необходимость.",{"type":31,"tag":63,"props":64,"children":66},"h2",{"id":65},"почему-6-разных-сигналов",[67],{"type":36,"value":68},"Почему 6 разных сигналов",{"type":31,"tag":32,"props":70,"children":71},{},[72,74,80,81,86,88,93,95,100,102,107,108,113],{"type":36,"value":73},"Современный маркетинг-стек собирает сигналы идентичности в шести слоях: ",{"type":31,"tag":75,"props":76,"children":77},"strong",{},[78],{"type":36,"value":79},"браузерная кука",{"type":36,"value":46},{"type":31,"tag":75,"props":82,"children":83},{},[84],{"type":36,"value":85},"ID устройства",{"type":36,"value":87}," (IDFA\u002FGAID), ",{"type":31,"tag":75,"props":89,"children":90},{},[91],{"type":36,"value":92},"аутентифицированный хеш",{"type":36,"value":94}," (email SHA-256), ",{"type":31,"tag":75,"props":96,"children":97},{},[98],{"type":36,"value":99},"ID клиента",{"type":36,"value":101}," (CRM\u002FCDP внутренний), ",{"type":31,"tag":75,"props":103,"children":104},{},[105],{"type":36,"value":106},"отпечаток IP+user-agent",{"type":36,"value":46},{"type":31,"tag":75,"props":109,"children":110},{},[111],{"type":36,"value":112},"household graph",{"type":36,"value":114},". Каждый включается на разных этапах жизненного цикла пользователя.",{"type":31,"tag":32,"props":116,"children":117},{},[118],{"type":36,"value":119},"Браузерная кука появляется при первом touchpoint'е; ID устройства — в мобильном приложении; аутентифицированный хеш — когда собирают email или номер телефона; ID клиента — после checkout'а; отпечаток — для вероятностного сопоставления без консента; household graph — для группировки устройств с одного маршрутизатора. Проблема: эти шесть сигналов хранятся в разных таблицах с разными TTL'ями (кука — 90 дней, IDFA — бесконечно, email хеш — до удаления клиента). Без разрешения каждый канал считает отдельного пользователя — в marketing mix model'и возникает двойной счёт, в incrementality тестах переоценка, в retention когортах искусственно низкая retention.",{"type":31,"tag":32,"props":121,"children":122},{},[123,125,130,132,137],{"type":36,"value":124},"Логику разрешения строят двумя методами: ",{"type":31,"tag":75,"props":126,"children":127},{},[128],{"type":36,"value":129},"детерминистический (hash matching)",{"type":36,"value":131}," и ",{"type":31,"tag":75,"props":133,"children":134},{},[135],{"type":36,"value":136},"вероятностный (graph linking)",{"type":36,"value":138},". Детерминистический: хеш SHA-256 email'а связывает браузерное событие с backend транзакцией — 100% уверенность. Вероятностный: одинаковые IP+user-agent за 24 часа в двух событиях → 73% вероятность, что это один пользователь (пример threshold). Без разрешения идентичности число unique users раздувается на 40-80% (в зависимости от категории и микса девайсов).",{"type":31,"tag":63,"props":140,"children":142},{"id":141},"hash-matching-превращаем-email-и-номер-в-identity-key",[143],{"type":36,"value":144},"Hash matching: превращаем email и номер в identity key",{"type":31,"tag":32,"props":146,"children":147},{},[148,150,156],{"type":36,"value":149},"Hash matching — позвоночник server-side идентификации. Когда пользователь вводит email или телефон, client-side или sGTM создаёт SHA-256 хеш, который пишется в таблицу ",{"type":31,"tag":39,"props":151,"children":153},{"className":152},[],[154],{"type":36,"value":155},"identity_map",{"type":36,"value":157},". При следующих анонимных событиях вы можешь найти хеш по куке или ID устройства.",{"type":31,"tag":32,"props":159,"children":160},{},[161,163,168],{"type":36,"value":162},"Базовая схема ",{"type":31,"tag":39,"props":164,"children":166},{"className":165},[],[167],{"type":36,"value":155},{"type":36,"value":169},":",{"type":31,"tag":171,"props":172,"children":176},"pre",{"className":173,"code":174,"language":175,"meta":15,"style":15},"language-sql shiki shiki-themes github-dark","CREATE TABLE identity_map (\n  canonical_id STRING NOT NULL,      -- UUID, внутренний ID\n  signal_type STRING NOT NULL,       -- 'email_sha256', 'phone_sha256', 'device_id', 'cookie'\n  signal_value STRING NOT NULL,      -- хеш или ID\n  first_seen TIMESTAMP,\n  last_seen TIMESTAMP,\n  PRIMARY KEY (signal_type, signal_value)\n);\n","sql",[177],{"type":31,"tag":39,"props":178,"children":179},{"__ignoreMap":15},[180,209,234,257,279,298,315,329],{"type":31,"tag":181,"props":182,"children":185},"span",{"class":183,"line":184},"line",1,[186,192,197,203],{"type":31,"tag":181,"props":187,"children":189},{"style":188},"--shiki-default:#F97583",[190],{"type":36,"value":191},"CREATE",{"type":31,"tag":181,"props":193,"children":194},{"style":188},[195],{"type":36,"value":196}," TABLE",{"type":31,"tag":181,"props":198,"children":200},{"style":199},"--shiki-default:#B392F0",[201],{"type":36,"value":202}," identity_map",{"type":31,"tag":181,"props":204,"children":206},{"style":205},"--shiki-default:#E1E4E8",[207],{"type":36,"value":208}," (\n",{"type":31,"tag":181,"props":210,"children":212},{"class":183,"line":211},2,[213,218,223,228],{"type":31,"tag":181,"props":214,"children":215},{"style":205},[216],{"type":36,"value":217},"  canonical_id STRING ",{"type":31,"tag":181,"props":219,"children":220},{"style":188},[221],{"type":36,"value":222},"NOT NULL",{"type":31,"tag":181,"props":224,"children":225},{"style":205},[226],{"type":36,"value":227},",      ",{"type":31,"tag":181,"props":229,"children":231},{"style":230},"--shiki-default:#6A737D",[232],{"type":36,"value":233},"-- UUID, внутренний ID\n",{"type":31,"tag":181,"props":235,"children":237},{"class":183,"line":236},3,[238,243,247,252],{"type":31,"tag":181,"props":239,"children":240},{"style":205},[241],{"type":36,"value":242},"  signal_type STRING ",{"type":31,"tag":181,"props":244,"children":245},{"style":188},[246],{"type":36,"value":222},{"type":31,"tag":181,"props":248,"children":249},{"style":205},[250],{"type":36,"value":251},",       ",{"type":31,"tag":181,"props":253,"children":254},{"style":230},[255],{"type":36,"value":256},"-- 'email_sha256', 'phone_sha256', 'device_id', 'cookie'\n",{"type":31,"tag":181,"props":258,"children":260},{"class":183,"line":259},4,[261,266,270,274],{"type":31,"tag":181,"props":262,"children":263},{"style":205},[264],{"type":36,"value":265},"  signal_value STRING ",{"type":31,"tag":181,"props":267,"children":268},{"style":188},[269],{"type":36,"value":222},{"type":31,"tag":181,"props":271,"children":272},{"style":205},[273],{"type":36,"value":227},{"type":31,"tag":181,"props":275,"children":276},{"style":230},[277],{"type":36,"value":278},"-- хеш или ID\n",{"type":31,"tag":181,"props":280,"children":282},{"class":183,"line":281},5,[283,288,293],{"type":31,"tag":181,"props":284,"children":285},{"style":205},[286],{"type":36,"value":287},"  first_seen ",{"type":31,"tag":181,"props":289,"children":290},{"style":188},[291],{"type":36,"value":292},"TIMESTAMP",{"type":31,"tag":181,"props":294,"children":295},{"style":205},[296],{"type":36,"value":297},",\n",{"type":31,"tag":181,"props":299,"children":301},{"class":183,"line":300},6,[302,307,311],{"type":31,"tag":181,"props":303,"children":304},{"style":205},[305],{"type":36,"value":306},"  last_seen ",{"type":31,"tag":181,"props":308,"children":309},{"style":188},[310],{"type":36,"value":292},{"type":31,"tag":181,"props":312,"children":313},{"style":205},[314],{"type":36,"value":297},{"type":31,"tag":181,"props":316,"children":318},{"class":183,"line":317},7,[319,324],{"type":31,"tag":181,"props":320,"children":321},{"style":188},[322],{"type":36,"value":323},"  PRIMARY KEY",{"type":31,"tag":181,"props":325,"children":326},{"style":205},[327],{"type":36,"value":328}," (signal_type, signal_value)\n",{"type":31,"tag":181,"props":330,"children":332},{"class":183,"line":331},8,[333],{"type":31,"tag":181,"props":334,"children":335},{"style":205},[336],{"type":36,"value":337},");\n",{"type":31,"tag":32,"props":339,"children":340},{},[341,343,349,351,357,359,365,367,373,375,381,383,389],{"type":36,"value":342},"Пользователь вводит ",{"type":31,"tag":39,"props":344,"children":346},{"className":345},[],[347],{"type":36,"value":348},"user@example.com",{"type":36,"value":350}," в форму регистрации — sGTM хеширует этот email SHA-256 и выполняет ",{"type":31,"tag":39,"props":352,"children":354},{"className":353},[],[355],{"type":36,"value":356},"INSERT",{"type":36,"value":358},": ",{"type":31,"tag":39,"props":360,"children":362},{"className":361},[],[363],{"type":36,"value":364},"('uuid-123', 'email_sha256', 'abc123...', NOW(), NOW())",{"type":36,"value":366},". На той же сессии есть кука ",{"type":31,"tag":39,"props":368,"children":370},{"className":369},[],[371],{"type":36,"value":372},"_ga=GA1.1.xyz",{"type":36,"value":374}," — вторая строка: ",{"type":31,"tag":39,"props":376,"children":378},{"className":377},[],[379],{"type":36,"value":380},"('uuid-123', 'cookie', 'GA1.1.xyz', NOW(), NOW())",{"type":36,"value":382},". Теперь под ",{"type":31,"tag":39,"props":384,"children":386},{"className":385},[],[387],{"type":36,"value":388},"canonical_id = uuid-123",{"type":36,"value":390}," два сигнала объединены.",{"type":31,"tag":32,"props":392,"children":393},{},[394,396,401],{"type":36,"value":395},"На следующей сессии пользователь приходит с ",{"type":31,"tag":39,"props":397,"children":399},{"className":398},[],[400],{"type":36,"value":372},{"type":36,"value":402},", но email не вводит. Запрос в BigQuery:",{"type":31,"tag":171,"props":404,"children":406},{"className":173,"code":405,"language":175,"meta":15,"style":15},"SELECT canonical_id\nFROM identity_map\nWHERE signal_type = 'cookie' AND signal_value = 'GA1.1.xyz'\nLIMIT 1;\n",[407],{"type":31,"tag":39,"props":408,"children":409},{"__ignoreMap":15},[410,423,436,479],{"type":31,"tag":181,"props":411,"children":412},{"class":183,"line":184},[413,418],{"type":31,"tag":181,"props":414,"children":415},{"style":188},[416],{"type":36,"value":417},"SELECT",{"type":31,"tag":181,"props":419,"children":420},{"style":205},[421],{"type":36,"value":422}," canonical_id\n",{"type":31,"tag":181,"props":424,"children":425},{"class":183,"line":211},[426,431],{"type":31,"tag":181,"props":427,"children":428},{"style":188},[429],{"type":36,"value":430},"FROM",{"type":31,"tag":181,"props":432,"children":433},{"style":205},[434],{"type":36,"value":435}," identity_map\n",{"type":31,"tag":181,"props":437,"children":438},{"class":183,"line":236},[439,444,449,454,460,465,470,474],{"type":31,"tag":181,"props":440,"children":441},{"style":188},[442],{"type":36,"value":443},"WHERE",{"type":31,"tag":181,"props":445,"children":446},{"style":205},[447],{"type":36,"value":448}," signal_type ",{"type":31,"tag":181,"props":450,"children":451},{"style":188},[452],{"type":36,"value":453},"=",{"type":31,"tag":181,"props":455,"children":457},{"style":456},"--shiki-default:#9ECBFF",[458],{"type":36,"value":459}," 'cookie'",{"type":31,"tag":181,"props":461,"children":462},{"style":188},[463],{"type":36,"value":464}," AND",{"type":31,"tag":181,"props":466,"children":467},{"style":205},[468],{"type":36,"value":469}," signal_value ",{"type":31,"tag":181,"props":471,"children":472},{"style":188},[473],{"type":36,"value":453},{"type":31,"tag":181,"props":475,"children":476},{"style":456},[477],{"type":36,"value":478}," 'GA1.1.xyz'\n",{"type":31,"tag":181,"props":480,"children":481},{"class":183,"line":259},[482,487,493],{"type":31,"tag":181,"props":483,"children":484},{"style":188},[485],{"type":36,"value":486},"LIMIT",{"type":31,"tag":181,"props":488,"children":490},{"style":489},"--shiki-default:#79B8FF",[491],{"type":36,"value":492}," 1",{"type":31,"tag":181,"props":494,"children":495},{"style":205},[496],{"type":36,"value":497},";\n",{"type":31,"tag":32,"props":499,"children":500},{},[501,503,509],{"type":36,"value":502},"Возвращает: ",{"type":31,"tag":39,"props":504,"children":506},{"className":505},[],[507],{"type":36,"value":508},"uuid-123",{"type":36,"value":510},". События привязываются к этому ID — пользователь опознан даже без email хеша. Hash matching на 100% точен, потому что кол-лизия хешей криптографически невозможна. Но есть проблема покрытия: если пользователь email не вводил — хеша нет, переходите на вероятностный метод.",{"type":31,"tag":512,"props":513,"children":515},"h3",{"id":514},"риск-коллизий-и-salt",[516],{"type":36,"value":517},"Риск коллизий и salt",{"type":31,"tag":32,"props":519,"children":520},{},[521,523,528,530,536,538,547],{"type":36,"value":522},"Риск SHA-256 коллизии теоретический: 1 на 2^128 попыток. В production главная проблема — ",{"type":31,"tag":75,"props":524,"children":525},{},[526],{"type":36,"value":527},"один email может быть привязан к разным canonical_id'ам",{"type":36,"value":529}," (ручная ошибка, остатки старой миграции). Поэтому вы ставите ",{"type":31,"tag":39,"props":531,"children":533},{"className":532},[],[534],{"type":36,"value":535},"UNIQUE INDEX (signal_type, signal_value)",{"type":36,"value":537},". Salt (email + секретная строка, потом хеш) не повышает риск коллизии, но в архитектуре ",{"type":31,"tag":539,"props":540,"children":544},"a",{"href":541,"rel":542},"https:\u002F\u002Fwww.roibase.com.tr\u002Fru\u002Ffirstparty",[543],"nofollow",[545],{"type":36,"value":546},"first-party данных",{"type":36,"value":548}," добавляет privacy слой — при ротации salt'а старые хеши становятся невалидными, что полезно для GDPR \"right to be forgotten\".",{"type":31,"tag":63,"props":550,"children":552},{"id":551},"probabilistic-linking-ip-user-agent-и-device-graph",[553],{"type":36,"value":554},"Probabilistic linking: IP, user-agent и device graph",{"type":31,"tag":32,"props":556,"children":557},{},[558,560,565],{"type":36,"value":559},"Пользователь сёрфит в инкогнито — детерминистичных сигналов нет. Тогда включаете ",{"type":31,"tag":75,"props":561,"children":562},{},[563],{"type":36,"value":564},"вероятностный граф",{"type":36,"value":566},": IP + user-agent + proximity timestamps создают оценку \"скорее всего одно лицо\". Пример: один IP, одинаковый user-agent, события с разницей в 15 минут — это 85% вероятность того же пользователя.",{"type":31,"tag":32,"props":568,"children":569},{},[570],{"type":36,"value":571},"Простая вероятностная логика слияния:",{"type":31,"tag":171,"props":573,"children":575},{"className":173,"code":574,"language":175,"meta":15,"style":15},"WITH anon_events AS (\n  SELECT\n    event_id,\n    ip_address,\n    user_agent,\n    event_timestamp,\n    FARM_FINGERPRINT(CONCAT(ip_address, user_agent)) AS fingerprint\n  FROM events\n  WHERE canonical_id IS NULL\n),\nclusters AS (\n  SELECT\n    fingerprint,\n    MIN(event_timestamp) AS first_event,\n    MAX(event_timestamp) AS last_event,\n    COUNT(*) AS event_count\n  FROM anon_events\n  GROUP BY fingerprint\n  HAVING TIMESTAMP_DIFF(MAX(event_timestamp), MIN(event_timestamp), HOUR) \u003C 24\n)\nSELECT\n  a.event_id,\n  c.fingerprint AS probable_cluster_id\nFROM anon_events a\nJOIN clusters c ON a.fingerprint = c.fingerprint;\n",[576],{"type":31,"tag":39,"props":577,"children":578},{"__ignoreMap":15},[579,601,609,617,625,633,641,668,681,704,713,730,738,747,770,792,825,838,851,903,912,921,944,972,985],{"type":31,"tag":181,"props":580,"children":581},{"class":183,"line":184},[582,587,592,597],{"type":31,"tag":181,"props":583,"children":584},{"style":188},[585],{"type":36,"value":586},"WITH",{"type":31,"tag":181,"props":588,"children":589},{"style":205},[590],{"type":36,"value":591}," anon_events ",{"type":31,"tag":181,"props":593,"children":594},{"style":188},[595],{"type":36,"value":596},"AS",{"type":31,"tag":181,"props":598,"children":599},{"style":205},[600],{"type":36,"value":208},{"type":31,"tag":181,"props":602,"children":603},{"class":183,"line":211},[604],{"type":31,"tag":181,"props":605,"children":606},{"style":188},[607],{"type":36,"value":608},"  SELECT\n",{"type":31,"tag":181,"props":610,"children":611},{"class":183,"line":236},[612],{"type":31,"tag":181,"props":613,"children":614},{"style":205},[615],{"type":36,"value":616},"    event_id,\n",{"type":31,"tag":181,"props":618,"children":619},{"class":183,"line":259},[620],{"type":31,"tag":181,"props":621,"children":622},{"style":205},[623],{"type":36,"value":624},"    ip_address,\n",{"type":31,"tag":181,"props":626,"children":627},{"class":183,"line":281},[628],{"type":31,"tag":181,"props":629,"children":630},{"style":205},[631],{"type":36,"value":632},"    user_agent,\n",{"type":31,"tag":181,"props":634,"children":635},{"class":183,"line":300},[636],{"type":31,"tag":181,"props":637,"children":638},{"style":205},[639],{"type":36,"value":640},"    event_timestamp,\n",{"type":31,"tag":181,"props":642,"children":643},{"class":183,"line":317},[644,649,654,659,663],{"type":31,"tag":181,"props":645,"children":646},{"style":205},[647],{"type":36,"value":648},"    FARM_FINGERPRINT(",{"type":31,"tag":181,"props":650,"children":651},{"style":489},[652],{"type":36,"value":653},"CONCAT",{"type":31,"tag":181,"props":655,"children":656},{"style":205},[657],{"type":36,"value":658},"(ip_address, user_agent)) ",{"type":31,"tag":181,"props":660,"children":661},{"style":188},[662],{"type":36,"value":596},{"type":31,"tag":181,"props":664,"children":665},{"style":205},[666],{"type":36,"value":667}," fingerprint\n",{"type":31,"tag":181,"props":669,"children":670},{"class":183,"line":331},[671,676],{"type":31,"tag":181,"props":672,"children":673},{"style":188},[674],{"type":36,"value":675},"  FROM",{"type":31,"tag":181,"props":677,"children":678},{"style":205},[679],{"type":36,"value":680}," events\n",{"type":31,"tag":181,"props":682,"children":683},{"class":183,"line":25},[684,689,694,699],{"type":31,"tag":181,"props":685,"children":686},{"style":188},[687],{"type":36,"value":688},"  WHERE",{"type":31,"tag":181,"props":690,"children":691},{"style":205},[692],{"type":36,"value":693}," canonical_id ",{"type":31,"tag":181,"props":695,"children":696},{"style":188},[697],{"type":36,"value":698},"IS",{"type":31,"tag":181,"props":700,"children":701},{"style":188},[702],{"type":36,"value":703}," NULL\n",{"type":31,"tag":181,"props":705,"children":707},{"class":183,"line":706},10,[708],{"type":31,"tag":181,"props":709,"children":710},{"style":205},[711],{"type":36,"value":712},"),\n",{"type":31,"tag":181,"props":714,"children":716},{"class":183,"line":715},11,[717,722,726],{"type":31,"tag":181,"props":718,"children":719},{"style":205},[720],{"type":36,"value":721},"clusters ",{"type":31,"tag":181,"props":723,"children":724},{"style":188},[725],{"type":36,"value":596},{"type":31,"tag":181,"props":727,"children":728},{"style":205},[729],{"type":36,"value":208},{"type":31,"tag":181,"props":731,"children":733},{"class":183,"line":732},12,[734],{"type":31,"tag":181,"props":735,"children":736},{"style":188},[737],{"type":36,"value":608},{"type":31,"tag":181,"props":739,"children":741},{"class":183,"line":740},13,[742],{"type":31,"tag":181,"props":743,"children":744},{"style":205},[745],{"type":36,"value":746},"    fingerprint,\n",{"type":31,"tag":181,"props":748,"children":750},{"class":183,"line":749},14,[751,756,761,765],{"type":31,"tag":181,"props":752,"children":753},{"style":489},[754],{"type":36,"value":755},"    MIN",{"type":31,"tag":181,"props":757,"children":758},{"style":205},[759],{"type":36,"value":760},"(event_timestamp) ",{"type":31,"tag":181,"props":762,"children":763},{"style":188},[764],{"type":36,"value":596},{"type":31,"tag":181,"props":766,"children":767},{"style":205},[768],{"type":36,"value":769}," first_event,\n",{"type":31,"tag":181,"props":771,"children":773},{"class":183,"line":772},15,[774,779,783,787],{"type":31,"tag":181,"props":775,"children":776},{"style":489},[777],{"type":36,"value":778},"    MAX",{"type":31,"tag":181,"props":780,"children":781},{"style":205},[782],{"type":36,"value":760},{"type":31,"tag":181,"props":784,"children":785},{"style":188},[786],{"type":36,"value":596},{"type":31,"tag":181,"props":788,"children":789},{"style":205},[790],{"type":36,"value":791}," last_event,\n",{"type":31,"tag":181,"props":793,"children":795},{"class":183,"line":794},16,[796,801,806,811,816,820],{"type":31,"tag":181,"props":797,"children":798},{"style":489},[799],{"type":36,"value":800},"    COUNT",{"type":31,"tag":181,"props":802,"children":803},{"style":205},[804],{"type":36,"value":805},"(",{"type":31,"tag":181,"props":807,"children":808},{"style":188},[809],{"type":36,"value":810},"*",{"type":31,"tag":181,"props":812,"children":813},{"style":205},[814],{"type":36,"value":815},") ",{"type":31,"tag":181,"props":817,"children":818},{"style":188},[819],{"type":36,"value":596},{"type":31,"tag":181,"props":821,"children":822},{"style":205},[823],{"type":36,"value":824}," event_count\n",{"type":31,"tag":181,"props":826,"children":828},{"class":183,"line":827},17,[829,833],{"type":31,"tag":181,"props":830,"children":831},{"style":188},[832],{"type":36,"value":675},{"type":31,"tag":181,"props":834,"children":835},{"style":205},[836],{"type":36,"value":837}," anon_events\n",{"type":31,"tag":181,"props":839,"children":841},{"class":183,"line":840},18,[842,847],{"type":31,"tag":181,"props":843,"children":844},{"style":188},[845],{"type":36,"value":846},"  GROUP BY",{"type":31,"tag":181,"props":848,"children":849},{"style":205},[850],{"type":36,"value":667},{"type":31,"tag":181,"props":852,"children":854},{"class":183,"line":853},19,[855,860,865,870,875,880,884,889,893,898],{"type":31,"tag":181,"props":856,"children":857},{"style":188},[858],{"type":36,"value":859},"  HAVING",{"type":31,"tag":181,"props":861,"children":862},{"style":205},[863],{"type":36,"value":864}," TIMESTAMP_DIFF(",{"type":31,"tag":181,"props":866,"children":867},{"style":489},[868],{"type":36,"value":869},"MAX",{"type":31,"tag":181,"props":871,"children":872},{"style":205},[873],{"type":36,"value":874},"(event_timestamp), ",{"type":31,"tag":181,"props":876,"children":877},{"style":489},[878],{"type":36,"value":879},"MIN",{"type":31,"tag":181,"props":881,"children":882},{"style":205},[883],{"type":36,"value":874},{"type":31,"tag":181,"props":885,"children":886},{"style":188},[887],{"type":36,"value":888},"HOUR",{"type":31,"tag":181,"props":890,"children":891},{"style":205},[892],{"type":36,"value":815},{"type":31,"tag":181,"props":894,"children":895},{"style":188},[896],{"type":36,"value":897},"\u003C",{"type":31,"tag":181,"props":899,"children":900},{"style":489},[901],{"type":36,"value":902}," 24\n",{"type":31,"tag":181,"props":904,"children":906},{"class":183,"line":905},20,[907],{"type":31,"tag":181,"props":908,"children":909},{"style":205},[910],{"type":36,"value":911},")\n",{"type":31,"tag":181,"props":913,"children":915},{"class":183,"line":914},21,[916],{"type":31,"tag":181,"props":917,"children":918},{"style":188},[919],{"type":36,"value":920},"SELECT\n",{"type":31,"tag":181,"props":922,"children":924},{"class":183,"line":923},22,[925,930,935,940],{"type":31,"tag":181,"props":926,"children":927},{"style":489},[928],{"type":36,"value":929},"  a",{"type":31,"tag":181,"props":931,"children":932},{"style":205},[933],{"type":36,"value":934},".",{"type":31,"tag":181,"props":936,"children":937},{"style":489},[938],{"type":36,"value":939},"event_id",{"type":31,"tag":181,"props":941,"children":942},{"style":205},[943],{"type":36,"value":297},{"type":31,"tag":181,"props":945,"children":947},{"class":183,"line":946},23,[948,953,957,962,967],{"type":31,"tag":181,"props":949,"children":950},{"style":489},[951],{"type":36,"value":952},"  c",{"type":31,"tag":181,"props":954,"children":955},{"style":205},[956],{"type":36,"value":934},{"type":31,"tag":181,"props":958,"children":959},{"style":489},[960],{"type":36,"value":961},"fingerprint",{"type":31,"tag":181,"props":963,"children":964},{"style":188},[965],{"type":36,"value":966}," AS",{"type":31,"tag":181,"props":968,"children":969},{"style":205},[970],{"type":36,"value":971}," probable_cluster_id\n",{"type":31,"tag":181,"props":973,"children":975},{"class":183,"line":974},24,[976,980],{"type":31,"tag":181,"props":977,"children":978},{"style":188},[979],{"type":36,"value":430},{"type":31,"tag":181,"props":981,"children":982},{"style":205},[983],{"type":36,"value":984}," anon_events a\n",{"type":31,"tag":181,"props":986,"children":988},{"class":183,"line":987},25,[989,994,999,1004,1009,1013,1017,1022,1027,1031,1035],{"type":31,"tag":181,"props":990,"children":991},{"style":188},[992],{"type":36,"value":993},"JOIN",{"type":31,"tag":181,"props":995,"children":996},{"style":205},[997],{"type":36,"value":998}," clusters c ",{"type":31,"tag":181,"props":1000,"children":1001},{"style":188},[1002],{"type":36,"value":1003},"ON",{"type":31,"tag":181,"props":1005,"children":1006},{"style":489},[1007],{"type":36,"value":1008}," a",{"type":31,"tag":181,"props":1010,"children":1011},{"style":205},[1012],{"type":36,"value":934},{"type":31,"tag":181,"props":1014,"children":1015},{"style":489},[1016],{"type":36,"value":961},{"type":31,"tag":181,"props":1018,"children":1019},{"style":188},[1020],{"type":36,"value":1021}," =",{"type":31,"tag":181,"props":1023,"children":1024},{"style":489},[1025],{"type":36,"value":1026}," c",{"type":31,"tag":181,"props":1028,"children":1029},{"style":205},[1030],{"type":36,"value":934},{"type":31,"tag":181,"props":1032,"children":1033},{"style":489},[1034],{"type":36,"value":961},{"type":31,"tag":181,"props":1036,"children":1037},{"style":205},[1038],{"type":36,"value":497},{"type":31,"tag":32,"props":1040,"children":1041},{},[1042,1044,1050,1052,1058],{"type":36,"value":1043},"Этот запрос группирует события по хешу IP+UA за 24 часа. Cluster ID можно использовать как временный ",{"type":31,"tag":39,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":36,"value":1049},"canonical_id",{"type":36,"value":1051},", но добавьте confidence score: ",{"type":31,"tag":39,"props":1053,"children":1055},{"className":1054},[],[1056],{"type":36,"value":1057},"event_count > 3 AND time_span \u003C 1 HOUR → confidence=0.9",{"type":36,"value":934},{"type":31,"tag":32,"props":1060,"children":1061},{},[1062,1067,1069,1075,1077,1082],{"type":31,"tag":75,"props":1063,"children":1064},{},[1065],{"type":36,"value":1066},"Household graph:",{"type":36,"value":1068}," разные user-agent'ы (ноутбук, планшет, телефон) с одного IP — вероятно один дом. Вы создаёте ",{"type":31,"tag":39,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":36,"value":1074},"household_id",{"type":36,"value":1076}," и привязываете его к отдельным ",{"type":31,"tag":39,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":36,"value":1049},{"type":36,"value":1083},". Например, Amazon Prime подписка: 1 аккаунт, 6 профилей — identity resolution агрегирует на household уровне.",{"type":31,"tag":512,"props":1085,"children":1087},{"id":1086},"процент-ложных-срабатываний",[1088],{"type":36,"value":1089},"Процент ложных срабатываний",{"type":31,"tag":32,"props":1091,"children":1092},{},[1093],{"type":36,"value":1094},"В probabilistic linking есть риск ложных срабатываний. Два разных пользователя могут быть с одного IP+user-agent (офисный WiFi, библиотека). Слишком низкий порог (%50 confidence) даст 15-25% ложных срабатываний. Industry best practice: порог 75%+, окно 1 час, минимум 2 события на совпадение. Вендоры типа LiveRamp используют graph databases (Neo4j) и комбинируют 30+ сигналов, обещая 95%+ accuracy — но в вашем first-party pipeline'е 2-3 сигнала с 80% accuracy достаточно.",{"type":31,"tag":63,"props":1096,"children":1098},{"id":1097},"server-side-pipeline-sgtm-bigquery-dbt",[1099],{"type":36,"value":1100},"Server-side pipeline: sGTM + BigQuery + dbt",{"type":31,"tag":32,"props":1102,"children":1103},{},[1104],{"type":36,"value":1105},"Identity resolution в production работает вот по такому потоку:",{"type":31,"tag":1107,"props":1108,"children":1109},"ol",{},[1110,1129,1168,1193,1216],{"type":31,"tag":1111,"props":1112,"children":1113},"li",{},[1114,1119,1121,1127],{"type":31,"tag":75,"props":1115,"children":1116},{},[1117],{"type":36,"value":1118},"sGTM ingestion:",{"type":36,"value":1120}," Client-side GTM отправляет событие в sGTM, sGTM добавляет SHA-256 хеш email'а (если есть), пишет raw событие в BigQuery (",{"type":31,"tag":39,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":36,"value":1126},"events_raw",{"type":36,"value":1128},").",{"type":31,"tag":1111,"props":1130,"children":1131},{},[1132,1137,1139,1145,1147,1152,1154,1160,1161,1167],{"type":31,"tag":75,"props":1133,"children":1134},{},[1135],{"type":36,"value":1136},"dbt staging model:",{"type":36,"value":1138}," таблица ",{"type":31,"tag":39,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":36,"value":1144},"stg_events",{"type":36,"value":1146}," вычищает ",{"type":31,"tag":39,"props":1148,"children":1150},{"className":1149},[],[1151],{"type":36,"value":1126},{"type":36,"value":1153},", парсит ",{"type":31,"tag":39,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":36,"value":1159},"signal_type",{"type":36,"value":131},{"type":31,"tag":39,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":36,"value":1166},"signal_value",{"type":36,"value":934},{"type":31,"tag":1111,"props":1169,"children":1170},{},[1171,1176,1178,1184,1186,1191],{"type":31,"tag":75,"props":1172,"children":1173},{},[1174],{"type":36,"value":1175},"dbt identity_map merge:",{"type":36,"value":1177}," при первом виде нового хеша выполняется ",{"type":31,"tag":39,"props":1179,"children":1181},{"className":1180},[],[1182],{"type":36,"value":1183},"MERGE",{"type":36,"value":1185}," в ",{"type":31,"tag":39,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":36,"value":155},{"type":36,"value":1192}," (upsert логика).",{"type":31,"tag":1111,"props":1194,"children":1195},{},[1196,1201,1203,1208,1210,1215],{"type":31,"tag":75,"props":1197,"children":1198},{},[1199],{"type":36,"value":1200},"dbt canonical_id enrichment:",{"type":36,"value":1202}," каждое событие join'ится с ",{"type":31,"tag":39,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":36,"value":155},{"type":36,"value":1209},", выполняется lookup ",{"type":31,"tag":39,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":36,"value":1049},{"type":36,"value":934},{"type":31,"tag":1111,"props":1217,"children":1218},{},[1219,1224,1226,1232,1233,1239,1241,1246],{"type":31,"tag":75,"props":1220,"children":1221},{},[1222],{"type":36,"value":1223},"dbt aggregation:",{"type":36,"value":1225}," user-level метрики (",{"type":31,"tag":39,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":36,"value":1231},"user_ltv",{"type":36,"value":46},{"type":31,"tag":39,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":36,"value":1238},"session_count",{"type":36,"value":1240},") агрегируются по ",{"type":31,"tag":39,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":36,"value":1049},{"type":36,"value":934},{"type":31,"tag":32,"props":1248,"children":1249},{},[1250,1252,1258],{"type":36,"value":1251},"Пример dbt модели (",{"type":31,"tag":39,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":36,"value":1257},"models\u002Fstaging\u002Fstg_events.sql",{"type":36,"value":1259},"):",{"type":31,"tag":171,"props":1261,"children":1263},{"className":173,"code":1262,"language":175,"meta":15,"style":15},"{{ config(materialized='incremental') }}\n\nWITH events_with_signals AS (\n  SELECT\n    event_id,\n    event_timestamp,\n    COALESCE(user_properties.email_sha256, NULL) AS email_hash,\n    COALESCE(user_properties.ga_client_id, NULL) AS cookie_id,\n    event_params\n  FROM {{ source('bigquery', 'events_raw') }}\n  {% if is_incremental() %}\n  WHERE event_timestamp > (SELECT MAX(event_timestamp) FROM {{ this }})\n  {% endif %}\n)\nSELECT * FROM events_with_signals;\n",[1264],{"type":31,"tag":39,"props":1265,"children":1266},{"__ignoreMap":15},[1267,1289,1298,1318,1325,1332,1339,1387,1432,1440,1470,1488,1532,1540,1547],{"type":31,"tag":181,"props":1268,"children":1269},{"class":183,"line":184},[1270,1275,1279,1284],{"type":31,"tag":181,"props":1271,"children":1272},{"style":205},[1273],{"type":36,"value":1274},"{{ config(materialized",{"type":31,"tag":181,"props":1276,"children":1277},{"style":188},[1278],{"type":36,"value":453},{"type":31,"tag":181,"props":1280,"children":1281},{"style":456},[1282],{"type":36,"value":1283},"'incremental'",{"type":31,"tag":181,"props":1285,"children":1286},{"style":205},[1287],{"type":36,"value":1288},") }}\n",{"type":31,"tag":181,"props":1290,"children":1291},{"class":183,"line":211},[1292],{"type":31,"tag":181,"props":1293,"children":1295},{"emptyLinePlaceholder":1294},true,[1296],{"type":36,"value":1297},"\n",{"type":31,"tag":181,"props":1299,"children":1300},{"class":183,"line":236},[1301,1305,1310,1314],{"type":31,"tag":181,"props":1302,"children":1303},{"style":188},[1304],{"type":36,"value":586},{"type":31,"tag":181,"props":1306,"children":1307},{"style":205},[1308],{"type":36,"value":1309}," events_with_signals ",{"type":31,"tag":181,"props":1311,"children":1312},{"style":188},[1313],{"type":36,"value":596},{"type":31,"tag":181,"props":1315,"children":1316},{"style":205},[1317],{"type":36,"value":208},{"type":31,"tag":181,"props":1319,"children":1320},{"class":183,"line":259},[1321],{"type":31,"tag":181,"props":1322,"children":1323},{"style":188},[1324],{"type":36,"value":608},{"type":31,"tag":181,"props":1326,"children":1327},{"class":183,"line":281},[1328],{"type":31,"tag":181,"props":1329,"children":1330},{"style":205},[1331],{"type":36,"value":616},{"type":31,"tag":181,"props":1333,"children":1334},{"class":183,"line":300},[1335],{"type":31,"tag":181,"props":1336,"children":1337},{"style":205},[1338],{"type":36,"value":640},{"type":31,"tag":181,"props":1340,"children":1341},{"class":183,"line":317},[1342,1347,1351,1356,1360,1365,1369,1374,1378,1382],{"type":31,"tag":181,"props":1343,"children":1344},{"style":489},[1345],{"type":36,"value":1346},"    COALESCE",{"type":31,"tag":181,"props":1348,"children":1349},{"style":205},[1350],{"type":36,"value":805},{"type":31,"tag":181,"props":1352,"children":1353},{"style":489},[1354],{"type":36,"value":1355},"user_properties",{"type":31,"tag":181,"props":1357,"children":1358},{"style":205},[1359],{"type":36,"value":934},{"type":31,"tag":181,"props":1361,"children":1362},{"style":489},[1363],{"type":36,"value":1364},"email_sha256",{"type":31,"tag":181,"props":1366,"children":1367},{"style":205},[1368],{"type":36,"value":46},{"type":31,"tag":181,"props":1370,"children":1371},{"style":188},[1372],{"type":36,"value":1373},"NULL",{"type":31,"tag":181,"props":1375,"children":1376},{"style":205},[1377],{"type":36,"value":815},{"type":31,"tag":181,"props":1379,"children":1380},{"style":188},[1381],{"type":36,"value":596},{"type":31,"tag":181,"props":1383,"children":1384},{"style":205},[1385],{"type":36,"value":1386}," email_hash,\n",{"type":31,"tag":181,"props":1388,"children":1389},{"class":183,"line":331},[1390,1394,1398,1402,1406,1411,1415,1419,1423,1427],{"type":31,"tag":181,"props":1391,"children":1392},{"style":489},[1393],{"type":36,"value":1346},{"type":31,"tag":181,"props":1395,"children":1396},{"style":205},[1397],{"type":36,"value":805},{"type":31,"tag":181,"props":1399,"children":1400},{"style":489},[1401],{"type":36,"value":1355},{"type":31,"tag":181,"props":1403,"children":1404},{"style":205},[1405],{"type":36,"value":934},{"type":31,"tag":181,"props":1407,"children":1408},{"style":489},[1409],{"type":36,"value":1410},"ga_client_id",{"type":31,"tag":181,"props":1412,"children":1413},{"style":205},[1414],{"type":36,"value":46},{"type":31,"tag":181,"props":1416,"children":1417},{"style":188},[1418],{"type":36,"value":1373},{"type":31,"tag":181,"props":1420,"children":1421},{"style":205},[1422],{"type":36,"value":815},{"type":31,"tag":181,"props":1424,"children":1425},{"style":188},[1426],{"type":36,"value":596},{"type":31,"tag":181,"props":1428,"children":1429},{"style":205},[1430],{"type":36,"value":1431}," cookie_id,\n",{"type":31,"tag":181,"props":1433,"children":1434},{"class":183,"line":25},[1435],{"type":31,"tag":181,"props":1436,"children":1437},{"style":205},[1438],{"type":36,"value":1439},"    event_params\n",{"type":31,"tag":181,"props":1441,"children":1442},{"class":183,"line":706},[1443,1447,1452,1457,1461,1466],{"type":31,"tag":181,"props":1444,"children":1445},{"style":188},[1446],{"type":36,"value":675},{"type":31,"tag":181,"props":1448,"children":1449},{"style":205},[1450],{"type":36,"value":1451}," {{ source(",{"type":31,"tag":181,"props":1453,"children":1454},{"style":456},[1455],{"type":36,"value":1456},"'bigquery'",{"type":31,"tag":181,"props":1458,"children":1459},{"style":205},[1460],{"type":36,"value":46},{"type":31,"tag":181,"props":1462,"children":1463},{"style":456},[1464],{"type":36,"value":1465},"'events_raw'",{"type":31,"tag":181,"props":1467,"children":1468},{"style":205},[1469],{"type":36,"value":1288},{"type":31,"tag":181,"props":1471,"children":1472},{"class":183,"line":715},[1473,1478,1483],{"type":31,"tag":181,"props":1474,"children":1475},{"style":205},[1476],{"type":36,"value":1477},"  {% ",{"type":31,"tag":181,"props":1479,"children":1480},{"style":188},[1481],{"type":36,"value":1482},"if",{"type":31,"tag":181,"props":1484,"children":1485},{"style":205},[1486],{"type":36,"value":1487}," is_incremental() %}\n",{"type":31,"tag":181,"props":1489,"children":1490},{"class":183,"line":732},[1491,1495,1500,1505,1510,1514,1519,1523,1527],{"type":31,"tag":181,"props":1492,"children":1493},{"style":188},[1494],{"type":36,"value":688},{"type":31,"tag":181,"props":1496,"children":1497},{"style":205},[1498],{"type":36,"value":1499}," event_timestamp ",{"type":31,"tag":181,"props":1501,"children":1502},{"style":188},[1503],{"type":36,"value":1504},">",{"type":31,"tag":181,"props":1506,"children":1507},{"style":205},[1508],{"type":36,"value":1509}," (",{"type":31,"tag":181,"props":1511,"children":1512},{"style":188},[1513],{"type":36,"value":417},{"type":31,"tag":181,"props":1515,"children":1516},{"style":489},[1517],{"type":36,"value":1518}," MAX",{"type":31,"tag":181,"props":1520,"children":1521},{"style":205},[1522],{"type":36,"value":760},{"type":31,"tag":181,"props":1524,"children":1525},{"style":188},[1526],{"type":36,"value":430},{"type":31,"tag":181,"props":1528,"children":1529},{"style":205},[1530],{"type":36,"value":1531}," {{ this }})\n",{"type":31,"tag":181,"props":1533,"children":1534},{"class":183,"line":740},[1535],{"type":31,"tag":181,"props":1536,"children":1537},{"style":205},[1538],{"type":36,"value":1539},"  {% endif %}\n",{"type":31,"tag":181,"props":1541,"children":1542},{"class":183,"line":749},[1543],{"type":31,"tag":181,"props":1544,"children":1545},{"style":205},[1546],{"type":36,"value":911},{"type":31,"tag":181,"props":1548,"children":1549},{"class":183,"line":772},[1550,1554,1559,1564],{"type":31,"tag":181,"props":1551,"children":1552},{"style":188},[1553],{"type":36,"value":417},{"type":31,"tag":181,"props":1555,"children":1556},{"style":188},[1557],{"type":36,"value":1558}," *",{"type":31,"tag":181,"props":1560,"children":1561},{"style":188},[1562],{"type":36,"value":1563}," FROM",{"type":31,"tag":181,"props":1565,"children":1566},{"style":205},[1567],{"type":36,"value":1568}," events_with_signals;\n",{"type":31,"tag":32,"props":1570,"children":1571},{},[1572,1574,1580],{"type":36,"value":1573},"Incremental модель запускается каждый час, обрабатывает последний батч. Логика identity merge в отдельной модели (",{"type":31,"tag":39,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":36,"value":1579},"models\u002Fcore\u002Ffct_identity_resolved.sql",{"type":36,"value":1259},{"type":31,"tag":171,"props":1582,"children":1584},{"className":173,"code":1583,"language":175,"meta":15,"style":15},"SELECT\n  e.event_id,\n  COALESCE(im_email.canonical_id, im_cookie.canonical_id) AS canonical_id,\n  e.event_timestamp\nFROM {{ ref('stg_events') }} e\nLEFT JOIN {{ ref('identity_map') }} im_email\n  ON e.email_hash IS NOT NULL\n  AND im_email.signal_type = 'email_sha256'\n  AND im_email.signal_value = e.email_hash\nLEFT JOIN {{ ref('identity_map') }} im_cookie\n  ON e.cookie_id IS NOT NULL\n  AND im_cookie.signal_type = 'cookie'\n  AND im_cookie.signal_value = e.cookie_id;\n",[1585],{"type":31,"tag":39,"props":1586,"children":1587},{"__ignoreMap":15},[1588,1595,1615,1670,1686,1708,1730,1756,1786,1822,1842,1866,1895],{"type":31,"tag":181,"props":1589,"children":1590},{"class":183,"line":184},[1591],{"type":31,"tag":181,"props":1592,"children":1593},{"style":188},[1594],{"type":36,"value":920},{"type":31,"tag":181,"props":1596,"children":1597},{"class":183,"line":211},[1598,1603,1607,1611],{"type":31,"tag":181,"props":1599,"children":1600},{"style":489},[1601],{"type":36,"value":1602},"  e",{"type":31,"tag":181,"props":1604,"children":1605},{"style":205},[1606],{"type":36,"value":934},{"type":31,"tag":181,"props":1608,"children":1609},{"style":489},[1610],{"type":36,"value":939},{"type":31,"tag":181,"props":1612,"children":1613},{"style":205},[1614],{"type":36,"value":297},{"type":31,"tag":181,"props":1616,"children":1617},{"class":183,"line":236},[1618,1623,1627,1632,1636,1640,1644,1649,1653,1657,1661,1665],{"type":31,"tag":181,"props":1619,"children":1620},{"style":489},[1621],{"type":36,"value":1622},"  COALESCE",{"type":31,"tag":181,"props":1624,"children":1625},{"style":205},[1626],{"type":36,"value":805},{"type":31,"tag":181,"props":1628,"children":1629},{"style":489},[1630],{"type":36,"value":1631},"im_email",{"type":31,"tag":181,"props":1633,"children":1634},{"style":205},[1635],{"type":36,"value":934},{"type":31,"tag":181,"props":1637,"children":1638},{"style":489},[1639],{"type":36,"value":1049},{"type":31,"tag":181,"props":1641,"children":1642},{"style":205},[1643],{"type":36,"value":46},{"type":31,"tag":181,"props":1645,"children":1646},{"style":489},[1647],{"type":36,"value":1648},"im_cookie",{"type":31,"tag":181,"props":1650,"children":1651},{"style":205},[1652],{"type":36,"value":934},{"type":31,"tag":181,"props":1654,"children":1655},{"style":489},[1656],{"type":36,"value":1049},{"type":31,"tag":181,"props":1658,"children":1659},{"style":205},[1660],{"type":36,"value":815},{"type":31,"tag":181,"props":1662,"children":1663},{"style":188},[1664],{"type":36,"value":596},{"type":31,"tag":181,"props":1666,"children":1667},{"style":205},[1668],{"type":36,"value":1669}," canonical_id,\n",{"type":31,"tag":181,"props":1671,"children":1672},{"class":183,"line":259},[1673,1677,1681],{"type":31,"tag":181,"props":1674,"children":1675},{"style":489},[1676],{"type":36,"value":1602},{"type":31,"tag":181,"props":1678,"children":1679},{"style":205},[1680],{"type":36,"value":934},{"type":31,"tag":181,"props":1682,"children":1683},{"style":489},[1684],{"type":36,"value":1685},"event_timestamp\n",{"type":31,"tag":181,"props":1687,"children":1688},{"class":183,"line":281},[1689,1693,1698,1703],{"type":31,"tag":181,"props":1690,"children":1691},{"style":188},[1692],{"type":36,"value":430},{"type":31,"tag":181,"props":1694,"children":1695},{"style":205},[1696],{"type":36,"value":1697}," {{ ref(",{"type":31,"tag":181,"props":1699,"children":1700},{"style":456},[1701],{"type":36,"value":1702},"'stg_events'",{"type":31,"tag":181,"props":1704,"children":1705},{"style":205},[1706],{"type":36,"value":1707},") }} e\n",{"type":31,"tag":181,"props":1709,"children":1710},{"class":183,"line":300},[1711,1716,1720,1725],{"type":31,"tag":181,"props":1712,"children":1713},{"style":188},[1714],{"type":36,"value":1715},"LEFT JOIN",{"type":31,"tag":181,"props":1717,"children":1718},{"style":205},[1719],{"type":36,"value":1697},{"type":31,"tag":181,"props":1721,"children":1722},{"style":456},[1723],{"type":36,"value":1724},"'identity_map'",{"type":31,"tag":181,"props":1726,"children":1727},{"style":205},[1728],{"type":36,"value":1729},") }} im_email\n",{"type":31,"tag":181,"props":1731,"children":1732},{"class":183,"line":317},[1733,1738,1743,1747,1751],{"type":31,"tag":181,"props":1734,"children":1735},{"style":188},[1736],{"type":36,"value":1737},"  ON",{"type":31,"tag":181,"props":1739,"children":1740},{"style":489},[1741],{"type":36,"value":1742}," e",{"type":31,"tag":181,"props":1744,"children":1745},{"style":205},[1746],{"type":36,"value":934},{"type":31,"tag":181,"props":1748,"children":1749},{"style":489},[1750],{"type":36,"value":59},{"type":31,"tag":181,"props":1752,"children":1753},{"style":188},[1754],{"type":36,"value":1755}," IS NOT NULL\n",{"type":31,"tag":181,"props":1757,"children":1758},{"class":183,"line":331},[1759,1764,1769,1773,1777,1781],{"type":31,"tag":181,"props":1760,"children":1761},{"style":188},[1762],{"type":36,"value":1763},"  AND",{"type":31,"tag":181,"props":1765,"children":1766},{"style":489},[1767],{"type":36,"value":1768}," im_email",{"type":31,"tag":181,"props":1770,"children":1771},{"style":205},[1772],{"type":36,"value":934},{"type":31,"tag":181,"props":1774,"children":1775},{"style":489},[1776],{"type":36,"value":1159},{"type":31,"tag":181,"props":1778,"children":1779},{"style":188},[1780],{"type":36,"value":1021},{"type":31,"tag":181,"props":1782,"children":1783},{"style":456},[1784],{"type":36,"value":1785}," 'email_sha256'\n",{"type":31,"tag":181,"props":1787,"children":1788},{"class":183,"line":25},[1789,1793,1797,1801,1805,1809,1813,1817],{"type":31,"tag":181,"props":1790,"children":1791},{"style":188},[1792],{"type":36,"value":1763},{"type":31,"tag":181,"props":1794,"children":1795},{"style":489},[1796],{"type":36,"value":1768},{"type":31,"tag":181,"props":1798,"children":1799},{"style":205},[1800],{"type":36,"value":934},{"type":31,"tag":181,"props":1802,"children":1803},{"style":489},[1804],{"type":36,"value":1166},{"type":31,"tag":181,"props":1806,"children":1807},{"style":188},[1808],{"type":36,"value":1021},{"type":31,"tag":181,"props":1810,"children":1811},{"style":489},[1812],{"type":36,"value":1742},{"type":31,"tag":181,"props":1814,"children":1815},{"style":205},[1816],{"type":36,"value":934},{"type":31,"tag":181,"props":1818,"children":1819},{"style":489},[1820],{"type":36,"value":1821},"email_hash\n",{"type":31,"tag":181,"props":1823,"children":1824},{"class":183,"line":706},[1825,1829,1833,1837],{"type":31,"tag":181,"props":1826,"children":1827},{"style":188},[1828],{"type":36,"value":1715},{"type":31,"tag":181,"props":1830,"children":1831},{"style":205},[1832],{"type":36,"value":1697},{"type":31,"tag":181,"props":1834,"children":1835},{"style":456},[1836],{"type":36,"value":1724},{"type":31,"tag":181,"props":1838,"children":1839},{"style":205},[1840],{"type":36,"value":1841},") }} im_cookie\n",{"type":31,"tag":181,"props":1843,"children":1844},{"class":183,"line":715},[1845,1849,1853,1857,1862],{"type":31,"tag":181,"props":1846,"children":1847},{"style":188},[1848],{"type":36,"value":1737},{"type":31,"tag":181,"props":1850,"children":1851},{"style":489},[1852],{"type":36,"value":1742},{"type":31,"tag":181,"props":1854,"children":1855},{"style":205},[1856],{"type":36,"value":934},{"type":31,"tag":181,"props":1858,"children":1859},{"style":489},[1860],{"type":36,"value":1861},"cookie_id",{"type":31,"tag":181,"props":1863,"children":1864},{"style":188},[1865],{"type":36,"value":1755},{"type":31,"tag":181,"props":1867,"children":1868},{"class":183,"line":732},[1869,1873,1878,1882,1886,1890],{"type":31,"tag":181,"props":1870,"children":1871},{"style":188},[1872],{"type":36,"value":1763},{"type":31,"tag":181,"props":1874,"children":1875},{"style":489},[1876],{"type":36,"value":1877}," im_cookie",{"type":31,"tag":181,"props":1879,"children":1880},{"style":205},[1881],{"type":36,"value":934},{"type":31,"tag":181,"props":1883,"children":1884},{"style":489},[1885],{"type":36,"value":1159},{"type":31,"tag":181,"props":1887,"children":1888},{"style":188},[1889],{"type":36,"value":1021},{"type":31,"tag":181,"props":1891,"children":1892},{"style":456},[1893],{"type":36,"value":1894}," 'cookie'\n",{"type":31,"tag":181,"props":1896,"children":1897},{"class":183,"line":740},[1898,1902,1906,1910,1914,1918,1922,1926,1930],{"type":31,"tag":181,"props":1899,"children":1900},{"style":188},[1901],{"type":36,"value":1763},{"type":31,"tag":181,"props":1903,"children":1904},{"style":489},[1905],{"type":36,"value":1877},{"type":31,"tag":181,"props":1907,"children":1908},{"style":205},[1909],{"type":36,"value":934},{"type":31,"tag":181,"props":1911,"children":1912},{"style":489},[1913],{"type":36,"value":1166},{"type":31,"tag":181,"props":1915,"children":1916},{"style":188},[1917],{"type":36,"value":1021},{"type":31,"tag":181,"props":1919,"children":1920},{"style":489},[1921],{"type":36,"value":1742},{"type":31,"tag":181,"props":1923,"children":1924},{"style":205},[1925],{"type":36,"value":934},{"type":31,"tag":181,"props":1927,"children":1928},{"style":489},[1929],{"type":36,"value":1861},{"type":31,"tag":181,"props":1931,"children":1932},{"style":205},[1933],{"type":36,"value":497},{"type":31,"tag":32,"props":1935,"children":1936},{},[1937,1939,1945],{"type":36,"value":1938},"Эта логика join'а выполняет детерминистичный hash matching. Для вероятностного добавляете отдельную модель ",{"type":31,"tag":39,"props":1940,"children":1942},{"className":1941},[],[1943],{"type":36,"value":1944},"fct_probabilistic_clusters",{"type":36,"value":934},{"type":31,"tag":63,"props":1947,"children":1949},{"id":1948},"consent-и-privacy-gdpr-ccpa-соответствие",[1950],{"type":36,"value":1951},"Consent и privacy: GDPR, CCPA соответствие",{"type":31,"tag":32,"props":1953,"children":1954},{},[1955,1957,1962],{"type":36,"value":1956},"Identity resolution подпадает под GDPR Article 6 (законное основание) и CCPA \"do not sell\" правила. Email хеш квалифицируется как ",{"type":31,"tag":75,"props":1958,"children":1959},{},[1960],{"type":36,"value":1961},"личные данные",{"type":36,"value":1963}," (решение CJEU 2019), поэтому требуется consent или legitimate interest.",{"type":31,"tag":32,"props":1965,"children":1966},{},[1967,1969,1975,1977,1983,1984,1989,1991,1997],{"type":36,"value":1968},"Под Consent Mode v2: если пользователь выставляет ",{"type":31,"tag":39,"props":1970,"children":1972},{"className":1971},[],[1973],{"type":36,"value":1974},"analytics_storage=denied",{"type":36,"value":1976},", вы не можете собирать email хеш. Остаётся только IP+UA отпечаток (под legitimate interest — хотя интерпретация CJEU спорна). Best practice: добавляете колонку ",{"type":31,"tag":39,"props":1978,"children":1980},{"className":1979},[],[1981],{"type":36,"value":1982},"consent_status",{"type":36,"value":1185},{"type":31,"tag":39,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":36,"value":155},{"type":36,"value":1990}," и пишите хеш только из событий с ",{"type":31,"tag":39,"props":1992,"children":1994},{"className":1993},[],[1995],{"type":36,"value":1996},"analytics_storage=granted",{"type":36,"value":934},{"type":31,"tag":32,"props":1999,"children":2000},{},[2001,2003,2008],{"type":36,"value":2002},"Для CCPA \"right to delete\" нужна логика удаления по ",{"type":31,"tag":39,"props":2004,"children":2006},{"className":2005},[],[2007],{"type":36,"value":1049},{"type":36,"value":169},{"type":31,"tag":171,"props":2010,"children":2012},{"className":173,"code":2011,"language":175,"meta":15,"style":15},"DELETE FROM identity_map WHERE canonical_id = 'uuid-123';\nDELETE FROM events WHERE canonical_id = 'uuid-123';\n",[2013],{"type":31,"tag":39,"props":2014,"children":2015},{"__ignoreMap":15},[2016,2054],{"type":31,"tag":181,"props":2017,"children":2018},{"class":183,"line":184},[2019,2024,2028,2033,2037,2041,2045,2050],{"type":31,"tag":181,"props":2020,"children":2021},{"style":188},[2022],{"type":36,"value":2023},"DELETE",{"type":31,"tag":181,"props":2025,"children":2026},{"style":188},[2027],{"type":36,"value":1563},{"type":31,"tag":181,"props":2029,"children":2030},{"style":205},[2031],{"type":36,"value":2032}," identity_map ",{"type":31,"tag":181,"props":2034,"children":2035},{"style":188},[2036],{"type":36,"value":443},{"type":31,"tag":181,"props":2038,"children":2039},{"style":205},[2040],{"type":36,"value":693},{"type":31,"tag":181,"props":2042,"children":2043},{"style":188},[2044],{"type":36,"value":453},{"type":31,"tag":181,"props":2046,"children":2047},{"style":456},[2048],{"type":36,"value":2049}," 'uuid-123'",{"type":31,"tag":181,"props":2051,"children":2052},{"style":205},[2053],{"type":36,"value":497},{"type":31,"tag":181,"props":2055,"children":2056},{"class":183,"line":211},[2057,2061,2065,2070,2074,2078,2082,2086],{"type":31,"tag":181,"props":2058,"children":2059},{"style":188},[2060],{"type":36,"value":2023},{"type":31,"tag":181,"props":2062,"children":2063},{"style":188},[2064],{"type":36,"value":1563},{"type":31,"tag":181,"props":2066,"children":2067},{"style":205},[2068],{"type":36,"value":2069}," events ",{"type":31,"tag":181,"props":2071,"children":2072},{"style":188},[2073],{"type":36,"value":443},{"type":31,"tag":181,"props":2075,"children":2076},{"style":205},[2077],{"type":36,"value":693},{"type":31,"tag":181,"props":2079,"children":2080},{"style":188},[2081],{"type":36,"value":453},{"type":31,"tag":181,"props":2083,"children":2084},{"style":456},[2085],{"type":36,"value":2049},{"type":31,"tag":181,"props":2087,"children":2088},{"style":205},[2089],{"type":36,"value":497},{"type":31,"tag":32,"props":2091,"children":2092},{},[2093,2095,2101],{"type":36,"value":2094},"Для cascade удаления используйте foreign key constraints (BigQuery их не поддерживает, но Postgres\u002FSnowflake поддерживают). Альтернатива: soft delete (",{"type":31,"tag":39,"props":2096,"children":2098},{"className":2097},[],[2099],{"type":36,"value":2100},"deleted_at TIMESTAMP",{"type":36,"value":2102},") с последующей batch очисткой.",{"type":31,"tag":512,"props":2104,"children":2106},{"id":2105},"tcf-22-маппинг-вендоров",[2107],{"type":36,"value":2108},"TCF 2.2 маппинг вендоров",{"type":31,"tag":32,"props":2110,"children":2111},{},[2112,2114,2120],{"type":36,"value":2113},"Под IAB TCF 2.2 identity resolution попадает под \"Purpose 1 — Store and\u002For access information on a device\". Если пользователь не одобрил вашего вендора в списке, вы не можете делать cross-device linking. В Roibase проектах парсим TCF строку в BigQuery и пишем в колонку ",{"type":31,"tag":39,"props":2115,"children":2117},{"className":2116},[],[2118],{"type":36,"value":2119},"vendor_consent",{"type":36,"value":2121},", затем фильтруем при identity merge:",{"type":31,"tag":171,"props":2123,"children":2125},{"className":173,"code":2124,"language":175,"meta":15,"style":15},"WHERE vendor_consent LIKE '%vendor_id=123%'\n",[2126],{"type":31,"tag":39,"props":2127,"children":2128},{"__ignoreMap":15},[2129],{"type":31,"tag":181,"props":2130,"children":2131},{"class":183,"line":184},[2132,2136,2141,2146],{"type":31,"tag":181,"props":2133,"children":2134},{"style":188},[2135],{"type":36,"value":443},{"type":31,"tag":181,"props":2137,"children":2138},{"style":205},[2139],{"type":36,"value":2140}," vendor_consent ",{"type":31,"tag":181,"props":2142,"children":2143},{"style":188},[2144],{"type":36,"value":2145},"LIKE",{"type":31,"tag":181,"props":2147,"children":2148},{"style":456},[2149],{"type":36,"value":2150}," '%vendor_id=123%'\n",{"type":31,"tag":32,"props":2152,"children":2153},{},[2154],{"type":36,"value":2155},"Эта логика блокирует граф идентичности без consent'а — баланс между compliance и качеством данных.",{"type":31,"tag":63,"props":2157,"children":2159},{"id":2158},"cdp-интеграция-segment-mparticle-rudderstack",[2160],{"type":36,"value":2161},"CDP интеграция: Segment, mParticle, Rudderstack",{"type":31,"tag":32,"props":2163,"children":2164},{},[2165,2167,2174,2176,2182,2184,2190,2191,2197],{"type":36,"value":2166},"Современные CDP'ы предлагают собственные identity graph'ы, но обычно это \"чёрный ящик\". Когда вы строите свой pipeline, вы контролируете логику графа — особенно критично в проектах ",{"type":31,"tag":539,"props":2168,"children":2171},{"href":2169,"rel":2170},"https:\u002F\u002Fwww.roibase.com.tr\u002Fru\u002Fretention-engineering-cdp",[543],[2172],{"type":36,"value":2173},"CDP и Retention Engineering",{"type":36,"value":2175},". ",{"type":31,"tag":39,"props":2177,"children":2179},{"className":2178},[],[2180],{"type":36,"value":2181},"identify()",{"type":36,"value":2183}," вызов в Segment слияет ",{"type":31,"tag":39,"props":2185,"children":2187},{"className":2186},[],[2188],{"type":36,"value":2189},"userId",{"type":36,"value":131},{"type":31,"tag":39,"props":2192,"children":2194},{"className":2193},[],[2195],{"type":36,"value":2196},"anonymousId",{"type":36,"value":2198},", но какой сигнал приоритетнее? В вашей логике порядок приоритета явный:",{"type":31,"tag":1107,"props":2200,"children":2201},{},[2202,2213,2223,2233,2244],{"type":31,"tag":1111,"props":2203,"children":2204},{},[2205,2211],{"type":31,"tag":39,"props":2206,"children":2208},{"className":2207},[],[2209],{"type":36,"value":2210},"customer_id",{"type":36,"value":2212}," (CRM) — самый надёжный",{"type":31,"tag":1111,"props":2214,"children":2215},{},[2216,2221],{"type":31,"tag":39,"props":2217,"children":2219},{"className":2218},[],[2220],{"type":36,"value":1364},{"type":36,"value":2222}," — детерминистичный",{"type":31,"tag":1111,"props":2224,"children":2225},{},[2226,2231],{"type":31,"tag":39,"props":2227,"children":2229},{"className":2228},[],[2230],{"type":36,"value":44},{"type":36,"value":2232}," — cross-session но не cross-device",{"type":31,"tag":1111,"props":2234,"children":2235},{},[2236,2242],{"type":31,"tag":39,"props":2237,"children":2239},{"className":2238},[],[2240],{"type":36,"value":2241},"cookie",{"type":36,"value":2243}," — самый короткий TTL",{"type":31,"tag":1111,"props":2245,"children":2246},{},[2247,2252],{"type":31,"tag":39,"props":2248,"children":2250},{"className":2249},[],[2251],{"type":36,"value":961},{"type":36,"value":2253}," — probabilistic fallback",{"type":31,"tag":32,"props":2255,"children":2256},{},[2257,2259,2265,2267,2272,2273,2279],{"type":36,"value":2258},"Этот порядок кодируется в dbt цепочкой ",{"type":31,"tag":39,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":36,"value":2264},"COALESCE()",{"type":36,"value":2266},". В CDP отправляете только финальный ",{"type":31,"tag":39,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":36,"value":1049},{"type":36,"value":131},{"type":31,"tag":39,"props":2274,"children":2276},{"className":2275},[],[2277],{"type":36,"value":2278},"confidence_score",{"type":36,"value":2280}," — логика слияния остаётся у вас.",{"type":31,"tag":32,"props":2282,"children":2283},{},[2284],{"type":36,"value":2285},"Identity resolution — фундаментальный слой современного маркетинг data stack'а. Hash matching даёт детерминистичную точность, probabilistic linking обеспечивает покрытие, household graph открывает семейную сегментацию. Server-side pipeline объединяет эти шесть сигналов в соответствии с consent и privacy правилами — и accuracy unique users прыгает на 40%, аномалии в retention когортах исчезают, incrementality тесты становятся надёжными. Когда вы кодируете resolution лог",{"type":31,"tag":2287,"props":2288,"children":2289},"style",{},[2290],{"type":36,"value":2291},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":15,"searchDepth":236,"depth":236,"links":2293},[2294,2295,2298,2301,2302,2305],{"id":65,"depth":211,"text":68},{"id":141,"depth":211,"text":144,"children":2296},[2297],{"id":514,"depth":236,"text":517},{"id":551,"depth":211,"text":554,"children":2299},[2300],{"id":1086,"depth":236,"text":1089},{"id":1097,"depth":211,"text":1100},{"id":1948,"depth":211,"text":1951,"children":2303},[2304],{"id":2105,"depth":236,"text":2108},{"id":2158,"depth":211,"text":2161},"markdown","content:ru:data:razreshenie-identichnosti-6-signalov-v-yedin-profil.md","content","ru\u002Fdata\u002Frazreshenie-identichnosti-6-signalov-v-yedin-profil.md","ru\u002Fdata\u002Frazreshenie-identichnosti-6-signalov-v-yedin-profil","md",1785967505042]