[{"data":1,"prerenderedAt":2210},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-production":11},{"i18nKey":4,"paths":5},"data-001-2026-05",{"de":6,"es":7,"fr":8,"it":9,"ru":10},"\u002Fde\u002Fdata\u002Fserver-side-gtm-conversion-api-produktion","\u002Fes\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Ffr\u002Fdata\u002Fserver-side-gtm-conversion-api-production","\u002Fit\u002Fdata\u002Fserver-side-gtm-conversion-api-da-produzione","\u002Fru\u002Fdata\u002Fserver-side-gtm-konversiya-api-production",{"_path":7,"_dir":12,"_draft":13,"_partial":13,"_locale":14,"title":15,"description":16,"publishedAt":17,"modifiedAt":17,"category":12,"i18nKey":4,"tags":18,"readingTime":24,"author":25,"body":26,"_type":2204,"_id":2205,"_source":2206,"_file":2207,"_stem":2208,"_extension":2209},"data",false,"","Server-Side GTM y Conversion API: De Cero a Producción","Cloud Run deploy, container template, deduplicación de eventos — cómo construimos nuestro stack de medición server-side en producción, qué trampas evitamos.","2026-05-24",[19,20,21,22,23],"server-side-gtm","conversion-api","cloud-run","first-party-data","event-deduplication",9,"Roibase",{"type":27,"children":28,"toc":2192},"root",[29,37,44,49,54,59,234,253,266,272,285,314,475,487,516,545,551,556,565,620,628,677,682,690,702,709,714,981,994,1000,1005,1010,1223,1259,1264,1270,1275,1283,1326,1331,1439,1460,1465,1617,1633,1639,1660,1665,1704,1709,2057,2084,2090,2095,2103,2165,2170,2176,2181,2186],{"type":30,"tag":31,"props":32,"children":33},"element","p",{},[34],{"type":35,"value":36},"text","Deprecation de cookies, Consent Mode v2, iOS ATT — el área de confiabilidad de la medición client-side se reduce cada año. En 2024, Meta tuvo que aceptar %23 menos eventos client-side, y en Google Analytics 4 el conteo de sesiones cayó %18. La medición server-side ya no es \"el futuro\" sino \"obligatoria\". Desde finales de 2025, en Roibase estamos configurando completamente a nuevos clientes en stack sGTM + Conversion API. En este artículo compartimos lo que aprendimos durante la migración a producción, qué decisiones tomamos y por qué, y qué componentes son imprescindibles en el stack.",{"type":30,"tag":38,"props":39,"children":41},"h2",{"id":40},"dónde-desplegar-el-container-sgtm",[42],{"type":35,"value":43},"¿Dónde Desplegar el Container sGTM?",{"type":30,"tag":31,"props":45,"children":46},{},[47],{"type":35,"value":48},"Puedes ejecutar Google Tag Manager Server Container en App Engine, Cloud Run, Docker manual, o proveedores terceros. En 2026, dos opciones dominan: Cloud Run y Cloudflare Workers. App Engine se considera legacy — sin escalado automático, cold start 8+ segundos. Workers es más barato, pero la integración con el ecosistema de GTM requiere middleware adicional.",{"type":30,"tag":31,"props":50,"children":51},{},[52],{"type":35,"value":53},"Elegimos Cloud Run: la imagen oficial del contenedor de GTM corre directamente, escalado horizontal automático, cold start bajo 2 segundos. El cálculo de costo es crítico: 1M request\u002Fmes + instancia 512MB × 3 zonas = ~$35\u002Fmes. En Cloudflare Workers esto es $5\u002Fmes, pero el tooling de debug es débil y la integración de variables personalizadas requiere configuración manual.",{"type":30,"tag":31,"props":55,"children":56},{},[57],{"type":35,"value":58},"El comando de deploy:",{"type":30,"tag":60,"props":61,"children":65},"pre",{"code":62,"language":63,"meta":14,"className":64,"style":14},"gcloud run deploy sgtm-prod \\\n  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable \\\n  --platform=managed \\\n  --region=europe-west1 \\\n  --memory=512Mi \\\n  --min-instances=1 \\\n  --max-instances=10 \\\n  --allow-unauthenticated \\\n  --set-env-vars=\"CONTAINER_CONFIG=$(cat container.json | base64)\"\n","bash","language-bash shiki shiki-themes github-dark",[66],{"type":30,"tag":67,"props":68,"children":69},"code",{"__ignoreMap":14},[70,104,117,130,143,156,169,182,195],{"type":30,"tag":71,"props":72,"children":75},"span",{"class":73,"line":74},"line",1,[76,82,88,93,98],{"type":30,"tag":71,"props":77,"children":79},{"style":78},"--shiki-default:#B392F0",[80],{"type":35,"value":81},"gcloud",{"type":30,"tag":71,"props":83,"children":85},{"style":84},"--shiki-default:#9ECBFF",[86],{"type":35,"value":87}," run",{"type":30,"tag":71,"props":89,"children":90},{"style":84},[91],{"type":35,"value":92}," deploy",{"type":30,"tag":71,"props":94,"children":95},{"style":84},[96],{"type":35,"value":97}," sgtm-prod",{"type":30,"tag":71,"props":99,"children":101},{"style":100},"--shiki-default:#79B8FF",[102],{"type":35,"value":103}," \\\n",{"type":30,"tag":71,"props":105,"children":107},{"class":73,"line":106},2,[108,113],{"type":30,"tag":71,"props":109,"children":110},{"style":100},[111],{"type":35,"value":112},"  --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable",{"type":30,"tag":71,"props":114,"children":115},{"style":100},[116],{"type":35,"value":103},{"type":30,"tag":71,"props":118,"children":120},{"class":73,"line":119},3,[121,126],{"type":30,"tag":71,"props":122,"children":123},{"style":100},[124],{"type":35,"value":125},"  --platform=managed",{"type":30,"tag":71,"props":127,"children":128},{"style":100},[129],{"type":35,"value":103},{"type":30,"tag":71,"props":131,"children":133},{"class":73,"line":132},4,[134,139],{"type":30,"tag":71,"props":135,"children":136},{"style":100},[137],{"type":35,"value":138},"  --region=europe-west1",{"type":30,"tag":71,"props":140,"children":141},{"style":100},[142],{"type":35,"value":103},{"type":30,"tag":71,"props":144,"children":146},{"class":73,"line":145},5,[147,152],{"type":30,"tag":71,"props":148,"children":149},{"style":100},[150],{"type":35,"value":151},"  --memory=512Mi",{"type":30,"tag":71,"props":153,"children":154},{"style":100},[155],{"type":35,"value":103},{"type":30,"tag":71,"props":157,"children":159},{"class":73,"line":158},6,[160,165],{"type":30,"tag":71,"props":161,"children":162},{"style":100},[163],{"type":35,"value":164},"  --min-instances=1",{"type":30,"tag":71,"props":166,"children":167},{"style":100},[168],{"type":35,"value":103},{"type":30,"tag":71,"props":170,"children":172},{"class":73,"line":171},7,[173,178],{"type":30,"tag":71,"props":174,"children":175},{"style":100},[176],{"type":35,"value":177},"  --max-instances=10",{"type":30,"tag":71,"props":179,"children":180},{"style":100},[181],{"type":35,"value":103},{"type":30,"tag":71,"props":183,"children":185},{"class":73,"line":184},8,[186,191],{"type":30,"tag":71,"props":187,"children":188},{"style":100},[189],{"type":35,"value":190},"  --allow-unauthenticated",{"type":30,"tag":71,"props":192,"children":193},{"style":100},[194],{"type":35,"value":103},{"type":30,"tag":71,"props":196,"children":197},{"class":73,"line":24},[198,203,208,213,218,224,229],{"type":30,"tag":71,"props":199,"children":200},{"style":100},[201],{"type":35,"value":202},"  --set-env-vars=",{"type":30,"tag":71,"props":204,"children":205},{"style":84},[206],{"type":35,"value":207},"\"CONTAINER_CONFIG=$(",{"type":30,"tag":71,"props":209,"children":210},{"style":78},[211],{"type":35,"value":212},"cat",{"type":30,"tag":71,"props":214,"children":215},{"style":84},[216],{"type":35,"value":217}," container.json ",{"type":30,"tag":71,"props":219,"children":221},{"style":220},"--shiki-default:#F97583",[222],{"type":35,"value":223},"|",{"type":30,"tag":71,"props":225,"children":226},{"style":78},[227],{"type":35,"value":228}," base64",{"type":30,"tag":71,"props":230,"children":231},{"style":84},[232],{"type":35,"value":233},")\"\n",{"type":30,"tag":31,"props":235,"children":236},{},[237,243,245,251],{"type":30,"tag":67,"props":238,"children":240},{"className":239},[],[241],{"type":35,"value":242},"min-instances=1",{"type":35,"value":244}," es crítico — en un sitio de e-commerce, el tiempo para crear una instancia desde cero puede perder conversiones. Costo +$8\u002Fmes, pero garantiza uptime del 100%. El ",{"type":30,"tag":67,"props":246,"children":248},{"className":247},[],[249],{"type":35,"value":250},"container.json",{"type":35,"value":252}," es la configuración exportada desde la interfaz de GTM — puedes vincularla a CI\u002FCD en lugar de sincronización manual.",{"type":30,"tag":31,"props":254,"children":255},{},[256,258,264],{"type":35,"value":257},"Estructura de subdominio: ",{"type":30,"tag":67,"props":259,"children":261},{"className":260},[],[262],{"type":35,"value":263},"sgtm.example.com",{"type":35,"value":265}," → Cloud Run IP. No usamos Load Balancer; la IP anycast global de Cloud Run es suficiente. SSL automático, certificado gestionado de Cloud Run listo en 3 minutos.",{"type":30,"tag":38,"props":267,"children":269},{"id":268},"deduplicación-de-eventos-dos-señales-una-conversión",[270],{"type":35,"value":271},"Deduplicación de Eventos: Dos Señales, Una Conversión",{"type":30,"tag":31,"props":273,"children":274},{},[275,277,283],{"type":35,"value":276},"La mayor trampa de la medición server-side: la misma conversión se envía tanto desde el navegador como desde el servidor, y la plataforma la cuenta dos veces. El parámetro ",{"type":30,"tag":67,"props":278,"children":280},{"className":279},[],[281],{"type":35,"value":282},"event_id",{"type":35,"value":284}," en Meta Conversion API soluciona esto — si client y server comparten el mismo ID, Meta limpia la duplicación en una ventana de 28 horas.",{"type":30,"tag":31,"props":286,"children":287},{},[288,290,296,298,304,306,312],{"type":35,"value":289},"Flujo de ejemplo: el usuario completa un pedido, GTM client-side dispara un evento ",{"type":30,"tag":67,"props":291,"children":293},{"className":292},[],[294],{"type":35,"value":295},"purchase",{"type":35,"value":297}," → Meta Pixel. Simultáneamente, el frontend POST a nuestro endpoint ",{"type":30,"tag":67,"props":299,"children":301},{"className":300},[],[302],{"type":35,"value":303},"\u002Fapi\u002Ftrack",{"type":35,"value":305}," → sGTM → Meta Conversion API. Ambas señales llevan ",{"type":30,"tag":67,"props":307,"children":309},{"className":308},[],[310],{"type":35,"value":311},"event_id: order_12345_ts1716547200",{"type":35,"value":313},".",{"type":30,"tag":60,"props":315,"children":319},{"code":316,"language":317,"meta":14,"className":318,"style":14},"\u002F\u002F Variable de GTM Client-Side: event_id\nfunction() {\n  var orderId = {{Order ID}};\n  var timestamp = Math.floor(Date.now() \u002F 1000);\n  return orderId + '_ts' + timestamp;\n}\n","javascript","language-javascript shiki shiki-themes github-dark",[320],{"type":30,"tag":67,"props":321,"children":322},{"__ignoreMap":14},[323,332,346,379,435,467],{"type":30,"tag":71,"props":324,"children":325},{"class":73,"line":74},[326],{"type":30,"tag":71,"props":327,"children":329},{"style":328},"--shiki-default:#6A737D",[330],{"type":35,"value":331},"\u002F\u002F Variable de GTM Client-Side: event_id\n",{"type":30,"tag":71,"props":333,"children":334},{"class":73,"line":106},[335,340],{"type":30,"tag":71,"props":336,"children":337},{"style":220},[338],{"type":35,"value":339},"function",{"type":30,"tag":71,"props":341,"children":343},{"style":342},"--shiki-default:#E1E4E8",[344],{"type":35,"value":345},"() {\n",{"type":30,"tag":71,"props":347,"children":348},{"class":73,"line":119},[349,354,359,364,369,374],{"type":30,"tag":71,"props":350,"children":351},{"style":220},[352],{"type":35,"value":353},"  var",{"type":30,"tag":71,"props":355,"children":356},{"style":342},[357],{"type":35,"value":358}," orderId ",{"type":30,"tag":71,"props":360,"children":361},{"style":220},[362],{"type":35,"value":363},"=",{"type":30,"tag":71,"props":365,"children":366},{"style":342},[367],{"type":35,"value":368}," {{Order ",{"type":30,"tag":71,"props":370,"children":371},{"style":100},[372],{"type":35,"value":373},"ID",{"type":30,"tag":71,"props":375,"children":376},{"style":342},[377],{"type":35,"value":378},"}};\n",{"type":30,"tag":71,"props":380,"children":381},{"class":73,"line":132},[382,386,391,395,400,405,410,415,420,425,430],{"type":30,"tag":71,"props":383,"children":384},{"style":220},[385],{"type":35,"value":353},{"type":30,"tag":71,"props":387,"children":388},{"style":342},[389],{"type":35,"value":390}," timestamp ",{"type":30,"tag":71,"props":392,"children":393},{"style":220},[394],{"type":35,"value":363},{"type":30,"tag":71,"props":396,"children":397},{"style":342},[398],{"type":35,"value":399}," Math.",{"type":30,"tag":71,"props":401,"children":402},{"style":78},[403],{"type":35,"value":404},"floor",{"type":30,"tag":71,"props":406,"children":407},{"style":342},[408],{"type":35,"value":409},"(Date.",{"type":30,"tag":71,"props":411,"children":412},{"style":78},[413],{"type":35,"value":414},"now",{"type":30,"tag":71,"props":416,"children":417},{"style":342},[418],{"type":35,"value":419},"() ",{"type":30,"tag":71,"props":421,"children":422},{"style":220},[423],{"type":35,"value":424},"\u002F",{"type":30,"tag":71,"props":426,"children":427},{"style":100},[428],{"type":35,"value":429}," 1000",{"type":30,"tag":71,"props":431,"children":432},{"style":342},[433],{"type":35,"value":434},");\n",{"type":30,"tag":71,"props":436,"children":437},{"class":73,"line":145},[438,443,447,452,457,462],{"type":30,"tag":71,"props":439,"children":440},{"style":220},[441],{"type":35,"value":442},"  return",{"type":30,"tag":71,"props":444,"children":445},{"style":342},[446],{"type":35,"value":358},{"type":30,"tag":71,"props":448,"children":449},{"style":220},[450],{"type":35,"value":451},"+",{"type":30,"tag":71,"props":453,"children":454},{"style":84},[455],{"type":35,"value":456}," '_ts'",{"type":30,"tag":71,"props":458,"children":459},{"style":220},[460],{"type":35,"value":461}," +",{"type":30,"tag":71,"props":463,"children":464},{"style":342},[465],{"type":35,"value":466}," timestamp;\n",{"type":30,"tag":71,"props":468,"children":469},{"class":73,"line":158},[470],{"type":30,"tag":71,"props":471,"children":472},{"style":342},[473],{"type":35,"value":474},"}\n",{"type":30,"tag":31,"props":476,"children":477},{},[478,480,485],{"type":35,"value":479},"En el sGTM, mapeamos el mismo ",{"type":30,"tag":67,"props":481,"children":483},{"className":482},[],[484],{"type":35,"value":282},{"type":35,"value":486}," al tag de Meta Conversion API. Importante: el componente timestamp no es obligatorio, pero evita colisiones de unicidad — el mismo order_id puede reutilizarse en diferentes sesiones.",{"type":30,"tag":31,"props":488,"children":489},{},[490,492,498,500,506,508,514],{"type":35,"value":491},"Para Google Ads, es diferente: el parámetro ",{"type":30,"tag":67,"props":493,"children":495},{"className":494},[],[496],{"type":35,"value":497},"gclid",{"type":35,"value":499}," es suficiente, no hay ID de deduplicación adicional. Pero en Google Analytics 4, si envías la combinación ",{"type":30,"tag":67,"props":501,"children":503},{"className":502},[],[504],{"type":35,"value":505},"client_id",{"type":35,"value":507}," + ",{"type":30,"tag":67,"props":509,"children":511},{"className":510},[],[512],{"type":35,"value":513},"session_id",{"type":35,"value":515}," tanto desde client como desde server, GA4 realiza deduplicación automática — característica añadida en Q3 2024.",{"type":30,"tag":31,"props":517,"children":518},{},[519,521,527,529,535,537,543],{"type":35,"value":520},"Validación de dedup: en Meta Events Manager, la puntuación \"Event Match Quality\" debe estar por encima del %80. Si está baja — especialmente si faltan hashes ",{"type":30,"tag":67,"props":522,"children":524},{"className":523},[],[525],{"type":35,"value":526},"em",{"type":35,"value":528}," (email), ",{"type":30,"tag":67,"props":530,"children":532},{"className":531},[],[533],{"type":35,"value":534},"ph",{"type":35,"value":536}," (teléfono), ",{"type":30,"tag":67,"props":538,"children":540},{"className":539},[],[541],{"type":35,"value":542},"fn",{"type":35,"value":544}," (nombre) — el evento del servidor se considera \"baja confianza\" y la limpieza de duplicación es menos confiable.",{"type":30,"tag":38,"props":546,"children":548},{"id":547},"container-template-qué-tags-vienen-por-defecto",[549],{"type":35,"value":550},"Container Template: Qué Tags Vienen por Defecto",{"type":30,"tag":31,"props":552,"children":553},{},[554],{"type":35,"value":555},"El Server Container de GTM comienza vacío; cada tag lo añades manualmente. Después de configurar 15+ contenedores, creamos un repositorio template — un nuevo cliente llega a producción listo en 5 minutos.",{"type":30,"tag":31,"props":557,"children":558},{},[559],{"type":30,"tag":560,"props":561,"children":562},"strong",{},[563],{"type":35,"value":564},"Tags obligatorios:",{"type":30,"tag":566,"props":567,"children":568},"ul",{},[569,580,590,600,610],{"type":30,"tag":570,"props":571,"children":572},"li",{},[573,578],{"type":30,"tag":560,"props":574,"children":575},{},[576],{"type":35,"value":577},"Meta Conversion API",{"type":35,"value":579}," (usando Meta Business Extension)",{"type":30,"tag":570,"props":581,"children":582},{},[583,588],{"type":30,"tag":560,"props":584,"children":585},{},[586],{"type":35,"value":587},"Google Analytics 4",{"type":35,"value":589}," (con cliente server-side)",{"type":30,"tag":570,"props":591,"children":592},{},[593,598],{"type":30,"tag":560,"props":594,"children":595},{},[596],{"type":35,"value":597},"Google Ads Conversion",{"type":35,"value":599}," (con Enhanced Conversion)",{"type":30,"tag":570,"props":601,"children":602},{},[603,608],{"type":30,"tag":560,"props":604,"children":605},{},[606],{"type":35,"value":607},"Snapchat Conversion API",{"type":35,"value":609}," (para clientes gaming\u002Ffashion)",{"type":30,"tag":570,"props":611,"children":612},{},[613,618],{"type":30,"tag":560,"props":614,"children":615},{},[616],{"type":35,"value":617},"TikTok Events API",{"type":35,"value":619}," (si hay targeting de Gen Z)",{"type":30,"tag":31,"props":621,"children":622},{},[623],{"type":30,"tag":560,"props":624,"children":625},{},[626],{"type":35,"value":627},"Opcionales pero recomendados:",{"type":30,"tag":566,"props":629,"children":630},{},[631,641,659],{"type":30,"tag":570,"props":632,"children":633},{},[634,639],{"type":30,"tag":560,"props":635,"children":636},{},[637],{"type":35,"value":638},"Firestore\u002FBigQuery log writer",{"type":35,"value":640}," — registra cada evento en bruto, crítico para audit trail + modelado de atribución",{"type":30,"tag":570,"props":642,"children":643},{},[644,649,651,657],{"type":30,"tag":560,"props":645,"children":646},{},[647],{"type":35,"value":648},"Variable de verificación de consent",{"type":35,"value":650}," — parsea string TCF 2.2, verifica propósitos 1 (almacenamiento) y 2 (medición), envía ",{"type":30,"tag":67,"props":652,"children":654},{"className":653},[],[655],{"type":35,"value":656},"action_source=physical_store",{"type":35,"value":658}," si hay rechazo (no es bypass, es señal agregada)",{"type":30,"tag":570,"props":660,"children":661},{},[662,667,669,675],{"type":30,"tag":560,"props":663,"children":664},{},[665],{"type":35,"value":666},"Enriquecimiento de IP de usuario",{"type":35,"value":668}," — extrae ",{"type":30,"tag":67,"props":670,"children":672},{"className":671},[],[673],{"type":35,"value":674},"X-Forwarded-For",{"type":35,"value":676}," del header, aumenta accuracy geolocation de Conversion API %12",{"type":30,"tag":31,"props":678,"children":679},{},[680],{"type":35,"value":681},"Estructura del repositorio template:",{"type":30,"tag":60,"props":683,"children":685},{"code":684},"sgtm-template\u002F\n├── clients\u002F\n│   └── ga4-client.json\n├── tags\u002F\n│   ├── meta-capi.json\n│   ├── google-ads.json\n│   └── bigquery-log.json\n├── variables\u002F\n│   ├── event-id.json\n│   ├── user-data.json\n│   └── consent-status.json\n└── triggers\u002F\n    ├── all-events.json\n    └── conversion-only.json\n",[686],{"type":30,"tag":67,"props":687,"children":688},{"__ignoreMap":14},[689],{"type":35,"value":684},{"type":30,"tag":31,"props":691,"children":692},{},[693,695,700],{"type":35,"value":694},"Cada archivo JSON se exporta desde la interfaz de GTM — no puedes importarlos directamente con CLI ",{"type":30,"tag":67,"props":696,"children":698},{"className":697},[],[699],{"type":35,"value":81},{"type":35,"value":701},", pero se automatizan en CI\u002FCD con scripts. Existe un proveedor Terraform para GTM, pero es community-maintained, no oficial.",{"type":30,"tag":703,"props":704,"children":706},"h3",{"id":705},"variable-de-datos-de-usuario-envía-con-hash",[707],{"type":35,"value":708},"Variable de Datos de Usuario: Envía Con Hash",{"type":30,"tag":31,"props":710,"children":711},{},[712],{"type":35,"value":713},"Meta y Google requieren PII (información de identificación personal) hasheada: email → SHA256, teléfono → formato E.164 + SHA256. En GTM client-side el hash se hace en JavaScript, pero en sGTM es más seguro hacerlo server-side — no aparece texto plano en devtools del navegador.",{"type":30,"tag":60,"props":715,"children":717},{"code":716,"language":317,"meta":14,"className":318,"style":14},"\u002F\u002F Variable personalizada de sGTM: hashed_email\nconst crypto = require('crypto');\nconst getEventData = require('getEventData');\n\nconst email = getEventData('user_data.email_address');\nif (!email) return undefined;\n\nreturn crypto.createHash('sha256')\n  .update(email.toLowerCase().trim())\n  .digest('hex');\n",[718],{"type":30,"tag":67,"props":719,"children":720},{"__ignoreMap":14},[721,729,766,799,808,841,879,886,917,955],{"type":30,"tag":71,"props":722,"children":723},{"class":73,"line":74},[724],{"type":30,"tag":71,"props":725,"children":726},{"style":328},[727],{"type":35,"value":728},"\u002F\u002F Variable personalizada de sGTM: hashed_email\n",{"type":30,"tag":71,"props":730,"children":731},{"class":73,"line":106},[732,737,742,747,752,757,762],{"type":30,"tag":71,"props":733,"children":734},{"style":220},[735],{"type":35,"value":736},"const",{"type":30,"tag":71,"props":738,"children":739},{"style":100},[740],{"type":35,"value":741}," crypto",{"type":30,"tag":71,"props":743,"children":744},{"style":220},[745],{"type":35,"value":746}," =",{"type":30,"tag":71,"props":748,"children":749},{"style":78},[750],{"type":35,"value":751}," require",{"type":30,"tag":71,"props":753,"children":754},{"style":342},[755],{"type":35,"value":756},"(",{"type":30,"tag":71,"props":758,"children":759},{"style":84},[760],{"type":35,"value":761},"'crypto'",{"type":30,"tag":71,"props":763,"children":764},{"style":342},[765],{"type":35,"value":434},{"type":30,"tag":71,"props":767,"children":768},{"class":73,"line":119},[769,773,778,782,786,790,795],{"type":30,"tag":71,"props":770,"children":771},{"style":220},[772],{"type":35,"value":736},{"type":30,"tag":71,"props":774,"children":775},{"style":100},[776],{"type":35,"value":777}," getEventData",{"type":30,"tag":71,"props":779,"children":780},{"style":220},[781],{"type":35,"value":746},{"type":30,"tag":71,"props":783,"children":784},{"style":78},[785],{"type":35,"value":751},{"type":30,"tag":71,"props":787,"children":788},{"style":342},[789],{"type":35,"value":756},{"type":30,"tag":71,"props":791,"children":792},{"style":84},[793],{"type":35,"value":794},"'getEventData'",{"type":30,"tag":71,"props":796,"children":797},{"style":342},[798],{"type":35,"value":434},{"type":30,"tag":71,"props":800,"children":801},{"class":73,"line":132},[802],{"type":30,"tag":71,"props":803,"children":805},{"emptyLinePlaceholder":804},true,[806],{"type":35,"value":807},"\n",{"type":30,"tag":71,"props":809,"children":810},{"class":73,"line":145},[811,815,820,824,828,832,837],{"type":30,"tag":71,"props":812,"children":813},{"style":220},[814],{"type":35,"value":736},{"type":30,"tag":71,"props":816,"children":817},{"style":100},[818],{"type":35,"value":819}," email",{"type":30,"tag":71,"props":821,"children":822},{"style":220},[823],{"type":35,"value":746},{"type":30,"tag":71,"props":825,"children":826},{"style":78},[827],{"type":35,"value":777},{"type":30,"tag":71,"props":829,"children":830},{"style":342},[831],{"type":35,"value":756},{"type":30,"tag":71,"props":833,"children":834},{"style":84},[835],{"type":35,"value":836},"'user_data.email_address'",{"type":30,"tag":71,"props":838,"children":839},{"style":342},[840],{"type":35,"value":434},{"type":30,"tag":71,"props":842,"children":843},{"class":73,"line":158},[844,849,854,859,864,869,874],{"type":30,"tag":71,"props":845,"children":846},{"style":220},[847],{"type":35,"value":848},"if",{"type":30,"tag":71,"props":850,"children":851},{"style":342},[852],{"type":35,"value":853}," (",{"type":30,"tag":71,"props":855,"children":856},{"style":220},[857],{"type":35,"value":858},"!",{"type":30,"tag":71,"props":860,"children":861},{"style":342},[862],{"type":35,"value":863},"email) ",{"type":30,"tag":71,"props":865,"children":866},{"style":220},[867],{"type":35,"value":868},"return",{"type":30,"tag":71,"props":870,"children":871},{"style":100},[872],{"type":35,"value":873}," undefined",{"type":30,"tag":71,"props":875,"children":876},{"style":342},[877],{"type":35,"value":878},";\n",{"type":30,"tag":71,"props":880,"children":881},{"class":73,"line":171},[882],{"type":30,"tag":71,"props":883,"children":884},{"emptyLinePlaceholder":804},[885],{"type":35,"value":807},{"type":30,"tag":71,"props":887,"children":888},{"class":73,"line":184},[889,893,898,903,907,912],{"type":30,"tag":71,"props":890,"children":891},{"style":220},[892],{"type":35,"value":868},{"type":30,"tag":71,"props":894,"children":895},{"style":342},[896],{"type":35,"value":897}," crypto.",{"type":30,"tag":71,"props":899,"children":900},{"style":78},[901],{"type":35,"value":902},"createHash",{"type":30,"tag":71,"props":904,"children":905},{"style":342},[906],{"type":35,"value":756},{"type":30,"tag":71,"props":908,"children":909},{"style":84},[910],{"type":35,"value":911},"'sha256'",{"type":30,"tag":71,"props":913,"children":914},{"style":342},[915],{"type":35,"value":916},")\n",{"type":30,"tag":71,"props":918,"children":919},{"class":73,"line":24},[920,925,930,935,940,945,950],{"type":30,"tag":71,"props":921,"children":922},{"style":342},[923],{"type":35,"value":924},"  .",{"type":30,"tag":71,"props":926,"children":927},{"style":78},[928],{"type":35,"value":929},"update",{"type":30,"tag":71,"props":931,"children":932},{"style":342},[933],{"type":35,"value":934},"(email.",{"type":30,"tag":71,"props":936,"children":937},{"style":78},[938],{"type":35,"value":939},"toLowerCase",{"type":30,"tag":71,"props":941,"children":942},{"style":342},[943],{"type":35,"value":944},"().",{"type":30,"tag":71,"props":946,"children":947},{"style":78},[948],{"type":35,"value":949},"trim",{"type":30,"tag":71,"props":951,"children":952},{"style":342},[953],{"type":35,"value":954},"())\n",{"type":30,"tag":71,"props":956,"children":958},{"class":73,"line":957},10,[959,963,968,972,977],{"type":30,"tag":71,"props":960,"children":961},{"style":342},[962],{"type":35,"value":924},{"type":30,"tag":71,"props":964,"children":965},{"style":78},[966],{"type":35,"value":967},"digest",{"type":30,"tag":71,"props":969,"children":970},{"style":342},[971],{"type":35,"value":756},{"type":30,"tag":71,"props":973,"children":974},{"style":84},[975],{"type":35,"value":976},"'hex'",{"type":30,"tag":71,"props":978,"children":979},{"style":342},[980],{"type":35,"value":434},{"type":30,"tag":31,"props":982,"children":983},{},[984,986,992],{"type":35,"value":985},"Para teléfono, formato E.164: ",{"type":30,"tag":67,"props":987,"children":989},{"className":988},[],[990],{"type":35,"value":991},"+905321234567",{"type":35,"value":993}," (código de país + número sin cero). En proyectos de Roibase, %40 de datos de teléfono se rechazan por error de formato — debes agregar validación.",{"type":30,"tag":38,"props":995,"children":997},{"id":996},"conversion-api-y-enhanced-conversion-cuál-es-la-diferencia",[998],{"type":35,"value":999},"Conversion API y Enhanced Conversion: ¿Cuál es la Diferencia?",{"type":30,"tag":31,"props":1001,"children":1002},{},[1003],{"type":35,"value":1004},"Meta Conversion API y Google Enhanced Conversion son protocolos diferentes pero cumplen el mismo objetivo: aumentar la tasa de coincidencia de plataforma con first-party data. Conversion API es basado en eventos — cada clic, agregar al carrito, compra es un HTTP POST separado. Enhanced Conversion es basado en tags — data de usuario se envía solo en conversión (compra, registro).",{"type":30,"tag":31,"props":1006,"children":1007},{},[1008],{"type":35,"value":1009},"Configuración de tag de Google Enhanced Conversion en sGTM:",{"type":30,"tag":60,"props":1011,"children":1015},{"code":1012,"language":1013,"meta":14,"className":1014,"style":14},"{\n  \"type\": \"google_ads_remarketing\",\n  \"enhancedConversionData\": {\n    \"email\": \"{{Hashed Email}}\",\n    \"phone\": \"{{Hashed Phone}}\",\n    \"address\": {\n      \"first_name\": \"{{Hashed First Name}}\",\n      \"last_name\": \"{{Hashed Last Name}}\",\n      \"country\": \"ES\",\n      \"postal_code\": \"{{Postal Code}}\"\n    }\n  }\n}\n","json","language-json shiki shiki-themes github-dark",[1016],{"type":30,"tag":67,"props":1017,"children":1018},{"__ignoreMap":14},[1019,1027,1050,1063,1084,1105,1117,1138,1159,1180,1197,1206,1215],{"type":30,"tag":71,"props":1020,"children":1021},{"class":73,"line":74},[1022],{"type":30,"tag":71,"props":1023,"children":1024},{"style":342},[1025],{"type":35,"value":1026},"{\n",{"type":30,"tag":71,"props":1028,"children":1029},{"class":73,"line":106},[1030,1035,1040,1045],{"type":30,"tag":71,"props":1031,"children":1032},{"style":100},[1033],{"type":35,"value":1034},"  \"type\"",{"type":30,"tag":71,"props":1036,"children":1037},{"style":342},[1038],{"type":35,"value":1039},": ",{"type":30,"tag":71,"props":1041,"children":1042},{"style":84},[1043],{"type":35,"value":1044},"\"google_ads_remarketing\"",{"type":30,"tag":71,"props":1046,"children":1047},{"style":342},[1048],{"type":35,"value":1049},",\n",{"type":30,"tag":71,"props":1051,"children":1052},{"class":73,"line":119},[1053,1058],{"type":30,"tag":71,"props":1054,"children":1055},{"style":100},[1056],{"type":35,"value":1057},"  \"enhancedConversionData\"",{"type":30,"tag":71,"props":1059,"children":1060},{"style":342},[1061],{"type":35,"value":1062},": {\n",{"type":30,"tag":71,"props":1064,"children":1065},{"class":73,"line":132},[1066,1071,1075,1080],{"type":30,"tag":71,"props":1067,"children":1068},{"style":100},[1069],{"type":35,"value":1070},"    \"email\"",{"type":30,"tag":71,"props":1072,"children":1073},{"style":342},[1074],{"type":35,"value":1039},{"type":30,"tag":71,"props":1076,"children":1077},{"style":84},[1078],{"type":35,"value":1079},"\"{{Hashed Email}}\"",{"type":30,"tag":71,"props":1081,"children":1082},{"style":342},[1083],{"type":35,"value":1049},{"type":30,"tag":71,"props":1085,"children":1086},{"class":73,"line":145},[1087,1092,1096,1101],{"type":30,"tag":71,"props":1088,"children":1089},{"style":100},[1090],{"type":35,"value":1091},"    \"phone\"",{"type":30,"tag":71,"props":1093,"children":1094},{"style":342},[1095],{"type":35,"value":1039},{"type":30,"tag":71,"props":1097,"children":1098},{"style":84},[1099],{"type":35,"value":1100},"\"{{Hashed Phone}}\"",{"type":30,"tag":71,"props":1102,"children":1103},{"style":342},[1104],{"type":35,"value":1049},{"type":30,"tag":71,"props":1106,"children":1107},{"class":73,"line":158},[1108,1113],{"type":30,"tag":71,"props":1109,"children":1110},{"style":100},[1111],{"type":35,"value":1112},"    \"address\"",{"type":30,"tag":71,"props":1114,"children":1115},{"style":342},[1116],{"type":35,"value":1062},{"type":30,"tag":71,"props":1118,"children":1119},{"class":73,"line":171},[1120,1125,1129,1134],{"type":30,"tag":71,"props":1121,"children":1122},{"style":100},[1123],{"type":35,"value":1124},"      \"first_name\"",{"type":30,"tag":71,"props":1126,"children":1127},{"style":342},[1128],{"type":35,"value":1039},{"type":30,"tag":71,"props":1130,"children":1131},{"style":84},[1132],{"type":35,"value":1133},"\"{{Hashed First Name}}\"",{"type":30,"tag":71,"props":1135,"children":1136},{"style":342},[1137],{"type":35,"value":1049},{"type":30,"tag":71,"props":1139,"children":1140},{"class":73,"line":184},[1141,1146,1150,1155],{"type":30,"tag":71,"props":1142,"children":1143},{"style":100},[1144],{"type":35,"value":1145},"      \"last_name\"",{"type":30,"tag":71,"props":1147,"children":1148},{"style":342},[1149],{"type":35,"value":1039},{"type":30,"tag":71,"props":1151,"children":1152},{"style":84},[1153],{"type":35,"value":1154},"\"{{Hashed Last Name}}\"",{"type":30,"tag":71,"props":1156,"children":1157},{"style":342},[1158],{"type":35,"value":1049},{"type":30,"tag":71,"props":1160,"children":1161},{"class":73,"line":24},[1162,1167,1171,1176],{"type":30,"tag":71,"props":1163,"children":1164},{"style":100},[1165],{"type":35,"value":1166},"      \"country\"",{"type":30,"tag":71,"props":1168,"children":1169},{"style":342},[1170],{"type":35,"value":1039},{"type":30,"tag":71,"props":1172,"children":1173},{"style":84},[1174],{"type":35,"value":1175},"\"ES\"",{"type":30,"tag":71,"props":1177,"children":1178},{"style":342},[1179],{"type":35,"value":1049},{"type":30,"tag":71,"props":1181,"children":1182},{"class":73,"line":957},[1183,1188,1192],{"type":30,"tag":71,"props":1184,"children":1185},{"style":100},[1186],{"type":35,"value":1187},"      \"postal_code\"",{"type":30,"tag":71,"props":1189,"children":1190},{"style":342},[1191],{"type":35,"value":1039},{"type":30,"tag":71,"props":1193,"children":1194},{"style":84},[1195],{"type":35,"value":1196},"\"{{Postal Code}}\"\n",{"type":30,"tag":71,"props":1198,"children":1200},{"class":73,"line":1199},11,[1201],{"type":30,"tag":71,"props":1202,"children":1203},{"style":342},[1204],{"type":35,"value":1205},"    }\n",{"type":30,"tag":71,"props":1207,"children":1209},{"class":73,"line":1208},12,[1210],{"type":30,"tag":71,"props":1211,"children":1212},{"style":342},[1213],{"type":35,"value":1214},"  }\n",{"type":30,"tag":71,"props":1216,"children":1218},{"class":73,"line":1217},13,[1219],{"type":30,"tag":71,"props":1220,"children":1221},{"style":342},[1222],{"type":35,"value":474},{"type":30,"tag":31,"props":1224,"children":1225},{},[1226,1228,1234,1236,1242,1244,1250,1251,1257],{"type":35,"value":1227},"En Meta, el objeto ",{"type":30,"tag":67,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":35,"value":1233},"user_data",{"type":35,"value":1235}," se envía para cada evento — ",{"type":30,"tag":67,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":35,"value":1241},"ViewContent",{"type":35,"value":1243},", ",{"type":30,"tag":67,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":35,"value":1249},"AddToCart",{"type":35,"value":1243},{"type":30,"tag":67,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":35,"value":1256},"Purchase",{"type":35,"value":1258}," todos con los mismos datos hasheados.",{"type":30,"tag":31,"props":1260,"children":1261},{},[1262],{"type":35,"value":1263},"Diferencia práctica: Google Enhanced Conversion solo está activo en el pixel de conversión — si el tráfico es bajo, la tasa de coincidencia permanece baja. Meta CAPI recibe data de usuario en cada evento, la audiencia de retargeting se enriquece más. Por eso en e-commerce, la configuración de Meta CAPI es prioritaria, Google EC es secundario.",{"type":30,"tag":38,"props":1265,"children":1267},{"id":1266},"monitoreo-y-debug-qué-métricas-supervisar",[1268],{"type":35,"value":1269},"Monitoreo y Debug: Qué Métricas Supervisar",{"type":30,"tag":31,"props":1271,"children":1272},{},[1273],{"type":35,"value":1274},"Con stack server-side en producción, sin monitoreo no funciona. En GTM client-side hay modo preview — server-side no existe, debuggeas sobre tráfico en vivo.",{"type":30,"tag":31,"props":1276,"children":1277},{},[1278],{"type":30,"tag":560,"props":1279,"children":1280},{},[1281],{"type":35,"value":1282},"Métricas críticas:",{"type":30,"tag":566,"props":1284,"children":1285},{},[1286,1296,1306,1316],{"type":30,"tag":570,"props":1287,"children":1288},{},[1289,1294],{"type":30,"tag":560,"props":1290,"children":1291},{},[1292],{"type":35,"value":1293},"Conteo de instancias de Cloud Run",{"type":35,"value":1295}," — aunque min=1, en spike de tráfico puede alcanzar 10, configura alerta para control de costos",{"type":30,"tag":570,"props":1297,"children":1298},{},[1299,1304],{"type":30,"tag":560,"props":1300,"children":1301},{},[1302],{"type":35,"value":1303},"Tiempo de respuesta P95",{"type":35,"value":1305}," — por encima de 500ms comienza pérdida de conversiones, especialmente en páginas de checkout",{"type":30,"tag":570,"props":1307,"children":1308},{},[1309,1314],{"type":30,"tag":560,"props":1310,"children":1311},{},[1312],{"type":35,"value":1313},"Puntuación Meta Event Match Quality",{"type":35,"value":1315}," (verificación manual en Events Manager) — si está por debajo %80, faltan datos de usuario",{"type":30,"tag":570,"props":1317,"children":1318},{},[1319,1324],{"type":30,"tag":560,"props":1320,"children":1321},{},[1322],{"type":35,"value":1323},"Relación server event count \u002F client event count en GA4",{"type":35,"value":1325}," — idealmente 1.1-1.3 (server ve ligeramente más), por debajo de 0.8 hay error del servidor",{"type":30,"tag":31,"props":1327,"children":1328},{},[1329],{"type":35,"value":1330},"Query de Cloud Logging:",{"type":30,"tag":60,"props":1332,"children":1336},{"code":1333,"language":1334,"meta":14,"className":1335,"style":14},"resource.type=\"cloud_run_revision\"\nresource.labels.service_name=\"sgtm-prod\"\njsonPayload.event_name=\"purchase\"\nseverity=\"ERROR\"\n","sql","language-sql shiki shiki-themes github-dark",[1337],{"type":30,"tag":67,"props":1338,"children":1339},{"__ignoreMap":14},[1340,1366,1396,1422],{"type":30,"tag":71,"props":1341,"children":1342},{"class":73,"line":74},[1343,1348,1352,1357,1361],{"type":30,"tag":71,"props":1344,"children":1345},{"style":100},[1346],{"type":35,"value":1347},"resource",{"type":30,"tag":71,"props":1349,"children":1350},{"style":342},[1351],{"type":35,"value":313},{"type":30,"tag":71,"props":1353,"children":1354},{"style":100},[1355],{"type":35,"value":1356},"type",{"type":30,"tag":71,"props":1358,"children":1359},{"style":220},[1360],{"type":35,"value":363},{"type":30,"tag":71,"props":1362,"children":1363},{"style":84},[1364],{"type":35,"value":1365},"\"cloud_run_revision\"\n",{"type":30,"tag":71,"props":1367,"children":1368},{"class":73,"line":106},[1369,1373,1377,1382,1386,1391],{"type":30,"tag":71,"props":1370,"children":1371},{"style":100},[1372],{"type":35,"value":1347},{"type":30,"tag":71,"props":1374,"children":1375},{"style":342},[1376],{"type":35,"value":313},{"type":30,"tag":71,"props":1378,"children":1379},{"style":100},[1380],{"type":35,"value":1381},"labels",{"type":30,"tag":71,"props":1383,"children":1384},{"style":342},[1385],{"type":35,"value":313},{"type":30,"tag":71,"props":1387,"children":1388},{"style":220},[1389],{"type":35,"value":1390},"service_name=",{"type":30,"tag":71,"props":1392,"children":1393},{"style":84},[1394],{"type":35,"value":1395},"\"sgtm-prod\"\n",{"type":30,"tag":71,"props":1397,"children":1398},{"class":73,"line":119},[1399,1404,1408,1413,1417],{"type":30,"tag":71,"props":1400,"children":1401},{"style":100},[1402],{"type":35,"value":1403},"jsonPayload",{"type":30,"tag":71,"props":1405,"children":1406},{"style":342},[1407],{"type":35,"value":313},{"type":30,"tag":71,"props":1409,"children":1410},{"style":100},[1411],{"type":35,"value":1412},"event_name",{"type":30,"tag":71,"props":1414,"children":1415},{"style":220},[1416],{"type":35,"value":363},{"type":30,"tag":71,"props":1418,"children":1419},{"style":84},[1420],{"type":35,"value":1421},"\"purchase\"\n",{"type":30,"tag":71,"props":1423,"children":1424},{"class":73,"line":132},[1425,1430,1434],{"type":30,"tag":71,"props":1426,"children":1427},{"style":342},[1428],{"type":35,"value":1429},"severity",{"type":30,"tag":71,"props":1431,"children":1432},{"style":220},[1433],{"type":35,"value":363},{"type":30,"tag":71,"props":1435,"children":1436},{"style":84},[1437],{"type":35,"value":1438},"\"ERROR\"\n",{"type":30,"tag":31,"props":1440,"children":1441},{},[1442,1444,1450,1452,1458],{"type":35,"value":1443},"Los logs de error en GTM no se escriben con ",{"type":30,"tag":67,"props":1445,"children":1447},{"className":1446},[],[1448],{"type":35,"value":1449},"console.log",{"type":35,"value":1451}," — debes usar API ",{"type":30,"tag":67,"props":1453,"children":1455},{"className":1454},[],[1456],{"type":35,"value":1457},"logToConsole()",{"type":35,"value":1459},", que escribe en Cloud Logging.",{"type":30,"tag":31,"props":1461,"children":1462},{},[1463],{"type":35,"value":1464},"Esquema de tabla de log en BigQuery:",{"type":30,"tag":1466,"props":1467,"children":1468},"table",{},[1469,1493],{"type":30,"tag":1470,"props":1471,"children":1472},"thead",{},[1473],{"type":30,"tag":1474,"props":1475,"children":1476},"tr",{},[1477,1483,1488],{"type":30,"tag":1478,"props":1479,"children":1480},"th",{},[1481],{"type":35,"value":1482},"Campo",{"type":30,"tag":1478,"props":1484,"children":1485},{},[1486],{"type":35,"value":1487},"Tipo",{"type":30,"tag":1478,"props":1489,"children":1490},{},[1491],{"type":35,"value":1492},"Descripción",{"type":30,"tag":1494,"props":1495,"children":1496},"tbody",{},[1497,1516,1533,1550,1566,1582,1599],{"type":30,"tag":1474,"props":1498,"children":1499},{},[1500,1506,1511],{"type":30,"tag":1501,"props":1502,"children":1503},"td",{},[1504],{"type":35,"value":1505},"event_timestamp",{"type":30,"tag":1501,"props":1507,"children":1508},{},[1509],{"type":35,"value":1510},"TIMESTAMP",{"type":30,"tag":1501,"props":1512,"children":1513},{},[1514],{"type":35,"value":1515},"Tiempo del servidor (UTC)",{"type":30,"tag":1474,"props":1517,"children":1518},{},[1519,1523,1528],{"type":30,"tag":1501,"props":1520,"children":1521},{},[1522],{"type":35,"value":1412},{"type":30,"tag":1501,"props":1524,"children":1525},{},[1526],{"type":35,"value":1527},"STRING",{"type":30,"tag":1501,"props":1529,"children":1530},{},[1531],{"type":35,"value":1532},"purchase, add_to_cart, etc.",{"type":30,"tag":1474,"props":1534,"children":1535},{},[1536,1541,1545],{"type":30,"tag":1501,"props":1537,"children":1538},{},[1539],{"type":35,"value":1540},"user_id",{"type":30,"tag":1501,"props":1542,"children":1543},{},[1544],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1546,"children":1547},{},[1548],{"type":35,"value":1549},"Hasheado",{"type":30,"tag":1474,"props":1551,"children":1552},{},[1553,1557,1561],{"type":30,"tag":1501,"props":1554,"children":1555},{},[1556],{"type":35,"value":505},{"type":30,"tag":1501,"props":1558,"children":1559},{},[1560],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1562,"children":1563},{},[1564],{"type":35,"value":1565},"GA4 client ID",{"type":30,"tag":1474,"props":1567,"children":1568},{},[1569,1573,1577],{"type":30,"tag":1501,"props":1570,"children":1571},{},[1572],{"type":35,"value":282},{"type":30,"tag":1501,"props":1574,"children":1575},{},[1576],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1578,"children":1579},{},[1580],{"type":35,"value":1581},"ID de dedup",{"type":30,"tag":1474,"props":1583,"children":1584},{},[1585,1590,1594],{"type":30,"tag":1501,"props":1586,"children":1587},{},[1588],{"type":35,"value":1589},"platform",{"type":30,"tag":1501,"props":1591,"children":1592},{},[1593],{"type":35,"value":1527},{"type":30,"tag":1501,"props":1595,"children":1596},{},[1597],{"type":35,"value":1598},"meta, google_ads, snapchat",{"type":30,"tag":1474,"props":1600,"children":1601},{},[1602,1607,1612],{"type":30,"tag":1501,"props":1603,"children":1604},{},[1605],{"type":35,"value":1606},"response_code",{"type":30,"tag":1501,"props":1608,"children":1609},{},[1610],{"type":35,"value":1611},"INTEGER",{"type":30,"tag":1501,"props":1613,"children":1614},{},[1615],{"type":35,"value":1616},"Estado HTTP",{"type":30,"tag":31,"props":1618,"children":1619},{},[1620,1622,1631],{"type":35,"value":1621},"Esta tabla se escribe en tu data warehouse de BigQuery según ",{"type":30,"tag":1623,"props":1624,"children":1628},"a",{"href":1625,"rel":1626},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Ffirstparty",[1627],"nofollow",[1629],{"type":35,"value":1630},"Arquitectura de Datos de Primera Parte & Medición",{"type":35,"value":1632},", vinculada a modelos downstream con dbt (atribución, predicción de LTV).",{"type":30,"tag":38,"props":1634,"children":1636},{"id":1635},"consent-mode-v2-y-server-side-cómo-integrar",[1637],{"type":35,"value":1638},"Consent Mode v2 y Server-Side: Cómo Integrar",{"type":30,"tag":31,"props":1640,"children":1641},{},[1642,1644,1650,1652,1658],{"type":35,"value":1643},"Desde marzo de 2024, Google Consent Mode v2 es obligatorio en EEA — el estado de consentimiento ",{"type":30,"tag":67,"props":1645,"children":1647},{"className":1646},[],[1648],{"type":35,"value":1649},"ad_storage",{"type":35,"value":1651}," y ",{"type":30,"tag":67,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":35,"value":1657},"analytics_storage",{"type":35,"value":1659}," debe enviarse con cada hit. Server-side no recibe esta información de GTM client-side, la envías manualmente.",{"type":30,"tag":31,"props":1661,"children":1662},{},[1663],{"type":35,"value":1664},"Hay dos enfoques:",{"type":30,"tag":1666,"props":1667,"children":1668},"ol",{},[1669,1687],{"type":30,"tag":570,"props":1670,"children":1671},{},[1672,1677,1679,1685],{"type":30,"tag":560,"props":1673,"children":1674},{},[1675],{"type":35,"value":1676},"Parámetro de query:",{"type":35,"value":1678}," ",{"type":30,"tag":67,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":35,"value":1684},"sgtm.example.com\u002Fg\u002Fcollect?consent=granted",{"type":35,"value":1686}," — fácil pero visible en URL, problemas de cache",{"type":30,"tag":570,"props":1688,"children":1689},{},[1690,1695,1696,1702],{"type":30,"tag":560,"props":1691,"children":1692},{},[1693],{"type":35,"value":1694},"HTTP header:",{"type":35,"value":1678},{"type":30,"tag":67,"props":1697,"children":1699},{"className":1698},[],[1700],{"type":35,"value":1701},"X-Consent-Status: analytics_storage=granted,ad_storage=denied",{"type":35,"value":1703}," — método preferido",{"type":30,"tag":31,"props":1705,"children":1706},{},[1707],{"type":35,"value":1708},"Variable personalizada en sGTM:",{"type":30,"tag":60,"props":1710,"children":1712},{"code":1711,"language":317,"meta":14,"className":318,"style":14},"const getRequestHeader = require('getRequestHeader');\nconst consentHeader = getRequestHeader('x-consent-status');\n\nif (!consentHeader) return {analytics_storage: 'denied', ad_storage: 'denied'};\n\nconst pairs = consentHeader.split(',');\nconst consent = {};\npairs.forEach(pair => {\n  const [key, value] = pair.split('=');\n  consent[key.trim()] = value.trim();\n});\n\nreturn consent;\n",[1713],{"type":30,"tag":67,"props":1714,"children":1715},{"__ignoreMap":14},[1716,1749,1782,1789,1837,1844,1883,1904,1937,1995,2030,2038,2045],{"type":30,"tag":71,"props":1717,"children":1718},{"class":73,"line":74},[1719,1723,1728,1732,1736,1740,1745],{"type":30,"tag":71,"props":1720,"children":1721},{"style":220},[1722],{"type":35,"value":736},{"type":30,"tag":71,"props":1724,"children":1725},{"style":100},[1726],{"type":35,"value":1727}," getRequestHeader",{"type":30,"tag":71,"props":1729,"children":1730},{"style":220},[1731],{"type":35,"value":746},{"type":30,"tag":71,"props":1733,"children":1734},{"style":78},[1735],{"type":35,"value":751},{"type":30,"tag":71,"props":1737,"children":1738},{"style":342},[1739],{"type":35,"value":756},{"type":30,"tag":71,"props":1741,"children":1742},{"style":84},[1743],{"type":35,"value":1744},"'getRequestHeader'",{"type":30,"tag":71,"props":1746,"children":1747},{"style":342},[1748],{"type":35,"value":434},{"type":30,"tag":71,"props":1750,"children":1751},{"class":73,"line":106},[1752,1756,1761,1765,1769,1773,1778],{"type":30,"tag":71,"props":1753,"children":1754},{"style":220},[1755],{"type":35,"value":736},{"type":30,"tag":71,"props":1757,"children":1758},{"style":100},[1759],{"type":35,"value":1760}," consentHeader",{"type":30,"tag":71,"props":1762,"children":1763},{"style":220},[1764],{"type":35,"value":746},{"type":30,"tag":71,"props":1766,"children":1767},{"style":78},[1768],{"type":35,"value":1727},{"type":30,"tag":71,"props":1770,"children":1771},{"style":342},[1772],{"type":35,"value":756},{"type":30,"tag":71,"props":1774,"children":1775},{"style":84},[1776],{"type":35,"value":1777},"'x-consent-status'",{"type":30,"tag":71,"props":1779,"children":1780},{"style":342},[1781],{"type":35,"value":434},{"type":30,"tag":71,"props":1783,"children":1784},{"class":73,"line":119},[1785],{"type":30,"tag":71,"props":1786,"children":1787},{"emptyLinePlaceholder":804},[1788],{"type":35,"value":807},{"type":30,"tag":71,"props":1790,"children":1791},{"class":73,"line":132},[1792,1796,1800,1804,1809,1813,1818,1823,1828,1832],{"type":30,"tag":71,"props":1793,"children":1794},{"style":220},[1795],{"type":35,"value":848},{"type":30,"tag":71,"props":1797,"children":1798},{"style":342},[1799],{"type":35,"value":853},{"type":30,"tag":71,"props":1801,"children":1802},{"style":220},[1803],{"type":35,"value":858},{"type":30,"tag":71,"props":1805,"children":1806},{"style":342},[1807],{"type":35,"value":1808},"consentHeader) ",{"type":30,"tag":71,"props":1810,"children":1811},{"style":220},[1812],{"type":35,"value":868},{"type":30,"tag":71,"props":1814,"children":1815},{"style":342},[1816],{"type":35,"value":1817}," {analytics_storage: ",{"type":30,"tag":71,"props":1819,"children":1820},{"style":84},[1821],{"type":35,"value":1822},"'denied'",{"type":30,"tag":71,"props":1824,"children":1825},{"style":342},[1826],{"type":35,"value":1827},", ad_storage: ",{"type":30,"tag":71,"props":1829,"children":1830},{"style":84},[1831],{"type":35,"value":1822},{"type":30,"tag":71,"props":1833,"children":1834},{"style":342},[1835],{"type":35,"value":1836},"};\n",{"type":30,"tag":71,"props":1838,"children":1839},{"class":73,"line":145},[1840],{"type":30,"tag":71,"props":1841,"children":1842},{"emptyLinePlaceholder":804},[1843],{"type":35,"value":807},{"type":30,"tag":71,"props":1845,"children":1846},{"class":73,"line":158},[1847,1851,1856,1860,1865,1870,1874,1879],{"type":30,"tag":71,"props":1848,"children":1849},{"style":220},[1850],{"type":35,"value":736},{"type":30,"tag":71,"props":1852,"children":1853},{"style":100},[1854],{"type":35,"value":1855}," pairs",{"type":30,"tag":71,"props":1857,"children":1858},{"style":220},[1859],{"type":35,"value":746},{"type":30,"tag":71,"props":1861,"children":1862},{"style":342},[1863],{"type":35,"value":1864}," consentHeader.",{"type":30,"tag":71,"props":1866,"children":1867},{"style":78},[1868],{"type":35,"value":1869},"split",{"type":30,"tag":71,"props":1871,"children":1872},{"style":342},[1873],{"type":35,"value":756},{"type":30,"tag":71,"props":1875,"children":1876},{"style":84},[1877],{"type":35,"value":1878},"','",{"type":30,"tag":71,"props":1880,"children":1881},{"style":342},[1882],{"type":35,"value":434},{"type":30,"tag":71,"props":1884,"children":1885},{"class":73,"line":171},[1886,1890,1895,1899],{"type":30,"tag":71,"props":1887,"children":1888},{"style":220},[1889],{"type":35,"value":736},{"type":30,"tag":71,"props":1891,"children":1892},{"style":100},[1893],{"type":35,"value":1894}," consent",{"type":30,"tag":71,"props":1896,"children":1897},{"style":220},[1898],{"type":35,"value":746},{"type":30,"tag":71,"props":1900,"children":1901},{"style":342},[1902],{"type":35,"value":1903}," {};\n",{"type":30,"tag":71,"props":1905,"children":1906},{"class":73,"line":184},[1907,1912,1917,1921,1927,1932],{"type":30,"tag":71,"props":1908,"children":1909},{"style":342},[1910],{"type":35,"value":1911},"pairs.",{"type":30,"tag":71,"props":1913,"children":1914},{"style":78},[1915],{"type":35,"value":1916},"forEach",{"type":30,"tag":71,"props":1918,"children":1919},{"style":342},[1920],{"type":35,"value":756},{"type":30,"tag":71,"props":1922,"children":1924},{"style":1923},"--shiki-default:#FFAB70",[1925],{"type":35,"value":1926},"pair",{"type":30,"tag":71,"props":1928,"children":1929},{"style":220},[1930],{"type":35,"value":1931}," =>",{"type":30,"tag":71,"props":1933,"children":1934},{"style":342},[1935],{"type":35,"value":1936}," {\n",{"type":30,"tag":71,"props":1938,"children":1939},{"class":73,"line":24},[1940,1945,1950,1955,1959,1964,1969,1973,1978,1982,1986,1991],{"type":30,"tag":71,"props":1941,"children":1942},{"style":220},[1943],{"type":35,"value":1944},"  const",{"type":30,"tag":71,"props":1946,"children":1947},{"style":342},[1948],{"type":35,"value":1949}," [",{"type":30,"tag":71,"props":1951,"children":1952},{"style":100},[1953],{"type":35,"value":1954},"key",{"type":30,"tag":71,"props":1956,"children":1957},{"style":342},[1958],{"type":35,"value":1243},{"type":30,"tag":71,"props":1960,"children":1961},{"style":100},[1962],{"type":35,"value":1963},"value",{"type":30,"tag":71,"props":1965,"children":1966},{"style":342},[1967],{"type":35,"value":1968},"] ",{"type":30,"tag":71,"props":1970,"children":1971},{"style":220},[1972],{"type":35,"value":363},{"type":30,"tag":71,"props":1974,"children":1975},{"style":342},[1976],{"type":35,"value":1977}," pair.",{"type":30,"tag":71,"props":1979,"children":1980},{"style":78},[1981],{"type":35,"value":1869},{"type":30,"tag":71,"props":1983,"children":1984},{"style":342},[1985],{"type":35,"value":756},{"type":30,"tag":71,"props":1987,"children":1988},{"style":84},[1989],{"type":35,"value":1990},"'='",{"type":30,"tag":71,"props":1992,"children":1993},{"style":342},[1994],{"type":35,"value":434},{"type":30,"tag":71,"props":1996,"children":1997},{"class":73,"line":957},[1998,2003,2007,2012,2016,2021,2025],{"type":30,"tag":71,"props":1999,"children":2000},{"style":342},[2001],{"type":35,"value":2002},"  consent[key.",{"type":30,"tag":71,"props":2004,"children":2005},{"style":78},[2006],{"type":35,"value":949},{"type":30,"tag":71,"props":2008,"children":2009},{"style":342},[2010],{"type":35,"value":2011},"()] ",{"type":30,"tag":71,"props":2013,"children":2014},{"style":220},[2015],{"type":35,"value":363},{"type":30,"tag":71,"props":2017,"children":2018},{"style":342},[2019],{"type":35,"value":2020}," value.",{"type":30,"tag":71,"props":2022,"children":2023},{"style":78},[2024],{"type":35,"value":949},{"type":30,"tag":71,"props":2026,"children":2027},{"style":342},[2028],{"type":35,"value":2029},"();\n",{"type":30,"tag":71,"props":2031,"children":2032},{"class":73,"line":1199},[2033],{"type":30,"tag":71,"props":2034,"children":2035},{"style":342},[2036],{"type":35,"value":2037},"});\n",{"type":30,"tag":71,"props":2039,"children":2040},{"class":73,"line":1208},[2041],{"type":30,"tag":71,"props":2042,"children":2043},{"emptyLinePlaceholder":804},[2044],{"type":35,"value":807},{"type":30,"tag":71,"props":2046,"children":2047},{"class":73,"line":1217},[2048,2052],{"type":30,"tag":71,"props":2049,"children":2050},{"style":220},[2051],{"type":35,"value":868},{"type":30,"tag":71,"props":2053,"children":2054},{"style":342},[2055],{"type":35,"value":2056}," consent;\n",{"type":30,"tag":31,"props":2058,"children":2059},{},[2060,2062,2068,2069,2075,2077,2082],{"type":35,"value":2061},"Mapeas esta variable a tus tags de GA4 y Google Ads. En Meta CAPI no existe parámetro de consent — control indirecto vía ",{"type":30,"tag":67,"props":2063,"children":2065},{"className":2064},[],[2066],{"type":35,"value":2067},"action_source",{"type":35,"value":1039},{"type":30,"tag":67,"props":2070,"children":2072},{"className":2071},[],[2073],{"type":35,"value":2074},"action_source=website",{"type":35,"value":2076}," significa consentimiento presente, ",{"type":30,"tag":67,"props":2078,"children":2080},{"className":2079},[],[2081],{"type":35,"value":656},{"type":35,"value":2083}," es modo agregado (sin consentimiento pero attributable como offline).",{"type":30,"tag":38,"props":2085,"children":2087},{"id":2086},"qué-testear-la-primera-semana",[2088],{"type":35,"value":2089},"Qué Testear la Primera Semana",{"type":30,"tag":31,"props":2091,"children":2092},{},[2093],{"type":35,"value":2094},"Es obligatorio ejecutar en paralelo: los pixels client-side siguen, el server-side corre junto. Durante dos semanas supervisa ambos, luego apaga client-side.",{"type":30,"tag":31,"props":2096,"children":2097},{},[2098],{"type":30,"tag":560,"props":2099,"children":2100},{},[2101],{"type":35,"value":2102},"Checklist de test:",{"type":30,"tag":566,"props":2104,"children":2107},{"className":2105},[2106],"contains-task-list",[2108,2120,2129,2138,2147,2156],{"type":30,"tag":570,"props":2109,"children":2112},{"className":2110},[2111],"task-list-item",[2113,2118],{"type":30,"tag":2114,"props":2115,"children":2117},"input",{"disabled":804,"type":2116},"checkbox",[],{"type":35,"value":2119}," ¿El conteo de eventos en Meta Events Manager está ±%10 respecto a client-side?",{"type":30,"tag":570,"props":2121,"children":2123},{"className":2122},[2111],[2124,2127],{"type":30,"tag":2114,"props":2125,"children":2126},{"disabled":804,"type":2116},[],{"type":35,"value":2128}," ¿Hay caída en conteo de sesiones en GA4? (server-side debe ver más)",{"type":30,"tag":570,"props":2130,"children":2132},{"className":2131},[2111],[2133,2136],{"type":30,"tag":2114,"props":2134,"children":2135},{"disabled":804,"type":2116},[],{"type":35,"value":2137}," ¿El conteo de conversiones en Google Ads cambió? (Enhanced Conversion esperado +%8-15)",{"type":30,"tag":570,"props":2139,"children":2141},{"className":2140},[2111],[2142,2145],{"type":30,"tag":2114,"props":2143,"children":2144},{"disabled":804,"type":2116},[],{"type":35,"value":2146}," ¿El costo de Cloud Run superó $50\u002Fmes? (normal $30-40 para 1M eventos\u002Fmes)",{"type":30,"tag":570,"props":2148,"children":2150},{"className":2149},[2111],[2151,2154],{"type":30,"tag":2114,"props":2152,"children":2153},{"disabled":804,"type":2116},[],{"type":35,"value":2155}," ¿Funciona dedup — hay advertencias de eventos duplicados en Meta Test Events?",{"type":30,"tag":570,"props":2157,"children":2159},{"className":2158},[2111],[2160,2163],{"type":30,"tag":2114,"props":2161,"children":2162},{"disabled":804,"type":2116},[],{"type":35,"value":2164}," ¿El conteo diario de eventos en tabla BigQuery coincide con analytics frontend?",{"type":30,"tag":31,"props":2166,"children":2167},{},[2168],{"type":35,"value":2169},"Problemas garantizados la primera semana: error de formato en hash de data de usuario (%30-40 eventos), falta de header de consent (%15-20), pérdida inicial de conversiones por cold start de Cloud Run (si min-instances=0). Por eso nunca actives stack nuevo durante Black Friday — estabiliza con tráfico normal primero.",{"type":30,"tag":38,"props":2171,"children":2173},{"id":2172},"stack-de-producción-qué-hacer-ahora",[2174],{"type":35,"value":2175},"Stack de Producción: Qué Hacer Ahora",{"type":30,"tag":31,"props":2177,"children":2178},{},[2179],{"type":35,"value":2180},"La medición server-side en 2026 ya no es \"experimental\" sino \"estándar\". Confiar solo en pixel client-side significa %20-30 pérdida de conversiones — especialmente en iOS y usuarios conscientes de privacidad. En clientes de Roibase, la migración a sGTM + Conversion API resulta en +%18 tracking de conversiones promedio, +%12 mejora de ROAS — porque la plataforma puede optimizar más precisamente.",{"type":30,"tag":31,"props":2182,"children":2183},{},[2184],{"type":35,"value":2185},"Para empezar: configura un container de test en Cloud Run, ejecútalo en paralelo con client-side una semana, lleva la puntuación Meta Event Match Quality por encima del %80. Luego apaga client-side en producción. Con template ya preparado, este proceso toma 3-5 días; desde cero, 2-3 semanas. En stack de Roibase el tiempo de deployment estándar es 1 semana — porque template, monitoreo, integración de BigQuery ya están listos.",{"type":30,"tag":2187,"props":2188,"children":2189},"style",{},[2190],{"type":35,"value":2191},"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":14,"searchDepth":119,"depth":119,"links":2193},[2194,2195,2196,2199,2200,2201,2202,2203],{"id":40,"depth":106,"text":43},{"id":268,"depth":106,"text":271},{"id":547,"depth":106,"text":550,"children":2197},[2198],{"id":705,"depth":119,"text":708},{"id":996,"depth":106,"text":999},{"id":1266,"depth":106,"text":1269},{"id":1635,"depth":106,"text":1638},{"id":2086,"depth":106,"text":2089},{"id":2172,"depth":106,"text":2175},"markdown","content:es:data:server-side-gtm-conversion-api-production.md","content","es\u002Fdata\u002Fserver-side-gtm-conversion-api-production.md","es\u002Fdata\u002Fserver-side-gtm-conversion-api-production","md",1782050762300]