[{"data":1,"prerenderedAt":1648},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione":13},{"i18nKey":4,"paths":5},"data-001-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion","\u002Fen\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-produccion","\u002Ffr\u002Fdata\u002Fgtm-serverside-conversion-api-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione","\u002Fru\u002Fdata\u002Fserver-side-gtm-konversiya-api-production","\u002Ftr\u002Fdata\u002Fserver-side-gtm-ve-conversion-api-sifirdan-productiona",{"_path":10,"_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":1642,"_id":1643,"_source":1644,"_file":1645,"_stem":1646,"_extension":1647},"data",false,"","Server-Side GTM e Conversion API: Da Zero a Produzione","Setup di tagging lato server su Cloud Run e Workers, template container, event deduplication e strategie di monitoring in produzione.","2026-05-07",[21,22,23,24,25],"server-side-gtm","conversion-api","cloud-run","event-deduplication","privacy-sandbox",9,"Roibase",{"type":29,"children":30,"toc":1634},"root",[31,39,46,51,73,118,124,145,150,261,297,470,522,528,578,583,1034,1077,1112,1140,1146,1151,1156,1215,1236,1249,1270,1276,1382,1403,1453,1523,1529,1550,1615,1628],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La misurazione basata su browser è morta. I cookie di terze parti sono spariti, ITP è sceso a 12 ore, Consent Mode v2 è diventato obbligatorio. I brand che non inviano eventi server-side direttamente agli endpoint API di Meta e Google rimangono nel buio dell'attribuzione. Server-side Google Tag Manager (sGTM) e Conversion API non sono più opzionali nel 2026 — sono un requirement di produzione. In questo articolo mostriamo come deployare da zero un container sGTM production-ready su Cloud Run, come configurare la deduplication degli eventi e quali metriche monitorare.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"perché-il-server-side-tagging-richiede-un-container",[44],{"type":37,"value":45},"Perché il Server-Side Tagging Richiede un Container",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"La classica GTM JavaScript lato browser carica librerie e raccoglie dati dallo user agent. Server-side GTM funziona al contrario: un container Node.js in esecuzione su un server riceve POST HTTP dal client, arricchisce gli eventi (parsing di IP e user-agent, ID first-party dai cookie) e li trasmette agli endpoint API di destinazione (Meta CAPI, Google Ads Conversion, GA4 Measurement Protocol). Questa architettura offre 3 vantaggi fondamentali: (1) bypassi i vincoli del browser — niente ITP, adblocker, CORS; (2) puoi hashare il PII in modo controllato — email, telefono vengono SHA-256 sul server, mai tornano al browser; (3) da un singolo evento client puoi eseguire fan-out parallelo verso 4 piattaforme diverse — un POST dal client diventa 4 richieste verso endpoint distinti.",{"type":32,"tag":33,"props":52,"children":53},{},[54,56,63,65,71],{"type":37,"value":55},"Il metodo di deployment ufficiale di Google è App Engine o Cloud Run. App Engine offre costo fisso e auto-scaling ma non è customizzabile. Cloud Run è preferito perché con ",{"type":32,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":37,"value":62},"min_instances=1",{"type":37,"value":64}," garantisci latenza stabile h24 e puoi personalizzare l'immagine container con un Dockerfile custom (ad esempio, estrapolare i secret da variabili d'ambiente, injection di script di startup). Un'alternativa è il deployment su Cloudflare Workers — latenza più bassa dal cold-start (~5ms vs 200ms) ma con limitazioni sandbox di Node.js che impediscono l'esecuzione di alcuni tag GTM (soprattutto nei template custom che richiedono ",{"type":32,"tag":57,"props":66,"children":68},{"className":67},[],[69],{"type":37,"value":70},"require",{"type":37,"value":72}," di moduli nativi).",{"type":32,"tag":33,"props":74,"children":75},{},[76,78,84,86,92,94,100,102,108,110,116],{"type":37,"value":77},"Il processo di deployment consiste di: (1) creare un nuovo progetto in Google Cloud Console, (2) con ",{"type":32,"tag":57,"props":79,"children":81},{"className":80},[],[82],{"type":37,"value":83},"gcloud",{"type":37,"value":85}," CLI fare il pull dell'immagine container sGTM, (3) creare il Cloud Run service e settare le variabili d'ambiente (",{"type":32,"tag":57,"props":87,"children":89},{"className":88},[],[90],{"type":37,"value":91},"CONTAINER_CONFIG",{"type":37,"value":93},", ",{"type":32,"tag":57,"props":95,"children":97},{"className":96},[],[98],{"type":37,"value":99},"PREVIEW_SERVER_URL",{"type":37,"value":101},"), (4) collegare un dominio personalizzato (es. ",{"type":32,"tag":57,"props":103,"children":105},{"className":104},[],[106],{"type":37,"value":107},"gtm.roibase.com.tr",{"type":37,"value":109},") — fondamentale per il contesto first-party, (5) aggiungere l'URL del server di tagging al GTM web (",{"type":32,"tag":57,"props":111,"children":113},{"className":112},[],[114],{"type":37,"value":115},"serverContainerUrl",{"type":37,"value":117}," parameter). Il primo deploy richiede 15 minuti, successivamente con CI\u002FCD scendiamo a 2 minuti.",{"type":32,"tag":40,"props":119,"children":121},{"id":120},"event-deduplication-legare-il-segnale-client-server-a-un-unico-id",[122],{"type":37,"value":123},"Event Deduplication: Legare il Segnale Client + Server a un Unico ID",{"type":32,"tag":33,"props":125,"children":126},{},[127,129,135,137,143],{"type":37,"value":128},"Il problema critico del server-side GTM è la deduplication. Se la stessa conversione arriva sia dal browser (GA4 client-side tag) sia dal server (GA4 server-side client), la piattaforma la conta come 2 conversioni. Per Meta CAPI e Google Ads Conversion è obbligatorio un sistema di event deduplication ID. Come funziona: assegni a ogni evento un ",{"type":32,"tag":57,"props":130,"children":132},{"className":131},[],[133],{"type":37,"value":134},"event_id",{"type":37,"value":136}," univoco (o in terminologia Meta ",{"type":32,"tag":57,"props":138,"children":140},{"className":139},[],[141],{"type":37,"value":142},"event_name + event_id",{"type":37,"value":144},"), sia client che server inviano lo stesso ID, la piattaforma in una finestra di 24 ore elimina i duplicati in base alle collision di ID.",{"type":32,"tag":33,"props":146,"children":147},{},[148],{"type":37,"value":149},"Strategie di deduplication ID:",{"type":32,"tag":151,"props":152,"children":153},"table",{},[154,178],{"type":32,"tag":155,"props":156,"children":157},"thead",{},[158],{"type":32,"tag":159,"props":160,"children":161},"tr",{},[162,168,173],{"type":32,"tag":163,"props":164,"children":165},"th",{},[166],{"type":37,"value":167},"Metodo",{"type":32,"tag":163,"props":169,"children":170},{},[171],{"type":37,"value":172},"Vantaggio",{"type":32,"tag":163,"props":174,"children":175},{},[176],{"type":37,"value":177},"Rischio",{"type":32,"tag":179,"props":180,"children":181},"tbody",{},[182,201,219,237],{"type":32,"tag":159,"props":183,"children":184},{},[185,191,196],{"type":32,"tag":186,"props":187,"children":188},"td",{},[189],{"type":37,"value":190},"UUID v4 (random)",{"type":32,"tag":186,"props":192,"children":193},{},[194],{"type":37,"value":195},"Nessun rischio di collision",{"type":32,"tag":186,"props":197,"children":198},{},[199],{"type":37,"value":200},"Richiede sincronizzazione client-server (localStorage\u002Fcookie)",{"type":32,"tag":159,"props":202,"children":203},{},[204,209,214],{"type":32,"tag":186,"props":205,"children":206},{},[207],{"type":37,"value":208},"Transaction ID (e-commerce)",{"type":32,"tag":186,"props":210,"children":211},{},[212],{"type":37,"value":213},"Univoco naturale",{"type":32,"tag":186,"props":215,"children":216},{},[217],{"type":37,"value":218},"Mancante per eventi non-transazionali (lead, signup)",{"type":32,"tag":159,"props":220,"children":221},{},[222,227,232],{"type":32,"tag":186,"props":223,"children":224},{},[225],{"type":37,"value":226},"Session ID + timestamp",{"type":32,"tag":186,"props":228,"children":229},{},[230],{"type":37,"value":231},"Facile da generare",{"type":32,"tag":186,"props":233,"children":234},{},[235],{"type":37,"value":236},"Possibile overlap in sessioni",{"type":32,"tag":159,"props":238,"children":239},{},[240,251,256],{"type":32,"tag":186,"props":241,"children":242},{},[243,249],{"type":32,"tag":57,"props":244,"children":246},{"className":245},[],[247],{"type":37,"value":248},"_ga",{"type":37,"value":250}," client ID + event timestamp",{"type":32,"tag":186,"props":252,"children":253},{},[254],{"type":37,"value":255},"Basato su first-party ID",{"type":32,"tag":186,"props":257,"children":258},{},[259],{"type":37,"value":260},"Rischio di clock skew (differenza oraria client\u002Fserver)",{"type":32,"tag":33,"props":262,"children":263},{},[264,266,272,274,279,281,287,289,295],{"type":37,"value":265},"Setup di produzione Roibase: ",{"type":32,"tag":57,"props":267,"children":269},{"className":268},[],[270],{"type":37,"value":271},"SHA-256(_ga + event_name + unix_ms)",{"type":37,"value":273}," — quando il browser fa push nel DataLayer, popola il field ",{"type":32,"tag":57,"props":275,"children":277},{"className":276},[],[278],{"type":37,"value":134},{"type":37,"value":280}," con questo hash, il tag GA4 lato server legge lo stesso field e lo invia al Measurement Protocol. Per Meta CAPI, iniettiamo parametri aggiuntivi ",{"type":32,"tag":57,"props":282,"children":284},{"className":283},[],[285],{"type":37,"value":286},"event_source_url",{"type":37,"value":288}," e ",{"type":32,"tag":57,"props":290,"children":292},{"className":291},[],[293],{"type":37,"value":294},"action_source=website",{"type":37,"value":296}," lato server perché il Facebook Pixel client-side non invia questi field ma server-side validation li richiede.",{"type":32,"tag":298,"props":299,"children":303},"pre",{"className":300,"code":301,"language":302,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Esempio di push nel DataLayer (client-side)\nwindow.dataLayer.push({\n  event: 'purchase',\n  event_id: sha256(_ga + 'purchase' + Date.now()),\n  transaction_id: 'ORD-12345',\n  value: 299.00,\n  currency: 'TRY'\n});\n","javascript",[304],{"type":32,"tag":57,"props":305,"children":306},{"__ignoreMap":16},[307,319,340,360,410,428,447,461],{"type":32,"tag":308,"props":309,"children":312},"span",{"class":310,"line":311},"line",1,[313],{"type":32,"tag":308,"props":314,"children":316},{"style":315},"--shiki-default:#6A737D",[317],{"type":37,"value":318},"\u002F\u002F Esempio di push nel DataLayer (client-side)\n",{"type":32,"tag":308,"props":320,"children":322},{"class":310,"line":321},2,[323,329,335],{"type":32,"tag":308,"props":324,"children":326},{"style":325},"--shiki-default:#E1E4E8",[327],{"type":37,"value":328},"window.dataLayer.",{"type":32,"tag":308,"props":330,"children":332},{"style":331},"--shiki-default:#B392F0",[333],{"type":37,"value":334},"push",{"type":32,"tag":308,"props":336,"children":337},{"style":325},[338],{"type":37,"value":339},"({\n",{"type":32,"tag":308,"props":341,"children":343},{"class":310,"line":342},3,[344,349,355],{"type":32,"tag":308,"props":345,"children":346},{"style":325},[347],{"type":37,"value":348},"  event: ",{"type":32,"tag":308,"props":350,"children":352},{"style":351},"--shiki-default:#9ECBFF",[353],{"type":37,"value":354},"'purchase'",{"type":32,"tag":308,"props":356,"children":357},{"style":325},[358],{"type":37,"value":359},",\n",{"type":32,"tag":308,"props":361,"children":363},{"class":310,"line":362},4,[364,369,374,379,385,390,395,400,405],{"type":32,"tag":308,"props":365,"children":366},{"style":325},[367],{"type":37,"value":368},"  event_id: ",{"type":32,"tag":308,"props":370,"children":371},{"style":331},[372],{"type":37,"value":373},"sha256",{"type":32,"tag":308,"props":375,"children":376},{"style":325},[377],{"type":37,"value":378},"(_ga ",{"type":32,"tag":308,"props":380,"children":382},{"style":381},"--shiki-default:#F97583",[383],{"type":37,"value":384},"+",{"type":32,"tag":308,"props":386,"children":387},{"style":351},[388],{"type":37,"value":389}," 'purchase'",{"type":32,"tag":308,"props":391,"children":392},{"style":381},[393],{"type":37,"value":394}," +",{"type":32,"tag":308,"props":396,"children":397},{"style":325},[398],{"type":37,"value":399}," Date.",{"type":32,"tag":308,"props":401,"children":402},{"style":331},[403],{"type":37,"value":404},"now",{"type":32,"tag":308,"props":406,"children":407},{"style":325},[408],{"type":37,"value":409},"()),\n",{"type":32,"tag":308,"props":411,"children":413},{"class":310,"line":412},5,[414,419,424],{"type":32,"tag":308,"props":415,"children":416},{"style":325},[417],{"type":37,"value":418},"  transaction_id: ",{"type":32,"tag":308,"props":420,"children":421},{"style":351},[422],{"type":37,"value":423},"'ORD-12345'",{"type":32,"tag":308,"props":425,"children":426},{"style":325},[427],{"type":37,"value":359},{"type":32,"tag":308,"props":429,"children":431},{"class":310,"line":430},6,[432,437,443],{"type":32,"tag":308,"props":433,"children":434},{"style":325},[435],{"type":37,"value":436},"  value: ",{"type":32,"tag":308,"props":438,"children":440},{"style":439},"--shiki-default:#79B8FF",[441],{"type":37,"value":442},"299.00",{"type":32,"tag":308,"props":444,"children":445},{"style":325},[446],{"type":37,"value":359},{"type":32,"tag":308,"props":448,"children":450},{"class":310,"line":449},7,[451,456],{"type":32,"tag":308,"props":452,"children":453},{"style":325},[454],{"type":37,"value":455},"  currency: ",{"type":32,"tag":308,"props":457,"children":458},{"style":351},[459],{"type":37,"value":460},"'TRY'\n",{"type":32,"tag":308,"props":462,"children":464},{"class":310,"line":463},8,[465],{"type":32,"tag":308,"props":466,"children":467},{"style":325},[468],{"type":37,"value":469},"});\n",{"type":32,"tag":33,"props":471,"children":472},{},[473,475,481,483,489,491,496,498,504,506,512,514,520],{"type":37,"value":474},"Nel container server-side creiamo una variabile personalizzata che mappa ",{"type":32,"tag":57,"props":476,"children":478},{"className":477},[],[479],{"type":37,"value":480},"{{Event ID}}",{"type":37,"value":482}," sia al tag GA4 che al tag CAPI. GA4 Measurement Protocol supporta il parametro ",{"type":32,"tag":57,"props":484,"children":486},{"className":485},[],[487],{"type":37,"value":488},"&ep.event_id=",{"type":37,"value":490},", Meta CAPI ha un field root-level ",{"type":32,"tag":57,"props":492,"children":494},{"className":493},[],[495],{"type":37,"value":134},{"type":37,"value":497},". Per Google Ads Conversion la deduplication funziona con la combinazione ",{"type":32,"tag":57,"props":499,"children":501},{"className":500},[],[502],{"type":37,"value":503},"gclid + conversion_action_id",{"type":37,"value":505}," — il ",{"type":32,"tag":57,"props":507,"children":509},{"className":508},[],[510],{"type":37,"value":511},"gclid",{"type":37,"value":513}," viene letto dal cookie e inviato al server, il tag Ads combina ",{"type":32,"tag":57,"props":515,"children":517},{"className":516},[],[518],{"type":37,"value":519},"gclid + conversion_value",{"type":37,"value":521}," e lo invia all'API di Conversion Tracking.",{"type":32,"tag":40,"props":523,"children":525},{"id":524},"container-template-e-setup-custom-client",[526],{"type":37,"value":527},"Container Template e Setup Custom Client",{"type":32,"tag":33,"props":529,"children":530},{},[531,533,539,541,546,548,553,555,561,563,569,570,576],{"type":37,"value":532},"Il container sGTM si compone di 3 elementi fondamentali: ",{"type":32,"tag":534,"props":535,"children":536},"strong",{},[537],{"type":37,"value":538},"Client",{"type":37,"value":540}," (parsa la richiesta HTTP in ingresso, la trasforma in event object), ",{"type":32,"tag":534,"props":542,"children":543},{},[544],{"type":37,"value":545},"Tag",{"type":37,"value":547}," (invia l'evento all'API esterna), ",{"type":32,"tag":534,"props":549,"children":550},{},[551],{"type":37,"value":552},"Variable",{"type":37,"value":554}," (condivisione dati tra i tag). Il client \"GA4\" di default di Google non basta perché ascolta solo l'endpoint ",{"type":32,"tag":57,"props":556,"children":558},{"className":557},[],[559],{"type":37,"value":560},"\u002Fg\u002Fcollect",{"type":37,"value":562},". Scriviamo un client personalizzato per gestire sia GA4 che endpoint custom (",{"type":32,"tag":57,"props":564,"children":566},{"className":565},[],[567],{"type":37,"value":568},"\u002Fevent",{"type":37,"value":93},{"type":32,"tag":57,"props":571,"children":573},{"className":572},[],[574],{"type":37,"value":575},"\u002Fpurchase",{"type":37,"value":577},") nello stesso container.",{"type":32,"tag":33,"props":579,"children":580},{},[581],{"type":37,"value":582},"Esempio di template custom client:",{"type":32,"tag":298,"props":584,"children":586},{"className":300,"code":585,"language":302,"meta":16,"style":16},"const claimRequest = require('claimRequest');\nconst getRequestBody = require('getRequestBody');\nconst JSON = require('JSON');\nconst logToConsole = require('logToConsole');\n\nclaimRequest();\n\nconst body = getRequestBody();\nconst eventData = JSON.parse(body);\n\n\u002F\u002F Normalizza l'event object\nconst normalizedEvent = {\n  event_name: eventData.event || 'unknown',\n  user_data: {\n    client_id: eventData.client_id,\n    user_agent: eventData.user_agent,\n    ip_override: eventData.ip_address\n  },\n  event_id: eventData.event_id,\n  timestamp_micros: eventData.timestamp * 1000000\n};\n\nlogToConsole('Normalized event:', normalizedEvent);\nrunContainer(normalizedEvent, () => {\n  returnResponse();\n});\n",[587],{"type":32,"tag":57,"props":588,"children":589},{"__ignoreMap":16},[590,628,661,694,727,736,749,756,780,815,823,832,854,877,886,895,904,913,922,931,950,959,967,990,1013,1026],{"type":32,"tag":308,"props":591,"children":592},{"class":310,"line":311},[593,598,603,608,613,618,623],{"type":32,"tag":308,"props":594,"children":595},{"style":381},[596],{"type":37,"value":597},"const",{"type":32,"tag":308,"props":599,"children":600},{"style":439},[601],{"type":37,"value":602}," claimRequest",{"type":32,"tag":308,"props":604,"children":605},{"style":381},[606],{"type":37,"value":607}," =",{"type":32,"tag":308,"props":609,"children":610},{"style":331},[611],{"type":37,"value":612}," require",{"type":32,"tag":308,"props":614,"children":615},{"style":325},[616],{"type":37,"value":617},"(",{"type":32,"tag":308,"props":619,"children":620},{"style":351},[621],{"type":37,"value":622},"'claimRequest'",{"type":32,"tag":308,"props":624,"children":625},{"style":325},[626],{"type":37,"value":627},");\n",{"type":32,"tag":308,"props":629,"children":630},{"class":310,"line":321},[631,635,640,644,648,652,657],{"type":32,"tag":308,"props":632,"children":633},{"style":381},[634],{"type":37,"value":597},{"type":32,"tag":308,"props":636,"children":637},{"style":439},[638],{"type":37,"value":639}," getRequestBody",{"type":32,"tag":308,"props":641,"children":642},{"style":381},[643],{"type":37,"value":607},{"type":32,"tag":308,"props":645,"children":646},{"style":331},[647],{"type":37,"value":612},{"type":32,"tag":308,"props":649,"children":650},{"style":325},[651],{"type":37,"value":617},{"type":32,"tag":308,"props":653,"children":654},{"style":351},[655],{"type":37,"value":656},"'getRequestBody'",{"type":32,"tag":308,"props":658,"children":659},{"style":325},[660],{"type":37,"value":627},{"type":32,"tag":308,"props":662,"children":663},{"class":310,"line":342},[664,668,673,677,681,685,690],{"type":32,"tag":308,"props":665,"children":666},{"style":381},[667],{"type":37,"value":597},{"type":32,"tag":308,"props":669,"children":670},{"style":439},[671],{"type":37,"value":672}," JSON",{"type":32,"tag":308,"props":674,"children":675},{"style":381},[676],{"type":37,"value":607},{"type":32,"tag":308,"props":678,"children":679},{"style":331},[680],{"type":37,"value":612},{"type":32,"tag":308,"props":682,"children":683},{"style":325},[684],{"type":37,"value":617},{"type":32,"tag":308,"props":686,"children":687},{"style":351},[688],{"type":37,"value":689},"'JSON'",{"type":32,"tag":308,"props":691,"children":692},{"style":325},[693],{"type":37,"value":627},{"type":32,"tag":308,"props":695,"children":696},{"class":310,"line":362},[697,701,706,710,714,718,723],{"type":32,"tag":308,"props":698,"children":699},{"style":381},[700],{"type":37,"value":597},{"type":32,"tag":308,"props":702,"children":703},{"style":439},[704],{"type":37,"value":705}," logToConsole",{"type":32,"tag":308,"props":707,"children":708},{"style":381},[709],{"type":37,"value":607},{"type":32,"tag":308,"props":711,"children":712},{"style":331},[713],{"type":37,"value":612},{"type":32,"tag":308,"props":715,"children":716},{"style":325},[717],{"type":37,"value":617},{"type":32,"tag":308,"props":719,"children":720},{"style":351},[721],{"type":37,"value":722},"'logToConsole'",{"type":32,"tag":308,"props":724,"children":725},{"style":325},[726],{"type":37,"value":627},{"type":32,"tag":308,"props":728,"children":729},{"class":310,"line":412},[730],{"type":32,"tag":308,"props":731,"children":733},{"emptyLinePlaceholder":732},true,[734],{"type":37,"value":735},"\n",{"type":32,"tag":308,"props":737,"children":738},{"class":310,"line":430},[739,744],{"type":32,"tag":308,"props":740,"children":741},{"style":331},[742],{"type":37,"value":743},"claimRequest",{"type":32,"tag":308,"props":745,"children":746},{"style":325},[747],{"type":37,"value":748},"();\n",{"type":32,"tag":308,"props":750,"children":751},{"class":310,"line":449},[752],{"type":32,"tag":308,"props":753,"children":754},{"emptyLinePlaceholder":732},[755],{"type":37,"value":735},{"type":32,"tag":308,"props":757,"children":758},{"class":310,"line":463},[759,763,768,772,776],{"type":32,"tag":308,"props":760,"children":761},{"style":381},[762],{"type":37,"value":597},{"type":32,"tag":308,"props":764,"children":765},{"style":439},[766],{"type":37,"value":767}," body",{"type":32,"tag":308,"props":769,"children":770},{"style":381},[771],{"type":37,"value":607},{"type":32,"tag":308,"props":773,"children":774},{"style":331},[775],{"type":37,"value":639},{"type":32,"tag":308,"props":777,"children":778},{"style":325},[779],{"type":37,"value":748},{"type":32,"tag":308,"props":781,"children":782},{"class":310,"line":26},[783,787,792,796,800,805,810],{"type":32,"tag":308,"props":784,"children":785},{"style":381},[786],{"type":37,"value":597},{"type":32,"tag":308,"props":788,"children":789},{"style":439},[790],{"type":37,"value":791}," eventData",{"type":32,"tag":308,"props":793,"children":794},{"style":381},[795],{"type":37,"value":607},{"type":32,"tag":308,"props":797,"children":798},{"style":439},[799],{"type":37,"value":672},{"type":32,"tag":308,"props":801,"children":802},{"style":325},[803],{"type":37,"value":804},".",{"type":32,"tag":308,"props":806,"children":807},{"style":331},[808],{"type":37,"value":809},"parse",{"type":32,"tag":308,"props":811,"children":812},{"style":325},[813],{"type":37,"value":814},"(body);\n",{"type":32,"tag":308,"props":816,"children":818},{"class":310,"line":817},10,[819],{"type":32,"tag":308,"props":820,"children":821},{"emptyLinePlaceholder":732},[822],{"type":37,"value":735},{"type":32,"tag":308,"props":824,"children":826},{"class":310,"line":825},11,[827],{"type":32,"tag":308,"props":828,"children":829},{"style":315},[830],{"type":37,"value":831},"\u002F\u002F Normalizza l'event object\n",{"type":32,"tag":308,"props":833,"children":835},{"class":310,"line":834},12,[836,840,845,849],{"type":32,"tag":308,"props":837,"children":838},{"style":381},[839],{"type":37,"value":597},{"type":32,"tag":308,"props":841,"children":842},{"style":439},[843],{"type":37,"value":844}," normalizedEvent",{"type":32,"tag":308,"props":846,"children":847},{"style":381},[848],{"type":37,"value":607},{"type":32,"tag":308,"props":850,"children":851},{"style":325},[852],{"type":37,"value":853}," {\n",{"type":32,"tag":308,"props":855,"children":857},{"class":310,"line":856},13,[858,863,868,873],{"type":32,"tag":308,"props":859,"children":860},{"style":325},[861],{"type":37,"value":862},"  event_name: eventData.event ",{"type":32,"tag":308,"props":864,"children":865},{"style":381},[866],{"type":37,"value":867},"||",{"type":32,"tag":308,"props":869,"children":870},{"style":351},[871],{"type":37,"value":872}," 'unknown'",{"type":32,"tag":308,"props":874,"children":875},{"style":325},[876],{"type":37,"value":359},{"type":32,"tag":308,"props":878,"children":880},{"class":310,"line":879},14,[881],{"type":32,"tag":308,"props":882,"children":883},{"style":325},[884],{"type":37,"value":885},"  user_data: {\n",{"type":32,"tag":308,"props":887,"children":889},{"class":310,"line":888},15,[890],{"type":32,"tag":308,"props":891,"children":892},{"style":325},[893],{"type":37,"value":894},"    client_id: eventData.client_id,\n",{"type":32,"tag":308,"props":896,"children":898},{"class":310,"line":897},16,[899],{"type":32,"tag":308,"props":900,"children":901},{"style":325},[902],{"type":37,"value":903},"    user_agent: eventData.user_agent,\n",{"type":32,"tag":308,"props":905,"children":907},{"class":310,"line":906},17,[908],{"type":32,"tag":308,"props":909,"children":910},{"style":325},[911],{"type":37,"value":912},"    ip_override: eventData.ip_address\n",{"type":32,"tag":308,"props":914,"children":916},{"class":310,"line":915},18,[917],{"type":32,"tag":308,"props":918,"children":919},{"style":325},[920],{"type":37,"value":921},"  },\n",{"type":32,"tag":308,"props":923,"children":925},{"class":310,"line":924},19,[926],{"type":32,"tag":308,"props":927,"children":928},{"style":325},[929],{"type":37,"value":930},"  event_id: eventData.event_id,\n",{"type":32,"tag":308,"props":932,"children":934},{"class":310,"line":933},20,[935,940,945],{"type":32,"tag":308,"props":936,"children":937},{"style":325},[938],{"type":37,"value":939},"  timestamp_micros: eventData.timestamp ",{"type":32,"tag":308,"props":941,"children":942},{"style":381},[943],{"type":37,"value":944},"*",{"type":32,"tag":308,"props":946,"children":947},{"style":439},[948],{"type":37,"value":949}," 1000000\n",{"type":32,"tag":308,"props":951,"children":953},{"class":310,"line":952},21,[954],{"type":32,"tag":308,"props":955,"children":956},{"style":325},[957],{"type":37,"value":958},"};\n",{"type":32,"tag":308,"props":960,"children":962},{"class":310,"line":961},22,[963],{"type":32,"tag":308,"props":964,"children":965},{"emptyLinePlaceholder":732},[966],{"type":37,"value":735},{"type":32,"tag":308,"props":968,"children":970},{"class":310,"line":969},23,[971,976,980,985],{"type":32,"tag":308,"props":972,"children":973},{"style":331},[974],{"type":37,"value":975},"logToConsole",{"type":32,"tag":308,"props":977,"children":978},{"style":325},[979],{"type":37,"value":617},{"type":32,"tag":308,"props":981,"children":982},{"style":351},[983],{"type":37,"value":984},"'Normalized event:'",{"type":32,"tag":308,"props":986,"children":987},{"style":325},[988],{"type":37,"value":989},", normalizedEvent);\n",{"type":32,"tag":308,"props":991,"children":993},{"class":310,"line":992},24,[994,999,1004,1009],{"type":32,"tag":308,"props":995,"children":996},{"style":331},[997],{"type":37,"value":998},"runContainer",{"type":32,"tag":308,"props":1000,"children":1001},{"style":325},[1002],{"type":37,"value":1003},"(normalizedEvent, () ",{"type":32,"tag":308,"props":1005,"children":1006},{"style":381},[1007],{"type":37,"value":1008},"=>",{"type":32,"tag":308,"props":1010,"children":1011},{"style":325},[1012],{"type":37,"value":853},{"type":32,"tag":308,"props":1014,"children":1016},{"class":310,"line":1015},25,[1017,1022],{"type":32,"tag":308,"props":1018,"children":1019},{"style":331},[1020],{"type":37,"value":1021},"  returnResponse",{"type":32,"tag":308,"props":1023,"children":1024},{"style":325},[1025],{"type":37,"value":748},{"type":32,"tag":308,"props":1027,"children":1029},{"class":310,"line":1028},26,[1030],{"type":32,"tag":308,"props":1031,"children":1032},{"style":325},[1033],{"type":37,"value":469},{"type":32,"tag":33,"props":1035,"children":1036},{},[1037,1039,1044,1046,1052,1054,1060,1062,1068,1070,1076],{"type":37,"value":1038},"Questo client intercetta i POST verso il path ",{"type":32,"tag":57,"props":1040,"children":1042},{"className":1041},[],[1043],{"type":37,"value":568},{"type":37,"value":1045},", parsa il body JSON e lo trasforma nel modello di event di sGTM. La chiamata ",{"type":32,"tag":57,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":37,"value":1051},"runContainer()",{"type":37,"value":1053}," attiva i tag — quando il tag GA4 vede ",{"type":32,"tag":57,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":37,"value":1059},"event_name=purchase",{"type":37,"value":1061},", invia al Measurement Protocol, il tag Meta CAPI vede ",{"type":32,"tag":57,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":37,"value":1067},"user_data.email",{"type":37,"value":1069},", lo hashizza con SHA-256 e lo invia all'endpoint ",{"type":32,"tag":57,"props":1071,"children":1073},{"className":1072},[],[1074],{"type":37,"value":1075},"\u002Fevents",{"type":37,"value":804},{"type":32,"tag":33,"props":1078,"children":1079},{},[1080,1082,1087,1089,1094,1096,1102,1104,1110],{"type":37,"value":1081},"In produzione girano 4 client: (1) GA4 default client (",{"type":32,"tag":57,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":37,"value":560},{"type":37,"value":1088},"), (2) custom JSON client (",{"type":32,"tag":57,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":37,"value":568},{"type":37,"value":1095},"), (3) Meta Pixel client (",{"type":32,"tag":57,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":37,"value":1101},"\u002Ftr\u002F",{"type":37,"value":1103}," endpoint — compatibilità con SDK Facebook), (4) health check client (",{"type":32,"tag":57,"props":1105,"children":1107},{"className":1106},[],[1108],{"type":37,"value":1109},"\u002Fhealth",{"type":37,"value":1111},") — Cloud Run usa questo endpoint per il liveness probe e monitorare la salute del container. Ogni client ha un numero di priorità — se due client rivendicano lo stesso path, vince quello con priorità più alta.",{"type":32,"tag":33,"props":1113,"children":1114},{},[1115,1117,1123,1125,1131,1133,1139],{"type":37,"value":1116},"È critico tenere i template custom sotto version control. Le modifiche nella UI di Google Tag Manager non compaiono nella git history. Workflow: tieni i template come file ",{"type":32,"tag":57,"props":1118,"children":1120},{"className":1119},[],[1121],{"type":37,"value":1122},".tpl",{"type":37,"value":1124}," nel repo, usa ",{"type":32,"tag":57,"props":1126,"children":1128},{"className":1127},[],[1129],{"type":37,"value":1130},"gtm-template-push",{"type":37,"value":1132}," CLI tool nella pipeline CI per deployare nel workspace sGTM, testa nel container di staging, poi promovi in produzione. Così un rollback è un singolo ",{"type":32,"tag":57,"props":1134,"children":1136},{"className":1135},[],[1137],{"type":37,"value":1138},"git revert",{"type":37,"value":804},{"type":32,"tag":40,"props":1141,"children":1143},{"id":1142},"production-monitoring-quali-metriche-sono-critiche",[1144],{"type":37,"value":1145},"Production Monitoring: Quali Metriche Sono Critiche",{"type":32,"tag":33,"props":1147,"children":1148},{},[1149],{"type":37,"value":1150},"Una volta deployato server-side GTM, per non finire al buio serve monitoraggio su 4 livelli: (1) container health (uptime, latency, error rate), (2) event throughput (event\u002Fsec, tag success rate), (3) accuratezza deduplication (delta tra event contati client vs server), (4) validazione piattaforma downstream (Meta Event Quality Score, Google Ads conversion tracking status).",{"type":32,"tag":33,"props":1152,"children":1153},{},[1154],{"type":37,"value":1155},"Metriche native di Cloud Run:",{"type":32,"tag":1157,"props":1158,"children":1159},"ul",{},[1160,1178,1188,1205],{"type":32,"tag":1161,"props":1162,"children":1163},"li",{},[1164,1169,1171,1176],{"type":32,"tag":534,"props":1165,"children":1166},{},[1167],{"type":37,"value":1168},"Request count",{"type":37,"value":1170}," — numero di POST verso ",{"type":32,"tag":57,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":37,"value":568},{"type":37,"value":1177},", breakdown al minuto",{"type":32,"tag":1161,"props":1179,"children":1180},{},[1181,1186],{"type":32,"tag":534,"props":1182,"children":1183},{},[1184],{"type":37,"value":1185},"Request latency (p50, p95, p99)",{"type":37,"value":1187}," — se median > 120ms c'è un problema (normale 40-80ms)",{"type":32,"tag":1161,"props":1189,"children":1190},{},[1191,1196,1198,1203],{"type":32,"tag":534,"props":1192,"children":1193},{},[1194],{"type":37,"value":1195},"Container instance count",{"type":37,"value":1197}," — se ",{"type":32,"tag":57,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":37,"value":62},{"type":37,"value":1204},", deve sempre essere 1, auto-scale in caso di spike",{"type":32,"tag":1161,"props":1206,"children":1207},{},[1208,1213],{"type":32,"tag":534,"props":1209,"children":1210},{},[1211],{"type":37,"value":1212},"Error rate (5xx)",{"type":37,"value":1214}," — se > 0.1% continuamente, c'è un problema nei tag downstream",{"type":32,"tag":33,"props":1216,"children":1217},{},[1218,1220,1226,1228,1234],{"type":37,"value":1219},"Nel Console di sGTM, tab \"Logs\" ha debug log a livello di evento, ma in produzione ",{"type":32,"tag":57,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":37,"value":1225},"console.log",{"type":37,"value":1227}," su ogni evento genera I\u002FO pesante. Setup: debug logging attivo solo con query param ",{"type":32,"tag":57,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":37,"value":1233},"?gtm_debug=1",{"type":37,"value":1235},", disattivato su traffico production. Error critici (tag HTTP 4xx\u002F5xx) finiscono in Google Cloud Logging come structured JSON log, e scattano policy di alert in Cloud Monitoring — se Meta CAPI ritorna 10+ \"Invalid access token\" in 3 minuti, ping su Slack.",{"type":32,"tag":33,"props":1237,"children":1238},{},[1239,1241,1247],{"type":37,"value":1240},"Per monitorare l'event throughput creiamo una metrica custom: nei tag sGTM facciamo ",{"type":32,"tag":57,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":37,"value":1246},"sendHttpGet('https:\u002F\u002Fmetrics.roibase.com.tr\u002Fincrement?metric=capi_event')",{"type":37,"value":1248},", il metric service tiene counter in formato Prometheus. Dashboard Grafana mostra real-time event flow — se client-side GA4 invia 1000 event\u002Fmin ma server-side CAPI ne riceve solo 850\u002Fmin, significa collision ID deduplication o drop di rete.",{"type":32,"tag":33,"props":1250,"children":1251},{},[1252,1254,1260,1262,1268],{"type":37,"value":1253},"La validazione piattaforma downstream è la parte più critica. Meta Events Manager mostra Event Match Quality (EMQ) score — sotto 6.5\u002F10 è \"bassa qualità\", significa algoritmo hash sbagliato o PII field mancanti. Google Ads Conversion Tracking deve mostrare \"Status: Eligible\" — se vedi \"Rarely used\" o \"Below threshold\" vuol dire volume conversion insufficiente (minimo 15 conversioni\u002F30 giorni). GA4 DebugView: filtra server-side event con ",{"type":32,"tag":57,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":37,"value":1259},"traffic_type=server_side",{"type":37,"value":1261},", compara metric ",{"type":32,"tag":57,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":37,"value":1267},"event_count",{"type":37,"value":1269}," con client-side — se la differenza è > 20%, serve investigation.",{"type":32,"tag":40,"props":1271,"children":1273},{"id":1272},"identity-resolution-e-segnali-di-user-matching",[1274],{"type":37,"value":1275},"Identity Resolution e Segnali di User Matching",{"type":32,"tag":33,"props":1277,"children":1278},{},[1279,1281,1287,1289,1295,1297,1303,1305,1311,1313,1319,1321,1327,1329,1335,1337,1343,1344,1350,1352,1357,1359,1365,1367,1373,1374,1380],{"type":37,"value":1280},"La potenza del server-side ölçüm risiede nella capacità di trasmettere PII (Personally Identifiable Information) alle piattaforme in modo controllato. Meta CAPI accetta 7 parametri di user matching: ",{"type":32,"tag":57,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":37,"value":1286},"em",{"type":37,"value":1288}," (email hash), ",{"type":32,"tag":57,"props":1290,"children":1292},{"className":1291},[],[1293],{"type":37,"value":1294},"ph",{"type":37,"value":1296}," (phone hash), ",{"type":32,"tag":57,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":37,"value":1302},"fn",{"type":37,"value":1304}," (first name), ",{"type":32,"tag":57,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":37,"value":1310},"ln",{"type":37,"value":1312}," (last name), ",{"type":32,"tag":57,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":37,"value":1318},"ct",{"type":37,"value":1320}," (city), ",{"type":32,"tag":57,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":37,"value":1326},"st",{"type":37,"value":1328}," (state), ",{"type":32,"tag":57,"props":1330,"children":1332},{"className":1331},[],[1333],{"type":37,"value":1334},"zp",{"type":37,"value":1336}," (zip), ",{"type":32,"tag":57,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":37,"value":1342},"country",{"type":37,"value":93},{"type":32,"tag":57,"props":1345,"children":1347},{"className":1346},[],[1348],{"type":37,"value":1349},"external_id",{"type":37,"value":1351}," (CRM ID). Più segnali invii, più sale l'EMQ score — solo ",{"type":32,"tag":57,"props":1353,"children":1355},{"className":1354},[],[1356],{"type":37,"value":1286},{"type":37,"value":1358}," dà 4.2\u002F10, ",{"type":32,"tag":57,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":37,"value":1364},"em + ph + fn + ln",{"type":37,"value":1366}," dà 7.8\u002F10. Google Enhanced Conversions funziona ugualmente: aggiungendo ",{"type":32,"tag":57,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":37,"value":1372},"sha256_email_address",{"type":37,"value":288},{"type":32,"tag":57,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":37,"value":1379},"sha256_phone_number",{"type":37,"value":1381}," al tag Ads Conversion, la accuracy di attribuzione sale del ~40% (dato beta test Google 2025).",{"type":32,"tag":33,"props":1383,"children":1384},{},[1385,1387,1393,1395,1401],{"type":37,"value":1386},"Pipeline di identity resolution di Roibase in produzione: (1) utente inserisce email\u002Ftelefono in form web, (2) JS client-side hashizza con SHA-256 (plain text mai nel browser), (3) valore hashizzato viene push nel DataLayer, (4) sGTM prende l'hash e lo invia a Meta CAPI come ",{"type":32,"tag":57,"props":1388,"children":1390},{"className":1389},[],[1391],{"type":37,"value":1392},"user_data.em",{"type":37,"value":1394}," field, a Google come ",{"type":32,"tag":57,"props":1396,"children":1398},{"className":1397},[],[1399],{"type":37,"value":1400},"user_data.sha256_email_address",{"type":37,"value":1402},". Questo flusso è GDPR\u002FKVKK compliant perché il plain PII non finisce mai nei log server — SHA-256 è one-way hash, non reversibile.",{"type":32,"tag":33,"props":1404,"children":1405},{},[1406,1408,1414,1416,1422,1424,1429,1431,1436,1438,1444,1446,1451],{"type":37,"value":1407},"Segnale aggiuntivo: i cookie ",{"type":32,"tag":57,"props":1409,"children":1411},{"className":1410},[],[1412],{"type":37,"value":1413},"fbp",{"type":37,"value":1415}," (Facebook Browser ID) e ",{"type":32,"tag":57,"props":1417,"children":1419},{"className":1418},[],[1420],{"type":37,"value":1421},"fbc",{"type":37,"value":1423}," (Facebook Click ID) vengono letti lato server e inviati a CAPI. Il cookie ",{"type":32,"tag":57,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":37,"value":1413},{"type":37,"value":1430}," è set dal Pixel client-side ma ITP lo fa scadere dopo 7 giorni; noi lo leggiamo lato server e lo riscrviamo con TTL 90 giorni (set da first-party domain quindi bypass ITP). Il cookie ",{"type":32,"tag":57,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":37,"value":1421},{"type":37,"value":1437}," trasporta il ",{"type":32,"tag":57,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":37,"value":1443},"fbclid",{"type":37,"value":1445}," da traffico via ads — server-side facciamo parse di questo ID e lo aggiungiamo al field ",{"type":32,"tag":57,"props":1447,"children":1449},{"className":1448},[],[1450],{"type":37,"value":1421},{"type":37,"value":1452}," della CAPI, così Meta estende l'attribuzione da 24 ore a 28 giorni.",{"type":32,"tag":33,"props":1454,"children":1455},{},[1456,1458,1463,1465,1470,1472,1478,1480,1485,1487,1492,1494,1499,1501,1506,1508,1513,1515,1521],{"type":37,"value":1457},"Il meccanismo ",{"type":32,"tag":57,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":37,"value":511},{"type":37,"value":1464}," (Google Click ID) di Google funziona in modo simile. Client-side GTM legge il ",{"type":32,"tag":57,"props":1466,"children":1468},{"className":1467},[],[1469],{"type":37,"value":511},{"type":37,"value":1471}," dall'URL e lo scrive nel cookie ",{"type":32,"tag":57,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":37,"value":1477},"_gcl_aw",{"type":37,"value":1479}," con expiry 90 giorni. Server-side leggiamo questo cookie e lo aggiungiamo al tag Ads Conversion come parametro ",{"type":32,"tag":57,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":37,"value":511},{"type":37,"value":1486},". L'API server-side Conversion Tracking di Google usa ",{"type":32,"tag":57,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":37,"value":503},{"type":37,"value":1493}," come chiave univoca — se invii 2 conversioni con lo stesso ",{"type":32,"tag":57,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":37,"value":511},{"type":37,"value":1500},", Google fa deduplication. Setup nostro: se manca il cookie ",{"type":32,"tag":57,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":37,"value":511},{"type":37,"value":1507}," (traffico diretto), mappiamo il ",{"type":32,"tag":57,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":37,"value":248},{"type":37,"value":1514}," client ID nel parametro ",{"type":32,"tag":57,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":37,"value":1520},"gbraid",{"type":37,"value":1522}," come fallback — questo collega l'attribuzione GA4 con Ads.",{"type":32,"tag":40,"props":1524,"children":1526},{"id":1525},"compliance-e-consent-orchestration",[1527],{"type":37,"value":1528},"Compliance e Consent Orchestration",{"type":32,"tag":33,"props":1530,"children":1531},{},[1532,1534,1540,1542,1548],{"type":37,"value":1533},"Server-side tagging integrato male con Consent Mode v2 = rischio violazione GDPR. Regola di Google: se lo stato consent ",{"type":32,"tag":57,"props":1535,"children":1537},{"className":1536},[],[1538],{"type":37,"value":1539},"ad_storage=denied",{"type":37,"value":1541},", il tag sGTM Google Ads Conversion non deve scattare o deve inviare solo segnali anonimizzati (IP masking + drop di user ID). Sistema Limited Data Use (LDU) di Meta è simile: per traffico California, aggiungi parametro ",{"type":32,"tag":57,"props":1543,"children":1545},{"className":1544},[],[1546],{"type":37,"value":1547},"data_processing_options=['LDU']",{"type":37,"value":1549}," alla richiesta CAPI in modo che Meta non usi i dati per publicità personalizzata.",{"type":32,"tag":33,"props":1551,"children":1552},{},[1553,1555,1561,1562,1568,1569,1575,1576,1582,1584,1590,1592,1597,1599,1605,1607,1613],{"type":37,"value":1554},"Stack di consent orchestration nostro: (1) banner OneTrust\u002FCookiebot raccoglie consent dall'utente, (2) stato consent (",{"type":32,"tag":57,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":37,"value":1560},"ad_storage",{"type":37,"value":93},{"type":32,"tag":57,"props":1563,"children":1565},{"className":1564},[],[1566],{"type":37,"value":1567},"analytics_storage",{"type":37,"value":93},{"type":32,"tag":57,"props":1570,"children":1572},{"className":1571},[],[1573],{"type":37,"value":1574},"ad_user_data",{"type":37,"value":93},{"type":32,"tag":57,"props":1577,"children":1579},{"className":1578},[],[1580],{"type":37,"value":1581},"ad_personalization",{"type":37,"value":1583},") finisce nel DataLayer, (3) client-side GTM scrive lo stato in un cookie (",{"type":32,"tag":57,"props":1585,"children":1587},{"className":1586},[],[1588],{"type":37,"value":1589},"_consent_state",{"type":37,"value":1591},"), (4) quando l'utente fa POST ",{"type":32,"tag":57,"props":1593,"children":1595},{"className":1594},[],[1596],{"type":37,"value":568},{"type":37,"value":1598},", il cookie viene spedito negli header, (5) sGTM custom variable parsa il cookie, (6) nei tag Meta\u002FGoogle aggiungiamo conditional trigger: ",{"type":32,"tag":57,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":37,"value":1604},"{{Consent - Ad Storage}} equals \"granted\"",{"type":37,"value":1606}," → tag scatta, ",{"type":32,"tag":57,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":37,"value":1612},"denied",{"type":37,"value":1614}," → tag skip.",{"type":32,"tag":33,"props":1616,"children":1617},{},[1618,1620,1626],{"type":37,"value":1619},"Per Consent Conversion Modeling (CCM): aggiungiamo ",{"type":32,"tag":57,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":37,"value":1625},"consent_ad_user_data=true",{"type":37,"value":1627}," al tag Google Ads in modo che anche in stato denial",{"type":32,"tag":1629,"props":1630,"children":1631},"style",{},[1632],{"type":37,"value":1633},"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":342,"depth":342,"links":1635},[1636,1637,1638,1639,1640,1641],{"id":42,"depth":321,"text":45},{"id":120,"depth":321,"text":123},{"id":524,"depth":321,"text":527},{"id":1142,"depth":321,"text":1145},{"id":1272,"depth":321,"text":1275},{"id":1525,"depth":321,"text":1528},"markdown","content:it:data:server-side-gtm-conversion-api-da-produzione.md","content","it\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione.md","it\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione","md",1778306635747]