[{"data":1,"prerenderedAt":956},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fsgtm-conversion-api-produccion":13},{"i18nKey":4,"paths":5},"data-001-2026-07",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fen\u002Fdata\u002Fserver-side-gtm-conversion-api-production-deployment","\u002Fes\u002Fdata\u002Fsgtm-conversion-api-produccion","\u002Ffr\u002Fdata\u002Fserveur-gtm-et-api-conversion-de-zero-a-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fru\u002Fdata\u002Fsgtm-conversion-api-production","\u002Ftr\u002Fdata\u002Fserver-side-gtm-ve-conversion-api-sifirdan-productiona",{"_path":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":950,"_id":951,"_source":952,"_file":953,"_stem":954,"_extension":955},"data",false,"","Server-Side GTM y Conversion API: De Cero a Producción","Guía práctica para desplegar un contenedor sGTM en Cloud Run, integrar Meta CAPI y mejorar la calidad de medición con deduplicación de eventos.","2026-07-31",[21,22,23,24,25],"server-side-gtm","conversion-api","cloud-run","event-deduplication","measurement",8,"Roibase",{"type":29,"children":30,"toc":943},"root",[31,39,46,51,56,89,95,100,119,129,137,258,287,313,330,366,372,377,395,436,555,575,615,620,720,740,750,756,761,794,819,837,855,889,894,900,913,918,932,937],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","El calendario de depreciación de cookies se pospuso por tercera vez en 2024. Pero el punto de quiebre real en la medición de marketing ya sucedió: tras ATT con iOS 14.5, las tasas de conversión de Facebook bajaron 30-40%, la stitching de sesiones en Google Analytics colapsó, y las ventanas de atribución se redujeron de 7 días a 1. La medición server-side ya no es \"el futuro\" — es la única solución de ingeniería para cerrar el gap de atribución. En este artículo desplegamos paso a paso un contenedor Google Tag Manager server-side (sGTM) en Google Cloud Run, lo integramos con Meta Conversion API (CAPI), configuramos deduplicación de eventos y lo llevamos a producción.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"anatomía-de-la-medición-server-side",[44],{"type":37,"value":45},"Anatomía de la Medición Server-Side",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"Los píxeles client-side se ejecutan en el navegador — cuando el usuario carga la página, el código JavaScript recopila el evento y lo envía a la plataforma. En este proceso hay 3 puntos de ruptura: ad blockers (activos en 40% de usuarios), mecanismos de protección del navegador como ITP\u002FETP (Safari con cookies de 7 días), rechazo en consent banner (30-50% de tasa de rechazo GDPR en Europa). El flujo server-side sortea estos obstáculos porque los eventos salen de tu servidor, no del navegador del usuario — la señal de consentimiento está registrada, la cookie first-party leída, la resolución de identidad completada, y los paquetes de datos enriquecidos se envían mediante HTTPS a las APIs de la plataforma.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"sGTM estandariza esta arquitectura. Los tags definidos en Web Container (GA4, Meta Pixel) se disparan en el navegador, pero en lugar de enviar el evento directamente a la plataforma, lo redirigen al endpoint sGTM. El Server Container recibe ese evento, extrae parámetros de datos de usuario (email, teléfono, IP del cliente, user agent), los hashea, y los alimenta al tag Meta CAPI. Para deduplicación, genera un event_id y lo envía en ambos píxel y CAPI — el backend de Meta cuenta el mismo event_id como una única conversión, eliminando conteo doble. Este esquema puede recuperar valores de Facebook ROAS que bajaron 30-40% tras iOS 14.5 hasta niveles de 15-20% (benchmark Meta 2023).",{"type":32,"tag":33,"props":57,"children":58},{},[59,61,68,70,76,78,87],{"type":37,"value":60},"La segunda gran ventaja del server-side: liberas la ventana de atribución del límite del navegador. En Safari, ITP impide usar cookies de 7 días — si el usuario regresa el día 8 y compra, el píxel client-side no mide esa conversión. En server-side, la cookie first-party (por ejemplo ",{"type":32,"tag":62,"props":63,"children":65},"code",{"className":64},[],[66],{"type":37,"value":67},"_fbc",{"type":37,"value":69},", ",{"type":32,"tag":62,"props":71,"children":73},{"className":72},[],[74],{"type":37,"value":75},"_fbp",{"type":37,"value":77},") se almacena en tu propio dominio con vida útil de 1-2 años. Además, puedes hacer resolución de identidad server-side usando tu ID de CRM. Esto se integra con la disciplina de ",{"type":32,"tag":79,"props":80,"children":84},"a",{"href":81,"rel":82},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Ffirstparty",[83],"nofollow",[85],{"type":37,"value":86},"arquitectura de datos first-party",{"type":37,"value":88}," — merges entre client ID, user ID y hash de email en un único perfil.",{"type":32,"tag":40,"props":90,"children":92},{"id":91},"desplegar-sgtm-en-cloud-run",[93],{"type":37,"value":94},"Desplegar sGTM en Cloud Run",{"type":32,"tag":33,"props":96,"children":97},{},[98],{"type":37,"value":99},"Google Cloud Run es el camino más rápido para hostear un contenedor sGTM porque existe una imagen precompilada, autoscaling integrado y baja latencia de cold start (100-200ms). Las alternativas son App Engine o Kubernetes pero desde la perspectiva ROI, Cloud Run es óptimo — para 100K eventos mensuales, el costo ronda $10-15 (compute de Cloud Run + almacenamiento Firestore).",{"type":32,"tag":33,"props":101,"children":102},{},[103,109,111,117],{"type":32,"tag":104,"props":105,"children":106},"strong",{},[107],{"type":37,"value":108},"Paso 1: Activa el proyecto GCP y billing.",{"type":37,"value":110}," Crea un nuevo proyecto en Console, vincula una cuenta de billing. Configura local CLI con ",{"type":32,"tag":62,"props":112,"children":114},{"className":113},[],[115],{"type":37,"value":116},"gcloud init",{"type":37,"value":118},".",{"type":32,"tag":33,"props":120,"children":121},{},[122,127],{"type":32,"tag":104,"props":123,"children":124},{},[125],{"type":37,"value":126},"Paso 2: Crea el contenedor sGTM Server.",{"type":37,"value":128}," En Tag Manager UI, crea un nuevo contenedor de tipo \"Server\". En la esquina superior derecha selecciona \"Manually provision tagging server\" — así usas tu propio endpoint de Cloud Run en lugar de App Engine automático.",{"type":32,"tag":33,"props":130,"children":131},{},[132],{"type":32,"tag":104,"props":133,"children":134},{},[135],{"type":37,"value":136},"Paso 3: Despliega el servicio en Cloud Run.",{"type":32,"tag":138,"props":139,"children":143},"pre",{"className":140,"code":141,"language":142,"meta":16,"style":16},"language-bash shiki shiki-themes github-dark","gcloud run deploy sgtm-prod \\\n  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable \\\n  --platform=managed \\\n  --region=europe-west1 \\\n  --allow-unauthenticated \\\n  --set-env-vars=CONTAINER_CONFIG=\u003Cserver_container_config_string>\n","bash",[144],{"type":32,"tag":62,"props":145,"children":146},{"__ignoreMap":16},[147,181,194,207,220,233],{"type":32,"tag":148,"props":149,"children":152},"span",{"class":150,"line":151},"line",1,[153,159,165,170,175],{"type":32,"tag":148,"props":154,"children":156},{"style":155},"--shiki-default:#B392F0",[157],{"type":37,"value":158},"gcloud",{"type":32,"tag":148,"props":160,"children":162},{"style":161},"--shiki-default:#9ECBFF",[163],{"type":37,"value":164}," run",{"type":32,"tag":148,"props":166,"children":167},{"style":161},[168],{"type":37,"value":169}," deploy",{"type":32,"tag":148,"props":171,"children":172},{"style":161},[173],{"type":37,"value":174}," sgtm-prod",{"type":32,"tag":148,"props":176,"children":178},{"style":177},"--shiki-default:#79B8FF",[179],{"type":37,"value":180}," \\\n",{"type":32,"tag":148,"props":182,"children":184},{"class":150,"line":183},2,[185,190],{"type":32,"tag":148,"props":186,"children":187},{"style":177},[188],{"type":37,"value":189},"  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":32,"tag":148,"props":191,"children":192},{"style":177},[193],{"type":37,"value":180},{"type":32,"tag":148,"props":195,"children":197},{"class":150,"line":196},3,[198,203],{"type":32,"tag":148,"props":199,"children":200},{"style":177},[201],{"type":37,"value":202},"  --platform=managed",{"type":32,"tag":148,"props":204,"children":205},{"style":177},[206],{"type":37,"value":180},{"type":32,"tag":148,"props":208,"children":210},{"class":150,"line":209},4,[211,216],{"type":32,"tag":148,"props":212,"children":213},{"style":177},[214],{"type":37,"value":215},"  --region=europe-west1",{"type":32,"tag":148,"props":217,"children":218},{"style":177},[219],{"type":37,"value":180},{"type":32,"tag":148,"props":221,"children":223},{"class":150,"line":222},5,[224,229],{"type":32,"tag":148,"props":225,"children":226},{"style":177},[227],{"type":37,"value":228},"  --allow-unauthenticated",{"type":32,"tag":148,"props":230,"children":231},{"style":177},[232],{"type":37,"value":180},{"type":32,"tag":148,"props":234,"children":236},{"class":150,"line":235},6,[237,242,248,253],{"type":32,"tag":148,"props":238,"children":239},{"style":177},[240],{"type":37,"value":241},"  --set-env-vars=CONTAINER_CONFIG=",{"type":32,"tag":148,"props":243,"children":245},{"style":244},"--shiki-default:#F97583",[246],{"type":37,"value":247},"\u003C",{"type":32,"tag":148,"props":249,"children":250},{"style":177},[251],{"type":37,"value":252},"server_container_config_string",{"type":32,"tag":148,"props":254,"children":255},{"style":244},[256],{"type":37,"value":257},">\n",{"type":32,"tag":33,"props":259,"children":260},{},[261,263,269,271,277,279,285],{"type":37,"value":262},"El string ",{"type":32,"tag":62,"props":264,"children":266},{"className":265},[],[267],{"type":37,"value":268},"CONTAINER_CONFIG",{"type":37,"value":270}," se copia desde Tag Manager UI (Settings → Container Configuration). El flag ",{"type":32,"tag":62,"props":272,"children":274},{"className":273},[],[275],{"type":37,"value":276},"--allow-unauthenticated",{"type":37,"value":278}," es crítico — los clientes web necesitan acceso a este endpoint. Region ",{"type":32,"tag":62,"props":280,"children":282},{"className":281},[],[283],{"type":37,"value":284},"europe-west1",{"type":37,"value":286}," proporciona residencia de datos en Europa para cumplimiento GDPR.",{"type":32,"tag":33,"props":288,"children":289},{},[290,295,297,303,305,311],{"type":32,"tag":104,"props":291,"children":292},{},[293],{"type":37,"value":294},"Paso 4: Configura un dominio personalizado.",{"type":37,"value":296}," Cloud Run asigna un dominio ",{"type":32,"tag":62,"props":298,"children":300},{"className":299},[],[301],{"type":37,"value":302},"*.run.app",{"type":37,"value":304}," pero este se ve como third-party, algunos navegadores lo tratan con SameSite=None. Usa un subdominio de tu propio dominio (por ejemplo ",{"type":32,"tag":62,"props":306,"children":308},{"className":307},[],[309],{"type":37,"value":310},"gtm.roibase.com.tr",{"type":37,"value":312},"). En Cloud Run → Domain Mappings, configura el registro DNS — CNAME al endpoint de Cloud Run + certificado SSL automático con Let's Encrypt.",{"type":32,"tag":33,"props":314,"children":315},{},[316,321,323,328],{"type":32,"tag":104,"props":317,"children":318},{},[319],{"type":37,"value":320},"Paso 5: Almacenamiento de estado en Firestore.",{"type":37,"value":322}," El contenedor sGTM usa Firestore para estado server-side (por ejemplo, guardar cookies reivindicadas client-side). Activa Firestore en el mismo proyecto GCP, crea una base de datos en región ",{"type":32,"tag":62,"props":324,"children":326},{"className":325},[],[327],{"type":37,"value":284},{"type":37,"value":329},". No necesitas código adicional — el contenedor sGTM la encuentra automáticamente.",{"type":32,"tag":33,"props":331,"children":332},{},[333,335,341,343,349,351,357,359,364],{"type":37,"value":334},"Tras desplegar, ",{"type":32,"tag":62,"props":336,"children":338},{"className":337},[],[339],{"type":37,"value":340},"curl https:\u002F\u002Fgtm.roibase.com.tr\u002Fhealthz",{"type":37,"value":342}," debe devolver ",{"type":32,"tag":62,"props":344,"children":346},{"className":345},[],[347],{"type":37,"value":348},"200 OK",{"type":37,"value":350},". Verifica logs con ",{"type":32,"tag":62,"props":352,"children":354},{"className":353},[],[355],{"type":37,"value":356},"gcloud run logs read sgtm-prod",{"type":37,"value":358}," — cualquier error de parseo de ",{"type":32,"tag":62,"props":360,"children":362},{"className":361},[],[363],{"type":37,"value":268},{"type":37,"value":365}," aparecerá ahí.",{"type":32,"tag":40,"props":367,"children":369},{"id":368},"integración-de-meta-conversion-api-y-deduplicación",[370],{"type":37,"value":371},"Integración de Meta Conversion API y Deduplicación",{"type":32,"tag":33,"props":373,"children":374},{},[375],{"type":37,"value":376},"En el Server Container, crea un nuevo tag \"Facebook Conversion API\" (selecciona de Tag Templates o usa \"Facebook Conversions API by Stape\" de Community Template Gallery — más flexible). Configuración base:",{"type":32,"tag":33,"props":378,"children":379},{},[380,385,387,393],{"type":32,"tag":104,"props":381,"children":382},{},[383],{"type":37,"value":384},"Event Name Mapping:",{"type":37,"value":386}," Mapea el ",{"type":32,"tag":62,"props":388,"children":390},{"className":389},[],[391],{"type":37,"value":392},"event_name",{"type":37,"value":394}," que viene del Web Container a eventos estándar de Meta (purchase → Purchase, page_view → PageView). Puedes enviar nombres custom pero para dedup con píxel, usar eventos estándar es más limpio.",{"type":32,"tag":33,"props":396,"children":397},{},[398,403,405,411,413,419,421,427,428,434],{"type":32,"tag":104,"props":399,"children":400},{},[401],{"type":37,"value":402},"User Data Parameters:",{"type":37,"value":404}," Meta CAPI requiere obligatoriamente ",{"type":32,"tag":62,"props":406,"children":408},{"className":407},[],[409],{"type":37,"value":410},"em",{"type":37,"value":412}," (email), ",{"type":32,"tag":62,"props":414,"children":416},{"className":415},[],[417],{"type":37,"value":418},"ph",{"type":37,"value":420}," (teléfono), ",{"type":32,"tag":62,"props":422,"children":424},{"className":423},[],[425],{"type":37,"value":426},"client_ip_address",{"type":37,"value":69},{"type":32,"tag":62,"props":429,"children":431},{"className":430},[],[432],{"type":37,"value":433},"client_user_agent",{"type":37,"value":435},". sGTM los lee automáticamente de los headers de request. Email\u002Fteléfono deben venir del cliente web — por ejemplo, añade a dataLayer:",{"type":32,"tag":138,"props":437,"children":441},{"className":438,"code":439,"language":440,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","window.dataLayer.push({\n  event: 'purchase',\n  transaction_id: 'T12345',\n  value: 99.90,\n  currency: 'USD',\n  user_email: 'user@example.com'\n});\n","javascript",[442],{"type":32,"tag":62,"props":443,"children":444},{"__ignoreMap":16},[445,464,482,499,516,533,546],{"type":32,"tag":148,"props":446,"children":447},{"class":150,"line":151},[448,454,459],{"type":32,"tag":148,"props":449,"children":451},{"style":450},"--shiki-default:#E1E4E8",[452],{"type":37,"value":453},"window.dataLayer.",{"type":32,"tag":148,"props":455,"children":456},{"style":155},[457],{"type":37,"value":458},"push",{"type":32,"tag":148,"props":460,"children":461},{"style":450},[462],{"type":37,"value":463},"({\n",{"type":32,"tag":148,"props":465,"children":466},{"class":150,"line":183},[467,472,477],{"type":32,"tag":148,"props":468,"children":469},{"style":450},[470],{"type":37,"value":471},"  event: ",{"type":32,"tag":148,"props":473,"children":474},{"style":161},[475],{"type":37,"value":476},"'purchase'",{"type":32,"tag":148,"props":478,"children":479},{"style":450},[480],{"type":37,"value":481},",\n",{"type":32,"tag":148,"props":483,"children":484},{"class":150,"line":196},[485,490,495],{"type":32,"tag":148,"props":486,"children":487},{"style":450},[488],{"type":37,"value":489},"  transaction_id: ",{"type":32,"tag":148,"props":491,"children":492},{"style":161},[493],{"type":37,"value":494},"'T12345'",{"type":32,"tag":148,"props":496,"children":497},{"style":450},[498],{"type":37,"value":481},{"type":32,"tag":148,"props":500,"children":501},{"class":150,"line":209},[502,507,512],{"type":32,"tag":148,"props":503,"children":504},{"style":450},[505],{"type":37,"value":506},"  value: ",{"type":32,"tag":148,"props":508,"children":509},{"style":177},[510],{"type":37,"value":511},"99.90",{"type":32,"tag":148,"props":513,"children":514},{"style":450},[515],{"type":37,"value":481},{"type":32,"tag":148,"props":517,"children":518},{"class":150,"line":222},[519,524,529],{"type":32,"tag":148,"props":520,"children":521},{"style":450},[522],{"type":37,"value":523},"  currency: ",{"type":32,"tag":148,"props":525,"children":526},{"style":161},[527],{"type":37,"value":528},"'USD'",{"type":32,"tag":148,"props":530,"children":531},{"style":450},[532],{"type":37,"value":481},{"type":32,"tag":148,"props":534,"children":535},{"class":150,"line":235},[536,541],{"type":32,"tag":148,"props":537,"children":538},{"style":450},[539],{"type":37,"value":540},"  user_email: ",{"type":32,"tag":148,"props":542,"children":543},{"style":161},[544],{"type":37,"value":545},"'user@example.com'\n",{"type":32,"tag":148,"props":547,"children":549},{"class":150,"line":548},7,[550],{"type":32,"tag":148,"props":551,"children":552},{"style":450},[553],{"type":37,"value":554},"});\n",{"type":32,"tag":33,"props":556,"children":557},{},[558,560,566,568,573],{"type":37,"value":559},"En el Tag Template, mapea ",{"type":32,"tag":62,"props":561,"children":563},{"className":562},[],[564],{"type":37,"value":565},"user_email",{"type":37,"value":567}," → ",{"type":32,"tag":62,"props":569,"children":571},{"className":570},[],[572],{"type":37,"value":410},{"type":37,"value":574},". sGTM hashea este email con SHA256 antes de enviarlo a Meta (nunca envíes texto plano — violación GDPR\u002FKVKK).",{"type":32,"tag":33,"props":576,"children":577},{},[578,583,585,591,593,599,601,606,608,613],{"type":32,"tag":104,"props":579,"children":580},{},[581],{"type":37,"value":582},"Event Deduplication:",{"type":37,"value":584}," En el tag de píxel Facebook client-side, añade parámetro ",{"type":32,"tag":62,"props":586,"children":588},{"className":587},[],[589],{"type":37,"value":590},"eventID",{"type":37,"value":592},". Envía también este ID al server-side. En el tag CAPI de sGTM, usa el mismo ",{"type":32,"tag":62,"props":594,"children":596},{"className":595},[],[597],{"type":37,"value":598},"event_id",{"type":37,"value":600},". El backend de Meta contará la combinación ",{"type":32,"tag":62,"props":602,"children":604},{"className":603},[],[605],{"type":37,"value":598},{"type":37,"value":607}," + ",{"type":32,"tag":62,"props":609,"children":611},{"className":610},[],[612],{"type":37,"value":392},{"type":37,"value":614}," dentro de 48 horas como una única conversión.",{"type":32,"tag":33,"props":616,"children":617},{},[618],{"type":37,"value":619},"Ejemplo código píxel client-side:",{"type":32,"tag":138,"props":621,"children":623},{"className":438,"code":622,"language":440,"meta":16,"style":16},"fbq('track', 'Purchase', {\n  value: 99.90,\n  currency: 'USD'\n}, {\n  eventID: 'T12345-1627384912'  \u002F\u002F transaction_id + Unix timestamp\n});\n",[624],{"type":32,"tag":62,"props":625,"children":626},{"__ignoreMap":16},[627,659,674,686,694,713],{"type":32,"tag":148,"props":628,"children":629},{"class":150,"line":151},[630,635,640,645,649,654],{"type":32,"tag":148,"props":631,"children":632},{"style":155},[633],{"type":37,"value":634},"fbq",{"type":32,"tag":148,"props":636,"children":637},{"style":450},[638],{"type":37,"value":639},"(",{"type":32,"tag":148,"props":641,"children":642},{"style":161},[643],{"type":37,"value":644},"'track'",{"type":32,"tag":148,"props":646,"children":647},{"style":450},[648],{"type":37,"value":69},{"type":32,"tag":148,"props":650,"children":651},{"style":161},[652],{"type":37,"value":653},"'Purchase'",{"type":32,"tag":148,"props":655,"children":656},{"style":450},[657],{"type":37,"value":658},", {\n",{"type":32,"tag":148,"props":660,"children":661},{"class":150,"line":183},[662,666,670],{"type":32,"tag":148,"props":663,"children":664},{"style":450},[665],{"type":37,"value":506},{"type":32,"tag":148,"props":667,"children":668},{"style":177},[669],{"type":37,"value":511},{"type":32,"tag":148,"props":671,"children":672},{"style":450},[673],{"type":37,"value":481},{"type":32,"tag":148,"props":675,"children":676},{"class":150,"line":196},[677,681],{"type":32,"tag":148,"props":678,"children":679},{"style":450},[680],{"type":37,"value":523},{"type":32,"tag":148,"props":682,"children":683},{"style":161},[684],{"type":37,"value":685},"'USD'\n",{"type":32,"tag":148,"props":687,"children":688},{"class":150,"line":209},[689],{"type":32,"tag":148,"props":690,"children":691},{"style":450},[692],{"type":37,"value":693},"}, {\n",{"type":32,"tag":148,"props":695,"children":696},{"class":150,"line":222},[697,702,707],{"type":32,"tag":148,"props":698,"children":699},{"style":450},[700],{"type":37,"value":701},"  eventID: ",{"type":32,"tag":148,"props":703,"children":704},{"style":161},[705],{"type":37,"value":706},"'T12345-1627384912'",{"type":32,"tag":148,"props":708,"children":710},{"style":709},"--shiki-default:#6A737D",[711],{"type":37,"value":712},"  \u002F\u002F transaction_id + Unix timestamp\n",{"type":32,"tag":148,"props":714,"children":715},{"class":150,"line":235},[716],{"type":32,"tag":148,"props":717,"children":718},{"style":450},[719],{"type":37,"value":554},{"type":32,"tag":33,"props":721,"children":722},{},[723,725,730,732,738],{"type":37,"value":724},"En el Tag server-side, mapea el parámetro ",{"type":32,"tag":62,"props":726,"children":728},{"className":727},[],[729],{"type":37,"value":598},{"type":37,"value":731}," como ",{"type":32,"tag":62,"props":733,"children":735},{"className":734},[],[736],{"type":37,"value":737},"{{event.event_id}}",{"type":37,"value":739}," (Event Data → event_id field). Así píxel y CAPI envían el mismo event_id — double counting cae a 0%.",{"type":32,"tag":33,"props":741,"children":742},{},[743,748],{"type":32,"tag":104,"props":744,"children":745},{},[746],{"type":37,"value":747},"Testing:",{"type":37,"value":749}," Entra en Meta Events Manager → Test Events, obtén el test event code, añádelo como parámetro al tag sGTM. Dispara la página, verifica que el evento llegue. Para dedup, dispara píxel y CAPI simultáneamente — en Events Manager verás columna \"Deduplication\" con \"Deduplicated\".",{"type":32,"tag":40,"props":751,"children":753},{"id":752},"checklist-production-ready-y-monitoreo",[754],{"type":37,"value":755},"Checklist Production-Ready y Monitoreo",{"type":32,"tag":33,"props":757,"children":758},{},[759],{"type":37,"value":760},"Antes de pasar a producción, verifica 5 puntos críticos:",{"type":32,"tag":33,"props":762,"children":763},{},[764,769,771,777,778,784,786,792],{"type":32,"tag":104,"props":765,"children":766},{},[767],{"type":37,"value":768},"1. Integración Consent Mode v2.",{"type":37,"value":770}," Desde marzo 2024, obligatorio para cumplimiento GDPR\u002FKVKK. En Web Container, integra tu CMP (Consent Management Platform), pushea estado de consentimiento (",{"type":32,"tag":62,"props":772,"children":774},{"className":773},[],[775],{"type":37,"value":776},"ad_storage",{"type":37,"value":69},{"type":32,"tag":62,"props":779,"children":781},{"className":780},[],[782],{"type":37,"value":783},"analytics_storage",{"type":37,"value":785},") a dataLayer. sGTM puede leer este estado y filtrar eventos — por ejemplo, si ",{"type":32,"tag":62,"props":787,"children":789},{"className":788},[],[790],{"type":37,"value":791},"ad_storage: denied",{"type":37,"value":793},", no dispares Meta CAPI tag o envía solo evento agregado (sin user_data).",{"type":32,"tag":33,"props":795,"children":796},{},[797,802,804,810,812,817],{"type":32,"tag":104,"props":798,"children":799},{},[800],{"type":37,"value":801},"2. Rate limiting.",{"type":37,"value":803}," Cloud Run tiene concurrencia default de 80 por contenedor. En spikes de tráfico (Black Friday), puedes exceder el límite. Configura ",{"type":32,"tag":62,"props":805,"children":807},{"className":806},[],[808],{"type":37,"value":809},"--max-instances",{"type":37,"value":811}," entre 10-20, Cloud Run escala automáticamente. Para control de costos, establece ",{"type":32,"tag":62,"props":813,"children":815},{"className":814},[],[816],{"type":37,"value":809},{"type":37,"value":818}," — escalado descontrolado genera factura de $1000+.",{"type":32,"tag":33,"props":820,"children":821},{},[822,827,829,835],{"type":32,"tag":104,"props":823,"children":824},{},[825],{"type":37,"value":826},"3. Error logging y alerting.",{"type":37,"value":828}," sGTM no tiene mecanismo nativo de logging — lo que escribe a stdout\u002Fstderr en Cloud Run va a Cloud Logging. Para capturar errores HTTP 400\u002F500 de Meta CAPI, en el Custom Tag Template loguea la response de ",{"type":32,"tag":62,"props":830,"children":832},{"className":831},[],[833],{"type":37,"value":834},"fetch()",{"type":37,"value":836},". En Cloud Logging → Log-based Metrics, crea métrica \"capi_error_rate\", configura alerta en Cloud Monitoring (threshold: 5 errors\u002Fmin).",{"type":32,"tag":33,"props":838,"children":839},{},[840,845,847,853],{"type":32,"tag":104,"props":841,"children":842},{},[843],{"type":37,"value":844},"4. Optimización de latencia.",{"type":37,"value":846}," El response time de sGTM afecta tiempo de carga de página. sGTM cold start 100-200ms, warm instance 10-20ms. Mantén 1 instancia siempre activa (",{"type":32,"tag":62,"props":848,"children":850},{"className":849},[],[851],{"type":37,"value":852},"--min-instances=1",{"type":37,"value":854},") — evitas cold start pero adds idle cost $5-10\u002Fmes. Alternativa: en Cloud Run → CPU allocation, selecciona \"CPU is always allocated\" — instance consume CPU incluso idle, sin cold start.",{"type":32,"tag":33,"props":856,"children":857},{},[858,863,865,871,873,879,881,887],{"type":32,"tag":104,"props":859,"children":860},{},[861],{"type":37,"value":862},"5. GA4 + CAPI server-side simultáneamente.",{"type":37,"value":864}," Migra también GA4 a server-side — el tag Server-Side GA4 está built-in en sGTM. El mismo evento va a GA4 y CAPI. Atención: GA4 lee ",{"type":32,"tag":62,"props":866,"children":868},{"className":867},[],[869],{"type":37,"value":870},"client_id",{"type":37,"value":872},", CAPI lee ",{"type":32,"tag":62,"props":874,"children":876},{"className":875},[],[877],{"type":37,"value":878},"fbp",{"type":37,"value":880}," de diferentes cookies. Para resolución de identidad, envía ",{"type":32,"tag":62,"props":882,"children":884},{"className":883},[],[885],{"type":37,"value":886},"user_id",{"type":37,"value":888}," en dataLayer, úsalo en ambos tags — consistency en atribución cross-platform.",{"type":32,"tag":33,"props":890,"children":891},{},[892],{"type":37,"value":893},"En producción, revisa diariamente la primera semana en Events Manager: match rate (email\u002Fphone match), event count (ratio client vs server), dedup rate. Benchmark Meta: 60-70% de eventos server-side deben encontrar match de user_data. Si match rate \u003C 30%, calidad de user_data baja — normaliza emails (lowercase + trim) o envía teléfono en formato E.164.",{"type":32,"tag":40,"props":895,"children":897},{"id":896},"capas-estratégicas-de-la-medición-server-side",[898],{"type":37,"value":899},"Capas Estratégicas de la Medición Server-Side",{"type":32,"tag":33,"props":901,"children":902},{},[903,905,911],{"type":37,"value":904},"sGTM no es solo un contenedor técnico, es una decisión de arquitectura de datos marketing. Primera capa: event enrichment — puedes enriquecer en server-side con datos CRM (leer LTV de cliente desde BigQuery, añadir margen de producto desde catálogo). Por ejemplo, añade parámetro ",{"type":32,"tag":62,"props":906,"children":908},{"className":907},[],[909],{"type":37,"value":910},"customer_ltv",{"type":37,"value":912}," a evento purchase para alimentar audience lookalike value-based de Meta.",{"type":32,"tag":33,"props":914,"children":915},{},[916],{"type":37,"value":917},"Segunda capa: orquestación multi-plataforma. Desde el mismo contenedor sGTM, envía evento a Meta CAPI, Google Ads Enhanced Conversions, TikTok Events API, Snapchat CAPI. Cada plataforma tiene reglas diferentes de matching user_data (TikTok phone SHA256, Google email SHA256 + trim) — configura normalización en los Tag Templates.",{"type":32,"tag":33,"props":919,"children":920},{},[921,923,930],{"type":37,"value":922},"Tercera capa: medición de incrementalidad. Puedes A\u002FB testear eventos server-side — por ejemplo, envía CAPI event solo al 90% de tráfico, mide lift. Este tipo de test se integra con la disciplina de ",{"type":32,"tag":79,"props":924,"children":927},{"href":925,"rel":926},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fverianalizi",[83],[928],{"type":37,"value":929},"análisis de datos e ingeniería de insights",{"type":37,"value":931}," — construye causal impact model en BigQuery, calcula incrementalidad.",{"type":32,"tag":33,"props":933,"children":934},{},[935],{"type":37,"value":936},"El costo de sGTM es compute cloud + state storage. Para 1M events\u002Fmes: Cloud Run $50-70, Firestore $10-15. A cambio, cerrar el attribution gap 15-20%, mejorar Facebook ROAS, reducir conversion loss en usuarios iOS cubre ROI en el primer mes. Tiempo de setup: 2-4 semanas (test + rollout producción), pero una vez desplegado el template, se clona a otras cuentas en 1 día — infraestructura escalable.",{"type":32,"tag":938,"props":939,"children":940},"style",{},[941],{"type":37,"value":942},"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":196,"depth":196,"links":944},[945,946,947,948,949],{"id":42,"depth":183,"text":45},{"id":91,"depth":183,"text":94},{"id":368,"depth":183,"text":371},{"id":752,"depth":183,"text":755},{"id":896,"depth":183,"text":899},"markdown","content:es:data:sgtm-conversion-api-produccion.md","content","es\u002Fdata\u002Fsgtm-conversion-api-produccion.md","es\u002Fdata\u002Fsgtm-conversion-api-produccion","md",1785967481442]