[{"data":1,"prerenderedAt":1564},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-produccion":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":8,"_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":1558,"_id":1559,"_source":1560,"_file":1561,"_stem":1562,"_extension":1563},"data",false,"","Server-Side GTM y Conversion API: De Cero a Producción","Configuración de tagging server-side en Cloud Run y Workers, plantillas de contenedor, deduplicación de eventos y estrategias de monitoreo en producción.","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":1550},"root",[31,39,46,51,56,102,108,129,134,245,281,454,519,525,575,580,1031,1074,1109,1130,1136,1141,1146,1198,1219,1232,1253,1259,1365,1386,1436,1512,1518,1539,1544],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","La medición basada en navegador está muerta. Las cookies de terceros desaparecieron, ITP cayó a 12 horas, Consent Mode v2 es obligatorio. Las marcas que no envían eventos directamente a los endpoints de API de Meta y Google están en la oscuridad de atribución. La configuración de Server-Side Google Tag Manager (sGTM) y Conversion API no es opcional en 2026 — es un requisito de producción. En este artículo mostraremos cómo desplegar un contenedor sGTM production-ready desde cero en Cloud Run, cómo configurar deduplicación de eventos y qué métricas monitorear.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"por-qué-el-tagging-server-side-requiere-un-contenedor",[44],{"type":37,"value":45},"Por Qué el Tagging Server-Side Requiere un Contenedor",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"La librería JavaScript clásica de GTM en el navegador carga etiquetas y recopila datos del user agent. El sGTM funciona al revés: un contenedor Node.js ejecutándose en tu servidor recibe POST HTTP desde el cliente, enriquece eventos (IP, análisis de user-agent, ID de first-party desde cookies) y los transmite a APIs de destino (Meta CAPI, Google Ads Conversion, GA4 Measurement Protocol). Esta arquitectura proporciona 3 beneficios clave: (1) eludes restricciones del navegador — no hay ITP, adblockers ni CORS; (2) puedes hashear PII de forma controlada — email, teléfono se hash SHA-256 en el servidor, nunca regresan al navegador; (3) envías un evento a múltiples plataformas en paralelo — un POST del cliente, fan-out a 4 endpoints diferentes desde el servidor.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"La ruta oficial de Google para desplegar es App Engine o Cloud Run. App Engine trae costo fijo + auto-scaling, pero no se puede personalizar. Se prefiere Cloud Run porque con minimum instance=1 puedes garantizar latencia 24\u002F7 y personalizar la imagen del contenedor con un Dockerfile custom (por ejemplo, inyectar secrets desde variables de entorno, scripts de inicio). La alternativa es Cloudflare Workers — menor latencia de cold-start (~5ms vs 200ms) pero las limitaciones del sandbox de Node.js impiden que funcionen algunas etiquetas de GTM (especialmente custom templates que requieren módulos nativos).",{"type":32,"tag":33,"props":57,"children":58},{},[59,61,68,70,76,78,84,86,92,94,100],{"type":37,"value":60},"El proceso de despliegue consta de estos pasos: (1) nuevo proyecto en Google Cloud Console, (2) extraer la imagen del contenedor sGTM con ",{"type":32,"tag":62,"props":63,"children":65},"code",{"className":64},[],[66],{"type":37,"value":67},"gcloud",{"type":37,"value":69}," CLI, (3) crear servicio Cloud Run + establecer variables de entorno (",{"type":32,"tag":62,"props":71,"children":73},{"className":72},[],[74],{"type":37,"value":75},"CONTAINER_CONFIG",{"type":37,"value":77},", ",{"type":32,"tag":62,"props":79,"children":81},{"className":80},[],[82],{"type":37,"value":83},"PREVIEW_SERVER_URL",{"type":37,"value":85},"), (4) vincular dominio personalizado (ej. ",{"type":32,"tag":62,"props":87,"children":89},{"className":88},[],[90],{"type":37,"value":91},"gtm.roibase.com.tr",{"type":37,"value":93},") — obligatorio para contexto first-party, (5) añadir la URL del servidor de tagging al GTM web (",{"type":32,"tag":62,"props":95,"children":97},{"className":96},[],[98],{"type":37,"value":99},"serverContainerUrl",{"type":37,"value":101}," parameter). El primer despliegue toma 15 minutos, después se reduce a 2 minutos con CI\u002FCD.",{"type":32,"tag":40,"props":103,"children":105},{"id":104},"deduplicación-de-eventos-vincular-señal-de-cliente-servidor-con-un-id-único",[106],{"type":37,"value":107},"Deduplicación de Eventos: Vincular Señal de Cliente + Servidor con un ID Único",{"type":32,"tag":33,"props":109,"children":110},{},[111,113,119,121,127],{"type":37,"value":112},"El problema crítico del sGTM es la deduplicación. Si la misma conversión se envía tanto desde el navegador (etiqueta GA4 client-side) como desde el servidor (cliente GA4 server-side), la plataforma cuenta 2 conversiones. Para Meta CAPI y Google Ads Conversion es obligatorio un sistema de event deduplication ID. Cómo funciona: asignas un ",{"type":32,"tag":62,"props":114,"children":116},{"className":115},[],[117],{"type":37,"value":118},"event_id",{"type":37,"value":120}," único a cada evento (o en terminología de Meta ",{"type":32,"tag":62,"props":122,"children":124},{"className":123},[],[125],{"type":37,"value":126},"event_name + event_id",{"type":37,"value":128},"), tanto cliente como servidor envían el mismo ID, la plataforma en una ventana de 24 horas deduplica si hay colisión de ID.",{"type":32,"tag":33,"props":130,"children":131},{},[132],{"type":37,"value":133},"Estrategias de Deduplication ID:",{"type":32,"tag":135,"props":136,"children":137},"table",{},[138,162],{"type":32,"tag":139,"props":140,"children":141},"thead",{},[142],{"type":32,"tag":143,"props":144,"children":145},"tr",{},[146,152,157],{"type":32,"tag":147,"props":148,"children":149},"th",{},[150],{"type":37,"value":151},"Método",{"type":32,"tag":147,"props":153,"children":154},{},[155],{"type":37,"value":156},"Ventaja",{"type":32,"tag":147,"props":158,"children":159},{},[160],{"type":37,"value":161},"Riesgo",{"type":32,"tag":163,"props":164,"children":165},"tbody",{},[166,185,203,221],{"type":32,"tag":143,"props":167,"children":168},{},[169,175,180],{"type":32,"tag":170,"props":171,"children":172},"td",{},[173],{"type":37,"value":174},"UUID v4 (aleatorio)",{"type":32,"tag":170,"props":176,"children":177},{},[178],{"type":37,"value":179},"Riesgo de colisión nulo",{"type":32,"tag":170,"props":181,"children":182},{},[183],{"type":37,"value":184},"Requiere sincronización cliente-servidor (localStorage\u002Fcookie)",{"type":32,"tag":143,"props":186,"children":187},{},[188,193,198],{"type":32,"tag":170,"props":189,"children":190},{},[191],{"type":37,"value":192},"ID de transacción (e-commerce)",{"type":32,"tag":170,"props":194,"children":195},{},[196],{"type":37,"value":197},"Único naturalmente",{"type":32,"tag":170,"props":199,"children":200},{},[201],{"type":37,"value":202},"No existe para eventos no-transaccioneles (lead, signup)",{"type":32,"tag":143,"props":204,"children":205},{},[206,211,216],{"type":32,"tag":170,"props":207,"children":208},{},[209],{"type":37,"value":210},"Session ID + timestamp",{"type":32,"tag":170,"props":212,"children":213},{},[214],{"type":37,"value":215},"Fácil de generar",{"type":32,"tag":170,"props":217,"children":218},{},[219],{"type":37,"value":220},"Puede colisionar en superposición de sesiones",{"type":32,"tag":143,"props":222,"children":223},{},[224,235,240],{"type":32,"tag":170,"props":225,"children":226},{},[227,233],{"type":32,"tag":62,"props":228,"children":230},{"className":229},[],[231],{"type":37,"value":232},"_ga",{"type":37,"value":234}," client ID + event timestamp",{"type":32,"tag":170,"props":236,"children":237},{},[238],{"type":37,"value":239},"Basado en ID first-party",{"type":32,"tag":170,"props":241,"children":242},{},[243],{"type":37,"value":244},"Riesgo de skew de reloj (diferencia horaria cliente\u002Fservidor)",{"type":32,"tag":33,"props":246,"children":247},{},[248,250,256,258,263,265,271,273,279],{"type":37,"value":249},"Setup de Roibase en producción: ",{"type":32,"tag":62,"props":251,"children":253},{"className":252},[],[254],{"type":37,"value":255},"SHA-256(_ga + event_name + unix_ms)",{"type":37,"value":257}," — cuando haces push al DataLayer en el navegador, rellenas el field ",{"type":32,"tag":62,"props":259,"children":261},{"className":260},[],[262],{"type":37,"value":118},{"type":37,"value":264}," con este hash, la etiqueta GA4 server-side lee el mismo field y lo envía a Measurement Protocol. Para Meta CAPI inyectamos parámetros adicionales ",{"type":32,"tag":62,"props":266,"children":268},{"className":267},[],[269],{"type":37,"value":270},"event_source_url",{"type":37,"value":272}," y ",{"type":32,"tag":62,"props":274,"children":276},{"className":275},[],[277],{"type":37,"value":278},"action_source=website",{"type":37,"value":280}," en el servidor porque el Pixel de Facebook client-side no envía estos fields pero son obligatorios para validación server-side.",{"type":32,"tag":282,"props":283,"children":287},"pre",{"className":284,"code":285,"language":286,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Ejemplo de push al 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",[288],{"type":32,"tag":62,"props":289,"children":290},{"__ignoreMap":16},[291,303,324,344,394,412,431,445],{"type":32,"tag":292,"props":293,"children":296},"span",{"class":294,"line":295},"line",1,[297],{"type":32,"tag":292,"props":298,"children":300},{"style":299},"--shiki-default:#6A737D",[301],{"type":37,"value":302},"\u002F\u002F Ejemplo de push al DataLayer (client-side)\n",{"type":32,"tag":292,"props":304,"children":306},{"class":294,"line":305},2,[307,313,319],{"type":32,"tag":292,"props":308,"children":310},{"style":309},"--shiki-default:#E1E4E8",[311],{"type":37,"value":312},"window.dataLayer.",{"type":32,"tag":292,"props":314,"children":316},{"style":315},"--shiki-default:#B392F0",[317],{"type":37,"value":318},"push",{"type":32,"tag":292,"props":320,"children":321},{"style":309},[322],{"type":37,"value":323},"({\n",{"type":32,"tag":292,"props":325,"children":327},{"class":294,"line":326},3,[328,333,339],{"type":32,"tag":292,"props":329,"children":330},{"style":309},[331],{"type":37,"value":332},"  event: ",{"type":32,"tag":292,"props":334,"children":336},{"style":335},"--shiki-default:#9ECBFF",[337],{"type":37,"value":338},"'purchase'",{"type":32,"tag":292,"props":340,"children":341},{"style":309},[342],{"type":37,"value":343},",\n",{"type":32,"tag":292,"props":345,"children":347},{"class":294,"line":346},4,[348,353,358,363,369,374,379,384,389],{"type":32,"tag":292,"props":349,"children":350},{"style":309},[351],{"type":37,"value":352},"  event_id: ",{"type":32,"tag":292,"props":354,"children":355},{"style":315},[356],{"type":37,"value":357},"sha256",{"type":32,"tag":292,"props":359,"children":360},{"style":309},[361],{"type":37,"value":362},"(_ga ",{"type":32,"tag":292,"props":364,"children":366},{"style":365},"--shiki-default:#F97583",[367],{"type":37,"value":368},"+",{"type":32,"tag":292,"props":370,"children":371},{"style":335},[372],{"type":37,"value":373}," 'purchase'",{"type":32,"tag":292,"props":375,"children":376},{"style":365},[377],{"type":37,"value":378}," +",{"type":32,"tag":292,"props":380,"children":381},{"style":309},[382],{"type":37,"value":383}," Date.",{"type":32,"tag":292,"props":385,"children":386},{"style":315},[387],{"type":37,"value":388},"now",{"type":32,"tag":292,"props":390,"children":391},{"style":309},[392],{"type":37,"value":393},"()),\n",{"type":32,"tag":292,"props":395,"children":397},{"class":294,"line":396},5,[398,403,408],{"type":32,"tag":292,"props":399,"children":400},{"style":309},[401],{"type":37,"value":402},"  transaction_id: ",{"type":32,"tag":292,"props":404,"children":405},{"style":335},[406],{"type":37,"value":407},"'ORD-12345'",{"type":32,"tag":292,"props":409,"children":410},{"style":309},[411],{"type":37,"value":343},{"type":32,"tag":292,"props":413,"children":415},{"class":294,"line":414},6,[416,421,427],{"type":32,"tag":292,"props":417,"children":418},{"style":309},[419],{"type":37,"value":420},"  value: ",{"type":32,"tag":292,"props":422,"children":424},{"style":423},"--shiki-default:#79B8FF",[425],{"type":37,"value":426},"299.00",{"type":32,"tag":292,"props":428,"children":429},{"style":309},[430],{"type":37,"value":343},{"type":32,"tag":292,"props":432,"children":434},{"class":294,"line":433},7,[435,440],{"type":32,"tag":292,"props":436,"children":437},{"style":309},[438],{"type":37,"value":439},"  currency: ",{"type":32,"tag":292,"props":441,"children":442},{"style":335},[443],{"type":37,"value":444},"'TRY'\n",{"type":32,"tag":292,"props":446,"children":448},{"class":294,"line":447},8,[449],{"type":32,"tag":292,"props":450,"children":451},{"style":309},[452],{"type":37,"value":453},"});\n",{"type":32,"tag":33,"props":455,"children":456},{},[457,459,465,467,473,475,480,482,488,490,496,498,503,505,510,511,517],{"type":37,"value":458},"En el contenedor server-side creamos variables personalizadas mapeando el ",{"type":32,"tag":62,"props":460,"children":462},{"className":461},[],[463],{"type":37,"value":464},"{{Event ID}}",{"type":37,"value":466}," a ambas etiquetas GA4 y CAPI. GA4 Measurement Protocol soporta el parámetro ",{"type":32,"tag":62,"props":468,"children":470},{"className":469},[],[471],{"type":37,"value":472},"&ep.event_id=",{"type":37,"value":474},", Meta CAPI tiene un field ",{"type":32,"tag":62,"props":476,"children":478},{"className":477},[],[479],{"type":37,"value":118},{"type":37,"value":481}," a nivel raíz. Para Google Ads Conversion la combinación ",{"type":32,"tag":62,"props":483,"children":485},{"className":484},[],[486],{"type":37,"value":487},"gclid",{"type":37,"value":489}," + ",{"type":32,"tag":62,"props":491,"children":493},{"className":492},[],[494],{"type":37,"value":495},"conversion_action_id",{"type":37,"value":497}," proporciona deduplicación — el ",{"type":32,"tag":62,"props":499,"children":501},{"className":500},[],[502],{"type":37,"value":487},{"type":37,"value":504}," se lee desde la cookie y se envía al servidor mediante POST, la etiqueta de Ads en el servidor combina ",{"type":32,"tag":62,"props":506,"children":508},{"className":507},[],[509],{"type":37,"value":487},{"type":37,"value":489},{"type":32,"tag":62,"props":512,"children":514},{"className":513},[],[515],{"type":37,"value":516},"conversion_value",{"type":37,"value":518}," y los envía a la Conversion Tracking API.",{"type":32,"tag":40,"props":520,"children":522},{"id":521},"plantilla-de-contenedor-y-configuración-de-cliente-personalizado",[523],{"type":37,"value":524},"Plantilla de Contenedor y Configuración de Cliente Personalizado",{"type":32,"tag":33,"props":526,"children":527},{},[528,530,536,538,543,545,550,552,558,560,566,567,573],{"type":37,"value":529},"El contenedor sGTM está formado por 3 componentes fundamentales: ",{"type":32,"tag":531,"props":532,"children":533},"strong",{},[534],{"type":37,"value":535},"Cliente",{"type":37,"value":537}," (parsea solicitud HTTP entrante, la transforma en objeto evento), ",{"type":32,"tag":531,"props":539,"children":540},{},[541],{"type":37,"value":542},"Etiqueta",{"type":37,"value":544}," (envía evento a API externa), ",{"type":32,"tag":531,"props":546,"children":547},{},[548],{"type":37,"value":549},"Variable",{"type":37,"value":551}," (compartición de datos entre etiquetas). El cliente \"GA4\" por defecto de Google no es suficiente porque solo escucha el endpoint ",{"type":32,"tag":62,"props":553,"children":555},{"className":554},[],[556],{"type":37,"value":557},"\u002Fg\u002Fcollect",{"type":37,"value":559},". Escribimos un cliente personalizado para manejar tanto GA4 como endpoints personalizados (",{"type":32,"tag":62,"props":561,"children":563},{"className":562},[],[564],{"type":37,"value":565},"\u002Fevent",{"type":37,"value":77},{"type":32,"tag":62,"props":568,"children":570},{"className":569},[],[571],{"type":37,"value":572},"\u002Fpurchase",{"type":37,"value":574},") en el mismo contenedor.",{"type":32,"tag":33,"props":576,"children":577},{},[578],{"type":37,"value":579},"Ejemplo de plantilla de cliente personalizado:",{"type":32,"tag":282,"props":581,"children":583},{"className":284,"code":582,"language":286,"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 Normaliza el objeto evento\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",[584],{"type":32,"tag":62,"props":585,"children":586},{"__ignoreMap":16},[587,625,658,691,724,733,746,753,777,812,820,829,851,874,883,892,901,910,919,928,947,956,964,987,1010,1023],{"type":32,"tag":292,"props":588,"children":589},{"class":294,"line":295},[590,595,600,605,610,615,620],{"type":32,"tag":292,"props":591,"children":592},{"style":365},[593],{"type":37,"value":594},"const",{"type":32,"tag":292,"props":596,"children":597},{"style":423},[598],{"type":37,"value":599}," claimRequest",{"type":32,"tag":292,"props":601,"children":602},{"style":365},[603],{"type":37,"value":604}," =",{"type":32,"tag":292,"props":606,"children":607},{"style":315},[608],{"type":37,"value":609}," require",{"type":32,"tag":292,"props":611,"children":612},{"style":309},[613],{"type":37,"value":614},"(",{"type":32,"tag":292,"props":616,"children":617},{"style":335},[618],{"type":37,"value":619},"'claimRequest'",{"type":32,"tag":292,"props":621,"children":622},{"style":309},[623],{"type":37,"value":624},");\n",{"type":32,"tag":292,"props":626,"children":627},{"class":294,"line":305},[628,632,637,641,645,649,654],{"type":32,"tag":292,"props":629,"children":630},{"style":365},[631],{"type":37,"value":594},{"type":32,"tag":292,"props":633,"children":634},{"style":423},[635],{"type":37,"value":636}," getRequestBody",{"type":32,"tag":292,"props":638,"children":639},{"style":365},[640],{"type":37,"value":604},{"type":32,"tag":292,"props":642,"children":643},{"style":315},[644],{"type":37,"value":609},{"type":32,"tag":292,"props":646,"children":647},{"style":309},[648],{"type":37,"value":614},{"type":32,"tag":292,"props":650,"children":651},{"style":335},[652],{"type":37,"value":653},"'getRequestBody'",{"type":32,"tag":292,"props":655,"children":656},{"style":309},[657],{"type":37,"value":624},{"type":32,"tag":292,"props":659,"children":660},{"class":294,"line":326},[661,665,670,674,678,682,687],{"type":32,"tag":292,"props":662,"children":663},{"style":365},[664],{"type":37,"value":594},{"type":32,"tag":292,"props":666,"children":667},{"style":423},[668],{"type":37,"value":669}," JSON",{"type":32,"tag":292,"props":671,"children":672},{"style":365},[673],{"type":37,"value":604},{"type":32,"tag":292,"props":675,"children":676},{"style":315},[677],{"type":37,"value":609},{"type":32,"tag":292,"props":679,"children":680},{"style":309},[681],{"type":37,"value":614},{"type":32,"tag":292,"props":683,"children":684},{"style":335},[685],{"type":37,"value":686},"'JSON'",{"type":32,"tag":292,"props":688,"children":689},{"style":309},[690],{"type":37,"value":624},{"type":32,"tag":292,"props":692,"children":693},{"class":294,"line":346},[694,698,703,707,711,715,720],{"type":32,"tag":292,"props":695,"children":696},{"style":365},[697],{"type":37,"value":594},{"type":32,"tag":292,"props":699,"children":700},{"style":423},[701],{"type":37,"value":702}," logToConsole",{"type":32,"tag":292,"props":704,"children":705},{"style":365},[706],{"type":37,"value":604},{"type":32,"tag":292,"props":708,"children":709},{"style":315},[710],{"type":37,"value":609},{"type":32,"tag":292,"props":712,"children":713},{"style":309},[714],{"type":37,"value":614},{"type":32,"tag":292,"props":716,"children":717},{"style":335},[718],{"type":37,"value":719},"'logToConsole'",{"type":32,"tag":292,"props":721,"children":722},{"style":309},[723],{"type":37,"value":624},{"type":32,"tag":292,"props":725,"children":726},{"class":294,"line":396},[727],{"type":32,"tag":292,"props":728,"children":730},{"emptyLinePlaceholder":729},true,[731],{"type":37,"value":732},"\n",{"type":32,"tag":292,"props":734,"children":735},{"class":294,"line":414},[736,741],{"type":32,"tag":292,"props":737,"children":738},{"style":315},[739],{"type":37,"value":740},"claimRequest",{"type":32,"tag":292,"props":742,"children":743},{"style":309},[744],{"type":37,"value":745},"();\n",{"type":32,"tag":292,"props":747,"children":748},{"class":294,"line":433},[749],{"type":32,"tag":292,"props":750,"children":751},{"emptyLinePlaceholder":729},[752],{"type":37,"value":732},{"type":32,"tag":292,"props":754,"children":755},{"class":294,"line":447},[756,760,765,769,773],{"type":32,"tag":292,"props":757,"children":758},{"style":365},[759],{"type":37,"value":594},{"type":32,"tag":292,"props":761,"children":762},{"style":423},[763],{"type":37,"value":764}," body",{"type":32,"tag":292,"props":766,"children":767},{"style":365},[768],{"type":37,"value":604},{"type":32,"tag":292,"props":770,"children":771},{"style":315},[772],{"type":37,"value":636},{"type":32,"tag":292,"props":774,"children":775},{"style":309},[776],{"type":37,"value":745},{"type":32,"tag":292,"props":778,"children":779},{"class":294,"line":26},[780,784,789,793,797,802,807],{"type":32,"tag":292,"props":781,"children":782},{"style":365},[783],{"type":37,"value":594},{"type":32,"tag":292,"props":785,"children":786},{"style":423},[787],{"type":37,"value":788}," eventData",{"type":32,"tag":292,"props":790,"children":791},{"style":365},[792],{"type":37,"value":604},{"type":32,"tag":292,"props":794,"children":795},{"style":423},[796],{"type":37,"value":669},{"type":32,"tag":292,"props":798,"children":799},{"style":309},[800],{"type":37,"value":801},".",{"type":32,"tag":292,"props":803,"children":804},{"style":315},[805],{"type":37,"value":806},"parse",{"type":32,"tag":292,"props":808,"children":809},{"style":309},[810],{"type":37,"value":811},"(body);\n",{"type":32,"tag":292,"props":813,"children":815},{"class":294,"line":814},10,[816],{"type":32,"tag":292,"props":817,"children":818},{"emptyLinePlaceholder":729},[819],{"type":37,"value":732},{"type":32,"tag":292,"props":821,"children":823},{"class":294,"line":822},11,[824],{"type":32,"tag":292,"props":825,"children":826},{"style":299},[827],{"type":37,"value":828},"\u002F\u002F Normaliza el objeto evento\n",{"type":32,"tag":292,"props":830,"children":832},{"class":294,"line":831},12,[833,837,842,846],{"type":32,"tag":292,"props":834,"children":835},{"style":365},[836],{"type":37,"value":594},{"type":32,"tag":292,"props":838,"children":839},{"style":423},[840],{"type":37,"value":841}," normalizedEvent",{"type":32,"tag":292,"props":843,"children":844},{"style":365},[845],{"type":37,"value":604},{"type":32,"tag":292,"props":847,"children":848},{"style":309},[849],{"type":37,"value":850}," {\n",{"type":32,"tag":292,"props":852,"children":854},{"class":294,"line":853},13,[855,860,865,870],{"type":32,"tag":292,"props":856,"children":857},{"style":309},[858],{"type":37,"value":859},"  event_name: eventData.event ",{"type":32,"tag":292,"props":861,"children":862},{"style":365},[863],{"type":37,"value":864},"||",{"type":32,"tag":292,"props":866,"children":867},{"style":335},[868],{"type":37,"value":869}," 'unknown'",{"type":32,"tag":292,"props":871,"children":872},{"style":309},[873],{"type":37,"value":343},{"type":32,"tag":292,"props":875,"children":877},{"class":294,"line":876},14,[878],{"type":32,"tag":292,"props":879,"children":880},{"style":309},[881],{"type":37,"value":882},"  user_data: {\n",{"type":32,"tag":292,"props":884,"children":886},{"class":294,"line":885},15,[887],{"type":32,"tag":292,"props":888,"children":889},{"style":309},[890],{"type":37,"value":891},"    client_id: eventData.client_id,\n",{"type":32,"tag":292,"props":893,"children":895},{"class":294,"line":894},16,[896],{"type":32,"tag":292,"props":897,"children":898},{"style":309},[899],{"type":37,"value":900},"    user_agent: eventData.user_agent,\n",{"type":32,"tag":292,"props":902,"children":904},{"class":294,"line":903},17,[905],{"type":32,"tag":292,"props":906,"children":907},{"style":309},[908],{"type":37,"value":909},"    ip_override: eventData.ip_address\n",{"type":32,"tag":292,"props":911,"children":913},{"class":294,"line":912},18,[914],{"type":32,"tag":292,"props":915,"children":916},{"style":309},[917],{"type":37,"value":918},"  },\n",{"type":32,"tag":292,"props":920,"children":922},{"class":294,"line":921},19,[923],{"type":32,"tag":292,"props":924,"children":925},{"style":309},[926],{"type":37,"value":927},"  event_id: eventData.event_id,\n",{"type":32,"tag":292,"props":929,"children":931},{"class":294,"line":930},20,[932,937,942],{"type":32,"tag":292,"props":933,"children":934},{"style":309},[935],{"type":37,"value":936},"  timestamp_micros: eventData.timestamp ",{"type":32,"tag":292,"props":938,"children":939},{"style":365},[940],{"type":37,"value":941},"*",{"type":32,"tag":292,"props":943,"children":944},{"style":423},[945],{"type":37,"value":946}," 1000000\n",{"type":32,"tag":292,"props":948,"children":950},{"class":294,"line":949},21,[951],{"type":32,"tag":292,"props":952,"children":953},{"style":309},[954],{"type":37,"value":955},"};\n",{"type":32,"tag":292,"props":957,"children":959},{"class":294,"line":958},22,[960],{"type":32,"tag":292,"props":961,"children":962},{"emptyLinePlaceholder":729},[963],{"type":37,"value":732},{"type":32,"tag":292,"props":965,"children":967},{"class":294,"line":966},23,[968,973,977,982],{"type":32,"tag":292,"props":969,"children":970},{"style":315},[971],{"type":37,"value":972},"logToConsole",{"type":32,"tag":292,"props":974,"children":975},{"style":309},[976],{"type":37,"value":614},{"type":32,"tag":292,"props":978,"children":979},{"style":335},[980],{"type":37,"value":981},"'Normalized event:'",{"type":32,"tag":292,"props":983,"children":984},{"style":309},[985],{"type":37,"value":986},", normalizedEvent);\n",{"type":32,"tag":292,"props":988,"children":990},{"class":294,"line":989},24,[991,996,1001,1006],{"type":32,"tag":292,"props":992,"children":993},{"style":315},[994],{"type":37,"value":995},"runContainer",{"type":32,"tag":292,"props":997,"children":998},{"style":309},[999],{"type":37,"value":1000},"(normalizedEvent, () ",{"type":32,"tag":292,"props":1002,"children":1003},{"style":365},[1004],{"type":37,"value":1005},"=>",{"type":32,"tag":292,"props":1007,"children":1008},{"style":309},[1009],{"type":37,"value":850},{"type":32,"tag":292,"props":1011,"children":1013},{"class":294,"line":1012},25,[1014,1019],{"type":32,"tag":292,"props":1015,"children":1016},{"style":315},[1017],{"type":37,"value":1018},"  returnResponse",{"type":32,"tag":292,"props":1020,"children":1021},{"style":309},[1022],{"type":37,"value":745},{"type":32,"tag":292,"props":1024,"children":1026},{"class":294,"line":1025},26,[1027],{"type":32,"tag":292,"props":1028,"children":1029},{"style":309},[1030],{"type":37,"value":453},{"type":32,"tag":33,"props":1032,"children":1033},{},[1034,1036,1041,1043,1049,1051,1057,1059,1065,1067,1073],{"type":37,"value":1035},"Este cliente captura POST que llegan a la ruta ",{"type":32,"tag":62,"props":1037,"children":1039},{"className":1038},[],[1040],{"type":37,"value":565},{"type":37,"value":1042},", parsea el body JSON y lo transforma al modelo de evento de sGTM. La llamada a ",{"type":32,"tag":62,"props":1044,"children":1046},{"className":1045},[],[1047],{"type":37,"value":1048},"runContainer()",{"type":37,"value":1050}," dispara la ejecución de las etiquetas — cuando la etiqueta GA4 ve ",{"type":32,"tag":62,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":37,"value":1056},"event_name=purchase",{"type":37,"value":1058}," envía a Measurement Protocol, cuando la etiqueta Meta CAPI ve ",{"type":32,"tag":62,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":37,"value":1064},"user_data.email",{"type":37,"value":1066}," lo hashea SHA-256 y lo envía al endpoint ",{"type":32,"tag":62,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":37,"value":1072},"\u002Fevents",{"type":37,"value":801},{"type":32,"tag":33,"props":1075,"children":1076},{},[1077,1079,1084,1086,1091,1093,1099,1101,1107],{"type":37,"value":1078},"En setup de producción ejecutamos 4 clientes: (1) cliente GA4 por defecto (",{"type":32,"tag":62,"props":1080,"children":1082},{"className":1081},[],[1083],{"type":37,"value":557},{"type":37,"value":1085},"), (2) cliente JSON personalizado (",{"type":32,"tag":62,"props":1087,"children":1089},{"className":1088},[],[1090],{"type":37,"value":565},{"type":37,"value":1092},"), (3) cliente Meta Pixel (",{"type":32,"tag":62,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":37,"value":1098},"\u002Ftr\u002F",{"type":37,"value":1100}," endpoint — para compatibilidad con Facebook SDK), (4) cliente health check (",{"type":32,"tag":62,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":37,"value":1106},"\u002Fhealth",{"type":37,"value":1108},") — Cloud Run usa este endpoint para ping de liveness probe y verificar la salud del contenedor. Cada cliente tiene un orden de prioridad (priority number) — si dos clientes reclaman el mismo path, gana el de mayor prioridad.",{"type":32,"tag":33,"props":1110,"children":1111},{},[1112,1114,1120,1122,1128],{"type":37,"value":1113},"Es crítico mantener las plantillas personalizadas bajo control de versiones. Los cambios realizados en la UI de Google Tag Manager no aparecen en el histórico de git. Nuestro flujo: guarda plantillas como archivos ",{"type":32,"tag":62,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":37,"value":1119},".tpl",{"type":37,"value":1121}," en el repositorio, el pipeline CI usa la herramienta CLI ",{"type":32,"tag":62,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":37,"value":1127},"gtm-template-push",{"type":37,"value":1129}," para desplegar en el workspace de sGTM, prueba en contenedor staging, luego promueve a producción. De esta forma el rollback es un git revert.",{"type":32,"tag":40,"props":1131,"children":1133},{"id":1132},"monitoreo-en-producción-qué-métricas-son-críticas",[1134],{"type":37,"value":1135},"Monitoreo en Producción: Qué Métricas Son Críticas",{"type":32,"tag":33,"props":1137,"children":1138},{},[1139],{"type":37,"value":1140},"Después de desplegar sGTM, necesitas monitoreo en 4 capas para no quedarte a oscuras: (1) salud del contenedor (uptime, latencia, error rate), (2) throughput de eventos (eventos\u002Fseg, success rate de etiquetas), (3) precisión de deduplicación (delta de conteo de eventos cliente vs servidor), (4) validación de plataforma descendente (Meta Event Quality Score, estado de Google Ads conversion tracking).",{"type":32,"tag":33,"props":1142,"children":1143},{},[1144],{"type":37,"value":1145},"Métricas nativas de Cloud Run:",{"type":32,"tag":1147,"props":1148,"children":1149},"ul",{},[1150,1168,1178,1188],{"type":32,"tag":1151,"props":1152,"children":1153},"li",{},[1154,1159,1161,1166],{"type":32,"tag":531,"props":1155,"children":1156},{},[1157],{"type":37,"value":1158},"Request count",{"type":37,"value":1160}," — número de POST al endpoint ",{"type":32,"tag":62,"props":1162,"children":1164},{"className":1163},[],[1165],{"type":37,"value":565},{"type":37,"value":1167},", desglose por minuto",{"type":32,"tag":1151,"props":1169,"children":1170},{},[1171,1176],{"type":32,"tag":531,"props":1172,"children":1173},{},[1174],{"type":37,"value":1175},"Request latency (p50, p95, p99)",{"type":37,"value":1177}," — si la mediana está por encima de 120ms hay un problema (normalmente 40-80ms)",{"type":32,"tag":1151,"props":1179,"children":1180},{},[1181,1186],{"type":32,"tag":531,"props":1182,"children":1183},{},[1184],{"type":37,"value":1185},"Container instance count",{"type":37,"value":1187}," — si estableces min=1 siempre debería ser 1, auto-scale en picos",{"type":32,"tag":1151,"props":1189,"children":1190},{},[1191,1196],{"type":32,"tag":531,"props":1192,"children":1193},{},[1194],{"type":37,"value":1195},"Error rate (5xx)",{"type":37,"value":1197}," — si es >0.1% hay problemas sostenidos en etiquetas descendentes",{"type":32,"tag":33,"props":1199,"children":1200},{},[1201,1203,1209,1211,1217],{"type":37,"value":1202},"En la propia Console de sGTM hay una pestaña \"Logs\" con debug log a nivel de evento, pero en producción ",{"type":32,"tag":62,"props":1204,"children":1206},{"className":1205},[],[1207],{"type":37,"value":1208},"console.log",{"type":37,"value":1210}," en cada evento genera sobrecarga I\u002FO. Nuestro setup: debug logging solo activo con query param ",{"type":32,"tag":62,"props":1212,"children":1214},{"className":1213},[],[1215],{"type":37,"value":1216},"?gtm_debug=1",{"type":37,"value":1218},", desactivado en tráfico de producción. Los errores críticos (HTTP 4xx\u002F5xx desde etiquetas Meta\u002FGoogle) van como JSON structured log a Google Cloud Logging, desde ahí disparan alert policies — si CAPI devuelve 10+ errores \"Invalid access token\" en 3 minutos, genera ping a Slack.",{"type":32,"tag":33,"props":1220,"children":1221},{},[1222,1224,1230],{"type":37,"value":1223},"Para monitoreo de throughput de eventos creamos métrica personalizada: las etiquetas de sGTM hacen llamadas como ",{"type":32,"tag":62,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":37,"value":1229},"sendHttpGet('https:\u002F\u002Fmetrics.roibase.com.tr\u002Fincrement?metric=capi_event')",{"type":37,"value":1231},", el servicio de métricas mantiene counters en formato Prometheus. Así en el dashboard Grafana vemos flujo de eventos en tiempo real — si GA4 client-side envía 1000 eventos\u002Fmin pero server-side CAPI solo recibe 850\u002Fmin, hay colisión de deduplication ID o drop de red.",{"type":32,"tag":33,"props":1233,"children":1234},{},[1235,1237,1243,1245,1251],{"type":37,"value":1236},"La validación de plataforma descendente es la parte más crítica. Meta Events Manager tiene Event Match Quality (EMQ) score — si es \u003C6.5\u002F10 significa \"baja calidad\", indica algoritmo de hash incorrecto o fields de PII faltantes. En Google Ads Conversion Tracking debe decir \"Status: Eligible\" — si dice \"Rarely used\" o \"Below threshold\" el volumen de conversiones no es suficiente (mínimo 15 conversiones\u002F30 días). En GA4 DebugView filtra eventos server-side con ",{"type":32,"tag":62,"props":1238,"children":1240},{"className":1239},[],[1241],{"type":37,"value":1242},"traffic_type=server_side",{"type":37,"value":1244},", compara la métrica ",{"type":32,"tag":62,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":37,"value":1250},"event_count",{"type":37,"value":1252}," con client-side — si hay >20% de diferencia necesita investigación.",{"type":32,"tag":40,"props":1254,"children":1256},{"id":1255},"resolución-de-identidad-y-señales-de-user-matching",[1257],{"type":37,"value":1258},"Resolución de Identidad y Señales de User Matching",{"type":32,"tag":33,"props":1260,"children":1261},{},[1262,1264,1270,1272,1278,1280,1286,1288,1294,1296,1302,1304,1310,1312,1318,1320,1326,1327,1333,1335,1340,1342,1348,1350,1356,1357,1363],{"type":37,"value":1263},"La potencia del ölçüm server-side radica en poder transmitir señales PII (Personally Identifiable Information) de forma controlada a plataformas. Meta CAPI acepta 7 parámetros diferentes de user matching: ",{"type":32,"tag":62,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":37,"value":1269},"em",{"type":37,"value":1271}," (email hash), ",{"type":32,"tag":62,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":37,"value":1277},"ph",{"type":37,"value":1279}," (phone hash), ",{"type":32,"tag":62,"props":1281,"children":1283},{"className":1282},[],[1284],{"type":37,"value":1285},"fn",{"type":37,"value":1287}," (first name), ",{"type":32,"tag":62,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":37,"value":1293},"ln",{"type":37,"value":1295}," (last name), ",{"type":32,"tag":62,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":37,"value":1301},"ct",{"type":37,"value":1303}," (city), ",{"type":32,"tag":62,"props":1305,"children":1307},{"className":1306},[],[1308],{"type":37,"value":1309},"st",{"type":37,"value":1311}," (state), ",{"type":32,"tag":62,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":37,"value":1317},"zp",{"type":37,"value":1319}," (zip), ",{"type":32,"tag":62,"props":1321,"children":1323},{"className":1322},[],[1324],{"type":37,"value":1325},"country",{"type":37,"value":77},{"type":32,"tag":62,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":37,"value":1332},"external_id",{"type":37,"value":1334}," (CRM ID). Cuantas más señales envías, más alto el EMQ score — solo con ",{"type":32,"tag":62,"props":1336,"children":1338},{"className":1337},[],[1339],{"type":37,"value":1269},{"type":37,"value":1341}," obtienes 4.2\u002F10, con ",{"type":32,"tag":62,"props":1343,"children":1345},{"className":1344},[],[1346],{"type":37,"value":1347},"em + ph + fn + ln",{"type":37,"value":1349}," llegas a 7.8\u002F10. Google Enhanced Conversions funciona igual: cuando añades ",{"type":32,"tag":62,"props":1351,"children":1353},{"className":1352},[],[1354],{"type":37,"value":1355},"sha256_email_address",{"type":37,"value":272},{"type":32,"tag":62,"props":1358,"children":1360},{"className":1359},[],[1361],{"type":37,"value":1362},"sha256_phone_number",{"type":37,"value":1364}," a la etiqueta Ads Conversion, la precisión de atribución sube ~40% (datos de beta test de Google 2025).",{"type":32,"tag":33,"props":1366,"children":1367},{},[1368,1370,1376,1378,1384],{"type":37,"value":1369},"El pipeline de resolución de identidad de Roibase en producción: (1) el usuario ingresa email\u002Fteléfono en formulario web, (2) JS client-side hashea SHA-256 (texto plano nunca se guarda en navegador), (3) valor hasheado se pushea al DataLayer, (4) sGTM toma el hash y lo envía a Meta CAPI como field ",{"type":32,"tag":62,"props":1371,"children":1373},{"className":1372},[],[1374],{"type":37,"value":1375},"user_data.em",{"type":37,"value":1377},", a Google como ",{"type":32,"tag":62,"props":1379,"children":1381},{"className":1380},[],[1382],{"type":37,"value":1383},"user_data.sha256_email_address",{"type":37,"value":1385},". Este flujo es KVKK\u002FGDPR compliant porque PII plano nunca toca server logs — SHA-256 es one-way hash, irreversible.",{"type":32,"tag":33,"props":1387,"children":1388},{},[1389,1391,1397,1399,1405,1407,1412,1414,1419,1421,1427,1429,1434],{"type":37,"value":1390},"Señal adicional: leemos cookies ",{"type":32,"tag":62,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":37,"value":1396},"fbp",{"type":37,"value":1398}," (Facebook Browser ID) y ",{"type":32,"tag":62,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":37,"value":1404},"fbc",{"type":37,"value":1406}," (Facebook Click ID) server-side y las enviamos a CAPI. El Pixel de Facebook client-side establece la cookie ",{"type":32,"tag":62,"props":1408,"children":1410},{"className":1409},[],[1411],{"type":37,"value":1396},{"type":37,"value":1413}," pero ITP la expira después de 7 días; nosotros la leemos server-side y la reescribimos con TTL 90 días (como se establece desde dominio first-party, elude ITP). La cookie ",{"type":32,"tag":62,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":37,"value":1404},{"type":37,"value":1420}," lleva el ",{"type":32,"tag":62,"props":1422,"children":1424},{"className":1423},[],[1425],{"type":37,"value":1426},"fbclid",{"type":37,"value":1428}," del query param cuando vienes desde anuncio de Facebook — server-side parseamos este ID y lo agregamos al field ",{"type":32,"tag":62,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":37,"value":1404},{"type":37,"value":1435}," de CAPI, esto extiende la ventana de atribución de Meta de 24 horas a 28 días.",{"type":32,"tag":33,"props":1437,"children":1438},{},[1439,1441,1446,1448,1453,1455,1461,1463,1468,1470,1475,1476,1481,1483,1488,1490,1495,1497,1502,1504,1510],{"type":37,"value":1440},"El mecanismo ",{"type":32,"tag":62,"props":1442,"children":1444},{"className":1443},[],[1445],{"type":37,"value":487},{"type":37,"value":1447}," (Google Click ID) de Google funciona similar. GTM client-side lee ",{"type":32,"tag":62,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":37,"value":487},{"type":37,"value":1454}," de la URL y lo escribe en cookie ",{"type":32,"tag":62,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":37,"value":1460},"_gcl_aw",{"type":37,"value":1462},", con expire 90 días. Server-side leemos esta cookie y la añadimos como parámetro ",{"type":32,"tag":62,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":37,"value":487},{"type":37,"value":1469}," a la etiqueta Ads Conversion. La API de Conversion Tracking server-side de Google usa la combinación ",{"type":32,"tag":62,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":37,"value":487},{"type":37,"value":489},{"type":32,"tag":62,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":37,"value":495},{"type":37,"value":1482}," como clave única — si envías 2 conversiones con el mismo ",{"type":32,"tag":62,"props":1484,"children":1486},{"className":1485},[],[1487],{"type":37,"value":487},{"type":37,"value":1489},", la plataforma deduplica. Nuestro setup: si no hay cookie ",{"type":32,"tag":62,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":37,"value":487},{"type":37,"value":1496}," (tráfico directo) mapeamos el client ID ",{"type":32,"tag":62,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":37,"value":232},{"type":37,"value":1503}," del usuario al parámetro ",{"type":32,"tag":62,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":37,"value":1509},"gbraid",{"type":37,"value":1511}," como fallback — esto vincula atribución de Google Analytics a Ads.",{"type":32,"tag":40,"props":1513,"children":1515},{"id":1514},"compliance-y-orquestación-de-consentimiento",[1516],{"type":37,"value":1517},"Compliance y Orquestación de Consentimiento",{"type":32,"tag":33,"props":1519,"children":1520},{},[1521,1523,1529,1531,1537],{"type":37,"value":1522},"Si el tagging server-side no se integra con Consent Mode v2, hay riesgo de violación GDPR. La regla de Google: cuando ",{"type":32,"tag":62,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":37,"value":1528},"ad_storage=denied",{"type":37,"value":1530},", la etiqueta Google Ads Conversion en sGTM no debería dispararse o solo enviar señal anonimizada (IP masking + drop de user ID). El sistema Limited Data Use (LDU) de Meta es similar: para tráfico de California, agrega el parámetro ",{"type":32,"tag":62,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":37,"value":1536},"data_processing_options=['LDU']",{"type":37,"value":1538}," a la solicitud CAPI para que Meta no use datos para publicidad personalizada.",{"type":32,"tag":33,"props":1540,"children":1541},{},[1542],{"type":37,"value":1543},"Nuestro stack de orquestación de consentimiento",{"type":32,"tag":1545,"props":1546,"children":1547},"style",{},[1548],{"type":37,"value":1549},"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":326,"depth":326,"links":1551},[1552,1553,1554,1555,1556,1557],{"id":42,"depth":305,"text":45},{"id":104,"depth":305,"text":107},{"id":521,"depth":305,"text":524},{"id":1132,"depth":305,"text":1135},{"id":1255,"depth":305,"text":1258},{"id":1514,"depth":305,"text":1517},"markdown","content:es:data:server-side-gtm-conversion-api-produccion.md","content","es\u002Fdata\u002Fserver-side-gtm-conversion-api-produccion.md","es\u002Fdata\u002Fserver-side-gtm-conversion-api-produccion","md",1778306636246]