[{"data":1,"prerenderedAt":2396},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fidentity-resolution-6-signaux-identite-client-unique":12},{"i18nKey":4,"paths":5},"data-003-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11},"\u002Fde\u002Fdata\u002Fidentity-resolution-6-signale-zu-einer-kundenidentitaet","\u002Fen\u002Fdata\u002Fidentity-resolution-six-signals-to-unified-customer-identity","\u002Fes\u002Fdata\u002Fresolucion-de-identidad-de-6-senales-a-perfil-unico","\u002Ffr\u002Fdata\u002Fresolution-identite-6-signaux-vers-une-identite-client-unifiee","\u002Fit\u002Fdata\u002Frisoluzione-identita-6-segnali-a-profilo-unico","\u002Fru\u002Fdata\u002Fidentity-resolution-6-signalov-k-edinomu-identifikacionnomu-kodu-polzovatelya",{"_path":13,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":2390,"_id":2391,"_source":2392,"_file":2393,"_stem":2394,"_extension":2395},"\u002Ffr\u002Fdata\u002Fidentity-resolution-6-signaux-identite-client-unique","data",false,"","Identity Resolution: De 6 Signaux à une Identité Client Unique","Architecture technique de hash matching, probabilistic linking et household identity pour transformer les signaux dispersés en un profil client unifié.","2026-05-31",[21,22,23,24,25],"identity-resolution","cdp","first-party-data","probabilistic-matching","hash-matching",9,"Roibase",{"type":29,"children":30,"toc":2382},"root",[31,39,46,76,407,435,470,476,481,494,1030,1057,1077,1083,1103,1115,1279,1312,1327,1333,1362,1367,1653,1658,1664,1669,1674,1710,1716,1721,2314,2350,2364,2376],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Un utilisateur s'inscrit par email, passe commande depuis l'app mobile, ouvre un ticket de support depuis le navigateur desktop le lendemain. Cookie ID, device ID, email hashé, IP, session ID, user ID — six signaux distincts. Sans identity resolution, six « clients » différents apparaissent. L'attribution publicitaire se calcule mal, le modèle LTV reste biaisé, les signaux de rétention se perdent. Le User ID merge de Google Analytics 4 unifie uniquement les sessions authentifiées, les comportements anonymes restent fragmentés. Les CDP vendent du « probabilistic stitching » sans montrer l'architecture des tables. Pour mettre en production un identity graph, il faut faire fonctionner ensemble le hash matching, le probabilistic linking et l'household identity.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"hash-matching-lépine-dorsale-de-lunification-déterministe",[44],{"type":37,"value":45},"Hash Matching: L'Épine Dorsale de l'Unification Déterministe",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74],{"type":37,"value":50},"Le hash matching crée une liaison « certaine » entre deux signaux en appairant les hash SHA-256 de la même adresse email ou du même numéro de téléphone. Quand un utilisateur s'inscrit sur le site web avec ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"user@example.com",{"type":37,"value":59},", tu hashifies cette valeur en SHA-256 et l'écris dans ta table ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"identity_signals",{"type":37,"value":67}," sous la colonne ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"hashed_email",{"type":37,"value":75},". Lors d'une connexion à l'app mobile avec le même email, ce hash aura la même valeur dans la deuxième source — tu fusionnes les deux enregistrements.",{"type":32,"tag":77,"props":78,"children":82},"pre",{"className":79,"code":80,"language":81,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","-- Exemple de match déterministe dans BigQuery\nCREATE OR REPLACE TABLE `project.dataset.merged_identities` AS\nSELECT\n  web.anonymous_id AS web_cookie_id,\n  mobile.device_id AS mobile_device_id,\n  web.hashed_email,\n  MIN(web.first_seen_timestamp) AS first_seen\nFROM `project.dataset.web_events` web\nINNER JOIN `project.dataset.mobile_events` mobile\n  ON web.hashed_email = mobile.hashed_email\nWHERE web.hashed_email IS NOT NULL\nGROUP BY 1,2,3;\n","sql",[83],{"type":32,"tag":52,"props":84,"children":85},{"__ignoreMap":16},[86,98,134,143,174,201,222,265,284,302,343,369],{"type":32,"tag":87,"props":88,"children":91},"span",{"class":89,"line":90},"line",1,[92],{"type":32,"tag":87,"props":93,"children":95},{"style":94},"--shiki-default:#6A737D",[96],{"type":37,"value":97},"-- Exemple de match déterministe dans BigQuery\n",{"type":32,"tag":87,"props":99,"children":101},{"class":89,"line":100},2,[102,108,113,118,123,129],{"type":32,"tag":87,"props":103,"children":105},{"style":104},"--shiki-default:#F97583",[106],{"type":37,"value":107},"CREATE",{"type":32,"tag":87,"props":109,"children":110},{"style":104},[111],{"type":37,"value":112}," OR",{"type":32,"tag":87,"props":114,"children":115},{"style":104},[116],{"type":37,"value":117}," REPLACE",{"type":32,"tag":87,"props":119,"children":120},{"style":104},[121],{"type":37,"value":122}," TABLE",{"type":32,"tag":87,"props":124,"children":126},{"style":125},"--shiki-default:#9ECBFF",[127],{"type":37,"value":128}," `project.dataset.merged_identities`",{"type":32,"tag":87,"props":130,"children":131},{"style":104},[132],{"type":37,"value":133}," AS\n",{"type":32,"tag":87,"props":135,"children":137},{"class":89,"line":136},3,[138],{"type":32,"tag":87,"props":139,"children":140},{"style":104},[141],{"type":37,"value":142},"SELECT\n",{"type":32,"tag":87,"props":144,"children":146},{"class":89,"line":145},4,[147,153,159,164,169],{"type":32,"tag":87,"props":148,"children":150},{"style":149},"--shiki-default:#79B8FF",[151],{"type":37,"value":152},"  web",{"type":32,"tag":87,"props":154,"children":156},{"style":155},"--shiki-default:#E1E4E8",[157],{"type":37,"value":158},".",{"type":32,"tag":87,"props":160,"children":161},{"style":149},[162],{"type":37,"value":163},"anonymous_id",{"type":32,"tag":87,"props":165,"children":166},{"style":104},[167],{"type":37,"value":168}," AS",{"type":32,"tag":87,"props":170,"children":171},{"style":155},[172],{"type":37,"value":173}," web_cookie_id,\n",{"type":32,"tag":87,"props":175,"children":177},{"class":89,"line":176},5,[178,183,187,192,196],{"type":32,"tag":87,"props":179,"children":180},{"style":149},[181],{"type":37,"value":182},"  mobile",{"type":32,"tag":87,"props":184,"children":185},{"style":155},[186],{"type":37,"value":158},{"type":32,"tag":87,"props":188,"children":189},{"style":149},[190],{"type":37,"value":191},"device_id",{"type":32,"tag":87,"props":193,"children":194},{"style":104},[195],{"type":37,"value":168},{"type":32,"tag":87,"props":197,"children":198},{"style":155},[199],{"type":37,"value":200}," mobile_device_id,\n",{"type":32,"tag":87,"props":202,"children":204},{"class":89,"line":203},6,[205,209,213,217],{"type":32,"tag":87,"props":206,"children":207},{"style":149},[208],{"type":37,"value":152},{"type":32,"tag":87,"props":210,"children":211},{"style":155},[212],{"type":37,"value":158},{"type":32,"tag":87,"props":214,"children":215},{"style":149},[216],{"type":37,"value":73},{"type":32,"tag":87,"props":218,"children":219},{"style":155},[220],{"type":37,"value":221},",\n",{"type":32,"tag":87,"props":223,"children":225},{"class":89,"line":224},7,[226,231,236,241,245,250,255,260],{"type":32,"tag":87,"props":227,"children":228},{"style":149},[229],{"type":37,"value":230},"  MIN",{"type":32,"tag":87,"props":232,"children":233},{"style":155},[234],{"type":37,"value":235},"(",{"type":32,"tag":87,"props":237,"children":238},{"style":149},[239],{"type":37,"value":240},"web",{"type":32,"tag":87,"props":242,"children":243},{"style":155},[244],{"type":37,"value":158},{"type":32,"tag":87,"props":246,"children":247},{"style":149},[248],{"type":37,"value":249},"first_seen_timestamp",{"type":32,"tag":87,"props":251,"children":252},{"style":155},[253],{"type":37,"value":254},") ",{"type":32,"tag":87,"props":256,"children":257},{"style":104},[258],{"type":37,"value":259},"AS",{"type":32,"tag":87,"props":261,"children":262},{"style":155},[263],{"type":37,"value":264}," first_seen\n",{"type":32,"tag":87,"props":266,"children":268},{"class":89,"line":267},8,[269,274,279],{"type":32,"tag":87,"props":270,"children":271},{"style":104},[272],{"type":37,"value":273},"FROM",{"type":32,"tag":87,"props":275,"children":276},{"style":125},[277],{"type":37,"value":278}," `project.dataset.web_events`",{"type":32,"tag":87,"props":280,"children":281},{"style":155},[282],{"type":37,"value":283}," web\n",{"type":32,"tag":87,"props":285,"children":286},{"class":89,"line":26},[287,292,297],{"type":32,"tag":87,"props":288,"children":289},{"style":104},[290],{"type":37,"value":291},"INNER JOIN",{"type":32,"tag":87,"props":293,"children":294},{"style":125},[295],{"type":37,"value":296}," `project.dataset.mobile_events`",{"type":32,"tag":87,"props":298,"children":299},{"style":155},[300],{"type":37,"value":301}," mobile\n",{"type":32,"tag":87,"props":303,"children":305},{"class":89,"line":304},10,[306,311,316,320,324,329,334,338],{"type":32,"tag":87,"props":307,"children":308},{"style":104},[309],{"type":37,"value":310},"  ON",{"type":32,"tag":87,"props":312,"children":313},{"style":149},[314],{"type":37,"value":315}," web",{"type":32,"tag":87,"props":317,"children":318},{"style":155},[319],{"type":37,"value":158},{"type":32,"tag":87,"props":321,"children":322},{"style":149},[323],{"type":37,"value":73},{"type":32,"tag":87,"props":325,"children":326},{"style":104},[327],{"type":37,"value":328}," =",{"type":32,"tag":87,"props":330,"children":331},{"style":149},[332],{"type":37,"value":333}," mobile",{"type":32,"tag":87,"props":335,"children":336},{"style":155},[337],{"type":37,"value":158},{"type":32,"tag":87,"props":339,"children":340},{"style":149},[341],{"type":37,"value":342},"hashed_email\n",{"type":32,"tag":87,"props":344,"children":346},{"class":89,"line":345},11,[347,352,356,360,364],{"type":32,"tag":87,"props":348,"children":349},{"style":104},[350],{"type":37,"value":351},"WHERE",{"type":32,"tag":87,"props":353,"children":354},{"style":149},[355],{"type":37,"value":315},{"type":32,"tag":87,"props":357,"children":358},{"style":155},[359],{"type":37,"value":158},{"type":32,"tag":87,"props":361,"children":362},{"style":149},[363],{"type":37,"value":73},{"type":32,"tag":87,"props":365,"children":366},{"style":104},[367],{"type":37,"value":368}," IS NOT NULL\n",{"type":32,"tag":87,"props":370,"children":372},{"class":89,"line":371},12,[373,378,383,388,393,397,402],{"type":32,"tag":87,"props":374,"children":375},{"style":104},[376],{"type":37,"value":377},"GROUP BY",{"type":32,"tag":87,"props":379,"children":380},{"style":149},[381],{"type":37,"value":382}," 1",{"type":32,"tag":87,"props":384,"children":385},{"style":155},[386],{"type":37,"value":387},",",{"type":32,"tag":87,"props":389,"children":390},{"style":149},[391],{"type":37,"value":392},"2",{"type":32,"tag":87,"props":394,"children":395},{"style":155},[396],{"type":37,"value":387},{"type":32,"tag":87,"props":398,"children":399},{"style":149},[400],{"type":37,"value":401},"3",{"type":32,"tag":87,"props":403,"children":404},{"style":155},[405],{"type":37,"value":406},";\n",{"type":32,"tag":33,"props":408,"children":409},{},[410,412,417,419,425,427,433],{"type":37,"value":411},"Cette requête fusionne le cookie ID web avec le device ID mobile via l'email hashé. Le ",{"type":32,"tag":52,"props":413,"children":415},{"className":414},[],[416],{"type":37,"value":291},{"type":37,"value":418}," est déterministe — seules les correspondances certaines arrivent. Pour regrouper les signaux appairés sous le même ",{"type":32,"tag":52,"props":420,"children":422},{"className":421},[],[423],{"type":37,"value":424},"canonical_user_id",{"type":37,"value":426},", utilise ",{"type":32,"tag":52,"props":428,"children":430},{"className":429},[],[431],{"type":37,"value":432},"ROW_NUMBER()",{"type":37,"value":434}," ou une génération UUID. La limite du hash matching : si l'utilisateur change d'email (ancien compte + nouveau compte), ils restent deux identités distinctes. C'est ici que la couche probabiliste intervient.",{"type":32,"tag":33,"props":436,"children":437},{},[438,440,445,447,453,454,460,462,468],{"type":37,"value":439},"Le hash matching respecte le RGPD et la KVKK car tu ne stockes pas les plaintext email — le hash est unidirectionnel, non-réversible. Mais il reste vulnérable aux attaques par table arc-en-ciel (rainbow tables), donc il faut ajouter à l'email hashé d'autres signaux secondaires (device fingerprint, plage IP). Une seule colonne hash ne suffit pas — maintiens ",{"type":32,"tag":52,"props":441,"children":443},{"className":442},[],[444],{"type":37,"value":73},{"type":37,"value":446},", ",{"type":32,"tag":52,"props":448,"children":450},{"className":449},[],[451],{"type":37,"value":452},"hashed_phone",{"type":37,"value":446},{"type":32,"tag":52,"props":455,"children":457},{"className":456},[],[458],{"type":37,"value":459},"hashed_customer_id",{"type":37,"value":461}," comme colonnes séparées. Partitionne la table par ",{"type":32,"tag":52,"props":463,"children":465},{"className":464},[],[466],{"type":37,"value":467},"DATE(timestamp)",{"type":37,"value":469}," — la résolution d'identité est généralement incrémentale, un full scan de tout l'historique coûte cher.",{"type":32,"tag":40,"props":471,"children":473},{"id":472},"probabilistic-linking-gérer-lincertitude-par-scoring",[474],{"type":37,"value":475},"Probabilistic Linking: Gérer l'Incertitude par Scoring",{"type":32,"tag":33,"props":477,"children":478},{},[479],{"type":37,"value":480},"Quand un utilisateur navigue sans s'inscrire, tu n'as pas d'email hashé — mais tu as cookie ID, IP, user agent, timestamp de session. Le matching probabiliste pondère ces signaux pour générer un score de « probabilité d'être la même personne ». Si le score dépasse un seuil (ex. 0.85), tu fusionne les deux enregistrements ; en dessous, tu les gardes séparés. Des vendors comme LiveRamp, Merkle, Neustar vendent ces scores, mais tu peux construire ton propre modèle de règles dans ta warehouse.",{"type":32,"tag":33,"props":482,"children":483},{},[484,486,492],{"type":37,"value":485},"Logique exemple : même IP + même fingerprint navigateur (hash canvas) + session en 5 min → score 90 %. Même IP + navigateur différent + écart 2 heures → score 40 %. Seuil 0.7 = la première paire fusionne, la deuxième non. Tu peux le modéliser en BigQuery avec des blocs ",{"type":32,"tag":52,"props":487,"children":489},{"className":488},[],[490],{"type":37,"value":491},"CASE WHEN",{"type":37,"value":493}," :",{"type":32,"tag":77,"props":495,"children":497},{"className":79,"code":496,"language":81,"meta":16,"style":16},"SELECT\n  a.session_id AS session_a,\n  b.session_id AS session_b,\n  CASE\n    WHEN a.ip_address = b.ip_address\n      AND a.canvas_hash = b.canvas_hash\n      AND TIMESTAMP_DIFF(b.timestamp, a.timestamp, MINUTE) \u003C= 5\n    THEN 0.90\n    WHEN a.ip_address = b.ip_address\n      AND TIMESTAMP_DIFF(b.timestamp, a.timestamp, HOUR) \u003C= 2\n    THEN 0.40\n    ELSE 0.0\n  END AS match_score\nFROM `project.dataset.anonymous_sessions` a\nCROSS JOIN `project.dataset.anonymous_sessions` b\nWHERE a.session_id \u003C b.session_id\n  AND a.ip_address = b.ip_address\nQUALIFY match_score >= 0.70;\n",[498],{"type":32,"tag":52,"props":499,"children":500},{"__ignoreMap":16},[501,508,534,559,567,607,645,711,733,768,829,849,870,888,906,924,962,999],{"type":32,"tag":87,"props":502,"children":503},{"class":89,"line":90},[504],{"type":32,"tag":87,"props":505,"children":506},{"style":104},[507],{"type":37,"value":142},{"type":32,"tag":87,"props":509,"children":510},{"class":89,"line":100},[511,516,520,525,529],{"type":32,"tag":87,"props":512,"children":513},{"style":149},[514],{"type":37,"value":515},"  a",{"type":32,"tag":87,"props":517,"children":518},{"style":155},[519],{"type":37,"value":158},{"type":32,"tag":87,"props":521,"children":522},{"style":149},[523],{"type":37,"value":524},"session_id",{"type":32,"tag":87,"props":526,"children":527},{"style":104},[528],{"type":37,"value":168},{"type":32,"tag":87,"props":530,"children":531},{"style":155},[532],{"type":37,"value":533}," session_a,\n",{"type":32,"tag":87,"props":535,"children":536},{"class":89,"line":136},[537,542,546,550,554],{"type":32,"tag":87,"props":538,"children":539},{"style":149},[540],{"type":37,"value":541},"  b",{"type":32,"tag":87,"props":543,"children":544},{"style":155},[545],{"type":37,"value":158},{"type":32,"tag":87,"props":547,"children":548},{"style":149},[549],{"type":37,"value":524},{"type":32,"tag":87,"props":551,"children":552},{"style":104},[553],{"type":37,"value":168},{"type":32,"tag":87,"props":555,"children":556},{"style":155},[557],{"type":37,"value":558}," session_b,\n",{"type":32,"tag":87,"props":560,"children":561},{"class":89,"line":145},[562],{"type":32,"tag":87,"props":563,"children":564},{"style":104},[565],{"type":37,"value":566},"  CASE\n",{"type":32,"tag":87,"props":568,"children":569},{"class":89,"line":176},[570,575,580,584,589,593,598,602],{"type":32,"tag":87,"props":571,"children":572},{"style":104},[573],{"type":37,"value":574},"    WHEN",{"type":32,"tag":87,"props":576,"children":577},{"style":149},[578],{"type":37,"value":579}," a",{"type":32,"tag":87,"props":581,"children":582},{"style":155},[583],{"type":37,"value":158},{"type":32,"tag":87,"props":585,"children":586},{"style":149},[587],{"type":37,"value":588},"ip_address",{"type":32,"tag":87,"props":590,"children":591},{"style":104},[592],{"type":37,"value":328},{"type":32,"tag":87,"props":594,"children":595},{"style":149},[596],{"type":37,"value":597}," b",{"type":32,"tag":87,"props":599,"children":600},{"style":155},[601],{"type":37,"value":158},{"type":32,"tag":87,"props":603,"children":604},{"style":149},[605],{"type":37,"value":606},"ip_address\n",{"type":32,"tag":87,"props":608,"children":609},{"class":89,"line":203},[610,615,619,623,628,632,636,640],{"type":32,"tag":87,"props":611,"children":612},{"style":104},[613],{"type":37,"value":614},"      AND",{"type":32,"tag":87,"props":616,"children":617},{"style":149},[618],{"type":37,"value":579},{"type":32,"tag":87,"props":620,"children":621},{"style":155},[622],{"type":37,"value":158},{"type":32,"tag":87,"props":624,"children":625},{"style":149},[626],{"type":37,"value":627},"canvas_hash",{"type":32,"tag":87,"props":629,"children":630},{"style":104},[631],{"type":37,"value":328},{"type":32,"tag":87,"props":633,"children":634},{"style":149},[635],{"type":37,"value":597},{"type":32,"tag":87,"props":637,"children":638},{"style":155},[639],{"type":37,"value":158},{"type":32,"tag":87,"props":641,"children":642},{"style":149},[643],{"type":37,"value":644},"canvas_hash\n",{"type":32,"tag":87,"props":646,"children":647},{"class":89,"line":224},[648,652,657,662,666,671,675,680,684,688,692,697,701,706],{"type":32,"tag":87,"props":649,"children":650},{"style":104},[651],{"type":37,"value":614},{"type":32,"tag":87,"props":653,"children":654},{"style":155},[655],{"type":37,"value":656}," TIMESTAMP_DIFF(",{"type":32,"tag":87,"props":658,"children":659},{"style":149},[660],{"type":37,"value":661},"b",{"type":32,"tag":87,"props":663,"children":664},{"style":155},[665],{"type":37,"value":158},{"type":32,"tag":87,"props":667,"children":668},{"style":149},[669],{"type":37,"value":670},"timestamp",{"type":32,"tag":87,"props":672,"children":673},{"style":155},[674],{"type":37,"value":446},{"type":32,"tag":87,"props":676,"children":677},{"style":149},[678],{"type":37,"value":679},"a",{"type":32,"tag":87,"props":681,"children":682},{"style":155},[683],{"type":37,"value":158},{"type":32,"tag":87,"props":685,"children":686},{"style":149},[687],{"type":37,"value":670},{"type":32,"tag":87,"props":689,"children":690},{"style":155},[691],{"type":37,"value":446},{"type":32,"tag":87,"props":693,"children":694},{"style":104},[695],{"type":37,"value":696},"MINUTE",{"type":32,"tag":87,"props":698,"children":699},{"style":155},[700],{"type":37,"value":254},{"type":32,"tag":87,"props":702,"children":703},{"style":104},[704],{"type":37,"value":705},"\u003C=",{"type":32,"tag":87,"props":707,"children":708},{"style":149},[709],{"type":37,"value":710}," 5\n",{"type":32,"tag":87,"props":712,"children":713},{"class":89,"line":267},[714,719,724,728],{"type":32,"tag":87,"props":715,"children":716},{"style":104},[717],{"type":37,"value":718},"    THEN",{"type":32,"tag":87,"props":720,"children":721},{"style":149},[722],{"type":37,"value":723}," 0",{"type":32,"tag":87,"props":725,"children":726},{"style":155},[727],{"type":37,"value":158},{"type":32,"tag":87,"props":729,"children":730},{"style":149},[731],{"type":37,"value":732},"90\n",{"type":32,"tag":87,"props":734,"children":735},{"class":89,"line":26},[736,740,744,748,752,756,760,764],{"type":32,"tag":87,"props":737,"children":738},{"style":104},[739],{"type":37,"value":574},{"type":32,"tag":87,"props":741,"children":742},{"style":149},[743],{"type":37,"value":579},{"type":32,"tag":87,"props":745,"children":746},{"style":155},[747],{"type":37,"value":158},{"type":32,"tag":87,"props":749,"children":750},{"style":149},[751],{"type":37,"value":588},{"type":32,"tag":87,"props":753,"children":754},{"style":104},[755],{"type":37,"value":328},{"type":32,"tag":87,"props":757,"children":758},{"style":149},[759],{"type":37,"value":597},{"type":32,"tag":87,"props":761,"children":762},{"style":155},[763],{"type":37,"value":158},{"type":32,"tag":87,"props":765,"children":766},{"style":149},[767],{"type":37,"value":606},{"type":32,"tag":87,"props":769,"children":770},{"class":89,"line":304},[771,775,779,783,787,791,795,799,803,807,811,816,820,824],{"type":32,"tag":87,"props":772,"children":773},{"style":104},[774],{"type":37,"value":614},{"type":32,"tag":87,"props":776,"children":777},{"style":155},[778],{"type":37,"value":656},{"type":32,"tag":87,"props":780,"children":781},{"style":149},[782],{"type":37,"value":661},{"type":32,"tag":87,"props":784,"children":785},{"style":155},[786],{"type":37,"value":158},{"type":32,"tag":87,"props":788,"children":789},{"style":149},[790],{"type":37,"value":670},{"type":32,"tag":87,"props":792,"children":793},{"style":155},[794],{"type":37,"value":446},{"type":32,"tag":87,"props":796,"children":797},{"style":149},[798],{"type":37,"value":679},{"type":32,"tag":87,"props":800,"children":801},{"style":155},[802],{"type":37,"value":158},{"type":32,"tag":87,"props":804,"children":805},{"style":149},[806],{"type":37,"value":670},{"type":32,"tag":87,"props":808,"children":809},{"style":155},[810],{"type":37,"value":446},{"type":32,"tag":87,"props":812,"children":813},{"style":104},[814],{"type":37,"value":815},"HOUR",{"type":32,"tag":87,"props":817,"children":818},{"style":155},[819],{"type":37,"value":254},{"type":32,"tag":87,"props":821,"children":822},{"style":104},[823],{"type":37,"value":705},{"type":32,"tag":87,"props":825,"children":826},{"style":149},[827],{"type":37,"value":828}," 2\n",{"type":32,"tag":87,"props":830,"children":831},{"class":89,"line":345},[832,836,840,844],{"type":32,"tag":87,"props":833,"children":834},{"style":104},[835],{"type":37,"value":718},{"type":32,"tag":87,"props":837,"children":838},{"style":149},[839],{"type":37,"value":723},{"type":32,"tag":87,"props":841,"children":842},{"style":155},[843],{"type":37,"value":158},{"type":32,"tag":87,"props":845,"children":846},{"style":149},[847],{"type":37,"value":848},"40\n",{"type":32,"tag":87,"props":850,"children":851},{"class":89,"line":371},[852,857,861,865],{"type":32,"tag":87,"props":853,"children":854},{"style":104},[855],{"type":37,"value":856},"    ELSE",{"type":32,"tag":87,"props":858,"children":859},{"style":149},[860],{"type":37,"value":723},{"type":32,"tag":87,"props":862,"children":863},{"style":155},[864],{"type":37,"value":158},{"type":32,"tag":87,"props":866,"children":867},{"style":149},[868],{"type":37,"value":869},"0\n",{"type":32,"tag":87,"props":871,"children":873},{"class":89,"line":872},13,[874,879,883],{"type":32,"tag":87,"props":875,"children":876},{"style":104},[877],{"type":37,"value":878},"  END",{"type":32,"tag":87,"props":880,"children":881},{"style":104},[882],{"type":37,"value":168},{"type":32,"tag":87,"props":884,"children":885},{"style":155},[886],{"type":37,"value":887}," match_score\n",{"type":32,"tag":87,"props":889,"children":891},{"class":89,"line":890},14,[892,896,901],{"type":32,"tag":87,"props":893,"children":894},{"style":104},[895],{"type":37,"value":273},{"type":32,"tag":87,"props":897,"children":898},{"style":125},[899],{"type":37,"value":900}," `project.dataset.anonymous_sessions`",{"type":32,"tag":87,"props":902,"children":903},{"style":155},[904],{"type":37,"value":905}," a\n",{"type":32,"tag":87,"props":907,"children":909},{"class":89,"line":908},15,[910,915,919],{"type":32,"tag":87,"props":911,"children":912},{"style":104},[913],{"type":37,"value":914},"CROSS JOIN",{"type":32,"tag":87,"props":916,"children":917},{"style":125},[918],{"type":37,"value":900},{"type":32,"tag":87,"props":920,"children":921},{"style":155},[922],{"type":37,"value":923}," b\n",{"type":32,"tag":87,"props":925,"children":927},{"class":89,"line":926},16,[928,932,936,940,944,949,953,957],{"type":32,"tag":87,"props":929,"children":930},{"style":104},[931],{"type":37,"value":351},{"type":32,"tag":87,"props":933,"children":934},{"style":149},[935],{"type":37,"value":579},{"type":32,"tag":87,"props":937,"children":938},{"style":155},[939],{"type":37,"value":158},{"type":32,"tag":87,"props":941,"children":942},{"style":149},[943],{"type":37,"value":524},{"type":32,"tag":87,"props":945,"children":946},{"style":104},[947],{"type":37,"value":948}," \u003C",{"type":32,"tag":87,"props":950,"children":951},{"style":149},[952],{"type":37,"value":597},{"type":32,"tag":87,"props":954,"children":955},{"style":155},[956],{"type":37,"value":158},{"type":32,"tag":87,"props":958,"children":959},{"style":149},[960],{"type":37,"value":961},"session_id\n",{"type":32,"tag":87,"props":963,"children":965},{"class":89,"line":964},17,[966,971,975,979,983,987,991,995],{"type":32,"tag":87,"props":967,"children":968},{"style":104},[969],{"type":37,"value":970},"  AND",{"type":32,"tag":87,"props":972,"children":973},{"style":149},[974],{"type":37,"value":579},{"type":32,"tag":87,"props":976,"children":977},{"style":155},[978],{"type":37,"value":158},{"type":32,"tag":87,"props":980,"children":981},{"style":149},[982],{"type":37,"value":588},{"type":32,"tag":87,"props":984,"children":985},{"style":104},[986],{"type":37,"value":328},{"type":32,"tag":87,"props":988,"children":989},{"style":149},[990],{"type":37,"value":597},{"type":32,"tag":87,"props":992,"children":993},{"style":155},[994],{"type":37,"value":158},{"type":32,"tag":87,"props":996,"children":997},{"style":149},[998],{"type":37,"value":606},{"type":32,"tag":87,"props":1000,"children":1002},{"class":89,"line":1001},18,[1003,1008,1013,1017,1021,1026],{"type":32,"tag":87,"props":1004,"children":1005},{"style":155},[1006],{"type":37,"value":1007},"QUALIFY match_score ",{"type":32,"tag":87,"props":1009,"children":1010},{"style":104},[1011],{"type":37,"value":1012},">=",{"type":32,"tag":87,"props":1014,"children":1015},{"style":149},[1016],{"type":37,"value":723},{"type":32,"tag":87,"props":1018,"children":1019},{"style":155},[1020],{"type":37,"value":158},{"type":32,"tag":87,"props":1022,"children":1023},{"style":149},[1024],{"type":37,"value":1025},"70",{"type":32,"tag":87,"props":1027,"children":1028},{"style":155},[1029],{"type":37,"value":406},{"type":32,"tag":33,"props":1031,"children":1032},{},[1033,1035,1040,1042,1048,1050,1055],{"type":37,"value":1034},"Ce ",{"type":32,"tag":52,"props":1036,"children":1038},{"className":1037},[],[1039],{"type":37,"value":914},{"type":37,"value":1041}," fait exploser le coût sur millions de lignes. En production, il faut du windowing ou du bucketing : partitionne par préfixe IP (ex. ",{"type":32,"tag":52,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":37,"value":1047},"\u002F24",{"type":37,"value":1049}," CIDR), compare seulement les 100 dernières sessions par bucket avec ",{"type":32,"tag":52,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":37,"value":432},{"type":37,"value":1056},". Le risque du probabilistic matching : faux positifs — deux utilisateurs différents sur le même IP (Wi-Fi bureau, VPN partagé) à la même heure pourraient fusionner à tort. C'est pourquoi le seuil doit rester entre 0.85–0.90 et validé par des signaux cross-device.",{"type":32,"tag":33,"props":1058,"children":1059},{},[1060,1062,1068,1070,1075],{"type":37,"value":1061},"Un modèle probabiliste ML est plus sophistiqué : régression logistique ou gradient boosting pour classifier « même utilisateur ». Feature set : distance Hamming sur IP, similarité Levenshtein sur user agent, décalage timezone, nombre de sessions. Les données d'entraînement étiquetées viennent de paires ",{"type":32,"tag":52,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":37,"value":1067},"user_id",{"type":37,"value":1069}," connues (positives) vs ",{"type":32,"tag":52,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":37,"value":1067},{"type":37,"value":1076}," différents (négatives). Le modèle sort un score 0-1, le seuil reste un paramètre manuel. Construire cette approche nécessite un pipeline Vertex AI ou SageMaker — l'engineering données et ML travaillent ensemble.",{"type":32,"tag":40,"props":1078,"children":1080},{"id":1079},"household-identity-même-ip-utilisateurs-différents",[1081],{"type":37,"value":1082},"Household Identity: Même IP, Utilisateurs Différents",{"type":32,"tag":33,"props":1084,"children":1085},{},[1086,1088,1093,1095,1101],{"type":37,"value":1087},"La couche « household » dans identity resolution : grouper les utilisateurs différents depuis la même IP ou adresse physique et les traiter comme une « unité foyer » pour le ciblage marketing. Exemple : sur un e-commerce, la mère regarde des vêtements enfant, le père achète de l'électronique — deux ",{"type":32,"tag":52,"props":1089,"children":1091},{"className":1090},[],[1092],{"type":37,"value":1067},{"type":37,"value":1094}," distincts mais même adresse de livraison. Le household graph les réunit sous un ",{"type":32,"tag":52,"props":1096,"children":1098},{"className":1097},[],[1099],{"type":37,"value":1100},"household_id",{"type":37,"value":1102},". Sur les plateformes publicitaires (Facebook Ads, Google Ads), cela s'appelle « household targeting », mais tu dois le modéliser toi-même dans tes first-party data.",{"type":32,"tag":33,"props":1104,"children":1105},{},[1106,1108,1114],{"type":37,"value":1107},"Normalise l'adresse de livraison en BigQuery : casse, espaces, numéro d'appartement variés. Puis hashifie et utilise-la comme ",{"type":32,"tag":52,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":37,"value":1113},"household_key",{"type":37,"value":493},{"type":32,"tag":77,"props":1116,"children":1118},{"className":79,"code":1117,"language":81,"meta":16,"style":16},"CREATE OR REPLACE TABLE `project.dataset.household_mapping` AS\nSELECT\n  user_id,\n  TO_HEX(SHA256(\n    LOWER(REGEXP_REPLACE(CONCAT(street, city, postal_code), r'\\s+', ''))\n  )) AS household_key\nFROM `project.dataset.user_addresses`\nWHERE street IS NOT NULL AND postal_code IS NOT NULL;\n",[1119],{"type":32,"tag":52,"props":1120,"children":1121},{"__ignoreMap":16},[1122,1150,1157,1165,1173,1215,1232,1244],{"type":32,"tag":87,"props":1123,"children":1124},{"class":89,"line":90},[1125,1129,1133,1137,1141,1146],{"type":32,"tag":87,"props":1126,"children":1127},{"style":104},[1128],{"type":37,"value":107},{"type":32,"tag":87,"props":1130,"children":1131},{"style":104},[1132],{"type":37,"value":112},{"type":32,"tag":87,"props":1134,"children":1135},{"style":104},[1136],{"type":37,"value":117},{"type":32,"tag":87,"props":1138,"children":1139},{"style":104},[1140],{"type":37,"value":122},{"type":32,"tag":87,"props":1142,"children":1143},{"style":125},[1144],{"type":37,"value":1145}," `project.dataset.household_mapping`",{"type":32,"tag":87,"props":1147,"children":1148},{"style":104},[1149],{"type":37,"value":133},{"type":32,"tag":87,"props":1151,"children":1152},{"class":89,"line":100},[1153],{"type":32,"tag":87,"props":1154,"children":1155},{"style":104},[1156],{"type":37,"value":142},{"type":32,"tag":87,"props":1158,"children":1159},{"class":89,"line":136},[1160],{"type":32,"tag":87,"props":1161,"children":1162},{"style":155},[1163],{"type":37,"value":1164},"  user_id,\n",{"type":32,"tag":87,"props":1166,"children":1167},{"class":89,"line":145},[1168],{"type":32,"tag":87,"props":1169,"children":1170},{"style":155},[1171],{"type":37,"value":1172},"  TO_HEX(SHA256(\n",{"type":32,"tag":87,"props":1174,"children":1175},{"class":89,"line":176},[1176,1181,1186,1191,1196,1201,1205,1210],{"type":32,"tag":87,"props":1177,"children":1178},{"style":149},[1179],{"type":37,"value":1180},"    LOWER",{"type":32,"tag":87,"props":1182,"children":1183},{"style":155},[1184],{"type":37,"value":1185},"(REGEXP_REPLACE(",{"type":32,"tag":87,"props":1187,"children":1188},{"style":149},[1189],{"type":37,"value":1190},"CONCAT",{"type":32,"tag":87,"props":1192,"children":1193},{"style":155},[1194],{"type":37,"value":1195},"(street, city, postal_code), r",{"type":32,"tag":87,"props":1197,"children":1198},{"style":125},[1199],{"type":37,"value":1200},"'\\s+'",{"type":32,"tag":87,"props":1202,"children":1203},{"style":155},[1204],{"type":37,"value":446},{"type":32,"tag":87,"props":1206,"children":1207},{"style":125},[1208],{"type":37,"value":1209},"''",{"type":32,"tag":87,"props":1211,"children":1212},{"style":155},[1213],{"type":37,"value":1214},"))\n",{"type":32,"tag":87,"props":1216,"children":1217},{"class":89,"line":203},[1218,1223,1227],{"type":32,"tag":87,"props":1219,"children":1220},{"style":155},[1221],{"type":37,"value":1222},"  )) ",{"type":32,"tag":87,"props":1224,"children":1225},{"style":104},[1226],{"type":37,"value":259},{"type":32,"tag":87,"props":1228,"children":1229},{"style":155},[1230],{"type":37,"value":1231}," household_key\n",{"type":32,"tag":87,"props":1233,"children":1234},{"class":89,"line":224},[1235,1239],{"type":32,"tag":87,"props":1236,"children":1237},{"style":104},[1238],{"type":37,"value":273},{"type":32,"tag":87,"props":1240,"children":1241},{"style":125},[1242],{"type":37,"value":1243}," `project.dataset.user_addresses`\n",{"type":32,"tag":87,"props":1245,"children":1246},{"class":89,"line":267},[1247,1251,1256,1261,1266,1271,1275],{"type":32,"tag":87,"props":1248,"children":1249},{"style":104},[1250],{"type":37,"value":351},{"type":32,"tag":87,"props":1252,"children":1253},{"style":155},[1254],{"type":37,"value":1255}," street ",{"type":32,"tag":87,"props":1257,"children":1258},{"style":104},[1259],{"type":37,"value":1260},"IS NOT NULL",{"type":32,"tag":87,"props":1262,"children":1263},{"style":104},[1264],{"type":37,"value":1265}," AND",{"type":32,"tag":87,"props":1267,"children":1268},{"style":155},[1269],{"type":37,"value":1270}," postal_code ",{"type":32,"tag":87,"props":1272,"children":1273},{"style":104},[1274],{"type":37,"value":1260},{"type":32,"tag":87,"props":1276,"children":1277},{"style":155},[1278],{"type":37,"value":406},{"type":32,"tag":33,"props":1280,"children":1281},{},[1282,1284,1289,1291,1296,1298,1303,1305,1310],{"type":37,"value":1283},"Cette table mappe ",{"type":32,"tag":52,"props":1285,"children":1287},{"className":1286},[],[1288],{"type":37,"value":1067},{"type":37,"value":1290}," → ",{"type":32,"tag":52,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":37,"value":1113},{"type":37,"value":1297},". Groupe les utilisateurs avec la même ",{"type":32,"tag":52,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":37,"value":1113},{"type":37,"value":1304}," et assigne-leur un ",{"type":32,"tag":52,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":37,"value":1100},{"type":37,"value":1311},". L'household identity diffère de l'identity cross-device — pas les appareils d'une même personne, mais les personnes du même foyer. Risque de confidentialité élevé : fusionner deux adultes différents sous le même household viole le principe de minimisation de données (KVKK art. 5). Utilise le household graph uniquement pour les analyses agrégées et le ciblage anonyme, pas pour fusionner les profils individuels.",{"type":32,"tag":33,"props":1313,"children":1314},{},[1315,1317,1325],{"type":37,"value":1316},"Signaux supplémentaires au household graph : hash SSID Wi-Fi (si l'app mobile a permission), beacon Bluetooth (magasin physique), shared payment method (même carte de crédit). Ces signaux sont PII — besoin de hash + encrypted storage. Les CDP (Segment, mParticle, RudderStack) offrent une « relationship graph » intégrée, mais tu gagnes plus de contrôle en le bâtissant manuellement en BigQuery — tu vois exactement quel signal a quel poids. Le travail de Roibase sur ",{"type":32,"tag":679,"props":1318,"children":1322},{"href":1319,"rel":1320},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fretention-engineering-cdp",[1321],"nofollow",[1323],{"type":37,"value":1324},"CDP & Retention Engineering",{"type":37,"value":1326}," intègre cette couche dans un pipeline production.",{"type":32,"tag":40,"props":1328,"children":1330},{"id":1329},"graph-database-vs-relational-qui-est-plus-rapide",[1331],{"type":37,"value":1332},"Graph Database vs Relational: Qui Est Plus Rapide",{"type":32,"tag":33,"props":1334,"children":1335},{},[1336,1338,1344,1346,1352,1354,1360],{"type":37,"value":1337},"Stocker un identity graph dans une warehouse relationnelle comme BigQuery c'est possible, mais interroger les chaînes « A → B → C » (transitive closure) coûte cher. Une graph database (Neo4j, Amazon Neptune, TigerGraph) le fait en structure node\u002Fedge — « trouver tous les appareils d'un utilisateur » avec ",{"type":32,"tag":52,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":37,"value":1343},"MATCH (u:User)-[:HAS_DEVICE]->(d:Device)",{"type":37,"value":1345}," revient en millisecondes. En BigQuery, le même besoin s'écrit avec ",{"type":32,"tag":52,"props":1347,"children":1349},{"className":1348},[],[1350],{"type":37,"value":1351},"RECURSIVE CTE",{"type":37,"value":1353}," ou ",{"type":32,"tag":52,"props":1355,"children":1357},{"className":1356},[],[1358],{"type":37,"value":1359},"ARRAY_AGG",{"type":37,"value":1361}," — le coût en slots monte.",{"type":32,"tag":33,"props":1363,"children":1364},{},[1365],{"type":37,"value":1366},"Compromis : graph DB très rapide mais schema inflexible, le modèle node\u002Fedge est différent de la syntaxe SQL qu'les data engineers connaissent. La warehouse relationnelle est plus lente mais version control avec dbt, tests et documentation sont simples. La plupart des environnements production choisissent l'hybride : construis le mapping d'identité quotidien en BigQuery via dbt, sync-le vers Neo4j, fais les lookups temps réel depuis Neo4j. Pipeline exemple : dbt model → BigQuery view → Cloud Function trigger → Neo4j Cypher INSERT.",{"type":32,"tag":77,"props":1368,"children":1370},{"className":79,"code":1369,"language":81,"meta":16,"style":16},"-- BigQuery: transitive closure avec CTE récursive (lent)\nWITH RECURSIVE identity_chain AS (\n  SELECT signal_a, signal_b, 1 AS depth\n  FROM `project.dataset.identity_edges`\n  UNION ALL\n  SELECT ic.signal_a, e.signal_b, ic.depth + 1\n  FROM identity_chain ic\n  JOIN `project.dataset.identity_edges` e\n    ON ic.signal_b = e.signal_a\n  WHERE ic.depth \u003C 5\n)\nSELECT DISTINCT signal_a, signal_b\nFROM identity_chain;\n",[1371],{"type":32,"tag":52,"props":1372,"children":1373},{"__ignoreMap":16},[1374,1382,1409,1436,1449,1457,1524,1536,1554,1592,1620,1628,1641],{"type":32,"tag":87,"props":1375,"children":1376},{"class":89,"line":90},[1377],{"type":32,"tag":87,"props":1378,"children":1379},{"style":94},[1380],{"type":37,"value":1381},"-- BigQuery: transitive closure avec CTE récursive (lent)\n",{"type":32,"tag":87,"props":1383,"children":1384},{"class":89,"line":100},[1385,1390,1395,1400,1404],{"type":32,"tag":87,"props":1386,"children":1387},{"style":104},[1388],{"type":37,"value":1389},"WITH",{"type":32,"tag":87,"props":1391,"children":1392},{"style":104},[1393],{"type":37,"value":1394}," RECURSIVE",{"type":32,"tag":87,"props":1396,"children":1397},{"style":155},[1398],{"type":37,"value":1399}," identity_chain ",{"type":32,"tag":87,"props":1401,"children":1402},{"style":104},[1403],{"type":37,"value":259},{"type":32,"tag":87,"props":1405,"children":1406},{"style":155},[1407],{"type":37,"value":1408}," (\n",{"type":32,"tag":87,"props":1410,"children":1411},{"class":89,"line":136},[1412,1417,1422,1427,1431],{"type":32,"tag":87,"props":1413,"children":1414},{"style":104},[1415],{"type":37,"value":1416},"  SELECT",{"type":32,"tag":87,"props":1418,"children":1419},{"style":155},[1420],{"type":37,"value":1421}," signal_a, signal_b, ",{"type":32,"tag":87,"props":1423,"children":1424},{"style":149},[1425],{"type":37,"value":1426},"1",{"type":32,"tag":87,"props":1428,"children":1429},{"style":104},[1430],{"type":37,"value":168},{"type":32,"tag":87,"props":1432,"children":1433},{"style":155},[1434],{"type":37,"value":1435}," depth\n",{"type":32,"tag":87,"props":1437,"children":1438},{"class":89,"line":145},[1439,1444],{"type":32,"tag":87,"props":1440,"children":1441},{"style":104},[1442],{"type":37,"value":1443},"  FROM",{"type":32,"tag":87,"props":1445,"children":1446},{"style":125},[1447],{"type":37,"value":1448}," `project.dataset.identity_edges`\n",{"type":32,"tag":87,"props":1450,"children":1451},{"class":89,"line":176},[1452],{"type":32,"tag":87,"props":1453,"children":1454},{"style":104},[1455],{"type":37,"value":1456},"  UNION ALL\n",{"type":32,"tag":87,"props":1458,"children":1459},{"class":89,"line":203},[1460,1464,1469,1473,1478,1482,1487,1491,1496,1500,1505,1509,1514,1519],{"type":32,"tag":87,"props":1461,"children":1462},{"style":104},[1463],{"type":37,"value":1416},{"type":32,"tag":87,"props":1465,"children":1466},{"style":149},[1467],{"type":37,"value":1468}," ic",{"type":32,"tag":87,"props":1470,"children":1471},{"style":155},[1472],{"type":37,"value":158},{"type":32,"tag":87,"props":1474,"children":1475},{"style":149},[1476],{"type":37,"value":1477},"signal_a",{"type":32,"tag":87,"props":1479,"children":1480},{"style":155},[1481],{"type":37,"value":446},{"type":32,"tag":87,"props":1483,"children":1484},{"style":149},[1485],{"type":37,"value":1486},"e",{"type":32,"tag":87,"props":1488,"children":1489},{"style":155},[1490],{"type":37,"value":158},{"type":32,"tag":87,"props":1492,"children":1493},{"style":149},[1494],{"type":37,"value":1495},"signal_b",{"type":32,"tag":87,"props":1497,"children":1498},{"style":155},[1499],{"type":37,"value":446},{"type":32,"tag":87,"props":1501,"children":1502},{"style":149},[1503],{"type":37,"value":1504},"ic",{"type":32,"tag":87,"props":1506,"children":1507},{"style":155},[1508],{"type":37,"value":158},{"type":32,"tag":87,"props":1510,"children":1511},{"style":149},[1512],{"type":37,"value":1513},"depth",{"type":32,"tag":87,"props":1515,"children":1516},{"style":104},[1517],{"type":37,"value":1518}," +",{"type":32,"tag":87,"props":1520,"children":1521},{"style":149},[1522],{"type":37,"value":1523}," 1\n",{"type":32,"tag":87,"props":1525,"children":1526},{"class":89,"line":224},[1527,1531],{"type":32,"tag":87,"props":1528,"children":1529},{"style":104},[1530],{"type":37,"value":1443},{"type":32,"tag":87,"props":1532,"children":1533},{"style":155},[1534],{"type":37,"value":1535}," identity_chain ic\n",{"type":32,"tag":87,"props":1537,"children":1538},{"class":89,"line":267},[1539,1544,1549],{"type":32,"tag":87,"props":1540,"children":1541},{"style":104},[1542],{"type":37,"value":1543},"  JOIN",{"type":32,"tag":87,"props":1545,"children":1546},{"style":125},[1547],{"type":37,"value":1548}," `project.dataset.identity_edges`",{"type":32,"tag":87,"props":1550,"children":1551},{"style":155},[1552],{"type":37,"value":1553}," e\n",{"type":32,"tag":87,"props":1555,"children":1556},{"class":89,"line":26},[1557,1562,1566,1570,1574,1578,1583,1587],{"type":32,"tag":87,"props":1558,"children":1559},{"style":104},[1560],{"type":37,"value":1561},"    ON",{"type":32,"tag":87,"props":1563,"children":1564},{"style":149},[1565],{"type":37,"value":1468},{"type":32,"tag":87,"props":1567,"children":1568},{"style":155},[1569],{"type":37,"value":158},{"type":32,"tag":87,"props":1571,"children":1572},{"style":149},[1573],{"type":37,"value":1495},{"type":32,"tag":87,"props":1575,"children":1576},{"style":104},[1577],{"type":37,"value":328},{"type":32,"tag":87,"props":1579,"children":1580},{"style":149},[1581],{"type":37,"value":1582}," e",{"type":32,"tag":87,"props":1584,"children":1585},{"style":155},[1586],{"type":37,"value":158},{"type":32,"tag":87,"props":1588,"children":1589},{"style":149},[1590],{"type":37,"value":1591},"signal_a\n",{"type":32,"tag":87,"props":1593,"children":1594},{"class":89,"line":304},[1595,1600,1604,1608,1612,1616],{"type":32,"tag":87,"props":1596,"children":1597},{"style":104},[1598],{"type":37,"value":1599},"  WHERE",{"type":32,"tag":87,"props":1601,"children":1602},{"style":149},[1603],{"type":37,"value":1468},{"type":32,"tag":87,"props":1605,"children":1606},{"style":155},[1607],{"type":37,"value":158},{"type":32,"tag":87,"props":1609,"children":1610},{"style":149},[1611],{"type":37,"value":1513},{"type":32,"tag":87,"props":1613,"children":1614},{"style":104},[1615],{"type":37,"value":948},{"type":32,"tag":87,"props":1617,"children":1618},{"style":149},[1619],{"type":37,"value":710},{"type":32,"tag":87,"props":1621,"children":1622},{"class":89,"line":345},[1623],{"type":32,"tag":87,"props":1624,"children":1625},{"style":155},[1626],{"type":37,"value":1627},")\n",{"type":32,"tag":87,"props":1629,"children":1630},{"class":89,"line":371},[1631,1636],{"type":32,"tag":87,"props":1632,"children":1633},{"style":104},[1634],{"type":37,"value":1635},"SELECT DISTINCT",{"type":32,"tag":87,"props":1637,"children":1638},{"style":155},[1639],{"type":37,"value":1640}," signal_a, signal_b\n",{"type":32,"tag":87,"props":1642,"children":1643},{"class":89,"line":872},[1644,1648],{"type":32,"tag":87,"props":1645,"children":1646},{"style":104},[1647],{"type":37,"value":273},{"type":32,"tag":87,"props":1649,"children":1650},{"style":155},[1651],{"type":37,"value":1652}," identity_chain;\n",{"type":32,"tag":33,"props":1654,"children":1655},{},[1656],{"type":37,"value":1657},"Cette requête suit des chaînes jusqu'à 5 niveaux (depth). Sans limite de depth, risque de boucle infinie — A → B → A. Une graph DB gère les boucles nativement, BigQuery besoin d'une condition WHERE manuelle. Si ton graph atteint 10M+ edges, un système dédié comme Neo4j devient plus maintenable. Sous 1M edges, BigQuery + dbt suffisent.",{"type":32,"tag":40,"props":1659,"children":1661},{"id":1660},"privacy-et-consentement-les-limites-légales-du-graph-didentité",[1662],{"type":37,"value":1663},"Privacy et Consentement: Les Limites Légales du Graph d'Identité",{"type":32,"tag":33,"props":1665,"children":1666},{},[1667],{"type":37,"value":1668},"Identity resolution rentre dans « profiling » au sens du RGPD (art. 4 pt 4). Sans consentement utilisateur, le hash matching + probabilistic linking pose risque légal. Consent Mode v2 (Google) sépare « analytics_storage » et « ad_storage » mais pour l'identity stitching tu pourrais avoir besoin d'une catégorie « personalization_storage ». TCF 2.2 impose Purpose 1 (device storage) + Purpose 9 (personalized ads) — sans les deux, même le hash matching est illégal.",{"type":32,"tag":33,"props":1670,"children":1671},{},[1672],{"type":37,"value":1673},"L'email hashé compte comme « pseudonymous data » en RGPD (Considérant 26) — c'est toujours une donnée personnelle. Si quelqu'un peut inverser le hash ou faire une reverse lookup, ce n'est pas « anonymization » mais « pseudonymization ». Ajoute un salt (email + secret spécifique au site → SHA-256) et stocke le salt dans un HSM (Hardware Security Module) ou Secret Manager. Si l'utilisateur demande une restriction (RGPD art. 18), supprime-lui les edges du graph.",{"type":32,"tag":33,"props":1675,"children":1676},{},[1677,1679,1685,1687,1692,1694,1700,1702,1708],{"type":37,"value":1678},"KVKK art. 7 : « Le consentement explicite est le consentement librement donné, spécifique, éclairé et sans ambiguïté quant au traitement des données à caractère personnel. » Identity stitching doit être décrit ",{"type":32,"tag":1680,"props":1681,"children":1682},"em",{},[1683],{"type":37,"value":1684},"explicitement",{"type":37,"value":1686}," dans la notice de consentement — « meilleure expérience » est trop vague. Si l'utilisateur retire son consentement, supprime tous les edges pour ce ",{"type":32,"tag":52,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":37,"value":1067},{"type":37,"value":1693}," du graph et mark-le ",{"type":32,"tag":52,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":37,"value":1699},"deleted_at",{"type":37,"value":1701},". En BigQuery, soft delete suffit — filtre avec ",{"type":32,"tag":52,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":37,"value":1707},"WHERE deleted_at IS NULL",{"type":37,"value":1709}," plutôt que vrai suppression.",{"type":32,"tag":40,"props":1711,"children":1713},{"id":1712},"application-pipeline-identity-incrémental-avec-dbt",[1714],{"type":37,"value":1715},"Application: Pipeline Identity Incrémental avec dbt",{"type":32,"tag":33,"props":1717,"children":1718},{},[1719],{"type":37,"value":1720},"En production, identity resolution ne s'exécute pas une fois mais incrementalement — chaque jour ajoute de nouveaux signaux, update le graph. Utilise un modèle dbt incremental :",{"type":32,"tag":77,"props":1722,"children":1724},{"className":79,"code":1723,"language":81,"meta":16,"style":16},"{{\n  config(\n    materialized='incremental',\n    unique_key='edge_id',\n    partition_by={'field': 'created_date', 'data_type': 'date'},\n    cluster_by=['signal_a_type', 'signal_b_type']\n  )\n}}\n\nWITH new_edges AS (\n  SELECT\n    GENERATE_UUID() AS edge_id,\n    a.signal_id AS signal_a,\n    a.signal_type AS signal_a_type,\n    b.signal_id AS signal_b,\n    b.signal_type AS signal_b_type,\n    0.95 AS match_score,\n    CURRENT_DATE() AS created_date\n  FROM {{ ref('stg_hashed_emails') }} a\n  JOIN {{ ref('stg_device_ids') }} b\n    ON a.hashed_email = b.hashed_email\n  WHERE a.created_at >= CURRENT_DATE() - 1\n)\n\nSELECT * FROM new_edges\n\n{% if is_incremental() %}\nWHERE edge_id NOT IN (SELECT edge_id FROM {{ this }})\n{% endif %}\n",[1725],{"type":32,"tag":52,"props":1726,"children":1727},{"__ignoreMap":16},[1728,1736,1744,1766,1787,1842,1859,1867,1875,1884,1904,1912,1929,1955,1980,2005,2029,2055,2072,2095,2117,2153,2193,2201,2209,2233,2241,2260,2305],{"type":32,"tag":87,"props":1729,"children":1730},{"class":89,"line":90},[1731],{"type":32,"tag":87,"props":1732,"children":1733},{"style":155},[1734],{"type":37,"value":1735},"{{\n",{"type":32,"tag":87,"props":1737,"children":1738},{"class":89,"line":100},[1739],{"type":32,"tag":87,"props":1740,"children":1741},{"style":155},[1742],{"type":37,"value":1743},"  config(\n",{"type":32,"tag":87,"props":1745,"children":1746},{"class":89,"line":136},[1747,1752,1757,1762],{"type":32,"tag":87,"props":1748,"children":1749},{"style":155},[1750],{"type":37,"value":1751},"    materialized",{"type":32,"tag":87,"props":1753,"children":1754},{"style":104},[1755],{"type":37,"value":1756},"=",{"type":32,"tag":87,"props":1758,"children":1759},{"style":125},[1760],{"type":37,"value":1761},"'incremental'",{"type":32,"tag":87,"props":1763,"children":1764},{"style":155},[1765],{"type":37,"value":221},{"type":32,"tag":87,"props":1767,"children":1768},{"class":89,"line":145},[1769,1774,1778,1783],{"type":32,"tag":87,"props":1770,"children":1771},{"style":155},[1772],{"type":37,"value":1773},"    unique_key",{"type":32,"tag":87,"props":1775,"children":1776},{"style":104},[1777],{"type":37,"value":1756},{"type":32,"tag":87,"props":1779,"children":1780},{"style":125},[1781],{"type":37,"value":1782},"'edge_id'",{"type":32,"tag":87,"props":1784,"children":1785},{"style":155},[1786],{"type":37,"value":221},{"type":32,"tag":87,"props":1788,"children":1789},{"class":89,"line":176},[1790,1795,1799,1804,1809,1814,1819,1823,1828,1832,1837],{"type":32,"tag":87,"props":1791,"children":1792},{"style":155},[1793],{"type":37,"value":1794},"    partition_by",{"type":32,"tag":87,"props":1796,"children":1797},{"style":104},[1798],{"type":37,"value":1756},{"type":32,"tag":87,"props":1800,"children":1801},{"style":155},[1802],{"type":37,"value":1803},"{",{"type":32,"tag":87,"props":1805,"children":1806},{"style":125},[1807],{"type":37,"value":1808},"'field'",{"type":32,"tag":87,"props":1810,"children":1811},{"style":155},[1812],{"type":37,"value":1813},": ",{"type":32,"tag":87,"props":1815,"children":1816},{"style":125},[1817],{"type":37,"value":1818},"'created_date'",{"type":32,"tag":87,"props":1820,"children":1821},{"style":155},[1822],{"type":37,"value":446},{"type":32,"tag":87,"props":1824,"children":1825},{"style":125},[1826],{"type":37,"value":1827},"'data_type'",{"type":32,"tag":87,"props":1829,"children":1830},{"style":155},[1831],{"type":37,"value":1813},{"type":32,"tag":87,"props":1833,"children":1834},{"style":125},[1835],{"type":37,"value":1836},"'date'",{"type":32,"tag":87,"props":1838,"children":1839},{"style":155},[1840],{"type":37,"value":1841},"},\n",{"type":32,"tag":87,"props":1843,"children":1844},{"class":89,"line":203},[1845,1850,1854],{"type":32,"tag":87,"props":1846,"children":1847},{"style":155},[1848],{"type":37,"value":1849},"    cluster_by",{"type":32,"tag":87,"props":1851,"children":1852},{"style":104},[1853],{"type":37,"value":1756},{"type":32,"tag":87,"props":1855,"children":1856},{"style":155},[1857],{"type":37,"value":1858},"['signal_a_type', 'signal_b_type']\n",{"type":32,"tag":87,"props":1860,"children":1861},{"class":89,"line":224},[1862],{"type":32,"tag":87,"props":1863,"children":1864},{"style":155},[1865],{"type":37,"value":1866},"  )\n",{"type":32,"tag":87,"props":1868,"children":1869},{"class":89,"line":267},[1870],{"type":32,"tag":87,"props":1871,"children":1872},{"style":155},[1873],{"type":37,"value":1874},"}}\n",{"type":32,"tag":87,"props":1876,"children":1877},{"class":89,"line":26},[1878],{"type":32,"tag":87,"props":1879,"children":1881},{"emptyLinePlaceholder":1880},true,[1882],{"type":37,"value":1883},"\n",{"type":32,"tag":87,"props":1885,"children":1886},{"class":89,"line":304},[1887,1891,1896,1900],{"type":32,"tag":87,"props":1888,"children":1889},{"style":104},[1890],{"type":37,"value":1389},{"type":32,"tag":87,"props":1892,"children":1893},{"style":155},[1894],{"type":37,"value":1895}," new_edges ",{"type":32,"tag":87,"props":1897,"children":1898},{"style":104},[1899],{"type":37,"value":259},{"type":32,"tag":87,"props":1901,"children":1902},{"style":155},[1903],{"type":37,"value":1408},{"type":32,"tag":87,"props":1905,"children":1906},{"class":89,"line":345},[1907],{"type":32,"tag":87,"props":1908,"children":1909},{"style":104},[1910],{"type":37,"value":1911},"  SELECT\n",{"type":32,"tag":87,"props":1913,"children":1914},{"class":89,"line":371},[1915,1920,1924],{"type":32,"tag":87,"props":1916,"children":1917},{"style":155},[1918],{"type":37,"value":1919},"    GENERATE_UUID() ",{"type":32,"tag":87,"props":1921,"children":1922},{"style":104},[1923],{"type":37,"value":259},{"type":32,"tag":87,"props":1925,"children":1926},{"style":155},[1927],{"type":37,"value":1928}," edge_id,\n",{"type":32,"tag":87,"props":1930,"children":1931},{"class":89,"line":872},[1932,1937,1941,1946,1950],{"type":32,"tag":87,"props":1933,"children":1934},{"style":149},[1935],{"type":37,"value":1936},"    a",{"type":32,"tag":87,"props":1938,"children":1939},{"style":155},[1940],{"type":37,"value":158},{"type":32,"tag":87,"props":1942,"children":1943},{"style":149},[1944],{"type":37,"value":1945},"signal_id",{"type":32,"tag":87,"props":1947,"children":1948},{"style":104},[1949],{"type":37,"value":168},{"type":32,"tag":87,"props":1951,"children":1952},{"style":155},[1953],{"type":37,"value":1954}," signal_a,\n",{"type":32,"tag":87,"props":1956,"children":1957},{"class":89,"line":890},[1958,1962,1966,1971,1975],{"type":32,"tag":87,"props":1959,"children":1960},{"style":149},[1961],{"type":37,"value":1936},{"type":32,"tag":87,"props":1963,"children":1964},{"style":155},[1965],{"type":37,"value":158},{"type":32,"tag":87,"props":1967,"children":1968},{"style":149},[1969],{"type":37,"value":1970},"signal_type",{"type":32,"tag":87,"props":1972,"children":1973},{"style":104},[1974],{"type":37,"value":168},{"type":32,"tag":87,"props":1976,"children":1977},{"style":155},[1978],{"type":37,"value":1979}," signal_a_type,\n",{"type":32,"tag":87,"props":1981,"children":1982},{"class":89,"line":908},[1983,1988,1992,1996,2000],{"type":32,"tag":87,"props":1984,"children":1985},{"style":149},[1986],{"type":37,"value":1987},"    b",{"type":32,"tag":87,"props":1989,"children":1990},{"style":155},[1991],{"type":37,"value":158},{"type":32,"tag":87,"props":1993,"children":1994},{"style":149},[1995],{"type":37,"value":1945},{"type":32,"tag":87,"props":1997,"children":1998},{"style":104},[1999],{"type":37,"value":168},{"type":32,"tag":87,"props":2001,"children":2002},{"style":155},[2003],{"type":37,"value":2004}," signal_b,\n",{"type":32,"tag":87,"props":2006,"children":2007},{"class":89,"line":926},[2008,2012,2016,2020,2024],{"type":32,"tag":87,"props":2009,"children":2010},{"style":149},[2011],{"type":37,"value":1987},{"type":32,"tag":87,"props":2013,"children":2014},{"style":155},[2015],{"type":37,"value":158},{"type":32,"tag":87,"props":2017,"children":2018},{"style":149},[2019],{"type":37,"value":1970},{"type":32,"tag":87,"props":2021,"children":2022},{"style":104},[2023],{"type":37,"value":168},{"type":32,"tag":87,"props":2025,"children":2026},{"style":155},[2027],{"type":37,"value":2028}," signal_b_type,\n",{"type":32,"tag":87,"props":2030,"children":2031},{"class":89,"line":964},[2032,2037,2041,2046,2050],{"type":32,"tag":87,"props":2033,"children":2034},{"style":149},[2035],{"type":37,"value":2036},"    0",{"type":32,"tag":87,"props":2038,"children":2039},{"style":155},[2040],{"type":37,"value":158},{"type":32,"tag":87,"props":2042,"children":2043},{"style":149},[2044],{"type":37,"value":2045},"95",{"type":32,"tag":87,"props":2047,"children":2048},{"style":104},[2049],{"type":37,"value":168},{"type":32,"tag":87,"props":2051,"children":2052},{"style":155},[2053],{"type":37,"value":2054}," match_score,\n",{"type":32,"tag":87,"props":2056,"children":2057},{"class":89,"line":1001},[2058,2063,2067],{"type":32,"tag":87,"props":2059,"children":2060},{"style":155},[2061],{"type":37,"value":2062},"    CURRENT_DATE() ",{"type":32,"tag":87,"props":2064,"children":2065},{"style":104},[2066],{"type":37,"value":259},{"type":32,"tag":87,"props":2068,"children":2069},{"style":155},[2070],{"type":37,"value":2071}," created_date\n",{"type":32,"tag":87,"props":2073,"children":2075},{"class":89,"line":2074},19,[2076,2080,2085,2090],{"type":32,"tag":87,"props":2077,"children":2078},{"style":104},[2079],{"type":37,"value":1443},{"type":32,"tag":87,"props":2081,"children":2082},{"style":155},[2083],{"type":37,"value":2084}," {{ ref(",{"type":32,"tag":87,"props":2086,"children":2087},{"style":125},[2088],{"type":37,"value":2089},"'stg_hashed_emails'",{"type":32,"tag":87,"props":2091,"children":2092},{"style":155},[2093],{"type":37,"value":2094},") }} a\n",{"type":32,"tag":87,"props":2096,"children":2098},{"class":89,"line":2097},20,[2099,2103,2107,2112],{"type":32,"tag":87,"props":2100,"children":2101},{"style":104},[2102],{"type":37,"value":1543},{"type":32,"tag":87,"props":2104,"children":2105},{"style":155},[2106],{"type":37,"value":2084},{"type":32,"tag":87,"props":2108,"children":2109},{"style":125},[2110],{"type":37,"value":2111},"'stg_device_ids'",{"type":32,"tag":87,"props":2113,"children":2114},{"style":155},[2115],{"type":37,"value":2116},") }} b\n",{"type":32,"tag":87,"props":2118,"children":2120},{"class":89,"line":2119},21,[2121,2125,2129,2133,2137,2141,2145,2149],{"type":32,"tag":87,"props":2122,"children":2123},{"style":104},[2124],{"type":37,"value":1561},{"type":32,"tag":87,"props":2126,"children":2127},{"style":149},[2128],{"type":37,"value":579},{"type":32,"tag":87,"props":2130,"children":2131},{"style":155},[2132],{"type":37,"value":158},{"type":32,"tag":87,"props":2134,"children":2135},{"style":149},[2136],{"type":37,"value":73},{"type":32,"tag":87,"props":2138,"children":2139},{"style":104},[2140],{"type":37,"value":328},{"type":32,"tag":87,"props":2142,"children":2143},{"style":149},[2144],{"type":37,"value":597},{"type":32,"tag":87,"props":2146,"children":2147},{"style":155},[2148],{"type":37,"value":158},{"type":32,"tag":87,"props":2150,"children":2151},{"style":149},[2152],{"type":37,"value":342},{"type":32,"tag":87,"props":2154,"children":2156},{"class":89,"line":2155},22,[2157,2161,2165,2169,2174,2179,2184,2189],{"type":32,"tag":87,"props":2158,"children":2159},{"style":104},[2160],{"type":37,"value":1599},{"type":32,"tag":87,"props":2162,"children":2163},{"style":149},[2164],{"type":37,"value":579},{"type":32,"tag":87,"props":2166,"children":2167},{"style":155},[2168],{"type":37,"value":158},{"type":32,"tag":87,"props":2170,"children":2171},{"style":149},[2172],{"type":37,"value":2173},"created_at",{"type":32,"tag":87,"props":2175,"children":2176},{"style":104},[2177],{"type":37,"value":2178}," >=",{"type":32,"tag":87,"props":2180,"children":2181},{"style":155},[2182],{"type":37,"value":2183}," CURRENT_DATE() ",{"type":32,"tag":87,"props":2185,"children":2186},{"style":104},[2187],{"type":37,"value":2188},"-",{"type":32,"tag":87,"props":2190,"children":2191},{"style":149},[2192],{"type":37,"value":1523},{"type":32,"tag":87,"props":2194,"children":2196},{"class":89,"line":2195},23,[2197],{"type":32,"tag":87,"props":2198,"children":2199},{"style":155},[2200],{"type":37,"value":1627},{"type":32,"tag":87,"props":2202,"children":2204},{"class":89,"line":2203},24,[2205],{"type":32,"tag":87,"props":2206,"children":2207},{"emptyLinePlaceholder":1880},[2208],{"type":37,"value":1883},{"type":32,"tag":87,"props":2210,"children":2212},{"class":89,"line":2211},25,[2213,2218,2223,2228],{"type":32,"tag":87,"props":2214,"children":2215},{"style":104},[2216],{"type":37,"value":2217},"SELECT",{"type":32,"tag":87,"props":2219,"children":2220},{"style":104},[2221],{"type":37,"value":2222}," *",{"type":32,"tag":87,"props":2224,"children":2225},{"style":104},[2226],{"type":37,"value":2227}," FROM",{"type":32,"tag":87,"props":2229,"children":2230},{"style":155},[2231],{"type":37,"value":2232}," new_edges\n",{"type":32,"tag":87,"props":2234,"children":2236},{"class":89,"line":2235},26,[2237],{"type":32,"tag":87,"props":2238,"children":2239},{"emptyLinePlaceholder":1880},[2240],{"type":37,"value":1883},{"type":32,"tag":87,"props":2242,"children":2244},{"class":89,"line":2243},27,[2245,2250,2255],{"type":32,"tag":87,"props":2246,"children":2247},{"style":155},[2248],{"type":37,"value":2249},"{% ",{"type":32,"tag":87,"props":2251,"children":2252},{"style":104},[2253],{"type":37,"value":2254},"if",{"type":32,"tag":87,"props":2256,"children":2257},{"style":155},[2258],{"type":37,"value":2259}," is_incremental() %}\n",{"type":32,"tag":87,"props":2261,"children":2263},{"class":89,"line":2262},28,[2264,2268,2273,2278,2283,2288,2292,2296,2300],{"type":32,"tag":87,"props":2265,"children":2266},{"style":104},[2267],{"type":37,"value":351},{"type":32,"tag":87,"props":2269,"children":2270},{"style":155},[2271],{"type":37,"value":2272}," edge_id ",{"type":32,"tag":87,"props":2274,"children":2275},{"style":104},[2276],{"type":37,"value":2277},"NOT",{"type":32,"tag":87,"props":2279,"children":2280},{"style":104},[2281],{"type":37,"value":2282}," IN",{"type":32,"tag":87,"props":2284,"children":2285},{"style":155},[2286],{"type":37,"value":2287}," (",{"type":32,"tag":87,"props":2289,"children":2290},{"style":104},[2291],{"type":37,"value":2217},{"type":32,"tag":87,"props":2293,"children":2294},{"style":155},[2295],{"type":37,"value":2272},{"type":32,"tag":87,"props":2297,"children":2298},{"style":104},[2299],{"type":37,"value":273},{"type":32,"tag":87,"props":2301,"children":2302},{"style":155},[2303],{"type":37,"value":2304}," {{ this }})\n",{"type":32,"tag":87,"props":2306,"children":2308},{"class":89,"line":2307},29,[2309],{"type":32,"tag":87,"props":2310,"children":2311},{"style":155},[2312],{"type":37,"value":2313},"{% endif %}\n",{"type":32,"tag":33,"props":2315,"children":2316},{},[2317,2319,2325,2327,2333,2335,2340,2342,2348],{"type":37,"value":2318},"Le modèle ajoute chaque run les nouveaux appairages email-device du dernier jour. ",{"type":32,"tag":52,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":37,"value":2324},"unique_key",{"type":37,"value":2326}," prévient les doublons, ",{"type":32,"tag":52,"props":2328,"children":2330},{"className":2329},[],[2331],{"type":37,"value":2332},"partition_by",{"type":37,"value":2334}," laisse les partitions anciennes intactes. Clustérise par ",{"type":32,"tag":52,"props":2336,"children":2338},{"className":2337},[],[2339],{"type":37,"value":1970},{"type":37,"value":2341}," car les requêtes filtrent souvent « tous les email→cookie ». Ajoute des tests dbt : si des edges avec ",{"type":32,"tag":52,"props":2343,"children":2345},{"className":2344},[],[2346],{"type":37,"value":2347},"match_score \u003C 0.70",{"type":37,"value":2349}," apparaissent, le test échoue et le déploiement s'arrête.",{"type":32,"tag":33,"props":2351,"children":2352},{},[2353,2355,2362],{"type":37,"value":2354},"Un pipeline identity sans data quality test est dangereux — une fusion erronée fausse LTV, attribution, segmentation. Le travail de Roibase sur ",{"type":32,"tag":679,"props":2356,"children":2359},{"href":2357,"rel":2358},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[1321],[2360],{"type":37,"value":2361},"First-Party Data & Architecture de Mesure",{"type":37,"value":2363}," intègre ce pipeline avec consent layer, server-side GTM et CDP.",{"type":32,"tag":33,"props":2365,"children":2366},{},[2367,2369,2374],{"type":37,"value":2368},"Ensuite, il faut passer le graph identité en aval : segment builder, moteur de recommandation, prédiction LTV, MMM — tous tirent metrics agrégées via ",{"type":32,"tag":52,"props":2370,"children":2372},{"className":2371},[],[2373],{"type":37,"value":424},{"type":37,"value":2375},". Quand le graph fonctionne bien, tu réduisais 6 signaux à 1 utilisateur : la précision LTV gagne 30–40 %, la fenêtre d'attribution s",{"type":32,"tag":2377,"props":2378,"children":2379},"style",{},[2380],{"type":37,"value":2381},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":16,"searchDepth":136,"depth":136,"links":2383},[2384,2385,2386,2387,2388,2389],{"id":42,"depth":100,"text":45},{"id":472,"depth":100,"text":475},{"id":1079,"depth":100,"text":1082},{"id":1329,"depth":100,"text":1332},{"id":1660,"depth":100,"text":1663},{"id":1712,"depth":100,"text":1715},"markdown","content:fr:data:identity-resolution-6-signaux-identite-client-unique.md","content","fr\u002Fdata\u002Fidentity-resolution-6-signaux-identite-client-unique.md","fr\u002Fdata\u002Fidentity-resolution-6-signaux-identite-client-unique","md",1782079501634]