[{"data":1,"prerenderedAt":1540},["ShallowReactive",2],{"article-alternates":3,"article-\u002Ffr\u002Fdata\u002Fserveur-gtm-et-api-conversion-de-zero-a-production":13},{"i18nKey":4,"paths":5},"data-001-2026-07",{"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-deployment","\u002Fes\u002Fdata\u002Fsgtm-conversion-api-produccion","\u002Ffr\u002Fdata\u002Fserveur-gtm-et-api-conversion-de-zero-a-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fru\u002Fdata\u002Fsgtm-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":1534,"_id":1535,"_source":1536,"_file":1537,"_stem":1538,"_extension":1539},"data",false,"","Server-Side GTM et Conversion API : De Zéro à Production","Guide technique pour déployer un conteneur server-side GTM sur Cloud Run ou Workers, configurer la déduplication via Conversion API et mettre en place un monitoring production-grade.","2026-07-14",[21,22,23,24,25],"server-side-gtm","conversion-api","cloud-run","deduplication","privacy-sandbox",9,"Roibase",{"type":29,"children":30,"toc":1520},"root",[31,39,46,51,78,83,90,104,278,289,318,324,329,357,566,579,599,605,625,795,827,833,838,850,1221,1233,1239,1244,1331,1336,1341,1347,1360,1428,1462,1468,1473,1478,1484,1489,1514],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La mesure basée sur les cookies n'est plus optionnelle — avec Safari, Firefox et le blocage complet des cookies tiers par Chrome en 2025, une architecture de données first-party devient obligatoire. La transmission d'événements server-side offerte par Google Analytics 4 et Meta Conversion API constitue la fondation de cette nouvelle ère. Mais il existe une distance considérable entre « nous avons configuré un server-side GTM » et « cela fonctionne de manière fiable en production » : déploiement du conteneur, déduplication d'événements, équilibrage de charge, gestion des erreurs et optimisation des coûts. Dans cet article, nous construirons de zéro une infrastructure server-side GTM production-grade sur Cloud Run ou Cloudflare Workers.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"anatomie-du-server-side-gtm-conteneur-serveur-de-tagging-et-client",[44],{"type":37,"value":45},"Anatomie du Server-Side GTM : Conteneur, Serveur de Tagging et Client",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Le Google Tag Manager server-side fonctionne selon une architecture fondamentalement différente du GTM classique. Le snippet JavaScript côté client effectue un « data layer push » léger, mais le travail intensif — envoyer des requêtes vers les API tierces, lire les cookies, enrichir les données — est confié à un conteneur backend. Ce conteneur est distribué en tant qu'image Docker ; il s'exécute sur Google Cloud Run, AWS Fargate ou Cloudflare Workers.",{"type":32,"tag":33,"props":52,"children":53},{},[54,56,62,64,69,71,76],{"type":37,"value":55},"L'architecture comprend trois couches. La première est le ",{"type":32,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":37,"value":61},"navigateur web",{"type":37,"value":63}," : la bibliothèque gtag.js ou gtm.js envoie une charge utile d'événement minimale (client_id, event_name, timestamp) via une requête HTTP POST au serveur. La deuxième couche est le ",{"type":32,"tag":57,"props":65,"children":66},{},[67],{"type":37,"value":68},"serveur de tagging",{"type":37,"value":70}," : un conteneur GTM basé sur Node.js exécuté dans un pod Cloud Run qui reçoit cette requête POST, déclenche les tags dans l'espace de travail GTM (GA4, Meta CAPI, TikTok Events API) et transmet chacun en tant que requête HTTP parallèle aux API des plateformes. La troisième couche correspond aux ",{"type":32,"tag":57,"props":72,"children":73},{},[74],{"type":37,"value":75},"plateformes cibles",{"type":37,"value":77}," : Google Analytics Measurement Protocol, Meta Graph API, etc. Le server-side GTM agit comme un proxy entre ces couches tout en intégrant une logique d'enrichissement, de filtrage et de déduplication.",{"type":32,"tag":33,"props":79,"children":80},{},[81],{"type":37,"value":82},"Avec le GTM classique, chaque tag charge un snippet JavaScript distinct sur la page web ; 10 tags = 10 requêtes externes, la page ralentit. Côté server-side, le navigateur envoie une seule requête à votre infrastructure, puis les 10 autres requêtes s'exécutent en parallèle en backend. L'expérience utilisateur s'accélère, l'ad blocking est contourné, la durée de vie des cookies first-party s'allonge (les problèmes de SameSite=None disparaissent). Néanmoins, cette configuration introduit des coûts supplémentaires : une invocation Cloud Run par hit, des services de géolocalisation par IP, un stockage des logs. Gérer correctement ce compromis détermine le succès en production.",{"type":32,"tag":84,"props":85,"children":87},"h3",{"id":86},"déploiement-cloud-run-dockerfile-et-configuration",[88],{"type":37,"value":89},"Déploiement Cloud Run : Dockerfile et Configuration",{"type":32,"tag":33,"props":91,"children":92},{},[93,95,102],{"type":37,"value":94},"Vous pouvez utiliser l'image officielle de Google ",{"type":32,"tag":96,"props":97,"children":99},"code",{"className":98},[],[100],{"type":37,"value":101},"gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image",{"type":37,"value":103}," pour déployer le conteneur. Alternativement, créez votre propre Dockerfile et ajoutez des middlewares personnalisés (par exemple, une liste noire d'IP, rate limiting). Déploiement Cloud Run minimaliste :",{"type":32,"tag":105,"props":106,"children":110},"pre",{"className":107,"code":108,"language":109,"meta":16,"style":16},"language-bash shiki shiki-themes github-dark","gcloud run deploy gtm-server \\\n  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable \\\n  --platform=managed \\\n  --region=europe-west1 \\\n  --allow-unauthenticated \\\n  --set-env-vars=\"CONTAINER_CONFIG=\u003Cbase64_config>\" \\\n  --min-instances=1 \\\n  --max-instances=10 \\\n  --cpu=1 \\\n  --memory=512Mi \\\n  --concurrency=80\n","bash",[111],{"type":32,"tag":96,"props":112,"children":113},{"__ignoreMap":16},[114,148,161,174,187,200,218,231,244,256,269],{"type":32,"tag":115,"props":116,"children":119},"span",{"class":117,"line":118},"line",1,[120,126,132,137,142],{"type":32,"tag":115,"props":121,"children":123},{"style":122},"--shiki-default:#B392F0",[124],{"type":37,"value":125},"gcloud",{"type":32,"tag":115,"props":127,"children":129},{"style":128},"--shiki-default:#9ECBFF",[130],{"type":37,"value":131}," run",{"type":32,"tag":115,"props":133,"children":134},{"style":128},[135],{"type":37,"value":136}," deploy",{"type":32,"tag":115,"props":138,"children":139},{"style":128},[140],{"type":37,"value":141}," gtm-server",{"type":32,"tag":115,"props":143,"children":145},{"style":144},"--shiki-default:#79B8FF",[146],{"type":37,"value":147}," \\\n",{"type":32,"tag":115,"props":149,"children":151},{"class":117,"line":150},2,[152,157],{"type":32,"tag":115,"props":153,"children":154},{"style":144},[155],{"type":37,"value":156},"  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":32,"tag":115,"props":158,"children":159},{"style":144},[160],{"type":37,"value":147},{"type":32,"tag":115,"props":162,"children":164},{"class":117,"line":163},3,[165,170],{"type":32,"tag":115,"props":166,"children":167},{"style":144},[168],{"type":37,"value":169},"  --platform=managed",{"type":32,"tag":115,"props":171,"children":172},{"style":144},[173],{"type":37,"value":147},{"type":32,"tag":115,"props":175,"children":177},{"class":117,"line":176},4,[178,183],{"type":32,"tag":115,"props":179,"children":180},{"style":144},[181],{"type":37,"value":182},"  --region=europe-west1",{"type":32,"tag":115,"props":184,"children":185},{"style":144},[186],{"type":37,"value":147},{"type":32,"tag":115,"props":188,"children":190},{"class":117,"line":189},5,[191,196],{"type":32,"tag":115,"props":192,"children":193},{"style":144},[194],{"type":37,"value":195},"  --allow-unauthenticated",{"type":32,"tag":115,"props":197,"children":198},{"style":144},[199],{"type":37,"value":147},{"type":32,"tag":115,"props":201,"children":203},{"class":117,"line":202},6,[204,209,214],{"type":32,"tag":115,"props":205,"children":206},{"style":144},[207],{"type":37,"value":208},"  --set-env-vars=",{"type":32,"tag":115,"props":210,"children":211},{"style":128},[212],{"type":37,"value":213},"\"CONTAINER_CONFIG=\u003Cbase64_config>\"",{"type":32,"tag":115,"props":215,"children":216},{"style":144},[217],{"type":37,"value":147},{"type":32,"tag":115,"props":219,"children":221},{"class":117,"line":220},7,[222,227],{"type":32,"tag":115,"props":223,"children":224},{"style":144},[225],{"type":37,"value":226},"  --min-instances=1",{"type":32,"tag":115,"props":228,"children":229},{"style":144},[230],{"type":37,"value":147},{"type":32,"tag":115,"props":232,"children":234},{"class":117,"line":233},8,[235,240],{"type":32,"tag":115,"props":236,"children":237},{"style":144},[238],{"type":37,"value":239},"  --max-instances=10",{"type":32,"tag":115,"props":241,"children":242},{"style":144},[243],{"type":37,"value":147},{"type":32,"tag":115,"props":245,"children":246},{"class":117,"line":26},[247,252],{"type":32,"tag":115,"props":248,"children":249},{"style":144},[250],{"type":37,"value":251},"  --cpu=1",{"type":32,"tag":115,"props":253,"children":254},{"style":144},[255],{"type":37,"value":147},{"type":32,"tag":115,"props":257,"children":259},{"class":117,"line":258},10,[260,265],{"type":32,"tag":115,"props":261,"children":262},{"style":144},[263],{"type":37,"value":264},"  --memory=512Mi",{"type":32,"tag":115,"props":266,"children":267},{"style":144},[268],{"type":37,"value":147},{"type":32,"tag":115,"props":270,"children":272},{"class":117,"line":271},11,[273],{"type":32,"tag":115,"props":274,"children":275},{"style":144},[276],{"type":37,"value":277},"  --concurrency=80\n",{"type":32,"tag":33,"props":279,"children":280},{},[281,287],{"type":32,"tag":96,"props":282,"children":284},{"className":283},[],[285],{"type":37,"value":286},"CONTAINER_CONFIG",{"type":37,"value":288}," encode en base64 le JSON exporté du conteneur serveur de votre espace de travail GTM. Cette configuration définit quels tags sont déclenchés selon les triggers, comment les variables sont remplies. En production, stockez cette configuration dans Cloud Secret Manager — une variable d'environnement en texte clair pose un problème de sécurité.",{"type":32,"tag":33,"props":290,"children":291},{},[292,294,300,302,308,310,316],{"type":37,"value":293},"Garantissez le comportement d'auto-scaling de Cloud Run avec ",{"type":32,"tag":96,"props":295,"children":297},{"className":296},[],[298],{"type":37,"value":299},"--min-instances=1",{"type":37,"value":301},". Si ",{"type":32,"tag":96,"props":303,"children":305},{"className":304},[],[306],{"type":37,"value":307},"min-instances=0",{"type":37,"value":309},", le premier hit subit un cold start (1-3 secondes) ; pendant cette durée, il y a un risque de perte d'événement. Maintenir 1 instance active en permanence représente environ $10 par mois, mais prévient les pertes d'événements critiques. ",{"type":32,"tag":96,"props":311,"children":313},{"className":312},[],[314],{"type":37,"value":315},"--concurrency=80",{"type":37,"value":317}," indique qu'un seul pod peut gérer 80 requêtes parallèles ; calibrez ce nombre via un test de charge (une concurrence élevée consomme plus de mémoire, une concurrence basse déclenche un scaling inutile).",{"type":32,"tag":40,"props":319,"children":321},{"id":320},"intégration-conversion-api-meta-tiktok-et-déduplication",[322],{"type":37,"value":323},"Intégration Conversion API : Meta, TikTok et Déduplication",{"type":32,"tag":33,"props":325,"children":326},{},[327],{"type":37,"value":328},"Le scénario d'utilisation le plus critique du server-side GTM est de soutenir Meta Conversion API (CAPI) et TikTok Events API à côté des pixels navigateur. En envoyant le même événement via deux canaux, vous atteignez 100% du signal : si le pixel iOS se heurte aux restrictions ATT, l'événement serveur le compense ; si le serveur manque d'information sur l'adresse IP, le navigateur fournit l'user agent. Cependant, signaler le même événement deux fois détériore l'attribution — la déduplication est indispensable.",{"type":32,"tag":33,"props":330,"children":331},{},[332,334,340,342,347,349,355],{"type":37,"value":333},"Meta CAPI attend un champ ",{"type":32,"tag":96,"props":335,"children":337},{"className":336},[],[338],{"type":37,"value":339},"event_id",{"type":37,"value":341}," dans chaque charge utile d'événement. Si vous envoyez la même combinaison ",{"type":32,"tag":96,"props":343,"children":345},{"className":344},[],[346],{"type":37,"value":339},{"type":37,"value":348}," + ",{"type":32,"tag":96,"props":350,"children":352},{"className":351},[],[353],{"type":37,"value":354},"event_name",{"type":37,"value":356}," deux fois en moins de 48 heures, Meta déduplique automatiquement. Implémentation simple : lors du déclenchement d'un événement pixel côté client, générez un UUID et envoyez cet UUID identique au pixel et au server-side GTM.",{"type":32,"tag":105,"props":358,"children":362},{"className":359,"code":360,"language":361,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Client-side (GTM web ou gtag.js)\nconst eventId = crypto.randomUUID(); \u002F\u002F UUID du navigateur\nfbq('track', 'Purchase', { value: 99.90, currency: 'USD' }, { eventID: eventId });\n\n\u002F\u002F Envoyez le même eventId au server-side GTM via la data layer\ndataLayer.push({\n  event: 'purchase',\n  event_id: eventId,\n  value: 99.90,\n  currency: 'USD'\n});\n","javascript",[363],{"type":32,"tag":96,"props":364,"children":365},{"__ignoreMap":16},[366,375,415,468,477,485,503,521,529,545,558],{"type":32,"tag":115,"props":367,"children":368},{"class":117,"line":118},[369],{"type":32,"tag":115,"props":370,"children":372},{"style":371},"--shiki-default:#6A737D",[373],{"type":37,"value":374},"\u002F\u002F Client-side (GTM web ou gtag.js)\n",{"type":32,"tag":115,"props":376,"children":377},{"class":117,"line":150},[378,384,389,394,400,405,410],{"type":32,"tag":115,"props":379,"children":381},{"style":380},"--shiki-default:#F97583",[382],{"type":37,"value":383},"const",{"type":32,"tag":115,"props":385,"children":386},{"style":144},[387],{"type":37,"value":388}," eventId",{"type":32,"tag":115,"props":390,"children":391},{"style":380},[392],{"type":37,"value":393}," =",{"type":32,"tag":115,"props":395,"children":397},{"style":396},"--shiki-default:#E1E4E8",[398],{"type":37,"value":399}," crypto.",{"type":32,"tag":115,"props":401,"children":402},{"style":122},[403],{"type":37,"value":404},"randomUUID",{"type":32,"tag":115,"props":406,"children":407},{"style":396},[408],{"type":37,"value":409},"(); ",{"type":32,"tag":115,"props":411,"children":412},{"style":371},[413],{"type":37,"value":414},"\u002F\u002F UUID du navigateur\n",{"type":32,"tag":115,"props":416,"children":417},{"class":117,"line":163},[418,423,428,433,438,443,448,453,458,463],{"type":32,"tag":115,"props":419,"children":420},{"style":122},[421],{"type":37,"value":422},"fbq",{"type":32,"tag":115,"props":424,"children":425},{"style":396},[426],{"type":37,"value":427},"(",{"type":32,"tag":115,"props":429,"children":430},{"style":128},[431],{"type":37,"value":432},"'track'",{"type":32,"tag":115,"props":434,"children":435},{"style":396},[436],{"type":37,"value":437},", ",{"type":32,"tag":115,"props":439,"children":440},{"style":128},[441],{"type":37,"value":442},"'Purchase'",{"type":32,"tag":115,"props":444,"children":445},{"style":396},[446],{"type":37,"value":447},", { value: ",{"type":32,"tag":115,"props":449,"children":450},{"style":144},[451],{"type":37,"value":452},"99.90",{"type":32,"tag":115,"props":454,"children":455},{"style":396},[456],{"type":37,"value":457},", currency: ",{"type":32,"tag":115,"props":459,"children":460},{"style":128},[461],{"type":37,"value":462},"'USD'",{"type":32,"tag":115,"props":464,"children":465},{"style":396},[466],{"type":37,"value":467}," }, { eventID: eventId });\n",{"type":32,"tag":115,"props":469,"children":470},{"class":117,"line":176},[471],{"type":32,"tag":115,"props":472,"children":474},{"emptyLinePlaceholder":473},true,[475],{"type":37,"value":476},"\n",{"type":32,"tag":115,"props":478,"children":479},{"class":117,"line":189},[480],{"type":32,"tag":115,"props":481,"children":482},{"style":371},[483],{"type":37,"value":484},"\u002F\u002F Envoyez le même eventId au server-side GTM via la data layer\n",{"type":32,"tag":115,"props":486,"children":487},{"class":117,"line":202},[488,493,498],{"type":32,"tag":115,"props":489,"children":490},{"style":396},[491],{"type":37,"value":492},"dataLayer.",{"type":32,"tag":115,"props":494,"children":495},{"style":122},[496],{"type":37,"value":497},"push",{"type":32,"tag":115,"props":499,"children":500},{"style":396},[501],{"type":37,"value":502},"({\n",{"type":32,"tag":115,"props":504,"children":505},{"class":117,"line":220},[506,511,516],{"type":32,"tag":115,"props":507,"children":508},{"style":396},[509],{"type":37,"value":510},"  event: ",{"type":32,"tag":115,"props":512,"children":513},{"style":128},[514],{"type":37,"value":515},"'purchase'",{"type":32,"tag":115,"props":517,"children":518},{"style":396},[519],{"type":37,"value":520},",\n",{"type":32,"tag":115,"props":522,"children":523},{"class":117,"line":233},[524],{"type":32,"tag":115,"props":525,"children":526},{"style":396},[527],{"type":37,"value":528},"  event_id: eventId,\n",{"type":32,"tag":115,"props":530,"children":531},{"class":117,"line":26},[532,537,541],{"type":32,"tag":115,"props":533,"children":534},{"style":396},[535],{"type":37,"value":536},"  value: ",{"type":32,"tag":115,"props":538,"children":539},{"style":144},[540],{"type":37,"value":452},{"type":32,"tag":115,"props":542,"children":543},{"style":396},[544],{"type":37,"value":520},{"type":32,"tag":115,"props":546,"children":547},{"class":117,"line":258},[548,553],{"type":32,"tag":115,"props":549,"children":550},{"style":396},[551],{"type":37,"value":552},"  currency: ",{"type":32,"tag":115,"props":554,"children":555},{"style":128},[556],{"type":37,"value":557},"'USD'\n",{"type":32,"tag":115,"props":559,"children":560},{"class":117,"line":271},[561],{"type":32,"tag":115,"props":562,"children":563},{"style":396},[564],{"type":37,"value":565},"});\n",{"type":32,"tag":33,"props":567,"children":568},{},[569,571,577],{"type":37,"value":570},"Au sein du server-side GTM, dans le tag Meta CAPI, mappez la variable « Event ID » à ",{"type":32,"tag":96,"props":572,"children":574},{"className":573},[],[575],{"type":37,"value":576},"{{event_id}}",{"type":37,"value":578},". De cette façon, les événements navigateur et serveur se fusionnent. Vous pouvez surveiller le taux de déduplication (Match Quality) dans le dashboard Meta sous « Events Manager > Diagnostics ». L'objectif est un match supérieur à 80%.",{"type":32,"tag":33,"props":580,"children":581},{},[582,584,589,591,597],{"type":37,"value":583},"TikTok Events API utilise une logique ",{"type":32,"tag":96,"props":585,"children":587},{"className":586},[],[588],{"type":37,"value":339},{"type":37,"value":590}," similaire. Cependant, vous devez transporter le cookie TikTok (",{"type":32,"tag":96,"props":592,"children":594},{"className":593},[],[595],{"type":37,"value":596},"_ttp",{"type":37,"value":598},") côté serveur — le pixel côté client le définit, le tag côté serveur le lit. Transportez cette donnée dans un cookie first-party ou dans le corps POST. Si vous utilisez Cloudflare Workers, écrivez un middleware côté edge qui analyse les cookies et les injecte dans le conteneur GTM.",{"type":32,"tag":84,"props":600,"children":602},{"id":601},"tableau-de-déduplication-et-contrôle-de-hash-dévénement",[603],{"type":37,"value":604},"Tableau de Déduplication et Contrôle de Hash d'Événement",{"type":32,"tag":33,"props":606,"children":607},{},[608,610,615,617,623],{"type":37,"value":609},"Dans les scénarios de trafic élevé, un même utilisateur peut rapidement effectuer deux fois « add to cart » — les événements navigateur et serveur arrivent dans la même seconde avec différents ",{"type":32,"tag":96,"props":611,"children":613},{"className":612},[],[614],{"type":37,"value":339},{"type":37,"value":616},". Dans ce cas, une couche de déduplication externe est nécessaire : créez une table ",{"type":32,"tag":96,"props":618,"children":620},{"className":619},[],[621],{"type":37,"value":622},"event_hash",{"type":37,"value":624}," dans BigQuery.",{"type":32,"tag":105,"props":626,"children":630},{"className":627,"code":628,"language":629,"meta":16,"style":16},"language-sql shiki shiki-themes github-dark","CREATE TABLE analytics.event_dedup (\n  event_hash STRING NOT NULL,\n  event_time TIMESTAMP NOT NULL,\n  user_id STRING,\n  event_name STRING\n)\nPARTITION BY DATE(event_time)\nCLUSTER BY event_hash\nOPTIONS (\n  partition_expiration_days = 7\n);\n","sql",[631],{"type":32,"tag":96,"props":632,"children":633},{"__ignoreMap":16},[634,657,674,696,704,712,720,743,761,769,787],{"type":32,"tag":115,"props":635,"children":636},{"class":117,"line":118},[637,642,647,652],{"type":32,"tag":115,"props":638,"children":639},{"style":380},[640],{"type":37,"value":641},"CREATE",{"type":32,"tag":115,"props":643,"children":644},{"style":380},[645],{"type":37,"value":646}," TABLE",{"type":32,"tag":115,"props":648,"children":649},{"style":122},[650],{"type":37,"value":651}," analytics",{"type":32,"tag":115,"props":653,"children":654},{"style":396},[655],{"type":37,"value":656},".event_dedup (\n",{"type":32,"tag":115,"props":658,"children":659},{"class":117,"line":150},[660,665,670],{"type":32,"tag":115,"props":661,"children":662},{"style":396},[663],{"type":37,"value":664},"  event_hash STRING ",{"type":32,"tag":115,"props":666,"children":667},{"style":380},[668],{"type":37,"value":669},"NOT NULL",{"type":32,"tag":115,"props":671,"children":672},{"style":396},[673],{"type":37,"value":520},{"type":32,"tag":115,"props":675,"children":676},{"class":117,"line":163},[677,682,687,692],{"type":32,"tag":115,"props":678,"children":679},{"style":396},[680],{"type":37,"value":681},"  event_time ",{"type":32,"tag":115,"props":683,"children":684},{"style":380},[685],{"type":37,"value":686},"TIMESTAMP",{"type":32,"tag":115,"props":688,"children":689},{"style":380},[690],{"type":37,"value":691}," NOT NULL",{"type":32,"tag":115,"props":693,"children":694},{"style":396},[695],{"type":37,"value":520},{"type":32,"tag":115,"props":697,"children":698},{"class":117,"line":176},[699],{"type":32,"tag":115,"props":700,"children":701},{"style":396},[702],{"type":37,"value":703},"  user_id STRING,\n",{"type":32,"tag":115,"props":705,"children":706},{"class":117,"line":189},[707],{"type":32,"tag":115,"props":708,"children":709},{"style":396},[710],{"type":37,"value":711},"  event_name STRING\n",{"type":32,"tag":115,"props":713,"children":714},{"class":117,"line":202},[715],{"type":32,"tag":115,"props":716,"children":717},{"style":396},[718],{"type":37,"value":719},")\n",{"type":32,"tag":115,"props":721,"children":722},{"class":117,"line":220},[723,728,733,738],{"type":32,"tag":115,"props":724,"children":725},{"style":380},[726],{"type":37,"value":727},"PARTITION",{"type":32,"tag":115,"props":729,"children":730},{"style":380},[731],{"type":37,"value":732}," BY",{"type":32,"tag":115,"props":734,"children":735},{"style":380},[736],{"type":37,"value":737}," DATE",{"type":32,"tag":115,"props":739,"children":740},{"style":396},[741],{"type":37,"value":742},"(event_time)\n",{"type":32,"tag":115,"props":744,"children":745},{"class":117,"line":233},[746,751,756],{"type":32,"tag":115,"props":747,"children":748},{"style":396},[749],{"type":37,"value":750},"CLUSTER ",{"type":32,"tag":115,"props":752,"children":753},{"style":380},[754],{"type":37,"value":755},"BY",{"type":32,"tag":115,"props":757,"children":758},{"style":396},[759],{"type":37,"value":760}," event_hash\n",{"type":32,"tag":115,"props":762,"children":763},{"class":117,"line":26},[764],{"type":32,"tag":115,"props":765,"children":766},{"style":396},[767],{"type":37,"value":768},"OPTIONS (\n",{"type":32,"tag":115,"props":770,"children":771},{"class":117,"line":258},[772,777,782],{"type":32,"tag":115,"props":773,"children":774},{"style":396},[775],{"type":37,"value":776},"  partition_expiration_days ",{"type":32,"tag":115,"props":778,"children":779},{"style":380},[780],{"type":37,"value":781},"=",{"type":32,"tag":115,"props":783,"children":784},{"style":144},[785],{"type":37,"value":786}," 7\n",{"type":32,"tag":115,"props":788,"children":789},{"class":117,"line":271},[790],{"type":32,"tag":115,"props":791,"children":792},{"style":396},[793],{"type":37,"value":794},");\n",{"type":32,"tag":33,"props":796,"children":797},{},[798,800,806,808,814,816,825],{"type":37,"value":799},"Au sein du server-side GTM, calculez en tant que variable personnalisée : ",{"type":32,"tag":96,"props":801,"children":803},{"className":802},[],[804],{"type":37,"value":805},"SHA256(user_id + event_name + FLOOR(timestamp\u002F60))",{"type":37,"value":807},". Ce hash regroupe le même événement du même utilisateur dans une fenêtre de 1 minute. Avant de déclencher le tag, consultez BigQuery via ",{"type":32,"tag":96,"props":809,"children":811},{"className":810},[],[812],{"type":37,"value":813},"SELECT COUNT(*) WHERE event_hash = {{computed_hash}}",{"type":37,"value":815},". S'il existe une ligne, ignorez le tag. Ce pattern, combiné avec la résolution d'identité au sein d'une ",{"type":32,"tag":817,"props":818,"children":822},"a",{"href":819,"rel":820},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Ffirstparty",[821],"nofollow",[823],{"type":37,"value":824},"architecture de données first-party",{"type":37,"value":826},", crée une couche robuste de contrôle de la qualité du signal.",{"type":32,"tag":40,"props":828,"children":830},{"id":829},"équilibrage-de-charge-gestion-des-erreurs-et-stratégie-de-nouvelle-tentative",[831],{"type":37,"value":832},"Équilibrage de Charge, Gestion des Erreurs et Stratégie de Nouvelle Tentative",{"type":32,"tag":33,"props":834,"children":835},{},[836],{"type":37,"value":837},"Une seule instance Cloud Run ne suffit pas en production. Pour la distribution de charge, utilisez Cloud Load Balancer ou Cloudflare comme proxy. Cloud Load Balancer connecte Cloud Run via NEG (Network Endpoint Group), termine SSL, fournit une protection DDoS. Cloudflare Workers peut effectuer un rate limiting basé sur l'IP avec KV store — le trafic abusif est coupé avant d'atteindre le serveur de tagging.",{"type":32,"tag":33,"props":839,"children":840},{},[841,843,848],{"type":37,"value":842},"La gestion des erreurs s'effectue à deux niveaux. Le premier niveau est ",{"type":32,"tag":57,"props":844,"children":845},{},[846],{"type":37,"value":847},"au niveau des tags GTM",{"type":37,"value":849}," : si un tag Meta CAPI retourne une erreur 5xx, doit-il réessayer automatiquement ? GTM n'a pas de retry natif, mais vous pouvez écrire une logique d'exponential backoff dans un tag HTML personnalisé :",{"type":32,"tag":105,"props":851,"children":853},{"className":359,"code":852,"language":361,"meta":16,"style":16},"async function sendWithRetry(url, payload, maxRetries = 3) {\n  for (let i = 0; i \u003C maxRetries; i++) {\n    const res = await fetch(url, { method: 'POST', body: JSON.stringify(payload) });\n    if (res.ok) return res;\n    if (res.status \u003C 500) break; \u002F\u002F Ne pas réessayer les erreurs 4xx\n    await new Promise(r => setTimeout(r, 2 ** i * 1000)); \u002F\u002F 1s, 2s, 4s\n  }\n  throw new Error('Max retries exceeded');\n}\n",[854],{"type":32,"tag":96,"props":855,"children":856},{"__ignoreMap":16},[857,917,973,1035,1058,1099,1175,1183,1213],{"type":32,"tag":115,"props":858,"children":859},{"class":117,"line":118},[860,865,870,875,879,885,889,894,898,903,907,912],{"type":32,"tag":115,"props":861,"children":862},{"style":380},[863],{"type":37,"value":864},"async",{"type":32,"tag":115,"props":866,"children":867},{"style":380},[868],{"type":37,"value":869}," function",{"type":32,"tag":115,"props":871,"children":872},{"style":122},[873],{"type":37,"value":874}," sendWithRetry",{"type":32,"tag":115,"props":876,"children":877},{"style":396},[878],{"type":37,"value":427},{"type":32,"tag":115,"props":880,"children":882},{"style":881},"--shiki-default:#FFAB70",[883],{"type":37,"value":884},"url",{"type":32,"tag":115,"props":886,"children":887},{"style":396},[888],{"type":37,"value":437},{"type":32,"tag":115,"props":890,"children":891},{"style":881},[892],{"type":37,"value":893},"payload",{"type":32,"tag":115,"props":895,"children":896},{"style":396},[897],{"type":37,"value":437},{"type":32,"tag":115,"props":899,"children":900},{"style":881},[901],{"type":37,"value":902},"maxRetries",{"type":32,"tag":115,"props":904,"children":905},{"style":380},[906],{"type":37,"value":393},{"type":32,"tag":115,"props":908,"children":909},{"style":144},[910],{"type":37,"value":911}," 3",{"type":32,"tag":115,"props":913,"children":914},{"style":396},[915],{"type":37,"value":916},") {\n",{"type":32,"tag":115,"props":918,"children":919},{"class":117,"line":150},[920,925,930,935,940,944,949,954,959,964,969],{"type":32,"tag":115,"props":921,"children":922},{"style":380},[923],{"type":37,"value":924},"  for",{"type":32,"tag":115,"props":926,"children":927},{"style":396},[928],{"type":37,"value":929}," (",{"type":32,"tag":115,"props":931,"children":932},{"style":380},[933],{"type":37,"value":934},"let",{"type":32,"tag":115,"props":936,"children":937},{"style":396},[938],{"type":37,"value":939}," i ",{"type":32,"tag":115,"props":941,"children":942},{"style":380},[943],{"type":37,"value":781},{"type":32,"tag":115,"props":945,"children":946},{"style":144},[947],{"type":37,"value":948}," 0",{"type":32,"tag":115,"props":950,"children":951},{"style":396},[952],{"type":37,"value":953},"; i ",{"type":32,"tag":115,"props":955,"children":956},{"style":380},[957],{"type":37,"value":958},"\u003C",{"type":32,"tag":115,"props":960,"children":961},{"style":396},[962],{"type":37,"value":963}," maxRetries; i",{"type":32,"tag":115,"props":965,"children":966},{"style":380},[967],{"type":37,"value":968},"++",{"type":32,"tag":115,"props":970,"children":971},{"style":396},[972],{"type":37,"value":916},{"type":32,"tag":115,"props":974,"children":975},{"class":117,"line":163},[976,981,986,990,995,1000,1005,1010,1015,1020,1025,1030],{"type":32,"tag":115,"props":977,"children":978},{"style":380},[979],{"type":37,"value":980},"    const",{"type":32,"tag":115,"props":982,"children":983},{"style":144},[984],{"type":37,"value":985}," res",{"type":32,"tag":115,"props":987,"children":988},{"style":380},[989],{"type":37,"value":393},{"type":32,"tag":115,"props":991,"children":992},{"style":380},[993],{"type":37,"value":994}," await",{"type":32,"tag":115,"props":996,"children":997},{"style":122},[998],{"type":37,"value":999}," fetch",{"type":32,"tag":115,"props":1001,"children":1002},{"style":396},[1003],{"type":37,"value":1004},"(url, { method: ",{"type":32,"tag":115,"props":1006,"children":1007},{"style":128},[1008],{"type":37,"value":1009},"'POST'",{"type":32,"tag":115,"props":1011,"children":1012},{"style":396},[1013],{"type":37,"value":1014},", body: ",{"type":32,"tag":115,"props":1016,"children":1017},{"style":144},[1018],{"type":37,"value":1019},"JSON",{"type":32,"tag":115,"props":1021,"children":1022},{"style":396},[1023],{"type":37,"value":1024},".",{"type":32,"tag":115,"props":1026,"children":1027},{"style":122},[1028],{"type":37,"value":1029},"stringify",{"type":32,"tag":115,"props":1031,"children":1032},{"style":396},[1033],{"type":37,"value":1034},"(payload) });\n",{"type":32,"tag":115,"props":1036,"children":1037},{"class":117,"line":176},[1038,1043,1048,1053],{"type":32,"tag":115,"props":1039,"children":1040},{"style":380},[1041],{"type":37,"value":1042},"    if",{"type":32,"tag":115,"props":1044,"children":1045},{"style":396},[1046],{"type":37,"value":1047}," (res.ok) ",{"type":32,"tag":115,"props":1049,"children":1050},{"style":380},[1051],{"type":37,"value":1052},"return",{"type":32,"tag":115,"props":1054,"children":1055},{"style":396},[1056],{"type":37,"value":1057}," res;\n",{"type":32,"tag":115,"props":1059,"children":1060},{"class":117,"line":189},[1061,1065,1070,1074,1079,1084,1089,1094],{"type":32,"tag":115,"props":1062,"children":1063},{"style":380},[1064],{"type":37,"value":1042},{"type":32,"tag":115,"props":1066,"children":1067},{"style":396},[1068],{"type":37,"value":1069}," (res.status ",{"type":32,"tag":115,"props":1071,"children":1072},{"style":380},[1073],{"type":37,"value":958},{"type":32,"tag":115,"props":1075,"children":1076},{"style":144},[1077],{"type":37,"value":1078}," 500",{"type":32,"tag":115,"props":1080,"children":1081},{"style":396},[1082],{"type":37,"value":1083},") ",{"type":32,"tag":115,"props":1085,"children":1086},{"style":380},[1087],{"type":37,"value":1088},"break",{"type":32,"tag":115,"props":1090,"children":1091},{"style":396},[1092],{"type":37,"value":1093},"; ",{"type":32,"tag":115,"props":1095,"children":1096},{"style":371},[1097],{"type":37,"value":1098},"\u002F\u002F Ne pas réessayer les erreurs 4xx\n",{"type":32,"tag":115,"props":1100,"children":1101},{"class":117,"line":202},[1102,1107,1112,1117,1121,1126,1131,1136,1141,1146,1151,1155,1160,1165,1170],{"type":32,"tag":115,"props":1103,"children":1104},{"style":380},[1105],{"type":37,"value":1106},"    await",{"type":32,"tag":115,"props":1108,"children":1109},{"style":380},[1110],{"type":37,"value":1111}," new",{"type":32,"tag":115,"props":1113,"children":1114},{"style":144},[1115],{"type":37,"value":1116}," Promise",{"type":32,"tag":115,"props":1118,"children":1119},{"style":396},[1120],{"type":37,"value":427},{"type":32,"tag":115,"props":1122,"children":1123},{"style":881},[1124],{"type":37,"value":1125},"r",{"type":32,"tag":115,"props":1127,"children":1128},{"style":380},[1129],{"type":37,"value":1130}," =>",{"type":32,"tag":115,"props":1132,"children":1133},{"style":122},[1134],{"type":37,"value":1135}," setTimeout",{"type":32,"tag":115,"props":1137,"children":1138},{"style":396},[1139],{"type":37,"value":1140},"(r, ",{"type":32,"tag":115,"props":1142,"children":1143},{"style":144},[1144],{"type":37,"value":1145},"2",{"type":32,"tag":115,"props":1147,"children":1148},{"style":380},[1149],{"type":37,"value":1150}," **",{"type":32,"tag":115,"props":1152,"children":1153},{"style":396},[1154],{"type":37,"value":939},{"type":32,"tag":115,"props":1156,"children":1157},{"style":380},[1158],{"type":37,"value":1159},"*",{"type":32,"tag":115,"props":1161,"children":1162},{"style":144},[1163],{"type":37,"value":1164}," 1000",{"type":32,"tag":115,"props":1166,"children":1167},{"style":396},[1168],{"type":37,"value":1169},")); ",{"type":32,"tag":115,"props":1171,"children":1172},{"style":371},[1173],{"type":37,"value":1174},"\u002F\u002F 1s, 2s, 4s\n",{"type":32,"tag":115,"props":1176,"children":1177},{"class":117,"line":220},[1178],{"type":32,"tag":115,"props":1179,"children":1180},{"style":396},[1181],{"type":37,"value":1182},"  }\n",{"type":32,"tag":115,"props":1184,"children":1185},{"class":117,"line":233},[1186,1191,1195,1200,1204,1209],{"type":32,"tag":115,"props":1187,"children":1188},{"style":380},[1189],{"type":37,"value":1190},"  throw",{"type":32,"tag":115,"props":1192,"children":1193},{"style":380},[1194],{"type":37,"value":1111},{"type":32,"tag":115,"props":1196,"children":1197},{"style":122},[1198],{"type":37,"value":1199}," Error",{"type":32,"tag":115,"props":1201,"children":1202},{"style":396},[1203],{"type":37,"value":427},{"type":32,"tag":115,"props":1205,"children":1206},{"style":128},[1207],{"type":37,"value":1208},"'Max retries exceeded'",{"type":32,"tag":115,"props":1210,"children":1211},{"style":396},[1212],{"type":37,"value":794},{"type":32,"tag":115,"props":1214,"children":1215},{"class":117,"line":26},[1216],{"type":32,"tag":115,"props":1217,"children":1218},{"style":396},[1219],{"type":37,"value":1220},"}\n",{"type":32,"tag":33,"props":1222,"children":1223},{},[1224,1226,1231],{"type":37,"value":1225},"Le second niveau est une ",{"type":32,"tag":57,"props":1227,"children":1228},{},[1229],{"type":37,"value":1230},"dead letter queue",{"type":37,"value":1232}," : redirigez les erreurs 5xx depuis les logs Cloud Run vers un topic Pub\u002FSub ; un pool de workers en arrière-plan réessaie ces événements pendant 24 heures. Ce pattern réduit la perte d'événements à 0,01%. Écrivez la dead letter queue dans BigQuery et analysez les patterns des événements perdus — par exemple, les requêtes d'une région géographique particulière pourraient connaître un timeout permanent.",{"type":32,"tag":84,"props":1234,"children":1236},{"id":1235},"monitoring-latence-taux-derreur-et-coût-par-événement",[1237],{"type":37,"value":1238},"Monitoring : Latence, Taux d'Erreur et Coût par Événement",{"type":32,"tag":33,"props":1240,"children":1241},{},[1242],{"type":37,"value":1243},"Une configuration production-ready ne s'achève pas sans les métriques. Surveillez trois métriques principales :",{"type":32,"tag":1245,"props":1246,"children":1247},"table",{},[1248,1272],{"type":32,"tag":1249,"props":1250,"children":1251},"thead",{},[1252],{"type":32,"tag":1253,"props":1254,"children":1255},"tr",{},[1256,1262,1267],{"type":32,"tag":1257,"props":1258,"children":1259},"th",{},[1260],{"type":37,"value":1261},"Métrique",{"type":32,"tag":1257,"props":1263,"children":1264},{},[1265],{"type":37,"value":1266},"Objectif",{"type":32,"tag":1257,"props":1268,"children":1269},{},[1270],{"type":37,"value":1271},"Seuil d'Alerte",{"type":32,"tag":1273,"props":1274,"children":1275},"tbody",{},[1276,1295,1313],{"type":32,"tag":1253,"props":1277,"children":1278},{},[1279,1285,1290],{"type":32,"tag":1280,"props":1281,"children":1282},"td",{},[1283],{"type":37,"value":1284},"Latence p95",{"type":32,"tag":1280,"props":1286,"children":1287},{},[1288],{"type":37,"value":1289},"\u003C500ms",{"type":32,"tag":1280,"props":1291,"children":1292},{},[1293],{"type":37,"value":1294},">1000ms",{"type":32,"tag":1253,"props":1296,"children":1297},{},[1298,1303,1308],{"type":32,"tag":1280,"props":1299,"children":1300},{},[1301],{"type":37,"value":1302},"Taux d'erreur (5xx \u002F total)",{"type":32,"tag":1280,"props":1304,"children":1305},{},[1306],{"type":37,"value":1307},"\u003C0,1%",{"type":32,"tag":1280,"props":1309,"children":1310},{},[1311],{"type":37,"value":1312},">1%",{"type":32,"tag":1253,"props":1314,"children":1315},{},[1316,1321,1326],{"type":32,"tag":1280,"props":1317,"children":1318},{},[1319],{"type":37,"value":1320},"Coût par événement",{"type":32,"tag":1280,"props":1322,"children":1323},{},[1324],{"type":37,"value":1325},"\u003C$0,0001",{"type":32,"tag":1280,"props":1327,"children":1328},{},[1329],{"type":37,"value":1330},">$0,001",{"type":32,"tag":33,"props":1332,"children":1333},{},[1334],{"type":37,"value":1335},"Connectez les métriques Cloud Run au dashboard Cloud Monitoring. Un pic de latence provient généralement du ralentissement d'une API en aval (Meta, GA4) — appliquez dans ce cas un pattern circuit breaker : si Meta ne répond pas pendant 10 secondes, désactivez temporairement ce tag. Le coût par événement se calcule en divisant la facture mensuelle Cloud Run par le nombre total de hits. Si le coût dépasse $0,0001, optimisez la concurrence ou la taille de l'instance.",{"type":32,"tag":33,"props":1337,"children":1338},{},[1339],{"type":37,"value":1340},"Configurez des alertes via webhook Slack ou intégration PagerDuty. Déclenchez un rollback automatisé si le taux d'erreur dépasse 1% (utilisez la gestion des révisions Cloud Run pour revenir à la version stable antérieure). Cette automatisation réduit les incidents en production à 5 minutes.",{"type":32,"tag":40,"props":1342,"children":1344},{"id":1343},"résolution-didentité-et-forwarding-did-utilisateur",[1345],{"type":37,"value":1346},"Résolution d'Identité et Forwarding d'ID Utilisateur",{"type":32,"tag":33,"props":1348,"children":1349},{},[1350,1352,1358],{"type":37,"value":1351},"Le point fort du server-side GTM est la capacité à transporter l'identité first-party vers les systèmes en aval. En envoyant le ",{"type":32,"tag":96,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":37,"value":1357},"user_id",{"type":37,"value":1359}," de l'utilisateur connecté à la web vers GA4, Meta CAPI et votre CDP en parallèle, vous activez une attribution multi-appareils. Cependant, la conformité RGPD et KVKK exige de ne jamais envoyer les PII (email, téléphone) hashé sans consentement utilisateur.",{"type":32,"tag":33,"props":1361,"children":1362},{},[1363,1365,1371,1373,1379,1381,1387,1389,1394,1396,1402,1404,1410,1412,1418,1420,1426],{"type":37,"value":1364},"Au sein du conteneur serveur GTM, configurez un trigger « Consent Mode v2 » : vérifiez l'état du consentement ",{"type":32,"tag":96,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":37,"value":1370},"ad_storage",{"type":37,"value":1372}," et ",{"type":32,"tag":96,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":37,"value":1378},"analytics_storage",{"type":37,"value":1380},". Sans consentement, envoyez uniquement l'",{"type":32,"tag":96,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":37,"value":1386},"client_id",{"type":37,"value":1388}," anonyme ; avec consentement, ajoutez SHA256(email) et ",{"type":32,"tag":96,"props":1390,"children":1392},{"className":1391},[],[1393],{"type":37,"value":1357},{"type":37,"value":1395},". Pour Meta CAPI, remplissez les champs avancés de matching : ",{"type":32,"tag":96,"props":1397,"children":1399},{"className":1398},[],[1400],{"type":37,"value":1401},"em",{"type":37,"value":1403}," (email hashé), ",{"type":32,"tag":96,"props":1405,"children":1407},{"className":1406},[],[1408],{"type":37,"value":1409},"ph",{"type":37,"value":1411}," (téléphone hashé), ",{"type":32,"tag":96,"props":1413,"children":1415},{"className":1414},[],[1416],{"type":37,"value":1417},"fn",{"type":37,"value":1419},"\u002F",{"type":32,"tag":96,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":37,"value":1425},"ln",{"type":37,"value":1427}," (nom\u002Fprénom hashé). TikTok et Google Ads supportent des champs de matching avancés similaires.",{"type":32,"tag":33,"props":1429,"children":1430},{},[1431,1433,1439,1441,1446,1448,1453,1455,1460],{"type":37,"value":1432},"Gérez la logique de résolution d'identité de manière centralisée dans une table BigQuery ",{"type":32,"tag":96,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":37,"value":1438},"user_identity",{"type":37,"value":1440},". Chaque hit côté serveur interroge cette table et complète les signaux manquants (par exemple, si le ",{"type":32,"tag":96,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":37,"value":1386},{"type":37,"value":1447}," provenant du cookie correspond à un ",{"type":32,"tag":96,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":37,"value":1357},{"type":37,"value":1454}," connu, ajoutez ce ",{"type":32,"tag":96,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":37,"value":1357},{"type":37,"value":1461}," à tous les événements). Ce pattern, intégré à une architecture CDP, fournit une vue 360 degrés du client.",{"type":32,"tag":40,"props":1463,"children":1465},{"id":1464},"alternative-cloudflare-workers-déploiement-edge",[1466],{"type":37,"value":1467},"Alternative Cloudflare Workers : Déploiement Edge",{"type":32,"tag":33,"props":1469,"children":1470},{},[1471],{"type":37,"value":1472},"Vous pouvez également déployer un conteneur GTM sur Cloudflare Workers. Les Workers V8 s'exécutent dans une architecture isolate sans cold start (0ms), mais avec des limites de CPU (10ms de temps CPU par requête) et de taille de bundle (1MB). L'image officielle GTM ne rentre pas dans Workers — vous devez écrire une couche de tagging allégée et personnalisée.",{"type":32,"tag":33,"props":1474,"children":1475},{},[1476],{"type":37,"value":1477},"Les avantages de Workers : edge global (300+ localisations), protection DDoS intégrée, cache sub-milliseconde avec Cloudflare KV. Les inconvénients : pas de gestion de tags via l'interface GTM (config basée sur du code), aucune intégration BigQuery directe (pipeline Workers → Pub\u002FSub → BigQuery obligatoire). Choisissez Workers pour les scénarios nécessitant un RPS élevé (>10k req\u002Fs) et une latence faible — par exemple, l'analytics de jeux mobiles.",{"type":32,"tag":40,"props":1479,"children":1481},{"id":1480},"checklist-production-points-de-vérification-avant-déploiement",[1482],{"type":37,"value":1483},"Checklist Production : Points de Vérification Avant Déploiement",{"type":32,"tag":33,"props":1485,"children":1486},{},[1487],{"type":37,"value":1488},"N'effectuez PAS le déploiement si les points suivants manquent :",{"type":32,"tag":1490,"props":1491,"children":1492},"ol",{},[1493,1504],{"type":32,"tag":1494,"props":1495,"children":1496},"li",{},[1497,1502],{"type":32,"tag":57,"props":1498,"children":1499},{},[1500],{"type":37,"value":1501},"La config du conteneur est-elle versionnée ?",{"type":37,"value":1503}," Chaque changement d'espace de travail doit être committé dans Git.",{"type":32,"tag":1494,"props":1505,"children":1506},{},[1507,1512],{"type":32,"tag":57,"props":1508,"children":1509},{},[1510],{"type":37,"value":1511},"La logique de déduplication a-t-elle été testée ?",{"type":37,"value":1513}," Envoyez deux fois le même event_id et vér",{"type":32,"tag":1515,"props":1516,"children":1517},"style",{},[1518],{"type":37,"value":1519},"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":163,"depth":163,"links":1521},[1522,1525,1528,1531,1532,1533],{"id":42,"depth":150,"text":45,"children":1523},[1524],{"id":86,"depth":163,"text":89},{"id":320,"depth":150,"text":323,"children":1526},[1527],{"id":601,"depth":163,"text":604},{"id":829,"depth":150,"text":832,"children":1529},[1530],{"id":1235,"depth":163,"text":1238},{"id":1343,"depth":150,"text":1346},{"id":1464,"depth":150,"text":1467},{"id":1480,"depth":150,"text":1483},"markdown","content:fr:data:serveur-gtm-et-api-conversion-de-zero-a-production.md","content","fr\u002Fdata\u002Fserveur-gtm-et-api-conversion-de-zero-a-production.md","fr\u002Fdata\u002Fserveur-gtm-et-api-conversion-de-zero-a-production","md",1785967502042]