[{"data":1,"prerenderedAt":2179},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fserveur-gtm-conversion-api-production":13},{"i18nKey":4,"paths":5},"data-001-2026-06",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fen\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-produccion","\u002Ffr\u002Fdata\u002Fserveur-gtm-conversion-api-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fru\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Ftr\u002Fdata\u002Fserver-side-gtm-ve-conversion-api-sifirdan-productiona",{"_path":9,"_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":2173,"_id":2174,"_source":2175,"_file":2176,"_stem":2177,"_extension":2178},"data",false,"","Server-Side GTM et Conversion API : De zéro à la production","Déploiement Cloud Run\u002FWorkers, template de conteneur, stratégies de déduplication. Feuille de route technique pour passer la mesure côté serveur en production.","2026-06-12",[21,22,23,24,25],"server-side-gtm","conversion-api","cloud-run","event-deduplication","privacy-measurement",9,"Roibase",{"type":29,"children":30,"toc":2161},"root",[31,47,54,82,193,198,344,354,364,371,406,445,458,464,487,492,587,592,803,823,847,853,872,910,929,985,991,1011,1022,1071,1076,1397,1417,1451,1457,1476,1481,1574,1586,1603,1609,1614,1701,1709,1763,1787,1793,1823,1828,1859,1898,2113,2139,2143,2155],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36,39,45],{"type":37,"value":38},"text","La suppression des cookies, le renforcement de l'ITP, le consentement obligatoire — la mesure basée sur navigateur subit une ",{"type":32,"tag":40,"props":41,"children":42},"strong",{},[43],{"type":37,"value":44},"perte de signaux de 30-40 % depuis 2024",{"type":37,"value":46},". Les balises côté client ne donnent plus une \"vue complète\". La mesure côté serveur est le seul chemin d'ingénierie pour récupérer ces signaux perdus. Google Tag Manager Server Container (sGTM) et Meta Conversion API sont les deux composants fondamentaux de cette architecture. Mais \"déployer et faire fonctionner\" n'est pas si simple : hébergement du conteneur, déduplication d'événements, gestion des délais d'attente, enrichissement de données paramétriques — chaque étape exige une décision technique. Cet article couvre le déploiement de sGTM sur Cloud Run ou Cloudflare Workers, l'intégration de CAPI, la logique de déduplication et la checklist de production.",{"type":32,"tag":48,"props":49,"children":51},"h2",{"id":50},"hébergement-du-conteneur-server-side-gtm-cloud-run-vs-workers-vs-app-engine",[52],{"type":37,"value":53},"Hébergement du conteneur Server-Side GTM : Cloud Run vs Workers vs App Engine",{"type":32,"tag":33,"props":55,"children":56},{},[57,59,64,66,71,73,80],{"type":37,"value":58},"Vous pouvez exécuter le conteneur sGTM sur Google Cloud, mais ",{"type":32,"tag":40,"props":60,"children":61},{},[62],{"type":37,"value":63},"le déploiement manuel est obligatoire",{"type":37,"value":65},". Avec App Engine Automatic Scaling, les démarrages à froid durent 2-3 secondes ; en cas de pics de trafic, il y a un risque de perte d'événements de ",{"type":32,"tag":40,"props":67,"children":68},{},[69],{"type":37,"value":70},"15-20 %",{"type":37,"value":72},". Cloud Run est préféré : instance minimale \"toujours chaude\", concurrence 80-100, timeout de 10 secondes. Google fournit le template d'image dans un dépôt public — ",{"type":32,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":37,"value":79},"gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":37,"value":81},". En déployant cette image dans votre projet, 3 variables d'environnement sont obligatoires :",{"type":32,"tag":83,"props":84,"children":88},"pre",{"className":85,"code":86,"language":87,"meta":16,"style":16},"language-bash shiki shiki-themes github-dark","CONTAINER_CONFIG=\u003CGTM server container ID>\nPREVIEW_SERVER_URL=https:\u002F\u002F\u003Cpreview-domain>\nRUN_AS_HTTPS_SERVER=true\n","bash",[89],{"type":32,"tag":74,"props":90,"children":91},{"__ignoreMap":16},[92,142,175],{"type":32,"tag":93,"props":94,"children":97},"span",{"class":95,"line":96},"line",1,[98,104,110,116,122,127,132,137],{"type":32,"tag":93,"props":99,"children":101},{"style":100},"--shiki-default:#E1E4E8",[102],{"type":37,"value":103},"CONTAINER_CONFIG",{"type":32,"tag":93,"props":105,"children":107},{"style":106},"--shiki-default:#F97583",[108],{"type":37,"value":109},"=\u003C",{"type":32,"tag":93,"props":111,"children":113},{"style":112},"--shiki-default:#9ECBFF",[114],{"type":37,"value":115},"GTM",{"type":32,"tag":93,"props":117,"children":119},{"style":118},"--shiki-default:#B392F0",[120],{"type":37,"value":121}," server",{"type":32,"tag":93,"props":123,"children":124},{"style":112},[125],{"type":37,"value":126}," container",{"type":32,"tag":93,"props":128,"children":129},{"style":112},[130],{"type":37,"value":131}," I",{"type":32,"tag":93,"props":133,"children":134},{"style":100},[135],{"type":37,"value":136},"D",{"type":32,"tag":93,"props":138,"children":139},{"style":106},[140],{"type":37,"value":141},">\n",{"type":32,"tag":93,"props":143,"children":145},{"class":95,"line":144},2,[146,151,156,161,166,171],{"type":32,"tag":93,"props":147,"children":148},{"style":100},[149],{"type":37,"value":150},"PREVIEW_SERVER_URL",{"type":32,"tag":93,"props":152,"children":153},{"style":106},[154],{"type":37,"value":155},"=",{"type":32,"tag":93,"props":157,"children":158},{"style":112},[159],{"type":37,"value":160},"https:\u002F\u002F",{"type":32,"tag":93,"props":162,"children":163},{"style":106},[164],{"type":37,"value":165},"\u003C",{"type":32,"tag":93,"props":167,"children":168},{"style":112},[169],{"type":37,"value":170},"preview-domain",{"type":32,"tag":93,"props":172,"children":173},{"style":106},[174],{"type":37,"value":141},{"type":32,"tag":93,"props":176,"children":178},{"class":95,"line":177},3,[179,184,188],{"type":32,"tag":93,"props":180,"children":181},{"style":100},[182],{"type":37,"value":183},"RUN_AS_HTTPS_SERVER",{"type":32,"tag":93,"props":185,"children":186},{"style":106},[187],{"type":37,"value":155},{"type":32,"tag":93,"props":189,"children":190},{"style":112},[191],{"type":37,"value":192},"true\n",{"type":32,"tag":33,"props":194,"children":195},{},[196],{"type":37,"value":197},"Exemple de commande Cloud Run :",{"type":32,"tag":83,"props":199,"children":201},{"className":85,"code":200,"language":87,"meta":16,"style":16},"gcloud run deploy sgtm-prod \\\n  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable \\\n  --platform=managed \\\n  --region=europe-west1 \\\n  --set-env-vars=CONTAINER_CONFIG=GTM-XXXXXX,RUN_AS_HTTPS_SERVER=true \\\n  --min-instances=1 \\\n  --max-instances=10 \\\n  --concurrency=80 \\\n  --timeout=10s \\\n  --memory=512Mi\n",[202],{"type":32,"tag":74,"props":203,"children":204},{"__ignoreMap":16},[205,234,246,258,271,284,297,310,323,335],{"type":32,"tag":93,"props":206,"children":207},{"class":95,"line":96},[208,213,218,223,228],{"type":32,"tag":93,"props":209,"children":210},{"style":118},[211],{"type":37,"value":212},"gcloud",{"type":32,"tag":93,"props":214,"children":215},{"style":112},[216],{"type":37,"value":217}," run",{"type":32,"tag":93,"props":219,"children":220},{"style":112},[221],{"type":37,"value":222}," deploy",{"type":32,"tag":93,"props":224,"children":225},{"style":112},[226],{"type":37,"value":227}," sgtm-prod",{"type":32,"tag":93,"props":229,"children":231},{"style":230},"--shiki-default:#79B8FF",[232],{"type":37,"value":233}," \\\n",{"type":32,"tag":93,"props":235,"children":236},{"class":95,"line":144},[237,242],{"type":32,"tag":93,"props":238,"children":239},{"style":230},[240],{"type":37,"value":241},"  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":32,"tag":93,"props":243,"children":244},{"style":230},[245],{"type":37,"value":233},{"type":32,"tag":93,"props":247,"children":248},{"class":95,"line":177},[249,254],{"type":32,"tag":93,"props":250,"children":251},{"style":230},[252],{"type":37,"value":253},"  --platform=managed",{"type":32,"tag":93,"props":255,"children":256},{"style":230},[257],{"type":37,"value":233},{"type":32,"tag":93,"props":259,"children":261},{"class":95,"line":260},4,[262,267],{"type":32,"tag":93,"props":263,"children":264},{"style":230},[265],{"type":37,"value":266},"  --region=europe-west1",{"type":32,"tag":93,"props":268,"children":269},{"style":230},[270],{"type":37,"value":233},{"type":32,"tag":93,"props":272,"children":274},{"class":95,"line":273},5,[275,280],{"type":32,"tag":93,"props":276,"children":277},{"style":230},[278],{"type":37,"value":279},"  --set-env-vars=CONTAINER_CONFIG=GTM-XXXXXX,RUN_AS_HTTPS_SERVER=true",{"type":32,"tag":93,"props":281,"children":282},{"style":230},[283],{"type":37,"value":233},{"type":32,"tag":93,"props":285,"children":287},{"class":95,"line":286},6,[288,293],{"type":32,"tag":93,"props":289,"children":290},{"style":230},[291],{"type":37,"value":292},"  --min-instances=1",{"type":32,"tag":93,"props":294,"children":295},{"style":230},[296],{"type":37,"value":233},{"type":32,"tag":93,"props":298,"children":300},{"class":95,"line":299},7,[301,306],{"type":32,"tag":93,"props":302,"children":303},{"style":230},[304],{"type":37,"value":305},"  --max-instances=10",{"type":32,"tag":93,"props":307,"children":308},{"style":230},[309],{"type":37,"value":233},{"type":32,"tag":93,"props":311,"children":313},{"class":95,"line":312},8,[314,319],{"type":32,"tag":93,"props":315,"children":316},{"style":230},[317],{"type":37,"value":318},"  --concurrency=80",{"type":32,"tag":93,"props":320,"children":321},{"style":230},[322],{"type":37,"value":233},{"type":32,"tag":93,"props":324,"children":325},{"class":95,"line":26},[326,331],{"type":32,"tag":93,"props":327,"children":328},{"style":230},[329],{"type":37,"value":330},"  --timeout=10s",{"type":32,"tag":93,"props":332,"children":333},{"style":230},[334],{"type":37,"value":233},{"type":32,"tag":93,"props":336,"children":338},{"class":95,"line":337},10,[339],{"type":32,"tag":93,"props":340,"children":341},{"style":230},[342],{"type":37,"value":343},"  --memory=512Mi\n",{"type":32,"tag":33,"props":345,"children":346},{},[347,352],{"type":32,"tag":40,"props":348,"children":349},{},[350],{"type":37,"value":351},"Alternative Cloudflare Workers :",{"type":37,"value":353}," Si la latence globale est la priorité, Workers peut être utilisé. Cependant, il faut porter la logique du conteneur GTM vers le runtime Workers (ce n'est pas natif). L'avantage : temps de réponse \u003C 50 ms ; l'inconvénient : l'écosystème de modèles de balises est limité — vous devrez écrire des balises JavaScript personnalisées.",{"type":32,"tag":33,"props":355,"children":356},{},[357,362],{"type":32,"tag":40,"props":358,"children":359},{},[360],{"type":37,"value":361},"Coût d'hébergement :",{"type":37,"value":363}," Sur Cloud Run, environ 1 M de requêtes par mois coûtent 40-60 $ (1 instance toujours activée + autoscaling inclus). App Engine Flex : 150-200 $ environ. Workers : 5 $ de base + 0,50 $ par million de requêtes — beaucoup moins cher, mais sans support natif de sGTM, cela demande du temps de développement supplémentaire.",{"type":32,"tag":365,"props":366,"children":368},"h3",{"id":367},"domaine-personnalisé-et-certificat-ssl",[369],{"type":37,"value":370},"Domaine personnalisé et certificat SSL",{"type":32,"tag":33,"props":372,"children":373},{},[374,376,382,384,389,391,396,398,404],{"type":37,"value":375},"Le domaine par défaut ",{"type":32,"tag":74,"props":377,"children":379},{"className":378},[],[380],{"type":37,"value":381},"*.run.app",{"type":37,"value":383}," de sGTM ",{"type":32,"tag":40,"props":385,"children":386},{},[387],{"type":37,"value":388},"compte comme tiers",{"type":37,"value":390}," — Safari ITP supprime les cookies de ce domaine en 7 jours. C'est pourquoi un ",{"type":32,"tag":40,"props":392,"children":393},{},[394],{"type":37,"value":395},"sous-domaine first-party",{"type":37,"value":397}," comme ",{"type":32,"tag":74,"props":399,"children":401},{"className":400},[],[402],{"type":37,"value":403},"analytics.yoursite.com",{"type":37,"value":405}," est obligatoire. Configuration avec Cloud Load Balancer + certificat SSL géré :",{"type":32,"tag":407,"props":408,"children":409},"ol",{},[410,423,428,440],{"type":32,"tag":411,"props":412,"children":413},"li",{},[414,416,421],{"type":37,"value":415},"Ajouter un ",{"type":32,"tag":40,"props":417,"children":418},{},[419],{"type":37,"value":420},"NEG (Network Endpoint Group)",{"type":37,"value":422}," au service Cloud Run",{"type":32,"tag":411,"props":424,"children":425},{},[426],{"type":37,"value":427},"Créer un HTTPS Load Balancer, lier le NEG au backend",{"type":32,"tag":411,"props":429,"children":430},{},[431,433,438],{"type":37,"value":432},"Acquérir un certificat SSL géré pour ",{"type":32,"tag":74,"props":434,"children":436},{"className":435},[],[437],{"type":37,"value":403},{"type":37,"value":439}," (peut prendre 48 heures)",{"type":32,"tag":411,"props":441,"children":442},{},[443],{"type":37,"value":444},"Orienter l'enregistrement DNS A vers l'IP du Load Balancer",{"type":32,"tag":33,"props":446,"children":447},{},[448,450,456],{"type":37,"value":449},"Cette configuration est obligatoire au niveau de la production. En environnement de test, vous pouvez fonctionner avec un domaine ",{"type":32,"tag":74,"props":451,"children":453},{"className":452},[],[454],{"type":37,"value":455},"run.app",{"type":37,"value":457},", mais vous ne verrez pas les scénarios ITP.",{"type":32,"tag":48,"props":459,"children":461},{"id":460},"intégration-meta-conversion-api-stratégie-de-déduplication-des-événements",[462],{"type":37,"value":463},"Intégration Meta Conversion API : Stratégie de déduplication des événements",{"type":32,"tag":33,"props":465,"children":466},{},[467,469,474,476,485],{"type":37,"value":468},"Meta CAPI permet d'envoyer des événements de pixel côté serveur via sGTM. Cependant, le ",{"type":32,"tag":40,"props":470,"children":471},{},[472],{"type":37,"value":473},"Meta Pixel côté client",{"type":37,"value":475}," envoie peut-être déjà le même événement — s'il est compté deux fois, l'attribution est brisée. La méthode officielle de Meta : ajouter un paramètre ",{"type":32,"tag":40,"props":477,"children":478},{},[479],{"type":32,"tag":74,"props":480,"children":482},{"className":481},[],[483],{"type":37,"value":484},"event_id",{"type":37,"value":486}," à chaque événement, envoyer le même ID à la fois du client et du serveur. Meta fusionne les doublons dans les 48 heures.",{"type":32,"tag":33,"props":488,"children":489},{},[490],{"type":37,"value":491},"Lors de la configuration de la balise CAPI dans sGTM :",{"type":32,"tag":493,"props":494,"children":495},"ul",{},[496,529,547],{"type":32,"tag":411,"props":497,"children":498},{},[499,504,506,512,514,520,521,527],{"type":32,"tag":40,"props":500,"children":501},{},[502],{"type":37,"value":503},"Event Name :",{"type":37,"value":505}," ",{"type":32,"tag":74,"props":507,"children":509},{"className":508},[],[510],{"type":37,"value":511},"PageView",{"type":37,"value":513},", ",{"type":32,"tag":74,"props":515,"children":517},{"className":516},[],[518],{"type":37,"value":519},"Purchase",{"type":37,"value":513},{"type":32,"tag":74,"props":522,"children":524},{"className":523},[],[525],{"type":37,"value":526},"AddToCart",{"type":37,"value":528}," (événements standard de Meta)",{"type":32,"tag":411,"props":530,"children":531},{},[532,537,539,545],{"type":32,"tag":40,"props":533,"children":534},{},[535],{"type":37,"value":536},"Event ID :",{"type":37,"value":538}," Utilisez le cookie ",{"type":32,"tag":74,"props":540,"children":542},{"className":541},[],[543],{"type":37,"value":544},"fbp",{"type":37,"value":546}," du pixel côté client + hash du timestamp",{"type":32,"tag":411,"props":548,"children":549},{},[550,555,556,562,564,570,572,578,579,585],{"type":32,"tag":40,"props":551,"children":552},{},[553],{"type":37,"value":554},"User Data :",{"type":37,"value":505},{"type":32,"tag":74,"props":557,"children":559},{"className":558},[],[560],{"type":37,"value":561},"em",{"type":37,"value":563}," (email hashé), ",{"type":32,"tag":74,"props":565,"children":567},{"className":566},[],[568],{"type":37,"value":569},"ph",{"type":37,"value":571}," (téléphone haché), ",{"type":32,"tag":74,"props":573,"children":575},{"className":574},[],[576],{"type":37,"value":577},"client_ip_address",{"type":37,"value":513},{"type":32,"tag":74,"props":580,"children":582},{"className":581},[],[583],{"type":37,"value":584},"client_user_agent",{"type":37,"value":586}," — sGTM peut extraire automatiquement ces paramètres de l'en-tête HTTP",{"type":32,"tag":33,"props":588,"children":589},{},[590],{"type":37,"value":591},"Exemple de génération d'Event ID côté client :",{"type":32,"tag":83,"props":593,"children":597},{"className":594,"code":595,"language":596,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","const eventId = CryptoJS.SHA256(\n  fbp + '_' + eventName + '_' + Date.now()\n).toString();\n\nfbq('track', 'Purchase', {\n  value: 99.00,\n  currency: 'USD'\n}, {\n  eventID: eventId\n});\n","javascript",[598],{"type":32,"tag":74,"props":599,"children":600},{"__ignoreMap":16},[601,634,689,707,716,748,766,779,787,795],{"type":32,"tag":93,"props":602,"children":603},{"class":95,"line":96},[604,609,614,619,624,629],{"type":32,"tag":93,"props":605,"children":606},{"style":106},[607],{"type":37,"value":608},"const",{"type":32,"tag":93,"props":610,"children":611},{"style":230},[612],{"type":37,"value":613}," eventId",{"type":32,"tag":93,"props":615,"children":616},{"style":106},[617],{"type":37,"value":618}," =",{"type":32,"tag":93,"props":620,"children":621},{"style":100},[622],{"type":37,"value":623}," CryptoJS.",{"type":32,"tag":93,"props":625,"children":626},{"style":118},[627],{"type":37,"value":628},"SHA256",{"type":32,"tag":93,"props":630,"children":631},{"style":100},[632],{"type":37,"value":633},"(\n",{"type":32,"tag":93,"props":635,"children":636},{"class":95,"line":144},[637,642,647,652,657,662,666,670,674,679,684],{"type":32,"tag":93,"props":638,"children":639},{"style":100},[640],{"type":37,"value":641},"  fbp ",{"type":32,"tag":93,"props":643,"children":644},{"style":106},[645],{"type":37,"value":646},"+",{"type":32,"tag":93,"props":648,"children":649},{"style":112},[650],{"type":37,"value":651}," '_'",{"type":32,"tag":93,"props":653,"children":654},{"style":106},[655],{"type":37,"value":656}," +",{"type":32,"tag":93,"props":658,"children":659},{"style":100},[660],{"type":37,"value":661}," eventName ",{"type":32,"tag":93,"props":663,"children":664},{"style":106},[665],{"type":37,"value":646},{"type":32,"tag":93,"props":667,"children":668},{"style":112},[669],{"type":37,"value":651},{"type":32,"tag":93,"props":671,"children":672},{"style":106},[673],{"type":37,"value":656},{"type":32,"tag":93,"props":675,"children":676},{"style":100},[677],{"type":37,"value":678}," Date.",{"type":32,"tag":93,"props":680,"children":681},{"style":118},[682],{"type":37,"value":683},"now",{"type":32,"tag":93,"props":685,"children":686},{"style":100},[687],{"type":37,"value":688},"()\n",{"type":32,"tag":93,"props":690,"children":691},{"class":95,"line":177},[692,697,702],{"type":32,"tag":93,"props":693,"children":694},{"style":100},[695],{"type":37,"value":696},").",{"type":32,"tag":93,"props":698,"children":699},{"style":118},[700],{"type":37,"value":701},"toString",{"type":32,"tag":93,"props":703,"children":704},{"style":100},[705],{"type":37,"value":706},"();\n",{"type":32,"tag":93,"props":708,"children":709},{"class":95,"line":260},[710],{"type":32,"tag":93,"props":711,"children":713},{"emptyLinePlaceholder":712},true,[714],{"type":37,"value":715},"\n",{"type":32,"tag":93,"props":717,"children":718},{"class":95,"line":273},[719,724,729,734,738,743],{"type":32,"tag":93,"props":720,"children":721},{"style":118},[722],{"type":37,"value":723},"fbq",{"type":32,"tag":93,"props":725,"children":726},{"style":100},[727],{"type":37,"value":728},"(",{"type":32,"tag":93,"props":730,"children":731},{"style":112},[732],{"type":37,"value":733},"'track'",{"type":32,"tag":93,"props":735,"children":736},{"style":100},[737],{"type":37,"value":513},{"type":32,"tag":93,"props":739,"children":740},{"style":112},[741],{"type":37,"value":742},"'Purchase'",{"type":32,"tag":93,"props":744,"children":745},{"style":100},[746],{"type":37,"value":747},", {\n",{"type":32,"tag":93,"props":749,"children":750},{"class":95,"line":286},[751,756,761],{"type":32,"tag":93,"props":752,"children":753},{"style":100},[754],{"type":37,"value":755},"  value: ",{"type":32,"tag":93,"props":757,"children":758},{"style":230},[759],{"type":37,"value":760},"99.00",{"type":32,"tag":93,"props":762,"children":763},{"style":100},[764],{"type":37,"value":765},",\n",{"type":32,"tag":93,"props":767,"children":768},{"class":95,"line":299},[769,774],{"type":32,"tag":93,"props":770,"children":771},{"style":100},[772],{"type":37,"value":773},"  currency: ",{"type":32,"tag":93,"props":775,"children":776},{"style":112},[777],{"type":37,"value":778},"'USD'\n",{"type":32,"tag":93,"props":780,"children":781},{"class":95,"line":312},[782],{"type":32,"tag":93,"props":783,"children":784},{"style":100},[785],{"type":37,"value":786},"}, {\n",{"type":32,"tag":93,"props":788,"children":789},{"class":95,"line":26},[790],{"type":32,"tag":93,"props":791,"children":792},{"style":100},[793],{"type":37,"value":794},"  eventID: eventId\n",{"type":32,"tag":93,"props":796,"children":797},{"class":95,"line":337},[798],{"type":32,"tag":93,"props":799,"children":800},{"style":100},[801],{"type":37,"value":802},"});\n",{"type":32,"tag":33,"props":804,"children":805},{},[806,808,814,816,821],{"type":37,"value":807},"Du côté de sGTM, passez le même ",{"type":32,"tag":74,"props":809,"children":811},{"className":810},[],[812],{"type":37,"value":813},"eventId",{"type":37,"value":815}," à la balise CAPI. Meta fusionne les événements avec le même ID dans les ",{"type":32,"tag":40,"props":817,"children":818},{},[819],{"type":37,"value":820},"48 heures",{"type":37,"value":822},". Les événements tardifs au-delà de cette fenêtre risquent d'être comptabilisés comme des doublons.",{"type":32,"tag":33,"props":824,"children":825},{},[826,831,833,838,840,845],{"type":32,"tag":40,"props":827,"children":828},{},[829],{"type":37,"value":830},"Protocole de test :",{"type":37,"value":832}," Dans l'Events Manager de Meta, utilisez l'onglet ",{"type":32,"tag":40,"props":834,"children":835},{},[836],{"type":37,"value":837},"Test Events",{"type":37,"value":839},". Lorsque vous envoyez l'événement à la fois côté client et serveur, vous devriez voir le message \"Deduplication Active\" et 1 conversion sous le même ",{"type":32,"tag":74,"props":841,"children":843},{"className":842},[],[844],{"type":37,"value":484},{"type":37,"value":846},".",{"type":32,"tag":365,"props":848,"children":850},{"id":849},"enrichissement-des-données-utilisateur-ip-et-user-agent",[851],{"type":37,"value":852},"Enrichissement des données utilisateur : IP et User-Agent",{"type":32,"tag":33,"props":854,"children":855},{},[856,858,863,865,870],{"type":37,"value":857},"La puissance d'attribution de Meta CAPI dépend de la ",{"type":32,"tag":40,"props":859,"children":860},{},[861],{"type":37,"value":862},"richesse des paramètres de données utilisateur",{"type":37,"value":864},". Le pixel côté client les collecte automatiquement du navigateur ; côté serveur, vous devez les envoyer manuellement. Utilisez la variable ",{"type":32,"tag":40,"props":866,"children":867},{},[868],{"type":37,"value":869},"HTTP Request Headers",{"type":37,"value":871}," de sGTM :",{"type":32,"tag":493,"props":873,"children":874},{},[875,893],{"type":32,"tag":411,"props":876,"children":877},{},[878,883,885,891],{"type":32,"tag":74,"props":879,"children":881},{"className":880},[],[882],{"type":37,"value":577},{"type":37,"value":884}," → ",{"type":32,"tag":74,"props":886,"children":888},{"className":887},[],[889],{"type":37,"value":890},"{{Client IP Address}}",{"type":37,"value":892}," (variable intégrée sGTM)",{"type":32,"tag":411,"props":894,"children":895},{},[896,901,902,908],{"type":32,"tag":74,"props":897,"children":899},{"className":898},[],[900],{"type":37,"value":584},{"type":37,"value":884},{"type":32,"tag":74,"props":903,"children":905},{"className":904},[],[906],{"type":37,"value":907},"{{User Agent}}",{"type":37,"value":909}," (variable intégrée)",{"type":32,"tag":33,"props":911,"children":912},{},[913,915,920,922,927],{"type":37,"value":914},"Sans ces paramètres, l'événement CAPI donne un taux de correspondance inférieur de 40-60 % (selon les données internes de Meta). Si vous ajoutez le hash d'email (",{"type":32,"tag":74,"props":916,"children":918},{"className":917},[],[919],{"type":37,"value":561},{"type":37,"value":921},") et le hash de téléphone (",{"type":32,"tag":74,"props":923,"children":925},{"className":924},[],[926],{"type":37,"value":569},{"type":37,"value":928},"), le taux de correspondance monte à 80 %. Le hashage doit être effectué en SHA-256, en minuscules et en supprimant les espaces :",{"type":32,"tag":83,"props":930,"children":934},{"className":931,"code":932,"language":933,"meta":16,"style":16},"language-python shiki shiki-themes github-dark","import hashlib\n\nemail_hash = hashlib.sha256('user@example.com'.strip().lower().encode()).hexdigest()\n","python",[935],{"type":32,"tag":74,"props":936,"children":937},{"__ignoreMap":16},[938,951,958],{"type":32,"tag":93,"props":939,"children":940},{"class":95,"line":96},[941,946],{"type":32,"tag":93,"props":942,"children":943},{"style":106},[944],{"type":37,"value":945},"import",{"type":32,"tag":93,"props":947,"children":948},{"style":100},[949],{"type":37,"value":950}," hashlib\n",{"type":32,"tag":93,"props":952,"children":953},{"class":95,"line":144},[954],{"type":32,"tag":93,"props":955,"children":956},{"emptyLinePlaceholder":712},[957],{"type":37,"value":715},{"type":32,"tag":93,"props":959,"children":960},{"class":95,"line":177},[961,966,970,975,980],{"type":32,"tag":93,"props":962,"children":963},{"style":100},[964],{"type":37,"value":965},"email_hash ",{"type":32,"tag":93,"props":967,"children":968},{"style":106},[969],{"type":37,"value":155},{"type":32,"tag":93,"props":971,"children":972},{"style":100},[973],{"type":37,"value":974}," hashlib.sha256(",{"type":32,"tag":93,"props":976,"children":977},{"style":112},[978],{"type":37,"value":979},"'user@example.com'",{"type":32,"tag":93,"props":981,"children":982},{"style":100},[983],{"type":37,"value":984},".strip().lower().encode()).hexdigest()\n",{"type":32,"tag":48,"props":986,"children":988},{"id":987},"google-ads-enhanced-conversions-hash-sha-256-et-correspondance-gclid",[989],{"type":37,"value":990},"Google Ads Enhanced Conversions : Hash SHA-256 et correspondance gclid",{"type":32,"tag":33,"props":992,"children":993},{},[994,996,1001,1003,1009],{"type":37,"value":995},"Google Ads Enhanced Conversions nécessite l'envoi de ",{"type":32,"tag":40,"props":997,"children":998},{},[999],{"type":37,"value":1000},"données utilisateur hashées",{"type":37,"value":1002}," via sGTM. La logique est similaire à celle de Meta CAPI : hashez les PII comme l'email, le téléphone, l'adresse en SHA-256 et ajoutez-les à la balise de conversion. Google fait correspondre ces données avec ",{"type":32,"tag":74,"props":1004,"children":1006},{"className":1005},[],[1007],{"type":37,"value":1008},"gclid",{"type":37,"value":1010}," et les relie à la conversion hors ligne.",{"type":32,"tag":33,"props":1012,"children":1013},{},[1014,1016,1021],{"type":37,"value":1015},"Dans la balise ",{"type":32,"tag":40,"props":1017,"children":1018},{},[1019],{"type":37,"value":1020},"Google Ads Conversion Tracking",{"type":37,"value":871},{"type":32,"tag":493,"props":1023,"children":1024},{},[1025,1035,1060],{"type":32,"tag":411,"props":1026,"children":1027},{},[1028,1030],{"type":37,"value":1029},"Activez l'option ",{"type":32,"tag":40,"props":1031,"children":1032},{},[1033],{"type":37,"value":1034},"Enhanced Conversions",{"type":32,"tag":411,"props":1036,"children":1037},{},[1038,1040,1046,1047,1053,1055],{"type":37,"value":1039},"Ajoutez les variables ",{"type":32,"tag":74,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":37,"value":1045},"{{Email Hash}}",{"type":37,"value":513},{"type":32,"tag":74,"props":1048,"children":1050},{"className":1049},[],[1051],{"type":37,"value":1052},"{{Phone Hash}}",{"type":37,"value":1054}," dans la section ",{"type":32,"tag":40,"props":1056,"children":1057},{},[1058],{"type":37,"value":1059},"User Data",{"type":32,"tag":411,"props":1061,"children":1062},{},[1063,1065,1069],{"type":37,"value":1064},"Passez le paramètre ",{"type":32,"tag":40,"props":1066,"children":1067},{},[1068],{"type":37,"value":1008},{"type":37,"value":1070}," côté client (depuis la chaîne de requête URL ou un cookie)",{"type":32,"tag":33,"props":1072,"children":1073},{},[1074],{"type":37,"value":1075},"La fonction hash en JavaScript ressemble à ceci :",{"type":32,"tag":83,"props":1077,"children":1079},{"className":594,"code":1078,"language":596,"meta":16,"style":16},"async function hashSHA256(value) {\n  const encoder = new TextEncoder();\n  const data = encoder.encode(value.trim().toLowerCase());\n  const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n  const hashArray = Array.from(new Uint8Array(hashBuffer));\n  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');\n}\n",[1080],{"type":32,"tag":74,"props":1081,"children":1082},{"__ignoreMap":16},[1083,1116,1147,1198,1243,1288,1389],{"type":32,"tag":93,"props":1084,"children":1085},{"class":95,"line":96},[1086,1091,1096,1101,1105,1111],{"type":32,"tag":93,"props":1087,"children":1088},{"style":106},[1089],{"type":37,"value":1090},"async",{"type":32,"tag":93,"props":1092,"children":1093},{"style":106},[1094],{"type":37,"value":1095}," function",{"type":32,"tag":93,"props":1097,"children":1098},{"style":118},[1099],{"type":37,"value":1100}," hashSHA256",{"type":32,"tag":93,"props":1102,"children":1103},{"style":100},[1104],{"type":37,"value":728},{"type":32,"tag":93,"props":1106,"children":1108},{"style":1107},"--shiki-default:#FFAB70",[1109],{"type":37,"value":1110},"value",{"type":32,"tag":93,"props":1112,"children":1113},{"style":100},[1114],{"type":37,"value":1115},") {\n",{"type":32,"tag":93,"props":1117,"children":1118},{"class":95,"line":144},[1119,1124,1129,1133,1138,1143],{"type":32,"tag":93,"props":1120,"children":1121},{"style":106},[1122],{"type":37,"value":1123},"  const",{"type":32,"tag":93,"props":1125,"children":1126},{"style":230},[1127],{"type":37,"value":1128}," encoder",{"type":32,"tag":93,"props":1130,"children":1131},{"style":106},[1132],{"type":37,"value":618},{"type":32,"tag":93,"props":1134,"children":1135},{"style":106},[1136],{"type":37,"value":1137}," new",{"type":32,"tag":93,"props":1139,"children":1140},{"style":118},[1141],{"type":37,"value":1142}," TextEncoder",{"type":32,"tag":93,"props":1144,"children":1145},{"style":100},[1146],{"type":37,"value":706},{"type":32,"tag":93,"props":1148,"children":1149},{"class":95,"line":177},[1150,1154,1159,1163,1168,1173,1178,1183,1188,1193],{"type":32,"tag":93,"props":1151,"children":1152},{"style":106},[1153],{"type":37,"value":1123},{"type":32,"tag":93,"props":1155,"children":1156},{"style":230},[1157],{"type":37,"value":1158}," data",{"type":32,"tag":93,"props":1160,"children":1161},{"style":106},[1162],{"type":37,"value":618},{"type":32,"tag":93,"props":1164,"children":1165},{"style":100},[1166],{"type":37,"value":1167}," encoder.",{"type":32,"tag":93,"props":1169,"children":1170},{"style":118},[1171],{"type":37,"value":1172},"encode",{"type":32,"tag":93,"props":1174,"children":1175},{"style":100},[1176],{"type":37,"value":1177},"(value.",{"type":32,"tag":93,"props":1179,"children":1180},{"style":118},[1181],{"type":37,"value":1182},"trim",{"type":32,"tag":93,"props":1184,"children":1185},{"style":100},[1186],{"type":37,"value":1187},"().",{"type":32,"tag":93,"props":1189,"children":1190},{"style":118},[1191],{"type":37,"value":1192},"toLowerCase",{"type":32,"tag":93,"props":1194,"children":1195},{"style":100},[1196],{"type":37,"value":1197},"());\n",{"type":32,"tag":93,"props":1199,"children":1200},{"class":95,"line":260},[1201,1205,1210,1214,1219,1224,1229,1233,1238],{"type":32,"tag":93,"props":1202,"children":1203},{"style":106},[1204],{"type":37,"value":1123},{"type":32,"tag":93,"props":1206,"children":1207},{"style":230},[1208],{"type":37,"value":1209}," hashBuffer",{"type":32,"tag":93,"props":1211,"children":1212},{"style":106},[1213],{"type":37,"value":618},{"type":32,"tag":93,"props":1215,"children":1216},{"style":106},[1217],{"type":37,"value":1218}," await",{"type":32,"tag":93,"props":1220,"children":1221},{"style":100},[1222],{"type":37,"value":1223}," crypto.subtle.",{"type":32,"tag":93,"props":1225,"children":1226},{"style":118},[1227],{"type":37,"value":1228},"digest",{"type":32,"tag":93,"props":1230,"children":1231},{"style":100},[1232],{"type":37,"value":728},{"type":32,"tag":93,"props":1234,"children":1235},{"style":112},[1236],{"type":37,"value":1237},"'SHA-256'",{"type":32,"tag":93,"props":1239,"children":1240},{"style":100},[1241],{"type":37,"value":1242},", data);\n",{"type":32,"tag":93,"props":1244,"children":1245},{"class":95,"line":273},[1246,1250,1255,1259,1264,1269,1273,1278,1283],{"type":32,"tag":93,"props":1247,"children":1248},{"style":106},[1249],{"type":37,"value":1123},{"type":32,"tag":93,"props":1251,"children":1252},{"style":230},[1253],{"type":37,"value":1254}," hashArray",{"type":32,"tag":93,"props":1256,"children":1257},{"style":106},[1258],{"type":37,"value":618},{"type":32,"tag":93,"props":1260,"children":1261},{"style":100},[1262],{"type":37,"value":1263}," Array.",{"type":32,"tag":93,"props":1265,"children":1266},{"style":118},[1267],{"type":37,"value":1268},"from",{"type":32,"tag":93,"props":1270,"children":1271},{"style":100},[1272],{"type":37,"value":728},{"type":32,"tag":93,"props":1274,"children":1275},{"style":106},[1276],{"type":37,"value":1277},"new",{"type":32,"tag":93,"props":1279,"children":1280},{"style":118},[1281],{"type":37,"value":1282}," Uint8Array",{"type":32,"tag":93,"props":1284,"children":1285},{"style":100},[1286],{"type":37,"value":1287},"(hashBuffer));\n",{"type":32,"tag":93,"props":1289,"children":1290},{"class":95,"line":286},[1291,1296,1301,1306,1310,1315,1320,1325,1329,1333,1338,1342,1347,1351,1356,1360,1365,1370,1375,1379,1384],{"type":32,"tag":93,"props":1292,"children":1293},{"style":106},[1294],{"type":37,"value":1295},"  return",{"type":32,"tag":93,"props":1297,"children":1298},{"style":100},[1299],{"type":37,"value":1300}," hashArray.",{"type":32,"tag":93,"props":1302,"children":1303},{"style":118},[1304],{"type":37,"value":1305},"map",{"type":32,"tag":93,"props":1307,"children":1308},{"style":100},[1309],{"type":37,"value":728},{"type":32,"tag":93,"props":1311,"children":1312},{"style":1107},[1313],{"type":37,"value":1314},"b",{"type":32,"tag":93,"props":1316,"children":1317},{"style":106},[1318],{"type":37,"value":1319}," =>",{"type":32,"tag":93,"props":1321,"children":1322},{"style":100},[1323],{"type":37,"value":1324}," b.",{"type":32,"tag":93,"props":1326,"children":1327},{"style":118},[1328],{"type":37,"value":701},{"type":32,"tag":93,"props":1330,"children":1331},{"style":100},[1332],{"type":37,"value":728},{"type":32,"tag":93,"props":1334,"children":1335},{"style":230},[1336],{"type":37,"value":1337},"16",{"type":32,"tag":93,"props":1339,"children":1340},{"style":100},[1341],{"type":37,"value":696},{"type":32,"tag":93,"props":1343,"children":1344},{"style":118},[1345],{"type":37,"value":1346},"padStart",{"type":32,"tag":93,"props":1348,"children":1349},{"style":100},[1350],{"type":37,"value":728},{"type":32,"tag":93,"props":1352,"children":1353},{"style":230},[1354],{"type":37,"value":1355},"2",{"type":32,"tag":93,"props":1357,"children":1358},{"style":100},[1359],{"type":37,"value":513},{"type":32,"tag":93,"props":1361,"children":1362},{"style":112},[1363],{"type":37,"value":1364},"'0'",{"type":32,"tag":93,"props":1366,"children":1367},{"style":100},[1368],{"type":37,"value":1369},")).",{"type":32,"tag":93,"props":1371,"children":1372},{"style":118},[1373],{"type":37,"value":1374},"join",{"type":32,"tag":93,"props":1376,"children":1377},{"style":100},[1378],{"type":37,"value":728},{"type":32,"tag":93,"props":1380,"children":1381},{"style":112},[1382],{"type":37,"value":1383},"''",{"type":32,"tag":93,"props":1385,"children":1386},{"style":100},[1387],{"type":37,"value":1388},");\n",{"type":32,"tag":93,"props":1390,"children":1391},{"class":95,"line":299},[1392],{"type":32,"tag":93,"props":1393,"children":1394},{"style":100},[1395],{"type":37,"value":1396},"}\n",{"type":32,"tag":33,"props":1398,"children":1399},{},[1400,1402,1408,1410,1415],{"type":37,"value":1401},"Côté client, passez ce hash via ",{"type":32,"tag":74,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":37,"value":1407},"dataLayer.push()",{"type":37,"value":1409},", capturez-le comme variable dans sGTM, et transmettez-le à la balise Google Ads. ",{"type":32,"tag":40,"props":1411,"children":1412},{},[1413],{"type":37,"value":1414},"Critique :",{"type":37,"value":1416}," le hashage doit être effectué côté client (confidentialité — les PII ne doivent pas aller sur le serveur en texte brut) OU effectué sur sGTM avec la journalisation désactivée.",{"type":32,"tag":33,"props":1418,"children":1419},{},[1420,1425,1427,1433,1435,1441,1443,1449],{"type":32,"tag":40,"props":1421,"children":1422},{},[1423],{"type":37,"value":1424},"Lien avec Consent Mode v2 :",{"type":37,"value":1426}," Si les consentements ",{"type":32,"tag":74,"props":1428,"children":1430},{"className":1429},[],[1431],{"type":37,"value":1432},"ad_user_data",{"type":37,"value":1434}," et ",{"type":32,"tag":74,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":37,"value":1440},"ad_personalization",{"type":37,"value":1442}," ne sont pas accordés, même Enhanced Conversions ne fonctionne pas. Vous devez transmettre les signaux de consentement à sGTM via un événement ",{"type":32,"tag":74,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":37,"value":1448},"consent",{"type":37,"value":1450}," dans la dataLayer.",{"type":32,"tag":48,"props":1452,"children":1454},{"id":1453},"déduplication-des-événements-envoi-parallèle-côté-client-serveur",[1455],{"type":37,"value":1456},"Déduplication des événements : Envoi parallèle côté client + serveur",{"type":32,"tag":33,"props":1458,"children":1459},{},[1460,1462,1467,1469,1474],{"type":37,"value":1461},"Dans certains scénarios, la balise côté client et celle côté serveur se déclenchent toutes les deux — par exemple, sur Safari, la balise côté client fonctionne, MAIS ITP supprime le cookie en 7 jours ; pendant ce temps, le côté serveur continue de fonctionner. Il y a un risque d'événements en double. Solution : utiliser un ",{"type":32,"tag":40,"props":1463,"children":1464},{},[1465],{"type":37,"value":1466},"event_id unique",{"type":37,"value":1468}," (Meta) ou un ",{"type":32,"tag":40,"props":1470,"children":1471},{},[1472],{"type":37,"value":1473},"transaction_id",{"type":37,"value":1475}," (Google Analytics 4).",{"type":32,"tag":33,"props":1477,"children":1478},{},[1479],{"type":37,"value":1480},"Déduplication dans GA4 :",{"type":32,"tag":83,"props":1482,"children":1484},{"className":594,"code":1483,"language":596,"meta":16,"style":16},"gtag('event', 'purchase', {\n  transaction_id: 'ORDER_12345', \u002F\u002F unique per order\n  value: 99.00,\n  currency: 'USD'\n});\n",[1485],{"type":32,"tag":74,"props":1486,"children":1487},{"__ignoreMap":16},[1488,1518,1541,1556,1567],{"type":32,"tag":93,"props":1489,"children":1490},{"class":95,"line":96},[1491,1496,1500,1505,1509,1514],{"type":32,"tag":93,"props":1492,"children":1493},{"style":118},[1494],{"type":37,"value":1495},"gtag",{"type":32,"tag":93,"props":1497,"children":1498},{"style":100},[1499],{"type":37,"value":728},{"type":32,"tag":93,"props":1501,"children":1502},{"style":112},[1503],{"type":37,"value":1504},"'event'",{"type":32,"tag":93,"props":1506,"children":1507},{"style":100},[1508],{"type":37,"value":513},{"type":32,"tag":93,"props":1510,"children":1511},{"style":112},[1512],{"type":37,"value":1513},"'purchase'",{"type":32,"tag":93,"props":1515,"children":1516},{"style":100},[1517],{"type":37,"value":747},{"type":32,"tag":93,"props":1519,"children":1520},{"class":95,"line":144},[1521,1526,1531,1535],{"type":32,"tag":93,"props":1522,"children":1523},{"style":100},[1524],{"type":37,"value":1525},"  transaction_id: ",{"type":32,"tag":93,"props":1527,"children":1528},{"style":112},[1529],{"type":37,"value":1530},"'ORDER_12345'",{"type":32,"tag":93,"props":1532,"children":1533},{"style":100},[1534],{"type":37,"value":513},{"type":32,"tag":93,"props":1536,"children":1538},{"style":1537},"--shiki-default:#6A737D",[1539],{"type":37,"value":1540},"\u002F\u002F unique per order\n",{"type":32,"tag":93,"props":1542,"children":1543},{"class":95,"line":177},[1544,1548,1552],{"type":32,"tag":93,"props":1545,"children":1546},{"style":100},[1547],{"type":37,"value":755},{"type":32,"tag":93,"props":1549,"children":1550},{"style":230},[1551],{"type":37,"value":760},{"type":32,"tag":93,"props":1553,"children":1554},{"style":100},[1555],{"type":37,"value":765},{"type":32,"tag":93,"props":1557,"children":1558},{"class":95,"line":260},[1559,1563],{"type":32,"tag":93,"props":1560,"children":1561},{"style":100},[1562],{"type":37,"value":773},{"type":32,"tag":93,"props":1564,"children":1565},{"style":112},[1566],{"type":37,"value":778},{"type":32,"tag":93,"props":1568,"children":1569},{"class":95,"line":273},[1570],{"type":32,"tag":93,"props":1571,"children":1572},{"style":100},[1573],{"type":37,"value":802},{"type":32,"tag":33,"props":1575,"children":1576},{},[1577,1579,1584],{"type":37,"value":1578},"Si vous envoyez le même ",{"type":32,"tag":74,"props":1580,"children":1582},{"className":1581},[],[1583],{"type":37,"value":1473},{"type":37,"value":1585}," à la fois via gtag.js côté client et via sGTM, le backend GA4 nettoie le doublon (fenêtre de 48 heures).",{"type":32,"tag":33,"props":1587,"children":1588},{},[1589,1594,1596,1601],{"type":32,"tag":40,"props":1590,"children":1591},{},[1592],{"type":37,"value":1593},"Gestion des délais d'attente :",{"type":37,"value":1595}," Les balises sGTM ont un paramètre ",{"type":32,"tag":40,"props":1597,"children":1598},{},[1599],{"type":37,"value":1600},"timeout",{"type":37,"value":1602}," (par défaut 2000 ms). Si la réponse CAPI prend 3-4 secondes, la balise expire et l'événement n'est pas envoyé. En production, augmentez le timeout à 5000 ms et configurez la surveillance. Le timeout de la requête Cloud Run (10 s) doit être en accord avec le timeout de la balise sGTM.",{"type":32,"tag":48,"props":1604,"children":1606},{"id":1605},"checklist-de-production-surveillance-journalisation-débogage",[1607],{"type":37,"value":1608},"Checklist de production : Surveillance, journalisation, débogage",{"type":32,"tag":33,"props":1610,"children":1611},{},[1612],{"type":37,"value":1613},"Avant de passer sGTM en production :",{"type":32,"tag":407,"props":1615,"children":1616},{},[1617,1627,1642,1658,1683],{"type":32,"tag":411,"props":1618,"children":1619},{},[1620,1625],{"type":32,"tag":40,"props":1621,"children":1622},{},[1623],{"type":37,"value":1624},"Mode aperçu :",{"type":37,"value":1626}," Ouvrez l'aperçu dans l'interface GTM, connectez-vous à l'URL du conteneur sGTM, déboguez les événements clients dans la console",{"type":32,"tag":411,"props":1628,"children":1629},{},[1630,1635,1637],{"type":32,"tag":40,"props":1631,"children":1632},{},[1633],{"type":37,"value":1634},"Test de déclenchement de balise :",{"type":37,"value":1636}," Pour chaque balise (CAPI, Google Ads, GA4), validez avec l'",{"type":32,"tag":40,"props":1638,"children":1639},{},[1640],{"type":37,"value":1641},"Tag Assistant",{"type":32,"tag":411,"props":1643,"children":1644},{},[1645,1650,1652],{"type":32,"tag":40,"props":1646,"children":1647},{},[1648],{"type":37,"value":1649},"Signal de consentement :",{"type":37,"value":1651}," Testez les signaux Consent Mode v2 — vérifiez quelles balises ne se déclenchent pas quand ",{"type":32,"tag":74,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":37,"value":1657},"ad_storage=denied",{"type":32,"tag":411,"props":1659,"children":1660},{},[1661,1666,1668,1673,1675,1681],{"type":32,"tag":40,"props":1662,"children":1663},{},[1664],{"type":37,"value":1665},"Export de journaux :",{"type":37,"value":1667}," Exportez les journaux Cloud Run vers ",{"type":32,"tag":40,"props":1669,"children":1670},{},[1671],{"type":37,"value":1672},"Cloud Logging",{"type":37,"value":1674},", filtrez : ",{"type":32,"tag":74,"props":1676,"children":1678},{"className":1677},[],[1679],{"type":37,"value":1680},"resource.type=\"cloud_run_revision\"",{"type":37,"value":1682},", consultez les payloads d'événements",{"type":32,"tag":411,"props":1684,"children":1685},{},[1686,1691,1693,1699],{"type":32,"tag":40,"props":1687,"children":1688},{},[1689],{"type":37,"value":1690},"Alertage d'erreur :",{"type":37,"value":1692}," Configurez une alerte dans Cloud Monitoring : ",{"type":32,"tag":74,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":37,"value":1698},"http_response_code >= 500",{"type":37,"value":1700},", seuil 10\u002Fmin",{"type":32,"tag":33,"props":1702,"children":1703},{},[1704],{"type":32,"tag":40,"props":1705,"children":1706},{},[1707],{"type":37,"value":1708},"Outils de débogage :",{"type":32,"tag":493,"props":1710,"children":1711},{},[1712,1728,1753],{"type":32,"tag":411,"props":1713,"children":1714},{},[1715,1720,1722],{"type":32,"tag":40,"props":1716,"children":1717},{},[1718],{"type":37,"value":1719},"Mode débogage sGTM :",{"type":37,"value":1721}," Ouvrez l'URL d'aperçu du conteneur dans le navigateur, ajoutez la chaîne de requête ",{"type":32,"tag":74,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":37,"value":1727},"gtm_debug=x",{"type":32,"tag":411,"props":1729,"children":1730},{},[1731,1736,1738,1744,1745,1751],{"type":32,"tag":40,"props":1732,"children":1733},{},[1734],{"type":37,"value":1735},"Onglet Réseau :",{"type":37,"value":1737}," Inspectez les requêtes ",{"type":32,"tag":74,"props":1739,"children":1741},{"className":1740},[],[1742],{"type":37,"value":1743},"\u002Fgtm.js",{"type":37,"value":1434},{"type":32,"tag":74,"props":1746,"children":1748},{"className":1747},[],[1749],{"type":37,"value":1750},"\u002Fr\u002Fcollect",{"type":37,"value":1752}," dans les DevTools du navigateur",{"type":32,"tag":411,"props":1754,"children":1755},{},[1756,1761],{"type":32,"tag":40,"props":1757,"children":1758},{},[1759],{"type":37,"value":1760},"Test d'événement Meta :",{"type":37,"value":1762}," Events Manager → Test Events, consultez les événements de la dernière heure",{"type":32,"tag":33,"props":1764,"children":1765},{},[1766,1771,1773,1779,1781,1786],{"type":32,"tag":40,"props":1767,"children":1768},{},[1769],{"type":37,"value":1770},"Problème courant :",{"type":37,"value":1772}," L'adresse IP du client n'atteint pas sGTM — vérifiez que le Cloud Load Balancer transmet l'en-tête ",{"type":32,"tag":74,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":37,"value":1778},"X-Forwarded-For",{"type":37,"value":1780},", activez l'option ",{"type":32,"tag":40,"props":1782,"children":1783},{},[1784],{"type":37,"value":1785},"Preserve Client IP",{"type":37,"value":846},{"type":32,"tag":48,"props":1788,"children":1790},{"id":1789},"architecture-des-données-connexion-sgtm-bigquery-dbt",[1791],{"type":37,"value":1792},"Architecture des données : Connexion sGTM + BigQuery + dbt",{"type":32,"tag":33,"props":1794,"children":1795},{},[1796,1798,1803,1805,1810,1812,1821],{"type":37,"value":1797},"Vous pouvez streamer les événements sGTM directement vers BigQuery — via ",{"type":32,"tag":40,"props":1799,"children":1800},{},[1801],{"type":37,"value":1802},"Firestore",{"type":37,"value":1804}," ou ",{"type":32,"tag":40,"props":1806,"children":1807},{},[1808],{"type":37,"value":1809},"Pub\u002FSub",{"type":37,"value":1811},". L'export GA4 BigQuery est un batch quotidien ; avec sGTM, un stream en temps réel est possible. Cette stratégie est importante dans le cadre de ",{"type":32,"tag":1813,"props":1814,"children":1818},"a",{"href":1815,"rel":1816},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[1817],"nofollow",[1819],{"type":37,"value":1820},"First-Party Data & Architecture de mesure",{"type":37,"value":1822}," : données d'événements brutes → modèles dbt → couche sémantique → tableau de bord.",{"type":32,"tag":33,"props":1824,"children":1825},{},[1826],{"type":37,"value":1827},"Flux d'exemple :",{"type":32,"tag":407,"props":1829,"children":1830},{},[1831,1836,1841,1854],{"type":32,"tag":411,"props":1832,"children":1833},{},[1834],{"type":37,"value":1835},"Balise sGTM → Envoyer l'événement JSON au topic Cloud Pub\u002FSub",{"type":32,"tag":411,"props":1837,"children":1838},{},[1839],{"type":37,"value":1840},"Job Dataflow (ou Cloud Function) → Lire depuis Pub\u002FSub, écrire dans BigQuery",{"type":32,"tag":411,"props":1842,"children":1843},{},[1844,1846,1852],{"type":37,"value":1845},"Modèle dbt → Fusionner les événements par ",{"type":32,"tag":74,"props":1847,"children":1849},{"className":1848},[],[1850],{"type":37,"value":1851},"user_id",{"type":37,"value":1853},", appliquer la logique de session",{"type":32,"tag":411,"props":1855,"children":1856},{},[1857],{"type":37,"value":1858},"Looker\u002FMetabase → Tableau de bord sur les vues dbt",{"type":32,"tag":33,"props":1860,"children":1861},{},[1862,1864,1869,1871,1877,1878,1883,1884,1889,1891,1896],{"type":37,"value":1863},"Cette architecture est également critique pour la ",{"type":32,"tag":40,"props":1865,"children":1866},{},[1867],{"type":37,"value":1868},"résolution d'identité",{"type":37,"value":1870}," : vous pouvez fusionner les identifiants provenant de sGTM comme ",{"type":32,"tag":74,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":37,"value":1876},"client_id",{"type":37,"value":513},{"type":32,"tag":74,"props":1879,"children":1881},{"className":1880},[],[1882],{"type":37,"value":544},{"type":37,"value":513},{"type":32,"tag":74,"props":1885,"children":1887},{"className":1886},[],[1888],{"type":37,"value":1008},{"type":37,"value":1890}," dans BigQuery et créer un seul ",{"type":32,"tag":74,"props":1892,"children":1894},{"className":1893},[],[1895],{"type":37,"value":1851},{"type":37,"value":1897},". Exemple de modèle dbt incrémental :",{"type":32,"tag":83,"props":1899,"children":1903},{"className":1900,"code":1901,"language":1902,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","{{ config(materialized='incremental', unique_key='event_id') }}\n\nSELECT\n  event_id,\n  user_id,\n  client_id,\n  event_timestamp,\n  event_name,\n  event_params\nFROM {{ source('sgtm_events', 'raw_events') }}\n{% if is_incremental() %}\nWHERE event_timestamp > (SELECT MAX(event_timestamp) FROM {{ this }})\n{% endif %}\n","sql",[1904],{"type":32,"tag":74,"props":1905,"children":1906},{"__ignoreMap":16},[1907,1943,1950,1958,1966,1974,1982,1990,1998,2006,2037,2056,2104],{"type":32,"tag":93,"props":1908,"children":1909},{"class":95,"line":96},[1910,1915,1919,1924,1929,1933,1938],{"type":32,"tag":93,"props":1911,"children":1912},{"style":100},[1913],{"type":37,"value":1914},"{{ config(materialized",{"type":32,"tag":93,"props":1916,"children":1917},{"style":106},[1918],{"type":37,"value":155},{"type":32,"tag":93,"props":1920,"children":1921},{"style":112},[1922],{"type":37,"value":1923},"'incremental'",{"type":32,"tag":93,"props":1925,"children":1926},{"style":100},[1927],{"type":37,"value":1928},", unique_key",{"type":32,"tag":93,"props":1930,"children":1931},{"style":106},[1932],{"type":37,"value":155},{"type":32,"tag":93,"props":1934,"children":1935},{"style":112},[1936],{"type":37,"value":1937},"'event_id'",{"type":32,"tag":93,"props":1939,"children":1940},{"style":100},[1941],{"type":37,"value":1942},") }}\n",{"type":32,"tag":93,"props":1944,"children":1945},{"class":95,"line":144},[1946],{"type":32,"tag":93,"props":1947,"children":1948},{"emptyLinePlaceholder":712},[1949],{"type":37,"value":715},{"type":32,"tag":93,"props":1951,"children":1952},{"class":95,"line":177},[1953],{"type":32,"tag":93,"props":1954,"children":1955},{"style":106},[1956],{"type":37,"value":1957},"SELECT\n",{"type":32,"tag":93,"props":1959,"children":1960},{"class":95,"line":260},[1961],{"type":32,"tag":93,"props":1962,"children":1963},{"style":100},[1964],{"type":37,"value":1965},"  event_id,\n",{"type":32,"tag":93,"props":1967,"children":1968},{"class":95,"line":273},[1969],{"type":32,"tag":93,"props":1970,"children":1971},{"style":100},[1972],{"type":37,"value":1973},"  user_id,\n",{"type":32,"tag":93,"props":1975,"children":1976},{"class":95,"line":286},[1977],{"type":32,"tag":93,"props":1978,"children":1979},{"style":100},[1980],{"type":37,"value":1981},"  client_id,\n",{"type":32,"tag":93,"props":1983,"children":1984},{"class":95,"line":299},[1985],{"type":32,"tag":93,"props":1986,"children":1987},{"style":100},[1988],{"type":37,"value":1989},"  event_timestamp,\n",{"type":32,"tag":93,"props":1991,"children":1992},{"class":95,"line":312},[1993],{"type":32,"tag":93,"props":1994,"children":1995},{"style":100},[1996],{"type":37,"value":1997},"  event_name,\n",{"type":32,"tag":93,"props":1999,"children":2000},{"class":95,"line":26},[2001],{"type":32,"tag":93,"props":2002,"children":2003},{"style":100},[2004],{"type":37,"value":2005},"  event_params\n",{"type":32,"tag":93,"props":2007,"children":2008},{"class":95,"line":337},[2009,2014,2019,2024,2028,2033],{"type":32,"tag":93,"props":2010,"children":2011},{"style":106},[2012],{"type":37,"value":2013},"FROM",{"type":32,"tag":93,"props":2015,"children":2016},{"style":100},[2017],{"type":37,"value":2018}," {{ source(",{"type":32,"tag":93,"props":2020,"children":2021},{"style":112},[2022],{"type":37,"value":2023},"'sgtm_events'",{"type":32,"tag":93,"props":2025,"children":2026},{"style":100},[2027],{"type":37,"value":513},{"type":32,"tag":93,"props":2029,"children":2030},{"style":112},[2031],{"type":37,"value":2032},"'raw_events'",{"type":32,"tag":93,"props":2034,"children":2035},{"style":100},[2036],{"type":37,"value":1942},{"type":32,"tag":93,"props":2038,"children":2040},{"class":95,"line":2039},11,[2041,2046,2051],{"type":32,"tag":93,"props":2042,"children":2043},{"style":100},[2044],{"type":37,"value":2045},"{% ",{"type":32,"tag":93,"props":2047,"children":2048},{"style":106},[2049],{"type":37,"value":2050},"if",{"type":32,"tag":93,"props":2052,"children":2053},{"style":100},[2054],{"type":37,"value":2055}," is_incremental() %}\n",{"type":32,"tag":93,"props":2057,"children":2059},{"class":95,"line":2058},12,[2060,2065,2070,2075,2080,2085,2090,2095,2099],{"type":32,"tag":93,"props":2061,"children":2062},{"style":106},[2063],{"type":37,"value":2064},"WHERE",{"type":32,"tag":93,"props":2066,"children":2067},{"style":100},[2068],{"type":37,"value":2069}," event_timestamp ",{"type":32,"tag":93,"props":2071,"children":2072},{"style":106},[2073],{"type":37,"value":2074},">",{"type":32,"tag":93,"props":2076,"children":2077},{"style":100},[2078],{"type":37,"value":2079}," (",{"type":32,"tag":93,"props":2081,"children":2082},{"style":106},[2083],{"type":37,"value":2084},"SELECT",{"type":32,"tag":93,"props":2086,"children":2087},{"style":230},[2088],{"type":37,"value":2089}," MAX",{"type":32,"tag":93,"props":2091,"children":2092},{"style":100},[2093],{"type":37,"value":2094},"(event_timestamp) ",{"type":32,"tag":93,"props":2096,"children":2097},{"style":106},[2098],{"type":37,"value":2013},{"type":32,"tag":93,"props":2100,"children":2101},{"style":100},[2102],{"type":37,"value":2103}," {{ this }})\n",{"type":32,"tag":93,"props":2105,"children":2107},{"class":95,"line":2106},13,[2108],{"type":32,"tag":93,"props":2109,"children":2110},{"style":100},[2111],{"type":37,"value":2112},"{% endif %}\n",{"type":32,"tag":33,"props":2114,"children":2115},{},[2116,2118,2123,2125,2130,2131,2137],{"type":37,"value":2117},"Cette configuration supporte également le ",{"type":32,"tag":40,"props":2119,"children":2120},{},[2121],{"type":37,"value":2122},"modèle d'attribution",{"type":37,"value":2124}," : vous pouvez joindre les événements sGTM dans BigQuery avec ",{"type":32,"tag":74,"props":2126,"children":2128},{"className":2127},[],[2129],{"type":37,"value":1008},{"type":37,"value":1434},{"type":32,"tag":74,"props":2132,"children":2134},{"className":2133},[],[2135],{"type":37,"value":2136},"fbclid",{"type":37,"value":2138}," pour calculer l'attribution multi-touch.",{"type":32,"tag":2140,"props":2141,"children":2142},"hr",{},[],{"type":32,"tag":33,"props":2144,"children":2145},{},[2146,2148,2153],{"type":37,"value":2147},"La mesure côté serveur n'est plus une \"optimisation optionnelle\" — c'est une infrastructure obligatoire dans un monde axé sur la confidentialité. Déploiement Cloud Run, déduplication CAPI, hashage Enhanced Conversions, stream BigQuery — chaque étape demande une décision technique. Commencez avec un domaine ",{"type":32,"tag":74,"props":2149,"children":2151},{"className":2150},[],[2152],{"type":37,"value":455},{"type":37,"value":2154}," en environnement de test, configurez un domaine personnalisé +",{"type":32,"tag":2156,"props":2157,"children":2158},"style",{},[2159],{"type":37,"value":2160},"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":177,"depth":177,"links":2162},[2163,2166,2169,2170,2171,2172],{"id":50,"depth":144,"text":53,"children":2164},[2165],{"id":367,"depth":177,"text":370},{"id":460,"depth":144,"text":463,"children":2167},[2168],{"id":849,"depth":177,"text":852},{"id":987,"depth":144,"text":990},{"id":1453,"depth":144,"text":1456},{"id":1605,"depth":144,"text":1608},{"id":1789,"depth":144,"text":1792},"markdown","content:fr:data:serveur-gtm-conversion-api-production.md","content","fr\u002Fdata\u002Fserveur-gtm-conversion-api-production.md","fr\u002Fdata\u002Fserveur-gtm-conversion-api-production","md",1782050756802]