[{"data":1,"prerenderedAt":2194},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fserver-side-gtm-conversion-api-production":11},{"i18nKey":4,"paths":5},"data-001-2026-05",{"de":6,"es":7,"fr":8,"it":9,"ru":10},"\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion","\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Ffr\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione","\u002Fru\u002Fdata\u002Fserver-side-gtm-konversiya-api-production",{"_path":8,"_dir":12,"_draft":13,"_partial":13,"_locale":14,"title":15,"description":16,"publishedAt":17,"modifiedAt":17,"category":12,"i18nKey":4,"tags":18,"readingTime":24,"author":25,"body":26,"_type":2188,"_id":2189,"_source":2190,"_file":2191,"_stem":2192,"_extension":2193},"data",false,"","Server-Side GTM et Conversion API : De Zéro à la Production","Déploiement Cloud Run, template container, déduplication d'événements — comment nous avons construit la stack de mesure server-side en production, pièges rencontrés.","2026-05-24",[19,20,21,22,23],"server-side-gtm","conversion-api","cloud-run","first-party-data","event-deduplication",9,"Roibase",{"type":27,"children":28,"toc":2177},"root",[29,37,44,49,54,59,234,253,266,272,285,314,475,487,516,545,551,556,565,620,628,677,682,690,702,709,714,981,994,1000,1005,1010,1223,1259,1264,1270,1275,1283,1326,1331,1439,1460,1465,1617,1633,1639,1660,1665,1704,1709,2057,2085,2091,2096,2104,2166,2171],{"type":30,"tag":31,"props":32,"children":33},"element","p",{},[34],{"type":35,"value":36},"text","Dépréciation des cookies, Consent Mode v2, ATT iOS — la surface de fiabilité de la mesure client-side s'est rétrécie chaque année. En 2024, Meta a dû accepter de voir %23 d'événements client-side en moins, et Google Analytics 4 a enregistré une baisse de %18 du nombre de sessions. La mesure server-side n'est plus l'« avenir », c'est désormais « obligatoire ». Chez Roibase, depuis fin 2025, nous déployons entièrement les nouveaux clients sur une stack sGTM + Conversion API. Dans cet article, nous partageons ce que nous avons appris lors du passage en production, pourquoi nous avons pris telles décisions et quels composants doivent absolument faire partie de votre stack.",{"type":30,"tag":38,"props":39,"children":41},"h2",{"id":40},"où-déployer-le-container-sgtm",[42],{"type":35,"value":43},"Où déployer le Container sGTM",{"type":30,"tag":31,"props":45,"children":46},{},[47],{"type":35,"value":48},"Le Google Tag Manager Server Container peut s'exécuter sur App Engine, Cloud Run, Docker manuel, ou des solutions tierces. En 2026, deux options se démarquent : Cloud Run et Cloudflare Workers. App Engine est considéré comme legacy — pas de scaling automatique, cold start de 8+ secondes. Workers est moins cher mais l'intégration avec l'écosystème GTM nécessite des middlewares supplémentaires.",{"type":30,"tag":31,"props":50,"children":51},{},[52],{"type":35,"value":53},"Nous avons choisi Cloud Run : l'image container officielle de GTM s'exécute directement, scaling horizontal automatique, cold start inférieur à 2 secondes. Le calcul du coût est important : 1M requêtes\u002Fmois + instance 512 Mo × 3 zones = ~$35\u002Fmois. Avec Cloudflare Workers, ce serait $5\u002Fmois, mais les outils de debug sont faibles et l'intégration des variables personnalisées doit être configurée manuellement.",{"type":30,"tag":31,"props":55,"children":56},{},[57],{"type":35,"value":58},"Commande de déploiement :",{"type":30,"tag":60,"props":61,"children":65},"pre",{"code":62,"language":63,"meta":14,"className":64,"style":14},"gcloud run deploy sgtm-prod \\\n  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable \\\n  --platform=managed \\\n  --region=europe-west1 \\\n  --memory=512Mi \\\n  --min-instances=1 \\\n  --max-instances=10 \\\n  --allow-unauthenticated \\\n  --set-env-vars=\"CONTAINER_CONFIG=$(cat container.json | base64)\"\n","bash","language-bash shiki shiki-themes github-dark",[66],{"type":30,"tag":67,"props":68,"children":69},"code",{"__ignoreMap":14},[70,104,117,130,143,156,169,182,195],{"type":30,"tag":71,"props":72,"children":75},"span",{"class":73,"line":74},"line",1,[76,82,88,93,98],{"type":30,"tag":71,"props":77,"children":79},{"style":78},"--shiki-default:#B392F0",[80],{"type":35,"value":81},"gcloud",{"type":30,"tag":71,"props":83,"children":85},{"style":84},"--shiki-default:#9ECBFF",[86],{"type":35,"value":87}," run",{"type":30,"tag":71,"props":89,"children":90},{"style":84},[91],{"type":35,"value":92}," deploy",{"type":30,"tag":71,"props":94,"children":95},{"style":84},[96],{"type":35,"value":97}," sgtm-prod",{"type":30,"tag":71,"props":99,"children":101},{"style":100},"--shiki-default:#79B8FF",[102],{"type":35,"value":103}," \\\n",{"type":30,"tag":71,"props":105,"children":107},{"class":73,"line":106},2,[108,113],{"type":30,"tag":71,"props":109,"children":110},{"style":100},[111],{"type":35,"value":112},"  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":30,"tag":71,"props":114,"children":115},{"style":100},[116],{"type":35,"value":103},{"type":30,"tag":71,"props":118,"children":120},{"class":73,"line":119},3,[121,126],{"type":30,"tag":71,"props":122,"children":123},{"style":100},[124],{"type":35,"value":125},"  --platform=managed",{"type":30,"tag":71,"props":127,"children":128},{"style":100},[129],{"type":35,"value":103},{"type":30,"tag":71,"props":131,"children":133},{"class":73,"line":132},4,[134,139],{"type":30,"tag":71,"props":135,"children":136},{"style":100},[137],{"type":35,"value":138},"  --region=europe-west1",{"type":30,"tag":71,"props":140,"children":141},{"style":100},[142],{"type":35,"value":103},{"type":30,"tag":71,"props":144,"children":146},{"class":73,"line":145},5,[147,152],{"type":30,"tag":71,"props":148,"children":149},{"style":100},[150],{"type":35,"value":151},"  --memory=512Mi",{"type":30,"tag":71,"props":153,"children":154},{"style":100},[155],{"type":35,"value":103},{"type":30,"tag":71,"props":157,"children":159},{"class":73,"line":158},6,[160,165],{"type":30,"tag":71,"props":161,"children":162},{"style":100},[163],{"type":35,"value":164},"  --min-instances=1",{"type":30,"tag":71,"props":166,"children":167},{"style":100},[168],{"type":35,"value":103},{"type":30,"tag":71,"props":170,"children":172},{"class":73,"line":171},7,[173,178],{"type":30,"tag":71,"props":174,"children":175},{"style":100},[176],{"type":35,"value":177},"  --max-instances=10",{"type":30,"tag":71,"props":179,"children":180},{"style":100},[181],{"type":35,"value":103},{"type":30,"tag":71,"props":183,"children":185},{"class":73,"line":184},8,[186,191],{"type":30,"tag":71,"props":187,"children":188},{"style":100},[189],{"type":35,"value":190},"  --allow-unauthenticated",{"type":30,"tag":71,"props":192,"children":193},{"style":100},[194],{"type":35,"value":103},{"type":30,"tag":71,"props":196,"children":197},{"class":73,"line":24},[198,203,208,213,218,224,229],{"type":30,"tag":71,"props":199,"children":200},{"style":100},[201],{"type":35,"value":202},"  --set-env-vars=",{"type":30,"tag":71,"props":204,"children":205},{"style":84},[206],{"type":35,"value":207},"\"CONTAINER_CONFIG=$(",{"type":30,"tag":71,"props":209,"children":210},{"style":78},[211],{"type":35,"value":212},"cat",{"type":30,"tag":71,"props":214,"children":215},{"style":84},[216],{"type":35,"value":217}," container.json ",{"type":30,"tag":71,"props":219,"children":221},{"style":220},"--shiki-default:#F97583",[222],{"type":35,"value":223},"|",{"type":30,"tag":71,"props":225,"children":226},{"style":78},[227],{"type":35,"value":228}," base64",{"type":30,"tag":71,"props":230,"children":231},{"style":84},[232],{"type":35,"value":233},")\"\n",{"type":30,"tag":31,"props":235,"children":236},{},[237,243,245,251],{"type":30,"tag":67,"props":238,"children":240},{"className":239},[],[241],{"type":35,"value":242},"min-instances=1",{"type":35,"value":244}," est critique — sur un site e-commerce, le time de spin-up d'une instance à partir de zéro peut faire perdre des conversions. Coût additionnel : +$8\u002Fmois, mais vous garantissez 100% de disponibilité. ",{"type":30,"tag":67,"props":246,"children":248},{"className":247},[],[249],{"type":35,"value":250},"container.json",{"type":35,"value":252}," est la configuration du container exportée depuis l'interface GTM — vous pouvez la synchroniser via CI\u002FCD plutôt que manuellement.",{"type":30,"tag":31,"props":254,"children":255},{},[256,258,264],{"type":35,"value":257},"Structure de sous-domaine : ",{"type":30,"tag":67,"props":259,"children":261},{"className":260},[],[262],{"type":35,"value":263},"sgtm.example.com",{"type":35,"value":265}," → IP Cloud Run. Nous n'utilisons pas de Load Balancer, l'IP anycast globale de Cloud Run suffit. SSL est automatique avec les certificats gérés par Cloud Run, prêt en 3 minutes.",{"type":30,"tag":38,"props":267,"children":269},{"id":268},"déduplication-dévénements-deux-signaux-une-conversion",[270],{"type":35,"value":271},"Déduplication d'Événements : Deux Signaux, Une Conversion",{"type":30,"tag":31,"props":273,"children":274},{},[275,277,283],{"type":35,"value":276},"Le plus grand piège de la mesure server-side : la même conversion est envoyée à la fois depuis le navigateur et depuis le serveur, la plateforme la compte en double. Dans Meta Conversion API, le paramètre ",{"type":30,"tag":67,"props":278,"children":280},{"className":279},[],[281],{"type":35,"value":282},"event_id",{"type":35,"value":284}," résout ce problème — si le client et le serveur partagent le même ID, Meta nettoie la duplication dans une fenêtre de 28 heures.",{"type":30,"tag":31,"props":286,"children":287},{},[288,290,296,298,304,306,312],{"type":35,"value":289},"Flux d'exemple : l'utilisateur complète une commande, le navigateur déclenche l'événement ",{"type":30,"tag":67,"props":291,"children":293},{"className":292},[],[294],{"type":35,"value":295},"purchase",{"type":35,"value":297}," dans GTM → Meta Pixel. Simultanément, le frontend poste vers notre endpoint ",{"type":30,"tag":67,"props":299,"children":301},{"className":300},[],[302],{"type":35,"value":303},"\u002Fapi\u002Ftrack",{"type":35,"value":305}," → sGTM → Meta Conversion API. Les deux signaux transportent ",{"type":30,"tag":67,"props":307,"children":309},{"className":308},[],[310],{"type":35,"value":311},"event_id: order_12345_ts1716547200",{"type":35,"value":313},".",{"type":30,"tag":60,"props":315,"children":319},{"code":316,"language":317,"meta":14,"className":318,"style":14},"\u002F\u002F Variable GTM côté client : event_id\nfunction() {\n  var orderId = {{Order ID}};\n  var timestamp = Math.floor(Date.now() \u002F 1000);\n  return orderId + '_ts' + timestamp;\n}\n","javascript","language-javascript shiki shiki-themes github-dark",[320],{"type":30,"tag":67,"props":321,"children":322},{"__ignoreMap":14},[323,332,346,379,435,467],{"type":30,"tag":71,"props":324,"children":325},{"class":73,"line":74},[326],{"type":30,"tag":71,"props":327,"children":329},{"style":328},"--shiki-default:#6A737D",[330],{"type":35,"value":331},"\u002F\u002F Variable GTM côté client : event_id\n",{"type":30,"tag":71,"props":333,"children":334},{"class":73,"line":106},[335,340],{"type":30,"tag":71,"props":336,"children":337},{"style":220},[338],{"type":35,"value":339},"function",{"type":30,"tag":71,"props":341,"children":343},{"style":342},"--shiki-default:#E1E4E8",[344],{"type":35,"value":345},"() {\n",{"type":30,"tag":71,"props":347,"children":348},{"class":73,"line":119},[349,354,359,364,369,374],{"type":30,"tag":71,"props":350,"children":351},{"style":220},[352],{"type":35,"value":353},"  var",{"type":30,"tag":71,"props":355,"children":356},{"style":342},[357],{"type":35,"value":358}," orderId ",{"type":30,"tag":71,"props":360,"children":361},{"style":220},[362],{"type":35,"value":363},"=",{"type":30,"tag":71,"props":365,"children":366},{"style":342},[367],{"type":35,"value":368}," {{Order ",{"type":30,"tag":71,"props":370,"children":371},{"style":100},[372],{"type":35,"value":373},"ID",{"type":30,"tag":71,"props":375,"children":376},{"style":342},[377],{"type":35,"value":378},"}};\n",{"type":30,"tag":71,"props":380,"children":381},{"class":73,"line":132},[382,386,391,395,400,405,410,415,420,425,430],{"type":30,"tag":71,"props":383,"children":384},{"style":220},[385],{"type":35,"value":353},{"type":30,"tag":71,"props":387,"children":388},{"style":342},[389],{"type":35,"value":390}," timestamp ",{"type":30,"tag":71,"props":392,"children":393},{"style":220},[394],{"type":35,"value":363},{"type":30,"tag":71,"props":396,"children":397},{"style":342},[398],{"type":35,"value":399}," Math.",{"type":30,"tag":71,"props":401,"children":402},{"style":78},[403],{"type":35,"value":404},"floor",{"type":30,"tag":71,"props":406,"children":407},{"style":342},[408],{"type":35,"value":409},"(Date.",{"type":30,"tag":71,"props":411,"children":412},{"style":78},[413],{"type":35,"value":414},"now",{"type":30,"tag":71,"props":416,"children":417},{"style":342},[418],{"type":35,"value":419},"() ",{"type":30,"tag":71,"props":421,"children":422},{"style":220},[423],{"type":35,"value":424},"\u002F",{"type":30,"tag":71,"props":426,"children":427},{"style":100},[428],{"type":35,"value":429}," 1000",{"type":30,"tag":71,"props":431,"children":432},{"style":342},[433],{"type":35,"value":434},");\n",{"type":30,"tag":71,"props":436,"children":437},{"class":73,"line":145},[438,443,447,452,457,462],{"type":30,"tag":71,"props":439,"children":440},{"style":220},[441],{"type":35,"value":442},"  return",{"type":30,"tag":71,"props":444,"children":445},{"style":342},[446],{"type":35,"value":358},{"type":30,"tag":71,"props":448,"children":449},{"style":220},[450],{"type":35,"value":451},"+",{"type":30,"tag":71,"props":453,"children":454},{"style":84},[455],{"type":35,"value":456}," '_ts'",{"type":30,"tag":71,"props":458,"children":459},{"style":220},[460],{"type":35,"value":461}," +",{"type":30,"tag":71,"props":463,"children":464},{"style":342},[465],{"type":35,"value":466}," timestamp;\n",{"type":30,"tag":71,"props":468,"children":469},{"class":73,"line":158},[470],{"type":30,"tag":71,"props":471,"children":472},{"style":342},[473],{"type":35,"value":474},"}\n",{"type":30,"tag":31,"props":476,"children":477},{},[478,480,485],{"type":35,"value":479},"Dans sGTM, nous mappons le même ",{"type":30,"tag":67,"props":481,"children":483},{"className":482},[],[484],{"type":35,"value":282},{"type":35,"value":486}," au tag Meta Conversion API. Important : la composante timestamp n'est pas obligatoire, mais elle prévient les collisions uniques — le même order_id peut être réutilisé dans des sessions différentes.",{"type":30,"tag":31,"props":488,"children":489},{},[490,492,498,500,506,508,514],{"type":35,"value":491},"Pour Google Ads, c'est différent : le paramètre ",{"type":30,"tag":67,"props":493,"children":495},{"className":494},[],[496],{"type":35,"value":497},"gclid",{"type":35,"value":499}," suffit, pas de d'ID de déduplication supplémentaire. Mais dans Google Analytics 4, si vous envoyez à la fois ",{"type":30,"tag":67,"props":501,"children":503},{"className":502},[],[504],{"type":35,"value":505},"client_id",{"type":35,"value":507}," + ",{"type":30,"tag":67,"props":509,"children":511},{"className":510},[],[512],{"type":35,"value":513},"session_id",{"type":35,"value":515}," depuis le client et le serveur, GA4 exécute une dédup automatique — fonctionnalité ajoutée en 2024 Q3.",{"type":30,"tag":31,"props":517,"children":518},{},[519,521,527,529,535,537,543],{"type":35,"value":520},"Validation de dédup : dans Meta Events Manager, le score « Event Match Quality » doit être supérieur à %80. Si ce score est bas — en particulier si les hashs ",{"type":30,"tag":67,"props":522,"children":524},{"className":523},[],[525],{"type":35,"value":526},"em",{"type":35,"value":528}," (email), ",{"type":30,"tag":67,"props":530,"children":532},{"className":531},[],[533],{"type":35,"value":534},"ph",{"type":35,"value":536}," (téléphone), ",{"type":30,"tag":67,"props":538,"children":540},{"className":539},[],[541],{"type":35,"value":542},"fn",{"type":35,"value":544}," (prénom) manquent — l'événement serveur est classé comme « low confidence » et la fiabilité du nettoyage de duplication s'en trouve réduite.",{"type":30,"tag":38,"props":546,"children":548},{"id":547},"template-container-quels-tags-doivent-être-inclus-par-défaut",[549],{"type":35,"value":550},"Template Container : Quels Tags Doivent Être Inclus par Défaut",{"type":30,"tag":31,"props":552,"children":553},{},[554],{"type":35,"value":555},"Le Google Tag Manager Server Container commence vide, il faut ajouter manuellement chaque tag. Après avoir construit 15+ containers, nous avons créé un repo template — un nouveau client passe en production en 5 minutes.",{"type":30,"tag":31,"props":557,"children":558},{},[559],{"type":30,"tag":560,"props":561,"children":562},"strong",{},[563],{"type":35,"value":564},"Tags obligatoires :",{"type":30,"tag":566,"props":567,"children":568},"ul",{},[569,580,590,600,610],{"type":30,"tag":570,"props":571,"children":572},"li",{},[573,578],{"type":30,"tag":560,"props":574,"children":575},{},[576],{"type":35,"value":577},"Meta Conversion API",{"type":35,"value":579}," (via Meta Business Extension)",{"type":30,"tag":570,"props":581,"children":582},{},[583,588],{"type":30,"tag":560,"props":584,"children":585},{},[586],{"type":35,"value":587},"Google Analytics 4",{"type":35,"value":589}," (avec client server-side)",{"type":30,"tag":570,"props":591,"children":592},{},[593,598],{"type":30,"tag":560,"props":594,"children":595},{},[596],{"type":35,"value":597},"Google Ads Conversion",{"type":35,"value":599}," (avec Enhanced Conversion)",{"type":30,"tag":570,"props":601,"children":602},{},[603,608],{"type":30,"tag":560,"props":604,"children":605},{},[606],{"type":35,"value":607},"Snapchat Conversion API",{"type":35,"value":609}," (pour les clients gaming\u002Ffashion)",{"type":30,"tag":570,"props":611,"children":612},{},[613,618],{"type":30,"tag":560,"props":614,"children":615},{},[616],{"type":35,"value":617},"TikTok Events API",{"type":35,"value":619}," (si ciblage Gen Z)",{"type":30,"tag":31,"props":621,"children":622},{},[623],{"type":30,"tag":560,"props":624,"children":625},{},[626],{"type":35,"value":627},"Optionnels mais recommandés :",{"type":30,"tag":566,"props":629,"children":630},{},[631,641,659],{"type":30,"tag":570,"props":632,"children":633},{},[634,639],{"type":30,"tag":560,"props":635,"children":636},{},[637],{"type":35,"value":638},"Firestore\u002FBigQuery log writer",{"type":35,"value":640}," — enregistrez chaque événement brut, critique pour la piste d'audit + la modélisation d'attribution",{"type":30,"tag":570,"props":642,"children":643},{},[644,649,651,657],{"type":30,"tag":560,"props":645,"children":646},{},[647],{"type":35,"value":648},"Variable de vérification du consentement",{"type":35,"value":650}," — parser la chaîne TCF 2.2 et vérifiez les consentements purpose 1 (stockage) et purpose 2 (mesure), si refus envoyez ",{"type":30,"tag":67,"props":652,"children":654},{"className":653},[],[655],{"type":35,"value":656},"action_source=physical_store",{"type":35,"value":658}," à Meta (ce n'est pas un bypass de consentement, juste un signal agrégé)",{"type":30,"tag":570,"props":660,"children":661},{},[662,667,669,675],{"type":30,"tag":560,"props":663,"children":664},{},[665],{"type":35,"value":666},"Enrichissement IP utilisateur",{"type":35,"value":668}," — extrayez ",{"type":30,"tag":67,"props":670,"children":672},{"className":671},[],[673],{"type":35,"value":674},"X-Forwarded-For",{"type":35,"value":676}," de l'en-tête de la requête Cloud Run, cela améliore la précision de la géolocalisation de Conversion API de %12",{"type":30,"tag":31,"props":678,"children":679},{},[680],{"type":35,"value":681},"Structure exemple du repo template :",{"type":30,"tag":60,"props":683,"children":685},{"code":684},"sgtm-template\u002F\n├── clients\u002F\n│   └── ga4-client.json\n├── tags\u002F\n│   ├── meta-capi.json\n│   ├── google-ads.json\n│   └── bigquery-log.json\n├── variables\u002F\n│   ├── event-id.json\n│   ├── user-data.json\n│   └── consent-status.json\n└── triggers\u002F\n    ├── all-events.json\n    └── conversion-only.json\n",[686],{"type":30,"tag":67,"props":687,"children":688},{"__ignoreMap":14},[689],{"type":35,"value":684},{"type":30,"tag":31,"props":691,"children":692},{},[693,695,700],{"type":35,"value":694},"Chaque fichier JSON est exporté depuis l'interface GTM — vous ne pouvez pas l'importer directement via CLI ",{"type":30,"tag":67,"props":696,"children":698},{"className":697},[],[699],{"type":35,"value":81},{"type":35,"value":701},", mais vous pouvez l'automatiser avec des scripts en CI\u002FCD. Il existe un provider Terraform pour GTM, mais c'est du community-maintained, pas officiel.",{"type":30,"tag":703,"props":704,"children":706},"h3",{"id":705},"variable-de-données-utilisateur-envoi-sans-hachage",[707],{"type":35,"value":708},"Variable de Données Utilisateur : Envoi Sans Hachage",{"type":30,"tag":31,"props":710,"children":711},{},[712],{"type":35,"value":713},"Meta et Google exigent que les PII (informations personnelles identifiables) soient hachées : email → SHA256, téléphone → format E.164 + SHA256. Dans GTM côté client, le hachage se fait en JavaScript, mais dans sGTM, c'est plus sûr côté serveur — il n'apparaît pas en texte brut dans les devtools du navigateur.",{"type":30,"tag":60,"props":715,"children":717},{"code":716,"language":317,"meta":14,"className":318,"style":14},"\u002F\u002F Variable personnalisée sGTM : hashed_email\nconst crypto = require('crypto');\nconst getEventData = require('getEventData');\n\nconst email = getEventData('user_data.email_address');\nif (!email) return undefined;\n\nreturn crypto.createHash('sha256')\n  .update(email.toLowerCase().trim())\n  .digest('hex');\n",[718],{"type":30,"tag":67,"props":719,"children":720},{"__ignoreMap":14},[721,729,766,799,808,841,879,886,917,955],{"type":30,"tag":71,"props":722,"children":723},{"class":73,"line":74},[724],{"type":30,"tag":71,"props":725,"children":726},{"style":328},[727],{"type":35,"value":728},"\u002F\u002F Variable personnalisée sGTM : hashed_email\n",{"type":30,"tag":71,"props":730,"children":731},{"class":73,"line":106},[732,737,742,747,752,757,762],{"type":30,"tag":71,"props":733,"children":734},{"style":220},[735],{"type":35,"value":736},"const",{"type":30,"tag":71,"props":738,"children":739},{"style":100},[740],{"type":35,"value":741}," crypto",{"type":30,"tag":71,"props":743,"children":744},{"style":220},[745],{"type":35,"value":746}," =",{"type":30,"tag":71,"props":748,"children":749},{"style":78},[750],{"type":35,"value":751}," require",{"type":30,"tag":71,"props":753,"children":754},{"style":342},[755],{"type":35,"value":756},"(",{"type":30,"tag":71,"props":758,"children":759},{"style":84},[760],{"type":35,"value":761},"'crypto'",{"type":30,"tag":71,"props":763,"children":764},{"style":342},[765],{"type":35,"value":434},{"type":30,"tag":71,"props":767,"children":768},{"class":73,"line":119},[769,773,778,782,786,790,795],{"type":30,"tag":71,"props":770,"children":771},{"style":220},[772],{"type":35,"value":736},{"type":30,"tag":71,"props":774,"children":775},{"style":100},[776],{"type":35,"value":777}," getEventData",{"type":30,"tag":71,"props":779,"children":780},{"style":220},[781],{"type":35,"value":746},{"type":30,"tag":71,"props":783,"children":784},{"style":78},[785],{"type":35,"value":751},{"type":30,"tag":71,"props":787,"children":788},{"style":342},[789],{"type":35,"value":756},{"type":30,"tag":71,"props":791,"children":792},{"style":84},[793],{"type":35,"value":794},"'getEventData'",{"type":30,"tag":71,"props":796,"children":797},{"style":342},[798],{"type":35,"value":434},{"type":30,"tag":71,"props":800,"children":801},{"class":73,"line":132},[802],{"type":30,"tag":71,"props":803,"children":805},{"emptyLinePlaceholder":804},true,[806],{"type":35,"value":807},"\n",{"type":30,"tag":71,"props":809,"children":810},{"class":73,"line":145},[811,815,820,824,828,832,837],{"type":30,"tag":71,"props":812,"children":813},{"style":220},[814],{"type":35,"value":736},{"type":30,"tag":71,"props":816,"children":817},{"style":100},[818],{"type":35,"value":819}," email",{"type":30,"tag":71,"props":821,"children":822},{"style":220},[823],{"type":35,"value":746},{"type":30,"tag":71,"props":825,"children":826},{"style":78},[827],{"type":35,"value":777},{"type":30,"tag":71,"props":829,"children":830},{"style":342},[831],{"type":35,"value":756},{"type":30,"tag":71,"props":833,"children":834},{"style":84},[835],{"type":35,"value":836},"'user_data.email_address'",{"type":30,"tag":71,"props":838,"children":839},{"style":342},[840],{"type":35,"value":434},{"type":30,"tag":71,"props":842,"children":843},{"class":73,"line":158},[844,849,854,859,864,869,874],{"type":30,"tag":71,"props":845,"children":846},{"style":220},[847],{"type":35,"value":848},"if",{"type":30,"tag":71,"props":850,"children":851},{"style":342},[852],{"type":35,"value":853}," (",{"type":30,"tag":71,"props":855,"children":856},{"style":220},[857],{"type":35,"value":858},"!",{"type":30,"tag":71,"props":860,"children":861},{"style":342},[862],{"type":35,"value":863},"email) ",{"type":30,"tag":71,"props":865,"children":866},{"style":220},[867],{"type":35,"value":868},"return",{"type":30,"tag":71,"props":870,"children":871},{"style":100},[872],{"type":35,"value":873}," undefined",{"type":30,"tag":71,"props":875,"children":876},{"style":342},[877],{"type":35,"value":878},";\n",{"type":30,"tag":71,"props":880,"children":881},{"class":73,"line":171},[882],{"type":30,"tag":71,"props":883,"children":884},{"emptyLinePlaceholder":804},[885],{"type":35,"value":807},{"type":30,"tag":71,"props":887,"children":888},{"class":73,"line":184},[889,893,898,903,907,912],{"type":30,"tag":71,"props":890,"children":891},{"style":220},[892],{"type":35,"value":868},{"type":30,"tag":71,"props":894,"children":895},{"style":342},[896],{"type":35,"value":897}," crypto.",{"type":30,"tag":71,"props":899,"children":900},{"style":78},[901],{"type":35,"value":902},"createHash",{"type":30,"tag":71,"props":904,"children":905},{"style":342},[906],{"type":35,"value":756},{"type":30,"tag":71,"props":908,"children":909},{"style":84},[910],{"type":35,"value":911},"'sha256'",{"type":30,"tag":71,"props":913,"children":914},{"style":342},[915],{"type":35,"value":916},")\n",{"type":30,"tag":71,"props":918,"children":919},{"class":73,"line":24},[920,925,930,935,940,945,950],{"type":30,"tag":71,"props":921,"children":922},{"style":342},[923],{"type":35,"value":924},"  .",{"type":30,"tag":71,"props":926,"children":927},{"style":78},[928],{"type":35,"value":929},"update",{"type":30,"tag":71,"props":931,"children":932},{"style":342},[933],{"type":35,"value":934},"(email.",{"type":30,"tag":71,"props":936,"children":937},{"style":78},[938],{"type":35,"value":939},"toLowerCase",{"type":30,"tag":71,"props":941,"children":942},{"style":342},[943],{"type":35,"value":944},"().",{"type":30,"tag":71,"props":946,"children":947},{"style":78},[948],{"type":35,"value":949},"trim",{"type":30,"tag":71,"props":951,"children":952},{"style":342},[953],{"type":35,"value":954},"())\n",{"type":30,"tag":71,"props":956,"children":958},{"class":73,"line":957},10,[959,963,968,972,977],{"type":30,"tag":71,"props":960,"children":961},{"style":342},[962],{"type":35,"value":924},{"type":30,"tag":71,"props":964,"children":965},{"style":78},[966],{"type":35,"value":967},"digest",{"type":30,"tag":71,"props":969,"children":970},{"style":342},[971],{"type":35,"value":756},{"type":30,"tag":71,"props":973,"children":974},{"style":84},[975],{"type":35,"value":976},"'hex'",{"type":30,"tag":71,"props":978,"children":979},{"style":342},[980],{"type":35,"value":434},{"type":30,"tag":31,"props":982,"children":983},{},[984,986,992],{"type":35,"value":985},"Pour le téléphone, le format E.164 est : ",{"type":30,"tag":67,"props":987,"children":989},{"className":988},[],[990],{"type":35,"value":991},"+33612345678",{"type":35,"value":993}," (code pays + numéro). Dans les projets Roibase, %40 des données téléphoniques sont rejetées à cause d'erreurs de format — vous devez ajouter de la validation.",{"type":30,"tag":38,"props":995,"children":997},{"id":996},"conversion-api-et-enhanced-conversion-quelle-est-la-différence",[998],{"type":35,"value":999},"Conversion API et Enhanced Conversion : Quelle est la Différence",{"type":30,"tag":31,"props":1001,"children":1002},{},[1003],{"type":35,"value":1004},"Meta Conversion API et Google Enhanced Conversion sont des protocoles différents mais servent le même but : augmenter le taux d'appariement avec les données first-party. Conversion API fonctionne par événement — chaque clic, ajout au panier, achat est un POST HTTP séparé. Enhanced Conversion fonctionne par tag — les données utilisateur ne sont envoyées qu'au moment de la conversion (achat, inscription).",{"type":30,"tag":31,"props":1006,"children":1007},{},[1008],{"type":35,"value":1009},"Configuration du tag sGTM pour Google Enhanced Conversion :",{"type":30,"tag":60,"props":1011,"children":1015},{"code":1012,"language":1013,"meta":14,"className":1014,"style":14},"{\n  \"type\": \"google_ads_remarketing\",\n  \"enhancedConversionData\": {\n    \"email\": \"{{Hashed Email}}\",\n    \"phone\": \"{{Hashed Phone}}\",\n    \"address\": {\n      \"first_name\": \"{{Hashed First Name}}\",\n      \"last_name\": \"{{Hashed Last Name}}\",\n      \"country\": \"FR\",\n      \"postal_code\": \"{{Postal Code}}\"\n    }\n  }\n}\n","json","language-json shiki shiki-themes github-dark",[1016],{"type":30,"tag":67,"props":1017,"children":1018},{"__ignoreMap":14},[1019,1027,1050,1063,1084,1105,1117,1138,1159,1180,1197,1206,1215],{"type":30,"tag":71,"props":1020,"children":1021},{"class":73,"line":74},[1022],{"type":30,"tag":71,"props":1023,"children":1024},{"style":342},[1025],{"type":35,"value":1026},"{\n",{"type":30,"tag":71,"props":1028,"children":1029},{"class":73,"line":106},[1030,1035,1040,1045],{"type":30,"tag":71,"props":1031,"children":1032},{"style":100},[1033],{"type":35,"value":1034},"  \"type\"",{"type":30,"tag":71,"props":1036,"children":1037},{"style":342},[1038],{"type":35,"value":1039},": ",{"type":30,"tag":71,"props":1041,"children":1042},{"style":84},[1043],{"type":35,"value":1044},"\"google_ads_remarketing\"",{"type":30,"tag":71,"props":1046,"children":1047},{"style":342},[1048],{"type":35,"value":1049},",\n",{"type":30,"tag":71,"props":1051,"children":1052},{"class":73,"line":119},[1053,1058],{"type":30,"tag":71,"props":1054,"children":1055},{"style":100},[1056],{"type":35,"value":1057},"  \"enhancedConversionData\"",{"type":30,"tag":71,"props":1059,"children":1060},{"style":342},[1061],{"type":35,"value":1062},": {\n",{"type":30,"tag":71,"props":1064,"children":1065},{"class":73,"line":132},[1066,1071,1075,1080],{"type":30,"tag":71,"props":1067,"children":1068},{"style":100},[1069],{"type":35,"value":1070},"    \"email\"",{"type":30,"tag":71,"props":1072,"children":1073},{"style":342},[1074],{"type":35,"value":1039},{"type":30,"tag":71,"props":1076,"children":1077},{"style":84},[1078],{"type":35,"value":1079},"\"{{Hashed Email}}\"",{"type":30,"tag":71,"props":1081,"children":1082},{"style":342},[1083],{"type":35,"value":1049},{"type":30,"tag":71,"props":1085,"children":1086},{"class":73,"line":145},[1087,1092,1096,1101],{"type":30,"tag":71,"props":1088,"children":1089},{"style":100},[1090],{"type":35,"value":1091},"    \"phone\"",{"type":30,"tag":71,"props":1093,"children":1094},{"style":342},[1095],{"type":35,"value":1039},{"type":30,"tag":71,"props":1097,"children":1098},{"style":84},[1099],{"type":35,"value":1100},"\"{{Hashed Phone}}\"",{"type":30,"tag":71,"props":1102,"children":1103},{"style":342},[1104],{"type":35,"value":1049},{"type":30,"tag":71,"props":1106,"children":1107},{"class":73,"line":158},[1108,1113],{"type":30,"tag":71,"props":1109,"children":1110},{"style":100},[1111],{"type":35,"value":1112},"    \"address\"",{"type":30,"tag":71,"props":1114,"children":1115},{"style":342},[1116],{"type":35,"value":1062},{"type":30,"tag":71,"props":1118,"children":1119},{"class":73,"line":171},[1120,1125,1129,1134],{"type":30,"tag":71,"props":1121,"children":1122},{"style":100},[1123],{"type":35,"value":1124},"      \"first_name\"",{"type":30,"tag":71,"props":1126,"children":1127},{"style":342},[1128],{"type":35,"value":1039},{"type":30,"tag":71,"props":1130,"children":1131},{"style":84},[1132],{"type":35,"value":1133},"\"{{Hashed First Name}}\"",{"type":30,"tag":71,"props":1135,"children":1136},{"style":342},[1137],{"type":35,"value":1049},{"type":30,"tag":71,"props":1139,"children":1140},{"class":73,"line":184},[1141,1146,1150,1155],{"type":30,"tag":71,"props":1142,"children":1143},{"style":100},[1144],{"type":35,"value":1145},"      \"last_name\"",{"type":30,"tag":71,"props":1147,"children":1148},{"style":342},[1149],{"type":35,"value":1039},{"type":30,"tag":71,"props":1151,"children":1152},{"style":84},[1153],{"type":35,"value":1154},"\"{{Hashed Last Name}}\"",{"type":30,"tag":71,"props":1156,"children":1157},{"style":342},[1158],{"type":35,"value":1049},{"type":30,"tag":71,"props":1160,"children":1161},{"class":73,"line":24},[1162,1167,1171,1176],{"type":30,"tag":71,"props":1163,"children":1164},{"style":100},[1165],{"type":35,"value":1166},"      \"country\"",{"type":30,"tag":71,"props":1168,"children":1169},{"style":342},[1170],{"type":35,"value":1039},{"type":30,"tag":71,"props":1172,"children":1173},{"style":84},[1174],{"type":35,"value":1175},"\"FR\"",{"type":30,"tag":71,"props":1177,"children":1178},{"style":342},[1179],{"type":35,"value":1049},{"type":30,"tag":71,"props":1181,"children":1182},{"class":73,"line":957},[1183,1188,1192],{"type":30,"tag":71,"props":1184,"children":1185},{"style":100},[1186],{"type":35,"value":1187},"      \"postal_code\"",{"type":30,"tag":71,"props":1189,"children":1190},{"style":342},[1191],{"type":35,"value":1039},{"type":30,"tag":71,"props":1193,"children":1194},{"style":84},[1195],{"type":35,"value":1196},"\"{{Postal Code}}\"\n",{"type":30,"tag":71,"props":1198,"children":1200},{"class":73,"line":1199},11,[1201],{"type":30,"tag":71,"props":1202,"children":1203},{"style":342},[1204],{"type":35,"value":1205},"    }\n",{"type":30,"tag":71,"props":1207,"children":1209},{"class":73,"line":1208},12,[1210],{"type":30,"tag":71,"props":1211,"children":1212},{"style":342},[1213],{"type":35,"value":1214},"  }\n",{"type":30,"tag":71,"props":1216,"children":1218},{"class":73,"line":1217},13,[1219],{"type":30,"tag":71,"props":1220,"children":1221},{"style":342},[1222],{"type":35,"value":474},{"type":30,"tag":31,"props":1224,"children":1225},{},[1226,1228,1234,1236,1242,1244,1250,1251,1257],{"type":35,"value":1227},"Chez Meta, l'objet ",{"type":30,"tag":67,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":35,"value":1233},"user_data",{"type":35,"value":1235}," est envoyé pour chaque événement — ",{"type":30,"tag":67,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":35,"value":1241},"ViewContent",{"type":35,"value":1243},", ",{"type":30,"tag":67,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":35,"value":1249},"AddToCart",{"type":35,"value":1243},{"type":30,"tag":67,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":35,"value":1256},"Purchase",{"type":35,"value":1258},", tous avec le même hash.",{"type":30,"tag":31,"props":1260,"children":1261},{},[1262],{"type":35,"value":1263},"Différence pratique : Google Enhanced Conversion n'agit que sur le pixel de conversion — si le trafic n'est pas énorme, le taux d'appariement reste faible. Meta CAPI reçoit les données utilisateur pour chaque événement, l'audience de retargeting devient plus riche. C'est pourquoi sur l'e-commerce, le setup de Meta CAPI est prioritaire, Google EC vient en second.",{"type":30,"tag":38,"props":1265,"children":1267},{"id":1266},"monitoring-et-debug-quelles-métriques-surveiller",[1268],{"type":35,"value":1269},"Monitoring et Debug : Quelles Métriques Surveiller",{"type":30,"tag":31,"props":1271,"children":1272},{},[1273],{"type":35,"value":1274},"Avec une stack server-side en production, le monitoring est indispensable. Il n'y a pas de mode prévisualisation côté server-side comme avec GTM côté client — vous débuguez sur le trafic en direct.",{"type":30,"tag":31,"props":1276,"children":1277},{},[1278],{"type":30,"tag":560,"props":1279,"children":1280},{},[1281],{"type":35,"value":1282},"Métriques critiques :",{"type":30,"tag":566,"props":1284,"children":1285},{},[1286,1296,1306,1316],{"type":30,"tag":570,"props":1287,"children":1288},{},[1289,1294],{"type":30,"tag":560,"props":1290,"children":1291},{},[1292],{"type":35,"value":1293},"Nombre d'instances Cloud Run",{"type":35,"value":1295}," — même si min=1, le trafic en pics peut monter à 10 instances, mettez des alertes pour contrôler les coûts",{"type":30,"tag":570,"props":1297,"children":1298},{},[1299,1304],{"type":30,"tag":560,"props":1300,"children":1301},{},[1302],{"type":35,"value":1303},"Temps de réponse P95",{"type":35,"value":1305}," — au-delà de 500ms, les conversions commencent à être perdues, surtout sur la page de paiement",{"type":30,"tag":570,"props":1307,"children":1308},{},[1309,1314],{"type":30,"tag":560,"props":1310,"children":1311},{},[1312],{"type":35,"value":1313},"Score Meta Event Match Quality",{"type":35,"value":1315}," (vérification manuelle depuis Events Manager) — en dessous de %80, cela signifie que les données utilisateur manquent",{"type":30,"tag":570,"props":1317,"children":1318},{},[1319,1324],{"type":30,"tag":560,"props":1320,"children":1321},{},[1322],{"type":35,"value":1323},"Ratio count événement serveur \u002F événement client",{"type":35,"value":1325}," (depuis GA4) — idéalement entre 1.1 et 1.3 (le serveur en voit un peu plus, les blocages côté client expliquent la différence), en dessous de 0.8 il y a une erreur serveur",{"type":30,"tag":31,"props":1327,"children":1328},{},[1329],{"type":35,"value":1330},"Requête Cloud Logging :",{"type":30,"tag":60,"props":1332,"children":1336},{"code":1333,"language":1334,"meta":14,"className":1335,"style":14},"resource.type=\"cloud_run_revision\"\nresource.labels.service_name=\"sgtm-prod\"\njsonPayload.event_name=\"purchase\"\nseverity=\"ERROR\"\n","sql","language-sql shiki shiki-themes github-dark",[1337],{"type":30,"tag":67,"props":1338,"children":1339},{"__ignoreMap":14},[1340,1366,1396,1422],{"type":30,"tag":71,"props":1341,"children":1342},{"class":73,"line":74},[1343,1348,1352,1357,1361],{"type":30,"tag":71,"props":1344,"children":1345},{"style":100},[1346],{"type":35,"value":1347},"resource",{"type":30,"tag":71,"props":1349,"children":1350},{"style":342},[1351],{"type":35,"value":313},{"type":30,"tag":71,"props":1353,"children":1354},{"style":100},[1355],{"type":35,"value":1356},"type",{"type":30,"tag":71,"props":1358,"children":1359},{"style":220},[1360],{"type":35,"value":363},{"type":30,"tag":71,"props":1362,"children":1363},{"style":84},[1364],{"type":35,"value":1365},"\"cloud_run_revision\"\n",{"type":30,"tag":71,"props":1367,"children":1368},{"class":73,"line":106},[1369,1373,1377,1382,1386,1391],{"type":30,"tag":71,"props":1370,"children":1371},{"style":100},[1372],{"type":35,"value":1347},{"type":30,"tag":71,"props":1374,"children":1375},{"style":342},[1376],{"type":35,"value":313},{"type":30,"tag":71,"props":1378,"children":1379},{"style":100},[1380],{"type":35,"value":1381},"labels",{"type":30,"tag":71,"props":1383,"children":1384},{"style":342},[1385],{"type":35,"value":313},{"type":30,"tag":71,"props":1387,"children":1388},{"style":220},[1389],{"type":35,"value":1390},"service_name=",{"type":30,"tag":71,"props":1392,"children":1393},{"style":84},[1394],{"type":35,"value":1395},"\"sgtm-prod\"\n",{"type":30,"tag":71,"props":1397,"children":1398},{"class":73,"line":119},[1399,1404,1408,1413,1417],{"type":30,"tag":71,"props":1400,"children":1401},{"style":100},[1402],{"type":35,"value":1403},"jsonPayload",{"type":30,"tag":71,"props":1405,"children":1406},{"style":342},[1407],{"type":35,"value":313},{"type":30,"tag":71,"props":1409,"children":1410},{"style":100},[1411],{"type":35,"value":1412},"event_name",{"type":30,"tag":71,"props":1414,"children":1415},{"style":220},[1416],{"type":35,"value":363},{"type":30,"tag":71,"props":1418,"children":1419},{"style":84},[1420],{"type":35,"value":1421},"\"purchase\"\n",{"type":30,"tag":71,"props":1423,"children":1424},{"class":73,"line":132},[1425,1430,1434],{"type":30,"tag":71,"props":1426,"children":1427},{"style":342},[1428],{"type":35,"value":1429},"severity",{"type":30,"tag":71,"props":1431,"children":1432},{"style":220},[1433],{"type":35,"value":363},{"type":30,"tag":71,"props":1435,"children":1436},{"style":84},[1437],{"type":35,"value":1438},"\"ERROR\"\n",{"type":30,"tag":31,"props":1440,"children":1441},{},[1442,1444,1450,1452,1458],{"type":35,"value":1443},"Les logs d'erreur ne s'écrivent pas via ",{"type":30,"tag":67,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":35,"value":1449},"console.log",{"type":35,"value":1451}," dans GTM — vous devez utiliser l'API ",{"type":30,"tag":67,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":35,"value":1457},"logToConsole()",{"type":35,"value":1459},", qui écrit dans Cloud Logging.",{"type":30,"tag":31,"props":1461,"children":1462},{},[1463],{"type":35,"value":1464},"Schéma de table BigQuery pour les logs :",{"type":30,"tag":1466,"props":1467,"children":1468},"table",{},[1469,1493],{"type":30,"tag":1470,"props":1471,"children":1472},"thead",{},[1473],{"type":30,"tag":1474,"props":1475,"children":1476},"tr",{},[1477,1483,1488],{"type":30,"tag":1478,"props":1479,"children":1480},"th",{},[1481],{"type":35,"value":1482},"Champ",{"type":30,"tag":1478,"props":1484,"children":1485},{},[1486],{"type":35,"value":1487},"Type",{"type":30,"tag":1478,"props":1489,"children":1490},{},[1491],{"type":35,"value":1492},"Description",{"type":30,"tag":1494,"props":1495,"children":1496},"tbody",{},[1497,1516,1533,1550,1566,1582,1599],{"type":30,"tag":1474,"props":1498,"children":1499},{},[1500,1506,1511],{"type":30,"tag":1501,"props":1502,"children":1503},"td",{},[1504],{"type":35,"value":1505},"event_timestamp",{"type":30,"tag":1501,"props":1507,"children":1508},{},[1509],{"type":35,"value":1510},"TIMESTAMP",{"type":30,"tag":1501,"props":1512,"children":1513},{},[1514],{"type":35,"value":1515},"Heure serveur (UTC)",{"type":30,"tag":1474,"props":1517,"children":1518},{},[1519,1523,1528],{"type":30,"tag":1501,"props":1520,"children":1521},{},[1522],{"type":35,"value":1412},{"type":30,"tag":1501,"props":1524,"children":1525},{},[1526],{"type":35,"value":1527},"STRING",{"type":30,"tag":1501,"props":1529,"children":1530},{},[1531],{"type":35,"value":1532},"purchase, add_to_cart, etc.",{"type":30,"tag":1474,"props":1534,"children":1535},{},[1536,1541,1545],{"type":30,"tag":1501,"props":1537,"children":1538},{},[1539],{"type":35,"value":1540},"user_id",{"type":30,"tag":1501,"props":1542,"children":1543},{},[1544],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1546,"children":1547},{},[1548],{"type":35,"value":1549},"Haché",{"type":30,"tag":1474,"props":1551,"children":1552},{},[1553,1557,1561],{"type":30,"tag":1501,"props":1554,"children":1555},{},[1556],{"type":35,"value":505},{"type":30,"tag":1501,"props":1558,"children":1559},{},[1560],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1562,"children":1563},{},[1564],{"type":35,"value":1565},"ID client GA4",{"type":30,"tag":1474,"props":1567,"children":1568},{},[1569,1573,1577],{"type":30,"tag":1501,"props":1570,"children":1571},{},[1572],{"type":35,"value":282},{"type":30,"tag":1501,"props":1574,"children":1575},{},[1576],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1578,"children":1579},{},[1580],{"type":35,"value":1581},"ID déduplication",{"type":30,"tag":1474,"props":1583,"children":1584},{},[1585,1590,1594],{"type":30,"tag":1501,"props":1586,"children":1587},{},[1588],{"type":35,"value":1589},"platform",{"type":30,"tag":1501,"props":1591,"children":1592},{},[1593],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1595,"children":1596},{},[1597],{"type":35,"value":1598},"meta, google_ads, snapchat",{"type":30,"tag":1474,"props":1600,"children":1601},{},[1602,1607,1612],{"type":30,"tag":1501,"props":1603,"children":1604},{},[1605],{"type":35,"value":1606},"response_code",{"type":30,"tag":1501,"props":1608,"children":1609},{},[1610],{"type":35,"value":1611},"INTEGER",{"type":30,"tag":1501,"props":1613,"children":1614},{},[1615],{"type":35,"value":1616},"Statut HTTP",{"type":30,"tag":31,"props":1618,"children":1619},{},[1620,1622,1631],{"type":35,"value":1621},"Cette table s'inscrit dans le contexte de ",{"type":30,"tag":1623,"props":1624,"children":1628},"a",{"href":1625,"rel":1626},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[1627],"nofollow",[1629],{"type":35,"value":1630},"Stratégie de Données First-Party et Architecture de Mesure",{"type":35,"value":1632},", elle est écrite dans le data warehouse BigQuery et liée via dbt à des modèles en aval (attribution, prédiction LTV).",{"type":30,"tag":38,"props":1634,"children":1636},{"id":1635},"consent-mode-v2-et-server-side-comment-intégrer",[1637],{"type":35,"value":1638},"Consent Mode v2 et Server-Side : Comment Intégrer",{"type":30,"tag":31,"props":1640,"children":1641},{},[1642,1644,1650,1652,1658],{"type":35,"value":1643},"Depuis mars 2024, Google Consent Mode v2 est obligatoire en EEA — le statut de consentement ",{"type":30,"tag":67,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":35,"value":1649},"ad_storage",{"type":35,"value":1651}," et ",{"type":30,"tag":67,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":35,"value":1657},"analytics_storage",{"type":35,"value":1659}," doit être envoyé à chaque hit. Server-side, cette information ne vient pas de GTM côté client, vous devez l'envoyer manuellement.",{"type":30,"tag":31,"props":1661,"children":1662},{},[1663],{"type":35,"value":1664},"Deux méthodes :",{"type":30,"tag":1666,"props":1667,"children":1668},"ol",{},[1669,1687],{"type":30,"tag":570,"props":1670,"children":1671},{},[1672,1677,1679,1685],{"type":30,"tag":560,"props":1673,"children":1674},{},[1675],{"type":35,"value":1676},"Query parameter :",{"type":35,"value":1678}," ",{"type":30,"tag":67,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":35,"value":1684},"sgtm.example.com\u002Fg\u002Fcollect?consent=granted",{"type":35,"value":1686}," — facile mais visible dans l'URL, problèmes de cache",{"type":30,"tag":570,"props":1688,"children":1689},{},[1690,1695,1696,1702],{"type":30,"tag":560,"props":1691,"children":1692},{},[1693],{"type":35,"value":1694},"En-tête HTTP :",{"type":35,"value":1678},{"type":30,"tag":67,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":35,"value":1701},"X-Consent-Status: analytics_storage=granted,ad_storage=denied",{"type":35,"value":1703}," — méthode recommandée",{"type":30,"tag":31,"props":1705,"children":1706},{},[1707],{"type":35,"value":1708},"Variable personnalisée dans sGTM :",{"type":30,"tag":60,"props":1710,"children":1712},{"code":1711,"language":317,"meta":14,"className":318,"style":14},"const getRequestHeader = require('getRequestHeader');\nconst consentHeader = getRequestHeader('x-consent-status');\n\nif (!consentHeader) return {analytics_storage: 'denied', ad_storage: 'denied'};\n\nconst pairs = consentHeader.split(',');\nconst consent = {};\npairs.forEach(pair => {\n  const [key, value] = pair.split('=');\n  consent[key.trim()] = value.trim();\n});\n\nreturn consent;\n",[1713],{"type":30,"tag":67,"props":1714,"children":1715},{"__ignoreMap":14},[1716,1749,1782,1789,1837,1844,1883,1904,1937,1995,2030,2038,2045],{"type":30,"tag":71,"props":1717,"children":1718},{"class":73,"line":74},[1719,1723,1728,1732,1736,1740,1745],{"type":30,"tag":71,"props":1720,"children":1721},{"style":220},[1722],{"type":35,"value":736},{"type":30,"tag":71,"props":1724,"children":1725},{"style":100},[1726],{"type":35,"value":1727}," getRequestHeader",{"type":30,"tag":71,"props":1729,"children":1730},{"style":220},[1731],{"type":35,"value":746},{"type":30,"tag":71,"props":1733,"children":1734},{"style":78},[1735],{"type":35,"value":751},{"type":30,"tag":71,"props":1737,"children":1738},{"style":342},[1739],{"type":35,"value":756},{"type":30,"tag":71,"props":1741,"children":1742},{"style":84},[1743],{"type":35,"value":1744},"'getRequestHeader'",{"type":30,"tag":71,"props":1746,"children":1747},{"style":342},[1748],{"type":35,"value":434},{"type":30,"tag":71,"props":1750,"children":1751},{"class":73,"line":106},[1752,1756,1761,1765,1769,1773,1778],{"type":30,"tag":71,"props":1753,"children":1754},{"style":220},[1755],{"type":35,"value":736},{"type":30,"tag":71,"props":1757,"children":1758},{"style":100},[1759],{"type":35,"value":1760}," consentHeader",{"type":30,"tag":71,"props":1762,"children":1763},{"style":220},[1764],{"type":35,"value":746},{"type":30,"tag":71,"props":1766,"children":1767},{"style":78},[1768],{"type":35,"value":1727},{"type":30,"tag":71,"props":1770,"children":1771},{"style":342},[1772],{"type":35,"value":756},{"type":30,"tag":71,"props":1774,"children":1775},{"style":84},[1776],{"type":35,"value":1777},"'x-consent-status'",{"type":30,"tag":71,"props":1779,"children":1780},{"style":342},[1781],{"type":35,"value":434},{"type":30,"tag":71,"props":1783,"children":1784},{"class":73,"line":119},[1785],{"type":30,"tag":71,"props":1786,"children":1787},{"emptyLinePlaceholder":804},[1788],{"type":35,"value":807},{"type":30,"tag":71,"props":1790,"children":1791},{"class":73,"line":132},[1792,1796,1800,1804,1809,1813,1818,1823,1828,1832],{"type":30,"tag":71,"props":1793,"children":1794},{"style":220},[1795],{"type":35,"value":848},{"type":30,"tag":71,"props":1797,"children":1798},{"style":342},[1799],{"type":35,"value":853},{"type":30,"tag":71,"props":1801,"children":1802},{"style":220},[1803],{"type":35,"value":858},{"type":30,"tag":71,"props":1805,"children":1806},{"style":342},[1807],{"type":35,"value":1808},"consentHeader) ",{"type":30,"tag":71,"props":1810,"children":1811},{"style":220},[1812],{"type":35,"value":868},{"type":30,"tag":71,"props":1814,"children":1815},{"style":342},[1816],{"type":35,"value":1817}," {analytics_storage: ",{"type":30,"tag":71,"props":1819,"children":1820},{"style":84},[1821],{"type":35,"value":1822},"'denied'",{"type":30,"tag":71,"props":1824,"children":1825},{"style":342},[1826],{"type":35,"value":1827},", ad_storage: ",{"type":30,"tag":71,"props":1829,"children":1830},{"style":84},[1831],{"type":35,"value":1822},{"type":30,"tag":71,"props":1833,"children":1834},{"style":342},[1835],{"type":35,"value":1836},"};\n",{"type":30,"tag":71,"props":1838,"children":1839},{"class":73,"line":145},[1840],{"type":30,"tag":71,"props":1841,"children":1842},{"emptyLinePlaceholder":804},[1843],{"type":35,"value":807},{"type":30,"tag":71,"props":1845,"children":1846},{"class":73,"line":158},[1847,1851,1856,1860,1865,1870,1874,1879],{"type":30,"tag":71,"props":1848,"children":1849},{"style":220},[1850],{"type":35,"value":736},{"type":30,"tag":71,"props":1852,"children":1853},{"style":100},[1854],{"type":35,"value":1855}," pairs",{"type":30,"tag":71,"props":1857,"children":1858},{"style":220},[1859],{"type":35,"value":746},{"type":30,"tag":71,"props":1861,"children":1862},{"style":342},[1863],{"type":35,"value":1864}," consentHeader.",{"type":30,"tag":71,"props":1866,"children":1867},{"style":78},[1868],{"type":35,"value":1869},"split",{"type":30,"tag":71,"props":1871,"children":1872},{"style":342},[1873],{"type":35,"value":756},{"type":30,"tag":71,"props":1875,"children":1876},{"style":84},[1877],{"type":35,"value":1878},"','",{"type":30,"tag":71,"props":1880,"children":1881},{"style":342},[1882],{"type":35,"value":434},{"type":30,"tag":71,"props":1884,"children":1885},{"class":73,"line":171},[1886,1890,1895,1899],{"type":30,"tag":71,"props":1887,"children":1888},{"style":220},[1889],{"type":35,"value":736},{"type":30,"tag":71,"props":1891,"children":1892},{"style":100},[1893],{"type":35,"value":1894}," consent",{"type":30,"tag":71,"props":1896,"children":1897},{"style":220},[1898],{"type":35,"value":746},{"type":30,"tag":71,"props":1900,"children":1901},{"style":342},[1902],{"type":35,"value":1903}," {};\n",{"type":30,"tag":71,"props":1905,"children":1906},{"class":73,"line":184},[1907,1912,1917,1921,1927,1932],{"type":30,"tag":71,"props":1908,"children":1909},{"style":342},[1910],{"type":35,"value":1911},"pairs.",{"type":30,"tag":71,"props":1913,"children":1914},{"style":78},[1915],{"type":35,"value":1916},"forEach",{"type":30,"tag":71,"props":1918,"children":1919},{"style":342},[1920],{"type":35,"value":756},{"type":30,"tag":71,"props":1922,"children":1924},{"style":1923},"--shiki-default:#FFAB70",[1925],{"type":35,"value":1926},"pair",{"type":30,"tag":71,"props":1928,"children":1929},{"style":220},[1930],{"type":35,"value":1931}," =>",{"type":30,"tag":71,"props":1933,"children":1934},{"style":342},[1935],{"type":35,"value":1936}," {\n",{"type":30,"tag":71,"props":1938,"children":1939},{"class":73,"line":24},[1940,1945,1950,1955,1959,1964,1969,1973,1978,1982,1986,1991],{"type":30,"tag":71,"props":1941,"children":1942},{"style":220},[1943],{"type":35,"value":1944},"  const",{"type":30,"tag":71,"props":1946,"children":1947},{"style":342},[1948],{"type":35,"value":1949}," [",{"type":30,"tag":71,"props":1951,"children":1952},{"style":100},[1953],{"type":35,"value":1954},"key",{"type":30,"tag":71,"props":1956,"children":1957},{"style":342},[1958],{"type":35,"value":1243},{"type":30,"tag":71,"props":1960,"children":1961},{"style":100},[1962],{"type":35,"value":1963},"value",{"type":30,"tag":71,"props":1965,"children":1966},{"style":342},[1967],{"type":35,"value":1968},"] ",{"type":30,"tag":71,"props":1970,"children":1971},{"style":220},[1972],{"type":35,"value":363},{"type":30,"tag":71,"props":1974,"children":1975},{"style":342},[1976],{"type":35,"value":1977}," pair.",{"type":30,"tag":71,"props":1979,"children":1980},{"style":78},[1981],{"type":35,"value":1869},{"type":30,"tag":71,"props":1983,"children":1984},{"style":342},[1985],{"type":35,"value":756},{"type":30,"tag":71,"props":1987,"children":1988},{"style":84},[1989],{"type":35,"value":1990},"'='",{"type":30,"tag":71,"props":1992,"children":1993},{"style":342},[1994],{"type":35,"value":434},{"type":30,"tag":71,"props":1996,"children":1997},{"class":73,"line":957},[1998,2003,2007,2012,2016,2021,2025],{"type":30,"tag":71,"props":1999,"children":2000},{"style":342},[2001],{"type":35,"value":2002},"  consent[key.",{"type":30,"tag":71,"props":2004,"children":2005},{"style":78},[2006],{"type":35,"value":949},{"type":30,"tag":71,"props":2008,"children":2009},{"style":342},[2010],{"type":35,"value":2011},"()] ",{"type":30,"tag":71,"props":2013,"children":2014},{"style":220},[2015],{"type":35,"value":363},{"type":30,"tag":71,"props":2017,"children":2018},{"style":342},[2019],{"type":35,"value":2020}," value.",{"type":30,"tag":71,"props":2022,"children":2023},{"style":78},[2024],{"type":35,"value":949},{"type":30,"tag":71,"props":2026,"children":2027},{"style":342},[2028],{"type":35,"value":2029},"();\n",{"type":30,"tag":71,"props":2031,"children":2032},{"class":73,"line":1199},[2033],{"type":30,"tag":71,"props":2034,"children":2035},{"style":342},[2036],{"type":35,"value":2037},"});\n",{"type":30,"tag":71,"props":2039,"children":2040},{"class":73,"line":1208},[2041],{"type":30,"tag":71,"props":2042,"children":2043},{"emptyLinePlaceholder":804},[2044],{"type":35,"value":807},{"type":30,"tag":71,"props":2046,"children":2047},{"class":73,"line":1217},[2048,2052],{"type":30,"tag":71,"props":2049,"children":2050},{"style":220},[2051],{"type":35,"value":868},{"type":30,"tag":71,"props":2053,"children":2054},{"style":342},[2055],{"type":35,"value":2056}," consent;\n",{"type":30,"tag":31,"props":2058,"children":2059},{},[2060,2062,2068,2070,2076,2078,2083],{"type":35,"value":2061},"Vous mappez cette variable aux tags GA4 et Google Ads. Pour Meta CAPI, il n'y a pas de paramètre de consentement — le contrôle est indirect via ",{"type":30,"tag":67,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":35,"value":2067},"action_source",{"type":35,"value":2069}," : ",{"type":30,"tag":67,"props":2071,"children":2073},{"className":2072},[],[2074],{"type":35,"value":2075},"action_source=website",{"type":35,"value":2077}," signifie consentement accordé, ",{"type":30,"tag":67,"props":2079,"children":2081},{"className":2080},[],[2082],{"type":35,"value":656},{"type":35,"value":2084}," signifie mode agrégé (pas de consentement, mais comptabilisé comme attribuable hors ligne).",{"type":30,"tag":38,"props":2086,"children":2088},{"id":2087},"ce-quil-faut-tester-la-première-semaine",[2089],{"type":35,"value":2090},"Ce Qu'il Faut Tester la Première Semaine",{"type":30,"tag":31,"props":2092,"children":2093},{},[2094],{"type":35,"value":2095},"Lors du passage en production, l'exécution parallèle est obligatoire : les pixels côté client ne s'arrêtent pas, server-side fonctionne en parallèle. Surveillez les deux pendant deux semaines, puis éteignez côté client.",{"type":30,"tag":31,"props":2097,"children":2098},{},[2099],{"type":30,"tag":560,"props":2100,"children":2101},{},[2102],{"type":35,"value":2103},"Checklist de test :",{"type":30,"tag":566,"props":2105,"children":2108},{"className":2106},[2107],"contains-task-list",[2109,2121,2130,2139,2148,2157],{"type":30,"tag":570,"props":2110,"children":2113},{"className":2111},[2112],"task-list-item",[2114,2119],{"type":30,"tag":2115,"props":2116,"children":2118},"input",{"disabled":804,"type":2117},"checkbox",[],{"type":35,"value":2120}," Le nombre d'événements dans Meta Events Manager est-il ±%10 du nombre côté client",{"type":30,"tag":570,"props":2122,"children":2124},{"className":2123},[2112],[2125,2128],{"type":30,"tag":2115,"props":2126,"children":2127},{"disabled":804,"type":2117},[],{"type":35,"value":2129}," Y a-t-il une baisse du nombre de sessions dans GA4 (server-side devrait en voir plus)",{"type":30,"tag":570,"props":2131,"children":2133},{"className":2132},[2112],[2134,2137],{"type":30,"tag":2115,"props":2135,"children":2136},{"disabled":804,"type":2117},[],{"type":35,"value":2138}," Le nombre de conversions dans Google Ads a-t-il changé (Enhanced Conversion attendu +%8-15)",{"type":30,"tag":570,"props":2140,"children":2142},{"className":2141},[2112],[2143,2146],{"type":30,"tag":2115,"props":2144,"children":2145},{"disabled":804,"type":2117},[],{"type":35,"value":2147}," Le coût de Cloud Run a-t-il dépassé $50\u002Fmois (normal $30-40\u002Fmois pour 1M événements)",{"type":30,"tag":570,"props":2149,"children":2151},{"className":2150},[2112],[2152,2155],{"type":30,"tag":2115,"props":2153,"children":2154},{"disabled":804,"type":2117},[],{"type":35,"value":2156}," La dédup fonctionne-t-elle — Events Manager ne montre-t-il pas d'avertissement d'événement dupliqué",{"type":30,"tag":570,"props":2158,"children":2160},{"className":2159},[2112],[2161,2164],{"type":30,"tag":2115,"props":2162,"children":2163},{"disabled":804,"type":2117},[],{"type":35,"value":2165}," Le nombre d'événements quotidiens dans la table BigQuery correspond-t-il aux données frontend analytics",{"type":30,"tag":31,"props":2167,"children":2168},{},[2169],{"type":35,"value":2170},"Les premiers problèmes qui surgiront la première semaine : erreurs de format dans le hachage de données utilisateur (%30-",{"type":30,"tag":2172,"props":2173,"children":2174},"style",{},[2175],{"type":35,"value":2176},"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":14,"searchDepth":119,"depth":119,"links":2178},[2179,2180,2181,2184,2185,2186,2187],{"id":40,"depth":106,"text":43},{"id":268,"depth":106,"text":271},{"id":547,"depth":106,"text":550,"children":2182},[2183],{"id":705,"depth":119,"text":708},{"id":996,"depth":106,"text":999},{"id":1266,"depth":106,"text":1269},{"id":1635,"depth":106,"text":1638},{"id":2087,"depth":106,"text":2090},"markdown","content:fr:data:server-side-gtm-conversion-api-production.md","content","fr\u002Fdata\u002Fserver-side-gtm-conversion-api-production.md","fr\u002Fdata\u002Fserver-side-gtm-conversion-api-production","md",1782050765522]