[{"data":1,"prerenderedAt":1634},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion":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":6,"_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":1628,"_id":1629,"_source":1630,"_file":1631,"_stem":1632,"_extension":1633},"data",false,"","Server-Side GTM und Conversion API: Von Null zur Production","Server-Side-Tagging auf Cloud Run und Workers, Container-Templates, Event-Deduplizierung und Production-Monitoring-Strategien für sichere Attribution.","2026-05-07",[21,22,23,24,25],"server-side-gtm","conversion-api","cloud-run","event-deduplizierung","privacy-sandbox",10,"Roibase",{"type":29,"children":30,"toc":1620},"root",[31,39,46,51,65,110,116,137,142,253,289,462,514,520,570,575,1026,1070,1105,1133,1139,1144,1149,1209,1222,1235,1256,1262,1368,1389,1439,1509,1515,1536,1601,1614],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Browser-basierte Messung ist tot. Third-Party-Cookies sind weg, ITP fällt auf 12 Stunden, Consent Mode v2 ist verpflichtend. Unternehmen, die Events nicht direkt über Server an Meta und Google senden, sitzen im Attributions-Blackout. Server-Side Google Tag Manager (sGTM) und Conversion API sind 2026 keine Option mehr — sie sind Production-Anforderung. Dieser Leitfaden zeigt, wie du auf Cloud Run einen Production-Ready sGTM-Container deployst, Event-Deduplizierung einrichtest und welche Metriken du monitoren musst.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"warum-server-side-tagging-container-erfordert",[44],{"type":37,"value":45},"Warum Server-Side Tagging Container erfordert",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Das klassische GTM-JavaScript lädt Bibliotheken im Browser und erfasst Daten vom User-Agent. Server-Side GTM funktioniert umgekehrt: Dein eigener Node.js-Container empfängt HTTP-POST-Requests vom Client, reichert Events an (IP, User-Agent-Parsing, First-Party-IDs aus Cookies), und sendet sie an Ziel-APIs (Meta CAPI, Google Ads Conversion, GA4 Measurement Protocol). Diese Architektur liefert drei entscheidende Vorteile: (1) Du umgehst Browser-Beschränkungen — ITP, Adblocker, CORS existieren nicht mehr; (2) Du kannst PII kontrolliert hashen und senden — E-Mail, Telefon werden auf dem Server SHA-256-verschlüsselt, niemals an den Browser zurück; (3) Du sendest ein Event zu mehreren Plattformen parallel — ein POST vom Client triggert vier API-Calls zur gleichen Zeit.",{"type":32,"tag":33,"props":52,"children":53},{},[54,56,63],{"type":37,"value":55},"Google's offizielle Deployment-Option ist App Engine oder Cloud Run. App Engine bringt fixe Kosten und Auto-Scaling, ist aber nicht anpassbar. Cloud Run ist vorzuziehen, da du mit ",{"type":32,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":37,"value":62},"min_instances=1",{"type":37,"value":64}," Latenz-Garantien geben und das Container-Image über custom Dockerfile spezialisieren kannst (z.B. Secrets aus Umgebungsvariablen laden, Startup-Scripts injizieren). Alternativ: Cloudflare Workers — niedrigerer Cold-Start (~5ms statt 200ms), aber Node.js-Sandbox-Limits bedeuten, dass bestimmte sGTM-Tags nicht laufen (vor allem Custom Templates mit nativen Module require()).",{"type":32,"tag":33,"props":66,"children":67},{},[68,70,76,78,84,86,92,94,100,102,108],{"type":37,"value":69},"Der Deployment-Prozess: (1) Neues Projekt in Google Cloud Console, (2) ",{"type":32,"tag":57,"props":71,"children":73},{"className":72},[],[74],{"type":37,"value":75},"gcloud",{"type":37,"value":77}," CLI zieht sGTM Container-Image, (3) Cloud Run Service mit Umgebungsvariablen erstellen (",{"type":32,"tag":57,"props":79,"children":81},{"className":80},[],[82],{"type":37,"value":83},"CONTAINER_CONFIG",{"type":37,"value":85},", ",{"type":32,"tag":57,"props":87,"children":89},{"className":88},[],[90],{"type":37,"value":91},"PREVIEW_SERVER_URL",{"type":37,"value":93},"), (4) Custom Domain binden (z.B. ",{"type":32,"tag":57,"props":95,"children":97},{"className":96},[],[98],{"type":37,"value":99},"gtm.roibase.com.tr",{"type":37,"value":101},") — First-Party-Context ist Pflicht, (5) Tagging Server URL ins Web-GTM eintragen (",{"type":32,"tag":57,"props":103,"children":105},{"className":104},[],[106],{"type":37,"value":107},"serverContainerUrl",{"type":37,"value":109},"-Parameter). Erstes Deployment dauert 15 Minuten, später 2 Minuten mit CI\u002FCD.",{"type":32,"tag":40,"props":111,"children":113},{"id":112},"event-deduplizierung-client-server-zu-einer-id",[114],{"type":37,"value":115},"Event-Deduplizierung: Client + Server zu einer ID",{"type":32,"tag":33,"props":117,"children":118},{},[119,121,127,129,135],{"type":37,"value":120},"Server-Side GTMs kritisches Problem ist Deduplizierung. Wenn dieselbe Conversion vom Browser (Client-Side GA4-Tag) und vom Server (Server-Side GA4-Client) gesendet wird, zählt die Plattform zwei Conversions. Meta CAPI und Google Ads Conversion erfordern ein Event-Deduplizierungs-ID-System. Wie es funktioniert: Jedes Event bekommt eine eindeutige ",{"type":32,"tag":57,"props":122,"children":124},{"className":123},[],[125],{"type":37,"value":126},"event_id",{"type":37,"value":128}," (Meta: ",{"type":32,"tag":57,"props":130,"children":132},{"className":131},[],[133],{"type":37,"value":134},"event_name + event_id",{"type":37,"value":136},"), Client und Server senden dieselbe ID, und die Plattform droht Duplikate innerhalb eines 24-Stunden-Fensters.",{"type":32,"tag":33,"props":138,"children":139},{},[140],{"type":37,"value":141},"Deduplizierungs-ID-Strategien:",{"type":32,"tag":143,"props":144,"children":145},"table",{},[146,170],{"type":32,"tag":147,"props":148,"children":149},"thead",{},[150],{"type":32,"tag":151,"props":152,"children":153},"tr",{},[154,160,165],{"type":32,"tag":155,"props":156,"children":157},"th",{},[158],{"type":37,"value":159},"Methode",{"type":32,"tag":155,"props":161,"children":162},{},[163],{"type":37,"value":164},"Vorteil",{"type":32,"tag":155,"props":166,"children":167},{},[168],{"type":37,"value":169},"Risiko",{"type":32,"tag":171,"props":172,"children":173},"tbody",{},[174,193,211,229],{"type":32,"tag":151,"props":175,"children":176},{},[177,183,188],{"type":32,"tag":178,"props":179,"children":180},"td",{},[181],{"type":37,"value":182},"UUID v4 (zufällig)",{"type":32,"tag":178,"props":184,"children":185},{},[186],{"type":37,"value":187},"Keine Kollisionsgefahr",{"type":32,"tag":178,"props":189,"children":190},{},[191],{"type":37,"value":192},"Client-Server-Sync erforderlich (localStorage\u002FCookie)",{"type":32,"tag":151,"props":194,"children":195},{},[196,201,206],{"type":32,"tag":178,"props":197,"children":198},{},[199],{"type":37,"value":200},"Transaction ID (E-Commerce)",{"type":32,"tag":178,"props":202,"children":203},{},[204],{"type":37,"value":205},"Natürlich eindeutig",{"type":32,"tag":178,"props":207,"children":208},{},[209],{"type":37,"value":210},"Für Non-Transaction Events (Lead, Signup) nicht vorhanden",{"type":32,"tag":151,"props":212,"children":213},{},[214,219,224],{"type":32,"tag":178,"props":215,"children":216},{},[217],{"type":37,"value":218},"Session ID + Timestamp",{"type":32,"tag":178,"props":220,"children":221},{},[222],{"type":37,"value":223},"Leicht generierbar",{"type":32,"tag":178,"props":225,"children":226},{},[227],{"type":37,"value":228},"Overlapping Sessions möglich",{"type":32,"tag":151,"props":230,"children":231},{},[232,243,248],{"type":32,"tag":178,"props":233,"children":234},{},[235,241],{"type":32,"tag":57,"props":236,"children":238},{"className":237},[],[239],{"type":37,"value":240},"_ga",{"type":37,"value":242}," Client ID + Event Timestamp",{"type":32,"tag":178,"props":244,"children":245},{},[246],{"type":37,"value":247},"Basiert auf First-Party-ID",{"type":32,"tag":178,"props":249,"children":250},{},[251],{"type":37,"value":252},"Risiko Clock-Skew (Client\u002FServer Zeit-Differenz)",{"type":32,"tag":33,"props":254,"children":255},{},[256,258,264,266,271,273,279,281,287],{"type":37,"value":257},"Roibase Production-Setup: ",{"type":32,"tag":57,"props":259,"children":261},{"className":260},[],[262],{"type":37,"value":263},"SHA-256(_ga + event_name + unix_ms)",{"type":37,"value":265}," — Browser füllt ",{"type":32,"tag":57,"props":267,"children":269},{"className":268},[],[270],{"type":37,"value":126},{"type":37,"value":272}," mit diesem Hash beim DataLayer-Push, Server-Side GA4-Tag liest dasselbe Feld und sendet es ans Measurement Protocol. Für Meta CAPI injizieren wir zusätzlich ",{"type":32,"tag":57,"props":274,"children":276},{"className":275},[],[277],{"type":37,"value":278},"event_source_url",{"type":37,"value":280}," und ",{"type":32,"tag":57,"props":282,"children":284},{"className":283},[],[285],{"type":37,"value":286},"action_source=website",{"type":37,"value":288}," auf dem Server, da der Client-Side Pixel diese Fields nicht sendet, aber für Validierung benötigt werden.",{"type":32,"tag":290,"props":291,"children":295},"pre",{"className":292,"code":293,"language":294,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F DataLayer Push Beispiel (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",[296],{"type":32,"tag":57,"props":297,"children":298},{"__ignoreMap":16},[299,311,332,352,402,420,439,453],{"type":32,"tag":300,"props":301,"children":304},"span",{"class":302,"line":303},"line",1,[305],{"type":32,"tag":300,"props":306,"children":308},{"style":307},"--shiki-default:#6A737D",[309],{"type":37,"value":310},"\u002F\u002F DataLayer Push Beispiel (Client-Side)\n",{"type":32,"tag":300,"props":312,"children":314},{"class":302,"line":313},2,[315,321,327],{"type":32,"tag":300,"props":316,"children":318},{"style":317},"--shiki-default:#E1E4E8",[319],{"type":37,"value":320},"window.dataLayer.",{"type":32,"tag":300,"props":322,"children":324},{"style":323},"--shiki-default:#B392F0",[325],{"type":37,"value":326},"push",{"type":32,"tag":300,"props":328,"children":329},{"style":317},[330],{"type":37,"value":331},"({\n",{"type":32,"tag":300,"props":333,"children":335},{"class":302,"line":334},3,[336,341,347],{"type":32,"tag":300,"props":337,"children":338},{"style":317},[339],{"type":37,"value":340},"  event: ",{"type":32,"tag":300,"props":342,"children":344},{"style":343},"--shiki-default:#9ECBFF",[345],{"type":37,"value":346},"'purchase'",{"type":32,"tag":300,"props":348,"children":349},{"style":317},[350],{"type":37,"value":351},",\n",{"type":32,"tag":300,"props":353,"children":355},{"class":302,"line":354},4,[356,361,366,371,377,382,387,392,397],{"type":32,"tag":300,"props":357,"children":358},{"style":317},[359],{"type":37,"value":360},"  event_id: ",{"type":32,"tag":300,"props":362,"children":363},{"style":323},[364],{"type":37,"value":365},"sha256",{"type":32,"tag":300,"props":367,"children":368},{"style":317},[369],{"type":37,"value":370},"(_ga ",{"type":32,"tag":300,"props":372,"children":374},{"style":373},"--shiki-default:#F97583",[375],{"type":37,"value":376},"+",{"type":32,"tag":300,"props":378,"children":379},{"style":343},[380],{"type":37,"value":381}," 'purchase'",{"type":32,"tag":300,"props":383,"children":384},{"style":373},[385],{"type":37,"value":386}," +",{"type":32,"tag":300,"props":388,"children":389},{"style":317},[390],{"type":37,"value":391}," Date.",{"type":32,"tag":300,"props":393,"children":394},{"style":323},[395],{"type":37,"value":396},"now",{"type":32,"tag":300,"props":398,"children":399},{"style":317},[400],{"type":37,"value":401},"()),\n",{"type":32,"tag":300,"props":403,"children":405},{"class":302,"line":404},5,[406,411,416],{"type":32,"tag":300,"props":407,"children":408},{"style":317},[409],{"type":37,"value":410},"  transaction_id: ",{"type":32,"tag":300,"props":412,"children":413},{"style":343},[414],{"type":37,"value":415},"'ORD-12345'",{"type":32,"tag":300,"props":417,"children":418},{"style":317},[419],{"type":37,"value":351},{"type":32,"tag":300,"props":421,"children":423},{"class":302,"line":422},6,[424,429,435],{"type":32,"tag":300,"props":425,"children":426},{"style":317},[427],{"type":37,"value":428},"  value: ",{"type":32,"tag":300,"props":430,"children":432},{"style":431},"--shiki-default:#79B8FF",[433],{"type":37,"value":434},"299.00",{"type":32,"tag":300,"props":436,"children":437},{"style":317},[438],{"type":37,"value":351},{"type":32,"tag":300,"props":440,"children":442},{"class":302,"line":441},7,[443,448],{"type":32,"tag":300,"props":444,"children":445},{"style":317},[446],{"type":37,"value":447},"  currency: ",{"type":32,"tag":300,"props":449,"children":450},{"style":343},[451],{"type":37,"value":452},"'TRY'\n",{"type":32,"tag":300,"props":454,"children":456},{"class":302,"line":455},8,[457],{"type":32,"tag":300,"props":458,"children":459},{"style":317},[460],{"type":37,"value":461},"});\n",{"type":32,"tag":33,"props":463,"children":464},{},[465,467,473,475,481,483,488,490,496,498,504,506,512],{"type":37,"value":466},"Im Server-Side Container erstellen wir Custom Variables, um ",{"type":32,"tag":57,"props":468,"children":470},{"className":469},[],[471],{"type":37,"value":472},"{{Event ID}}",{"type":37,"value":474}," sowohl GA4 als auch CAPI-Tags zu mappen. GA4 Measurement Protocol unterstützt ",{"type":32,"tag":57,"props":476,"children":478},{"className":477},[],[479],{"type":37,"value":480},"&ep.event_id=",{"type":37,"value":482},"-Parameter, Meta CAPI hat Root-Level ",{"type":32,"tag":57,"props":484,"children":486},{"className":485},[],[487],{"type":37,"value":126},{"type":37,"value":489},"-Feld. Für Google Ads Conversion liefert die ",{"type":32,"tag":57,"props":491,"children":493},{"className":492},[],[494],{"type":37,"value":495},"gclid + conversion_action_id",{"type":37,"value":497},"-Kombination Deduplizierung — ",{"type":32,"tag":57,"props":499,"children":501},{"className":500},[],[502],{"type":37,"value":503},"gclid",{"type":37,"value":505}," kommt aus dem Cookie zum Server, das Ads-Tag kombiniert ",{"type":32,"tag":57,"props":507,"children":509},{"className":508},[],[510],{"type":37,"value":511},"gclid + conversion_value",{"type":37,"value":513}," und sendet an Conversion Tracking API.",{"type":32,"tag":40,"props":515,"children":517},{"id":516},"container-template-und-custom-client-setup",[518],{"type":37,"value":519},"Container-Template und Custom Client Setup",{"type":32,"tag":33,"props":521,"children":522},{},[523,525,531,533,538,540,545,547,553,555,561,562,568],{"type":37,"value":524},"Ein sGTM-Container besteht aus drei Komponenten: ",{"type":32,"tag":526,"props":527,"children":528},"strong",{},[529],{"type":37,"value":530},"Client",{"type":37,"value":532}," (parsed eingehende HTTP-Requests in Event-Objects), ",{"type":32,"tag":526,"props":534,"children":535},{},[536],{"type":37,"value":537},"Tag",{"type":37,"value":539}," (sendet Event an externe API), ",{"type":32,"tag":526,"props":541,"children":542},{},[543],{"type":37,"value":544},"Variable",{"type":37,"value":546}," (teilt Daten zwischen Tags). Googles Default \"GA4\"-Client reicht nicht, da nur ",{"type":32,"tag":57,"props":548,"children":550},{"className":549},[],[551],{"type":37,"value":552},"\u002Fg\u002Fcollect",{"type":37,"value":554},"-Endpoint lauscht. Wir schreiben Custom Clients, um GA4 und Custom Endpoints (",{"type":32,"tag":57,"props":556,"children":558},{"className":557},[],[559],{"type":37,"value":560},"\u002Fevent",{"type":37,"value":85},{"type":32,"tag":57,"props":563,"children":565},{"className":564},[],[566],{"type":37,"value":567},"\u002Fpurchase",{"type":37,"value":569},") im selben Container zu handhaben.",{"type":32,"tag":33,"props":571,"children":572},{},[573],{"type":37,"value":574},"Custom Client-Template-Beispiel:",{"type":32,"tag":290,"props":576,"children":578},{"className":292,"code":577,"language":294,"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 Normalisiere 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",[579],{"type":32,"tag":57,"props":580,"children":581},{"__ignoreMap":16},[582,620,653,686,719,728,741,748,772,808,815,824,846,869,878,887,896,905,914,923,942,951,959,982,1005,1018],{"type":32,"tag":300,"props":583,"children":584},{"class":302,"line":303},[585,590,595,600,605,610,615],{"type":32,"tag":300,"props":586,"children":587},{"style":373},[588],{"type":37,"value":589},"const",{"type":32,"tag":300,"props":591,"children":592},{"style":431},[593],{"type":37,"value":594}," claimRequest",{"type":32,"tag":300,"props":596,"children":597},{"style":373},[598],{"type":37,"value":599}," =",{"type":32,"tag":300,"props":601,"children":602},{"style":323},[603],{"type":37,"value":604}," require",{"type":32,"tag":300,"props":606,"children":607},{"style":317},[608],{"type":37,"value":609},"(",{"type":32,"tag":300,"props":611,"children":612},{"style":343},[613],{"type":37,"value":614},"'claimRequest'",{"type":32,"tag":300,"props":616,"children":617},{"style":317},[618],{"type":37,"value":619},");\n",{"type":32,"tag":300,"props":621,"children":622},{"class":302,"line":313},[623,627,632,636,640,644,649],{"type":32,"tag":300,"props":624,"children":625},{"style":373},[626],{"type":37,"value":589},{"type":32,"tag":300,"props":628,"children":629},{"style":431},[630],{"type":37,"value":631}," getRequestBody",{"type":32,"tag":300,"props":633,"children":634},{"style":373},[635],{"type":37,"value":599},{"type":32,"tag":300,"props":637,"children":638},{"style":323},[639],{"type":37,"value":604},{"type":32,"tag":300,"props":641,"children":642},{"style":317},[643],{"type":37,"value":609},{"type":32,"tag":300,"props":645,"children":646},{"style":343},[647],{"type":37,"value":648},"'getRequestBody'",{"type":32,"tag":300,"props":650,"children":651},{"style":317},[652],{"type":37,"value":619},{"type":32,"tag":300,"props":654,"children":655},{"class":302,"line":334},[656,660,665,669,673,677,682],{"type":32,"tag":300,"props":657,"children":658},{"style":373},[659],{"type":37,"value":589},{"type":32,"tag":300,"props":661,"children":662},{"style":431},[663],{"type":37,"value":664}," JSON",{"type":32,"tag":300,"props":666,"children":667},{"style":373},[668],{"type":37,"value":599},{"type":32,"tag":300,"props":670,"children":671},{"style":323},[672],{"type":37,"value":604},{"type":32,"tag":300,"props":674,"children":675},{"style":317},[676],{"type":37,"value":609},{"type":32,"tag":300,"props":678,"children":679},{"style":343},[680],{"type":37,"value":681},"'JSON'",{"type":32,"tag":300,"props":683,"children":684},{"style":317},[685],{"type":37,"value":619},{"type":32,"tag":300,"props":687,"children":688},{"class":302,"line":354},[689,693,698,702,706,710,715],{"type":32,"tag":300,"props":690,"children":691},{"style":373},[692],{"type":37,"value":589},{"type":32,"tag":300,"props":694,"children":695},{"style":431},[696],{"type":37,"value":697}," logToConsole",{"type":32,"tag":300,"props":699,"children":700},{"style":373},[701],{"type":37,"value":599},{"type":32,"tag":300,"props":703,"children":704},{"style":323},[705],{"type":37,"value":604},{"type":32,"tag":300,"props":707,"children":708},{"style":317},[709],{"type":37,"value":609},{"type":32,"tag":300,"props":711,"children":712},{"style":343},[713],{"type":37,"value":714},"'logToConsole'",{"type":32,"tag":300,"props":716,"children":717},{"style":317},[718],{"type":37,"value":619},{"type":32,"tag":300,"props":720,"children":721},{"class":302,"line":404},[722],{"type":32,"tag":300,"props":723,"children":725},{"emptyLinePlaceholder":724},true,[726],{"type":37,"value":727},"\n",{"type":32,"tag":300,"props":729,"children":730},{"class":302,"line":422},[731,736],{"type":32,"tag":300,"props":732,"children":733},{"style":323},[734],{"type":37,"value":735},"claimRequest",{"type":32,"tag":300,"props":737,"children":738},{"style":317},[739],{"type":37,"value":740},"();\n",{"type":32,"tag":300,"props":742,"children":743},{"class":302,"line":441},[744],{"type":32,"tag":300,"props":745,"children":746},{"emptyLinePlaceholder":724},[747],{"type":37,"value":727},{"type":32,"tag":300,"props":749,"children":750},{"class":302,"line":455},[751,755,760,764,768],{"type":32,"tag":300,"props":752,"children":753},{"style":373},[754],{"type":37,"value":589},{"type":32,"tag":300,"props":756,"children":757},{"style":431},[758],{"type":37,"value":759}," body",{"type":32,"tag":300,"props":761,"children":762},{"style":373},[763],{"type":37,"value":599},{"type":32,"tag":300,"props":765,"children":766},{"style":323},[767],{"type":37,"value":631},{"type":32,"tag":300,"props":769,"children":770},{"style":317},[771],{"type":37,"value":740},{"type":32,"tag":300,"props":773,"children":775},{"class":302,"line":774},9,[776,780,785,789,793,798,803],{"type":32,"tag":300,"props":777,"children":778},{"style":373},[779],{"type":37,"value":589},{"type":32,"tag":300,"props":781,"children":782},{"style":431},[783],{"type":37,"value":784}," eventData",{"type":32,"tag":300,"props":786,"children":787},{"style":373},[788],{"type":37,"value":599},{"type":32,"tag":300,"props":790,"children":791},{"style":431},[792],{"type":37,"value":664},{"type":32,"tag":300,"props":794,"children":795},{"style":317},[796],{"type":37,"value":797},".",{"type":32,"tag":300,"props":799,"children":800},{"style":323},[801],{"type":37,"value":802},"parse",{"type":32,"tag":300,"props":804,"children":805},{"style":317},[806],{"type":37,"value":807},"(body);\n",{"type":32,"tag":300,"props":809,"children":810},{"class":302,"line":26},[811],{"type":32,"tag":300,"props":812,"children":813},{"emptyLinePlaceholder":724},[814],{"type":37,"value":727},{"type":32,"tag":300,"props":816,"children":818},{"class":302,"line":817},11,[819],{"type":32,"tag":300,"props":820,"children":821},{"style":307},[822],{"type":37,"value":823},"\u002F\u002F Normalisiere Event-Object\n",{"type":32,"tag":300,"props":825,"children":827},{"class":302,"line":826},12,[828,832,837,841],{"type":32,"tag":300,"props":829,"children":830},{"style":373},[831],{"type":37,"value":589},{"type":32,"tag":300,"props":833,"children":834},{"style":431},[835],{"type":37,"value":836}," normalizedEvent",{"type":32,"tag":300,"props":838,"children":839},{"style":373},[840],{"type":37,"value":599},{"type":32,"tag":300,"props":842,"children":843},{"style":317},[844],{"type":37,"value":845}," {\n",{"type":32,"tag":300,"props":847,"children":849},{"class":302,"line":848},13,[850,855,860,865],{"type":32,"tag":300,"props":851,"children":852},{"style":317},[853],{"type":37,"value":854},"  event_name: eventData.event ",{"type":32,"tag":300,"props":856,"children":857},{"style":373},[858],{"type":37,"value":859},"||",{"type":32,"tag":300,"props":861,"children":862},{"style":343},[863],{"type":37,"value":864}," 'unknown'",{"type":32,"tag":300,"props":866,"children":867},{"style":317},[868],{"type":37,"value":351},{"type":32,"tag":300,"props":870,"children":872},{"class":302,"line":871},14,[873],{"type":32,"tag":300,"props":874,"children":875},{"style":317},[876],{"type":37,"value":877},"  user_data: {\n",{"type":32,"tag":300,"props":879,"children":881},{"class":302,"line":880},15,[882],{"type":32,"tag":300,"props":883,"children":884},{"style":317},[885],{"type":37,"value":886},"    client_id: eventData.client_id,\n",{"type":32,"tag":300,"props":888,"children":890},{"class":302,"line":889},16,[891],{"type":32,"tag":300,"props":892,"children":893},{"style":317},[894],{"type":37,"value":895},"    user_agent: eventData.user_agent,\n",{"type":32,"tag":300,"props":897,"children":899},{"class":302,"line":898},17,[900],{"type":32,"tag":300,"props":901,"children":902},{"style":317},[903],{"type":37,"value":904},"    ip_override: eventData.ip_address\n",{"type":32,"tag":300,"props":906,"children":908},{"class":302,"line":907},18,[909],{"type":32,"tag":300,"props":910,"children":911},{"style":317},[912],{"type":37,"value":913},"  },\n",{"type":32,"tag":300,"props":915,"children":917},{"class":302,"line":916},19,[918],{"type":32,"tag":300,"props":919,"children":920},{"style":317},[921],{"type":37,"value":922},"  event_id: eventData.event_id,\n",{"type":32,"tag":300,"props":924,"children":926},{"class":302,"line":925},20,[927,932,937],{"type":32,"tag":300,"props":928,"children":929},{"style":317},[930],{"type":37,"value":931},"  timestamp_micros: eventData.timestamp ",{"type":32,"tag":300,"props":933,"children":934},{"style":373},[935],{"type":37,"value":936},"*",{"type":32,"tag":300,"props":938,"children":939},{"style":431},[940],{"type":37,"value":941}," 1000000\n",{"type":32,"tag":300,"props":943,"children":945},{"class":302,"line":944},21,[946],{"type":32,"tag":300,"props":947,"children":948},{"style":317},[949],{"type":37,"value":950},"};\n",{"type":32,"tag":300,"props":952,"children":954},{"class":302,"line":953},22,[955],{"type":32,"tag":300,"props":956,"children":957},{"emptyLinePlaceholder":724},[958],{"type":37,"value":727},{"type":32,"tag":300,"props":960,"children":962},{"class":302,"line":961},23,[963,968,972,977],{"type":32,"tag":300,"props":964,"children":965},{"style":323},[966],{"type":37,"value":967},"logToConsole",{"type":32,"tag":300,"props":969,"children":970},{"style":317},[971],{"type":37,"value":609},{"type":32,"tag":300,"props":973,"children":974},{"style":343},[975],{"type":37,"value":976},"'Normalized event:'",{"type":32,"tag":300,"props":978,"children":979},{"style":317},[980],{"type":37,"value":981},", normalizedEvent);\n",{"type":32,"tag":300,"props":983,"children":985},{"class":302,"line":984},24,[986,991,996,1001],{"type":32,"tag":300,"props":987,"children":988},{"style":323},[989],{"type":37,"value":990},"runContainer",{"type":32,"tag":300,"props":992,"children":993},{"style":317},[994],{"type":37,"value":995},"(normalizedEvent, () ",{"type":32,"tag":300,"props":997,"children":998},{"style":373},[999],{"type":37,"value":1000},"=>",{"type":32,"tag":300,"props":1002,"children":1003},{"style":317},[1004],{"type":37,"value":845},{"type":32,"tag":300,"props":1006,"children":1008},{"class":302,"line":1007},25,[1009,1014],{"type":32,"tag":300,"props":1010,"children":1011},{"style":323},[1012],{"type":37,"value":1013},"  returnResponse",{"type":32,"tag":300,"props":1015,"children":1016},{"style":317},[1017],{"type":37,"value":740},{"type":32,"tag":300,"props":1019,"children":1021},{"class":302,"line":1020},26,[1022],{"type":32,"tag":300,"props":1023,"children":1024},{"style":317},[1025],{"type":37,"value":461},{"type":32,"tag":33,"props":1027,"children":1028},{},[1029,1031,1036,1038,1044,1046,1052,1054,1060,1062,1068],{"type":37,"value":1030},"Dieser Client fängt POST-Requests auf ",{"type":32,"tag":57,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":37,"value":560},{"type":37,"value":1037}," ab, parsed JSON Body und transformiert ins sGTM Event-Modell. Der ",{"type":32,"tag":57,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":37,"value":1043},"runContainer()",{"type":37,"value":1045},"-Aufruf triggert die Tag-Ausführung — wenn ein GA4-Tag ",{"type":32,"tag":57,"props":1047,"children":1049},{"className":1048},[],[1050],{"type":37,"value":1051},"event_name=purchase",{"type":37,"value":1053}," sieht, sendet es an Measurement Protocol; wenn CAPI-Tag ",{"type":32,"tag":57,"props":1055,"children":1057},{"className":1056},[],[1058],{"type":37,"value":1059},"user_data.email",{"type":37,"value":1061}," findet, hasht und sendet zu ",{"type":32,"tag":57,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":37,"value":1067},"\u002Fevents",{"type":37,"value":1069},"-Endpoint.",{"type":32,"tag":33,"props":1071,"children":1072},{},[1073,1075,1080,1082,1087,1089,1095,1097,1103],{"type":37,"value":1074},"Production-Setup läuft 4 Clients: (1) GA4 Default-Client (",{"type":32,"tag":57,"props":1076,"children":1078},{"className":1077},[],[1079],{"type":37,"value":552},{"type":37,"value":1081},"), (2) Custom JSON Client (",{"type":32,"tag":57,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":37,"value":560},{"type":37,"value":1088},"), (3) Meta Pixel Client (",{"type":32,"tag":57,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":37,"value":1094},"\u002Ftr\u002F",{"type":37,"value":1096},"-Endpoint für Facebook SDK-Kompatibilität), (4) Health Check Client (",{"type":32,"tag":57,"props":1098,"children":1100},{"className":1099},[],[1101],{"type":37,"value":1102},"\u002Fhealth",{"type":37,"value":1104},") — Cloud Run Liveness Probe pingt diesen Endpoint für Container-Gesundheit. Jeder Client hat Priorität — wenn zwei Clients denselben Path beanspruchen, gewinnt die höhere Priorität.",{"type":32,"tag":33,"props":1106,"children":1107},{},[1108,1110,1116,1118,1124,1126,1132],{"type":37,"value":1109},"Custom Templates gehören unter Version Control. Änderungen in Google Tag Manager's Web-UI erscheinen nicht in Git-History. Unser Workflow: Templates als ",{"type":32,"tag":57,"props":1111,"children":1113},{"className":1112},[],[1114],{"type":37,"value":1115},".tpl",{"type":37,"value":1117},"-Dateien im Repo, CI-Pipeline mit ",{"type":32,"tag":57,"props":1119,"children":1121},{"className":1120},[],[1122],{"type":37,"value":1123},"gtm-template-push",{"type":37,"value":1125}," CLI-Tool deployt zu sGTM Workspace, Test im Staging-Container, dann Production-Promotion. So funktioniert Rollback mit 1 ",{"type":32,"tag":57,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":37,"value":1131},"git revert",{"type":37,"value":797},{"type":32,"tag":40,"props":1134,"children":1136},{"id":1135},"production-monitoring-welche-metriken-sind-kritisch",[1137],{"type":37,"value":1138},"Production Monitoring: Welche Metriken sind kritisch",{"type":32,"tag":33,"props":1140,"children":1141},{},[1142],{"type":37,"value":1143},"Nach sGTM-Deployment brauchst du Monitoring auf 4 Ebenen: (1) Container Health (Uptime, Latenz, Error Rate), (2) Event Throughput (Events\u002FSekunde, Tag Success Rate), (3) Deduplizierungs-Genauigkeit (Client vs. Server Event Count Delta), (4) Downstream Platform Validation (Meta Event Quality Score, Google Ads Tracking Status).",{"type":32,"tag":33,"props":1145,"children":1146},{},[1147],{"type":37,"value":1148},"Cloud Run Native Metriken:",{"type":32,"tag":1150,"props":1151,"children":1152},"ul",{},[1153,1171,1181,1199],{"type":32,"tag":1154,"props":1155,"children":1156},"li",{},[1157,1162,1164,1169],{"type":32,"tag":526,"props":1158,"children":1159},{},[1160],{"type":37,"value":1161},"Request Count",{"type":37,"value":1163}," — eingehende POST-Requests zu ",{"type":32,"tag":57,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":37,"value":560},{"type":37,"value":1170},", minutliche Granularität",{"type":32,"tag":1154,"props":1172,"children":1173},{},[1174,1179],{"type":32,"tag":526,"props":1175,"children":1176},{},[1177],{"type":37,"value":1178},"Request Latency (p50, p95, p99)",{"type":37,"value":1180}," — Normal 40-80ms, über 120ms = Problem",{"type":32,"tag":1154,"props":1182,"children":1183},{},[1184,1189,1191,1197],{"type":32,"tag":526,"props":1185,"children":1186},{},[1187],{"type":37,"value":1188},"Container Instance Count",{"type":37,"value":1190}," — sollte bei ",{"type":32,"tag":57,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":37,"value":1196},"min=1",{"type":37,"value":1198}," immer 1 sein, spikes triggern Auto-Scale",{"type":32,"tag":1154,"props":1200,"children":1201},{},[1202,1207],{"type":32,"tag":526,"props":1203,"children":1204},{},[1205],{"type":37,"value":1206},"Error Rate (5xx)",{"type":37,"value":1208}," — Über 0,1% kontinuierlich = Downstream Tag-Fehler",{"type":32,"tag":33,"props":1210,"children":1211},{},[1212,1214,1220],{"type":37,"value":1213},"sGTM's eigene Console hat \"Logs\"-Tab für Event-Level Debug, aber Production Logging auf jeden Event kostet I\u002FO-Performance. Unser Setup: Debug-Logging nur aktiviert bei ",{"type":32,"tag":57,"props":1215,"children":1217},{"className":1216},[],[1218],{"type":37,"value":1219},"?gtm_debug=1",{"type":37,"value":1221}," Query-Parameter, Production-Traffic ohne Logging. Kritische Fehler (HTTP 4xx\u002F5xx von Tags) gehen als JSON Structured Logs zu Google Cloud Logging, triggern Alerts — wenn Meta CAPI in 3 Minuten 10+ \"Invalid access token\"-Fehler sendet, Slack-Benachrichtigung.",{"type":32,"tag":33,"props":1223,"children":1224},{},[1225,1227,1233],{"type":37,"value":1226},"Für Event Throughput Monitoring erstellen wir Custom Metrics: sGTM-Tags rufen ",{"type":32,"tag":57,"props":1228,"children":1230},{"className":1229},[],[1231],{"type":37,"value":1232},"sendHttpGet('https:\u002F\u002Fmetrics.roibase.com.tr\u002Fincrement?metric=capi_event')",{"type":37,"value":1234}," auf, Metric Service hält Prometheus-Format Counter. So sehen wir in Grafana Real-Time Event Flow — wenn Client-Side GA4 1000 Events\u002FMinute sendet, aber Server-Side CAPI nur 850 empfängt, gibt es Deduplizierungs-ID Kollision oder Network Drop.",{"type":32,"tag":33,"props":1236,"children":1237},{},[1238,1240,1246,1248,1254],{"type":37,"value":1239},"Downstream Platform Validation ist kritischste Metrik. Meta Events Manager zeigt Event Match Quality (EMQ) Score — unter 6,5\u002F10 = \"niedrige Qualität\", falsche Hash-Algorithmen oder fehlende PII-Fields. Google Ads Conversion Status muss \"Eligible\" sein — \"Rarely used\" oder \"Below threshold\" bedeutet unzureichendes Conversion-Volumen (Minimum 15 Conversions\u002F30 Tage). In GA4 DebugView filtriere nach ",{"type":32,"tag":57,"props":1241,"children":1243},{"className":1242},[],[1244],{"type":37,"value":1245},"traffic_type=server_side",{"type":37,"value":1247},", vergleiche ",{"type":32,"tag":57,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":37,"value":1253},"event_count",{"type":37,"value":1255}," gegen Client-Side — über 20% Differenz = Investigation nötig.",{"type":32,"tag":40,"props":1257,"children":1259},{"id":1258},"identity-resolution-und-user-matching-signale",[1260],{"type":37,"value":1261},"Identity Resolution und User Matching Signale",{"type":32,"tag":33,"props":1263,"children":1264},{},[1265,1267,1273,1275,1281,1283,1289,1291,1297,1299,1305,1307,1313,1315,1321,1323,1329,1330,1336,1338,1343,1345,1351,1353,1359,1360,1366],{"type":37,"value":1266},"Server-Side Messung Stärke liegt darin, PII (Personally Identifiable Information) Signale kontrolliert an Plattformen zu senden. Meta CAPI akzeptiert 7 User Matching Parameter: ",{"type":32,"tag":57,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":37,"value":1272},"em",{"type":37,"value":1274}," (E-Mail Hash), ",{"type":32,"tag":57,"props":1276,"children":1278},{"className":1277},[],[1279],{"type":37,"value":1280},"ph",{"type":37,"value":1282}," (Telefon Hash), ",{"type":32,"tag":57,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":37,"value":1288},"fn",{"type":37,"value":1290}," (Vorname), ",{"type":32,"tag":57,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":37,"value":1296},"ln",{"type":37,"value":1298}," (Nachname), ",{"type":32,"tag":57,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":37,"value":1304},"ct",{"type":37,"value":1306}," (Stadt), ",{"type":32,"tag":57,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":37,"value":1312},"st",{"type":37,"value":1314}," (Bundesland), ",{"type":32,"tag":57,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":37,"value":1320},"zp",{"type":37,"value":1322}," (Postleitzahl), ",{"type":32,"tag":57,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":37,"value":1328},"country",{"type":37,"value":85},{"type":32,"tag":57,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":37,"value":1335},"external_id",{"type":37,"value":1337}," (CRM ID). Je mehr Signale, desto höher EMQ — nur ",{"type":32,"tag":57,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":37,"value":1272},{"type":37,"value":1344}," = 4,2\u002F10, ",{"type":32,"tag":57,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":37,"value":1350},"em + ph + fn + ln",{"type":37,"value":1352}," = 7,8\u002F10. Google Enhanced Conversions funktioniert ähnlich: ",{"type":32,"tag":57,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":37,"value":1358},"sha256_email_address",{"type":37,"value":280},{"type":32,"tag":57,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":37,"value":1365},"sha256_phone_number",{"type":37,"value":1367}," zum Ads Conversion Tag hinzufügen steigert Attribution-Accuracy um 40% (Googles 2025 Beta-Daten).",{"type":32,"tag":33,"props":1369,"children":1370},{},[1371,1373,1379,1381,1387],{"type":37,"value":1372},"Roibase's Production Identity Resolution Pipeline: (1) User gibt E-Mail\u002FTelefon im Web-Formular, (2) Client-Side JS hasht SHA-256 (Plain Text nie im Browser), (3) Hashed Wert in DataLayer gepusht, (4) sGTM liest Hash und sendet zu Meta CAPI als ",{"type":32,"tag":57,"props":1374,"children":1376},{"className":1375},[],[1377],{"type":37,"value":1378},"user_data.em",{"type":37,"value":1380},", zu Google als ",{"type":32,"tag":57,"props":1382,"children":1384},{"className":1383},[],[1385],{"type":37,"value":1386},"user_data.sha256_email_address",{"type":37,"value":1388},". Dieser Flow ist DSGVO\u002FKVKK-konform — Plain PII landet nie in Server-Logs, SHA-256 ist One-Way, nicht rückgängig zu machen.",{"type":32,"tag":33,"props":1390,"children":1391},{},[1392,1394,1400,1402,1408,1410,1415,1417,1422,1424,1430,1432,1437],{"type":37,"value":1393},"Zusätzliche Signale: ",{"type":32,"tag":57,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":37,"value":1399},"fbp",{"type":37,"value":1401}," (Facebook Browser ID) und ",{"type":32,"tag":57,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":37,"value":1407},"fbc",{"type":37,"value":1409}," (Facebook Click ID) Cookies vom Server-Side lesen, zu CAPI senden. ",{"type":32,"tag":57,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":37,"value":1399},{"type":37,"value":1416}," wird Client-Side vom Pixel gesetzt, aber ITP expiriert nach 7 Tagen; wir lesen vom Server und schreiben neu mit 90 Tage TTL (First-Party Domain bypassed ITP). ",{"type":32,"tag":57,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":37,"value":1407},{"type":37,"value":1423}," Cookies tragen Facebook-Ad ",{"type":32,"tag":57,"props":1425,"children":1427},{"className":1426},[],[1428],{"type":37,"value":1429},"fbclid",{"type":37,"value":1431}," Query Parameter — Server-Side parst diese ID und setzt in CAPI ",{"type":32,"tag":57,"props":1433,"children":1435},{"className":1434},[],[1436],{"type":37,"value":1407},{"type":37,"value":1438},"-Feld, womit Meta Attribution-Fenster von 24 auf 28 Tage erweitert.",{"type":32,"tag":33,"props":1440,"children":1441},{},[1442,1444,1449,1451,1456,1458,1464,1466,1471,1473,1478,1480,1485,1487,1492,1494,1499,1501,1507],{"type":37,"value":1443},"Googles ",{"type":32,"tag":57,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":37,"value":503},{"type":37,"value":1450}," (Google Click ID) Mechanismus funktioniert ähnlich. Client-Side GTM liest ",{"type":32,"tag":57,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":37,"value":503},{"type":37,"value":1457}," von URL und schreibt zu ",{"type":32,"tag":57,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":37,"value":1463},"_gcl_aw",{"type":37,"value":1465}," Cookie (90 Tage), Server-Side liest Cookie und setzt ",{"type":32,"tag":57,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":37,"value":503},{"type":37,"value":1472},"-Parameter in Ads Conversion Tag. Googles Server-Side Conversion Tracking API nutzt ",{"type":32,"tag":57,"props":1474,"children":1476},{"className":1475},[],[1477],{"type":37,"value":495},{"type":37,"value":1479}," als Unique Key — zwei Conversions mit derselben ",{"type":32,"tag":57,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":37,"value":503},{"type":37,"value":1486}," dedupliziert die Plattform. Unser Setup: Wenn ",{"type":32,"tag":57,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":37,"value":503},{"type":37,"value":1493}," Cookie fehlt (Direct Traffic), fallback auf User's ",{"type":32,"tag":57,"props":1495,"children":1497},{"className":1496},[],[1498],{"type":37,"value":240},{"type":37,"value":1500}," Client ID zu ",{"type":32,"tag":57,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":37,"value":1506},"gbraid",{"type":37,"value":1508},"-Parameter — das bindet Google Analytics Attribution an Ads.",{"type":32,"tag":40,"props":1510,"children":1512},{"id":1511},"compliance-und-consent-orchestration",[1513],{"type":37,"value":1514},"Compliance und Consent Orchestration",{"type":32,"tag":33,"props":1516,"children":1517},{},[1518,1520,1526,1528,1534],{"type":37,"value":1519},"Server-Side Tagging ohne Consent Mode v2 Integration ist DSGVO-Risiko. Googles Regel: Bei ",{"type":32,"tag":57,"props":1521,"children":1523},{"className":1522},[],[1524],{"type":37,"value":1525},"ad_storage=denied",{"type":37,"value":1527}," Consent State sollte sGTM Google Ads Conversion Tag nicht triggern oder nur anonymisierte Signale senden (IP Masking + User ID Drop). Metas Limited Data Use (LDU) System funktioniert ähnlich: Für kalifornischen Traffic mit ",{"type":32,"tag":57,"props":1529,"children":1531},{"className":1530},[],[1532],{"type":37,"value":1533},"data_processing_options=['LDU']",{"type":37,"value":1535}," im CAPI Request verwendet Meta Daten nicht für personalisierte Werbung.",{"type":32,"tag":33,"props":1537,"children":1538},{},[1539,1541,1547,1548,1554,1555,1561,1562,1568,1570,1576,1578,1583,1585,1591,1593,1599],{"type":37,"value":1540},"Unser Consent Orchestration Stack: (1) OneTrust\u002FCookiebot Banner holt Consent vom User, (2) Consent State (",{"type":32,"tag":57,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":37,"value":1546},"ad_storage",{"type":37,"value":85},{"type":32,"tag":57,"props":1549,"children":1551},{"className":1550},[],[1552],{"type":37,"value":1553},"analytics_storage",{"type":37,"value":85},{"type":32,"tag":57,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":37,"value":1560},"ad_user_data",{"type":37,"value":85},{"type":32,"tag":57,"props":1563,"children":1565},{"className":1564},[],[1566],{"type":37,"value":1567},"ad_personalization",{"type":37,"value":1569},") in DataLayer gepusht, (3) Client-Side GTM schreibt Consent in Cookie (",{"type":32,"tag":57,"props":1571,"children":1573},{"className":1572},[],[1574],{"type":37,"value":1575},"_consent_state",{"type":37,"value":1577},"), (4) User's ",{"type":32,"tag":57,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":37,"value":560},{"type":37,"value":1584}," POST trägt Cookie im Header, (5) Server-Side GTM parst Cookie mit Custom Variable, (6) Meta\u002FGoogle Tags mit bedingtem Trigger: ",{"type":32,"tag":57,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":37,"value":1590},"{{Consent - Ad Storage}} equals \"granted\"",{"type":37,"value":1592}," feuert Tag, ",{"type":32,"tag":57,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":37,"value":1598},"denied",{"type":37,"value":1600}," skipped Tag.",{"type":32,"tag":33,"props":1602,"children":1603},{},[1604,1606,1612],{"type":37,"value":1605},"Für Consent Conversion Modeling (CCM): Google Ads Tag mit ",{"type":32,"tag":57,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":37,"value":1611},"consent_ad_user_data=true",{"type":37,"value":1613}," erlaubt anonym",{"type":32,"tag":1615,"props":1616,"children":1617},"style",{},[1618],{"type":37,"value":1619},"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":334,"depth":334,"links":1621},[1622,1623,1624,1625,1626,1627],{"id":42,"depth":313,"text":45},{"id":112,"depth":313,"text":115},{"id":516,"depth":313,"text":519},{"id":1135,"depth":313,"text":1138},{"id":1258,"depth":313,"text":1261},{"id":1511,"depth":313,"text":1514},"markdown","content:de:data:server-side-gtm-conversion-api-produktion.md","content","de\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion.md","de\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion","md",1778306635958]