[{"data":1,"prerenderedAt":1031},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fes\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero":13},{"i18nKey":4,"paths":5},"marketing-001-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Fmarketing\u002Fserver-side-conversions-meta-capi-richtig-einrichten","\u002Fen\u002Fmarketing\u002Fserver-side-conversions-setting-up-meta-capi-correctly","\u002Fes\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero","\u002Ffr\u002Fmarketing\u002Fconfigurer-api-conversions-meta-capi-zero-a-heros","\u002Fit\u002Fmarketing\u002Fconfigurare-conversion-api-meta-da-zero","\u002Fru\u002Fmarketing\u002Fserver-side-conversions-meta-capi-sglm-setup","\u002Ftr\u002Fmarketing\u002Fserver-side-conversions-meta-capiyi-sifirdan-dogru-kurmak",{"_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":1025,"_id":1026,"_source":1027,"_file":1028,"_stem":1029,"_extension":1030},"marketing",false,"","Conversiones del Lado del Servidor: Configurar Meta CAPI Correctamente desde Cero","Arquitectura sGTM + Conversion API, calidad de coincidencia de eventos, estrategias de deduplicación y pipeline de datos de primera parte para atribución post-iOS 17.","2026-05-07",[21,22,23,24,25],"conversion-api","server-side-gtm","attribution","meta-ads","first-party-data",8,"Roibase",{"type":29,"children":30,"toc":1016},"root",[31,39,46,92,144,150,155,160,246,292,298,339,500,513,664,699,705,724,729,776,795,807,813,818,836,842,863,882,888,926,944,962,972,997,1010],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","Desde iOS 14.5, el poder de medición del píxel basado en navegador ha disminuido entre 40–60%. Según datos de Meta Q4 2025, el score promedio de Event Match Quality (EMQ) de anunciantes sin CAPI está por debajo de 3.8\u002F10. Esto significa que el algoritmo tiene muy pocas señales para optimizar. La primera fase del mundo sin cookies la perdieron los rastreadores del lado del navegador. La segunda fase—donde la arquitectura del lado del servidor está bien implementada o apenas esquemáticamente montada—está ocurriendo ahora. Configurar Meta Conversion API correctamente a través de sGTM ya no es opcional; es un requisito de infraestructura en marketing de rendimiento.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"por-qué-la-diferencia-entre-píxel-y-capi-es-crítica",[44],{"type":37,"value":45},"Por qué la diferencia entre píxel y CAPI es crítica",{"type":32,"tag":33,"props":47,"children":48},{},[49,51,58,60,66,68,74,76,82,84,90],{"type":37,"value":50},"Meta Pixel se ejecuta en el navegador. Depende del consentimiento del usuario, no puede filtrar tráfico bot, se ve afectado por latencia de red. CAPI, en cambio, envía POST HTTP directo desde el servidor a Meta. Hay dos diferencias clave: timing y calidad de datos. El píxel dispara un evento ",{"type":32,"tag":52,"props":53,"children":55},"code",{"className":54},[],[56],{"type":37,"value":57},"PageView",{"type":37,"value":59}," cuando el usuario carga la página; CAPI puede enviar el mismo evento desde el backend después de completar checkout. Esta diferencia de tiempo es la base de la deduplicación—Meta necesita fusionar el mismo evento procedente de dos fuentes. La segunda diferencia: con CAPI, tú controlas los identificadores de usuario. Si no hash'eas correctamente ",{"type":32,"tag":52,"props":61,"children":63},{"className":62},[],[64],{"type":37,"value":65},"em",{"type":37,"value":67}," (email hash), ",{"type":32,"tag":52,"props":69,"children":71},{"className":70},[],[72],{"type":37,"value":73},"ph",{"type":37,"value":75}," (teléfono hash), ",{"type":32,"tag":52,"props":77,"children":79},{"className":78},[],[80],{"type":37,"value":81},"fbc",{"type":37,"value":83}," (Facebook click ID), ",{"type":32,"tag":52,"props":85,"children":87},{"className":86},[],[88],{"type":37,"value":89},"fbp",{"type":37,"value":91}," (browser ID) y los envías, el Event Match Quality cae. Un EMQ bajo significa que el algoritmo no entiende al 100% qué usuario disparó qué evento. Esto empobrece la optimización de pujas. En el whitepaper 2024 de Meta, CAPI + Píxel juntos mostraron un incremento promedio de 13% en ROAS (n=4200 anunciantes, ventana de 60 días). Pero esta mejora solo ocurre si la deduplicación se configura correctamente.",{"type":32,"tag":33,"props":93,"children":94},{},[95,97,103,105,111,113,119,121,127,129,135,137,142],{"type":37,"value":96},"Desactivar el píxel e ir solo con CAPI también es un error. El píxel del navegador captura eventos intermedios como ",{"type":32,"tag":52,"props":98,"children":100},{"className":99},[],[101],{"type":37,"value":102},"ViewContent",{"type":37,"value":104},", ",{"type":32,"tag":52,"props":106,"children":108},{"className":107},[],[109],{"type":37,"value":110},"AddToCart",{"type":37,"value":112}," en tiempo real; CAPI generalmente se usa solo para ",{"type":32,"tag":52,"props":114,"children":116},{"className":115},[],[117],{"type":37,"value":118},"Purchase",{"type":37,"value":120},". Necesitas encontrar el medio: mantener el píxel ligero y enviar conversiones críticas doblemente a través de CAPI. Aquí es donde entran los parámetros de deduplicación. El sistema de Meta examina la combinación ",{"type":32,"tag":52,"props":122,"children":124},{"className":123},[],[125],{"type":37,"value":126},"event_id",{"type":37,"value":128}," + ",{"type":32,"tag":52,"props":130,"children":132},{"className":131},[],[133],{"type":37,"value":134},"event_time",{"type":37,"value":136}," para evitar contar el mismo evento dos veces. Pero si no pasas estos parámetros exactamente igual tanto al píxel como a CAPI, la deduplicación no funciona. La mayoría de implementaciones fallan aquí: el frontend genera ",{"type":32,"tag":52,"props":138,"children":140},{"className":139},[],[141],{"type":37,"value":126},{"type":37,"value":143}," con UUID, el backend lo envía con un ID diferente. Resultado: se detectan como dos eventos separados, y los reportes de ROAS se inflan.",{"type":32,"tag":40,"props":145,"children":147},{"id":146},"pasos-para-configurar-la-infraestructura-sgtm",[148],{"type":37,"value":149},"Pasos para configurar la infraestructura sGTM",{"type":32,"tag":33,"props":151,"children":152},{},[153],{"type":37,"value":154},"Sin Google Tag Manager del lado del servidor, es posible configurar CAPI—puedes hacer POST directo desde tu backend a Meta. Pero este enfoque genera problemas al escalar. Cuando añades múltiples destinos (Google Ads Enhanced Conversions, TikTok Events API, Snapchat CAPI), necesitas escribir un endpoint diferente para cada uno. sGTM actúa como capa de abstracción: un contenedor de servidor único maneja todas tus necesidades de tagging. Se aloja en Google Cloud Run o App Engine. Captura request HTTP desde tu contenedor GTM del lado del cliente, dispara tags del lado del servidor, luego envía POST en paralelo a Meta, Google, TikTok.",{"type":32,"tag":33,"props":156,"children":157},{},[158],{"type":37,"value":159},"El flujo de configuración es así:",{"type":32,"tag":161,"props":162,"children":163},"ol",{},[164,184,210,220],{"type":32,"tag":165,"props":166,"children":167},"li",{},[168,174,176,182],{"type":32,"tag":169,"props":170,"children":171},"strong",{},[172],{"type":37,"value":173},"Crea una instancia de Cloud Run:",{"type":37,"value":175}," ",{"type":32,"tag":52,"props":177,"children":179},{"className":178},[],[180],{"type":37,"value":181},"gcloud run deploy gtm-server --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable --platform=managed --region=europe-west1",{"type":37,"value":183},". Este comando despliega la imagen sGTM oficial de Google.",{"type":32,"tag":165,"props":185,"children":186},{},[187,192,194,200,202,208],{"type":32,"tag":169,"props":188,"children":189},{},[190],{"type":37,"value":191},"Obtén la URL del servidor de tagging:",{"type":37,"value":193}," Tras completar el despliegue, recibirás una URL como ",{"type":32,"tag":52,"props":195,"children":197},{"className":196},[],[198],{"type":37,"value":199},"https:\u002F\u002Fgtm-server-xxxxx-ew.a.run.app",{"type":37,"value":201},". Configurarás esta URL en tu GTM del lado del cliente como parámetro ",{"type":32,"tag":52,"props":203,"children":205},{"className":204},[],[206],{"type":37,"value":207},"serverContainerUrl",{"type":37,"value":209},".",{"type":32,"tag":165,"props":211,"children":212},{},[213,218],{"type":32,"tag":169,"props":214,"children":215},{},[216],{"type":37,"value":217},"Modifica el tag GA4 en GTM del lado del cliente:",{"type":37,"value":219}," Normalmente, los eventos GA4 van directo a Google. Si estableces la URL de transporte como tu sGTM, los datos GA4 fluyen primero a tu servidor, luego a Google. Esto también te permite hacer normalización de IP y user-agent en el servidor.",{"type":32,"tag":165,"props":221,"children":222},{},[223,228,230,236,238,244],{"type":32,"tag":169,"props":224,"children":225},{},[226],{"type":37,"value":227},"Añade el tag Meta CAPI en el contenedor sGTM:",{"type":37,"value":229}," Usa la plantilla \"Meta Conversions API\". Ingresa ",{"type":32,"tag":52,"props":231,"children":233},{"className":232},[],[234],{"type":37,"value":235},"Pixel ID",{"type":37,"value":237}," y ",{"type":32,"tag":52,"props":239,"children":241},{"className":240},[],[242],{"type":37,"value":243},"Access Token",{"type":37,"value":245},". Obtendrás el Access Token desde Events Manager > Settings > Conversions API. Aquí puedes enviar un evento de prueba para verificar la conexión.",{"type":32,"tag":33,"props":247,"children":248},{},[249,251,257,259,265,267,272,274,279,281,290],{"type":37,"value":250},"Una ventaja de sGTM: ambos GA4 y CAPI pueden recibir eventos desde la misma request. Un ",{"type":32,"tag":52,"props":252,"children":254},{"className":253},[],[255],{"type":37,"value":256},"dataLayer.push",{"type":37,"value":258}," del lado del cliente que dispara un trigger del lado del servidor puede activar dos tags diferentes. De este modo, no necesitas escribir dos llamadas API separadas en tu backend. Pero aquí hay un punto crítico: el ",{"type":32,"tag":52,"props":260,"children":262},{"className":261},[],[263],{"type":37,"value":264},"client_id",{"type":37,"value":266}," de GA4 no es lo mismo que el ",{"type":32,"tag":52,"props":268,"children":270},{"className":269},[],[271],{"type":37,"value":89},{"type":37,"value":273}," que Meta requiere. Por eso necesitas crear una variable de transformación en tu contenedor sGTM—tomar la cookie ",{"type":32,"tag":52,"props":275,"children":277},{"className":276},[],[278],{"type":37,"value":89},{"type":37,"value":280}," y mapearla al tag CAPI. Este mapeo requiere ",{"type":32,"tag":282,"props":283,"children":287},"a",{"href":284,"rel":285},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fppc",[286],"nofollow",[288],{"type":37,"value":289},"arquitectura de datos de primera parte",{"type":37,"value":291},"; sin ella, los identificadores se dessincronizan y el EMQ cae.",{"type":32,"tag":40,"props":293,"children":295},{"id":294},"elevar-la-calidad-de-coincidencia-de-eventos",[296],{"type":37,"value":297},"Elevar la calidad de coincidencia de eventos",{"type":32,"tag":33,"props":299,"children":300},{},[301,303,308,310,315,317,323,325,330,332,337],{"type":37,"value":302},"EMQ es el score de confianza de Meta: \"¿puedo atribuir este evento a este usuario?\" Máximo 10. Por encima de 8 es excelente, por debajo de 6 es problemático. Lo que sube EMQ es la combinación correcta de identificadores. Según la documentación de Meta, el orden de prioridad es: ",{"type":32,"tag":52,"props":304,"children":306},{"className":305},[],[307],{"type":37,"value":65},{"type":37,"value":309}," (email) > ",{"type":32,"tag":52,"props":311,"children":313},{"className":312},[],[314],{"type":37,"value":73},{"type":37,"value":316}," (teléfono) > ",{"type":32,"tag":52,"props":318,"children":320},{"className":319},[],[321],{"type":37,"value":322},"external_id",{"type":37,"value":324}," (CRM ID) > ",{"type":32,"tag":52,"props":326,"children":328},{"className":327},[],[329],{"type":37,"value":81},{"type":37,"value":331}," > ",{"type":32,"tag":52,"props":333,"children":335},{"className":334},[],[336],{"type":37,"value":89},{"type":37,"value":338},". Hash email y teléfono con SHA-256, convierte a minúsculas, sin espacios en blanco. Ejemplo:",{"type":32,"tag":340,"props":341,"children":345},"pre",{"className":342,"code":343,"language":344,"meta":16,"style":16},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Hash incorrecto\nconst email = \" John@Example.com \";\nconst hash = sha256(email); \u002F\u002F Espacios y mayúsculas son un problema\n\n\u002F\u002F Hash correcto\nconst email = \"john@example.com\";\nconst hash = sha256(email); \u002F\u002F SHA-256: a665a...\n","javascript",[346],{"type":32,"tag":52,"props":347,"children":348},{"__ignoreMap":16},[349,361,394,427,437,446,471],{"type":32,"tag":350,"props":351,"children":354},"span",{"class":352,"line":353},"line",1,[355],{"type":32,"tag":350,"props":356,"children":358},{"style":357},"--shiki-default:#6A737D",[359],{"type":37,"value":360},"\u002F\u002F Hash incorrecto\n",{"type":32,"tag":350,"props":362,"children":364},{"class":352,"line":363},2,[365,371,377,382,388],{"type":32,"tag":350,"props":366,"children":368},{"style":367},"--shiki-default:#F97583",[369],{"type":37,"value":370},"const",{"type":32,"tag":350,"props":372,"children":374},{"style":373},"--shiki-default:#79B8FF",[375],{"type":37,"value":376}," email",{"type":32,"tag":350,"props":378,"children":379},{"style":367},[380],{"type":37,"value":381}," =",{"type":32,"tag":350,"props":383,"children":385},{"style":384},"--shiki-default:#9ECBFF",[386],{"type":37,"value":387}," \" John@Example.com \"",{"type":32,"tag":350,"props":389,"children":391},{"style":390},"--shiki-default:#E1E4E8",[392],{"type":37,"value":393},";\n",{"type":32,"tag":350,"props":395,"children":397},{"class":352,"line":396},3,[398,402,407,411,417,422],{"type":32,"tag":350,"props":399,"children":400},{"style":367},[401],{"type":37,"value":370},{"type":32,"tag":350,"props":403,"children":404},{"style":373},[405],{"type":37,"value":406}," hash",{"type":32,"tag":350,"props":408,"children":409},{"style":367},[410],{"type":37,"value":381},{"type":32,"tag":350,"props":412,"children":414},{"style":413},"--shiki-default:#B392F0",[415],{"type":37,"value":416}," sha256",{"type":32,"tag":350,"props":418,"children":419},{"style":390},[420],{"type":37,"value":421},"(email); ",{"type":32,"tag":350,"props":423,"children":424},{"style":357},[425],{"type":37,"value":426},"\u002F\u002F Espacios y mayúsculas son un problema\n",{"type":32,"tag":350,"props":428,"children":430},{"class":352,"line":429},4,[431],{"type":32,"tag":350,"props":432,"children":434},{"emptyLinePlaceholder":433},true,[435],{"type":37,"value":436},"\n",{"type":32,"tag":350,"props":438,"children":440},{"class":352,"line":439},5,[441],{"type":32,"tag":350,"props":442,"children":443},{"style":357},[444],{"type":37,"value":445},"\u002F\u002F Hash correcto\n",{"type":32,"tag":350,"props":447,"children":449},{"class":352,"line":448},6,[450,454,458,462,467],{"type":32,"tag":350,"props":451,"children":452},{"style":367},[453],{"type":37,"value":370},{"type":32,"tag":350,"props":455,"children":456},{"style":373},[457],{"type":37,"value":376},{"type":32,"tag":350,"props":459,"children":460},{"style":367},[461],{"type":37,"value":381},{"type":32,"tag":350,"props":463,"children":464},{"style":384},[465],{"type":37,"value":466}," \"john@example.com\"",{"type":32,"tag":350,"props":468,"children":469},{"style":390},[470],{"type":37,"value":393},{"type":32,"tag":350,"props":472,"children":474},{"class":352,"line":473},7,[475,479,483,487,491,495],{"type":32,"tag":350,"props":476,"children":477},{"style":367},[478],{"type":37,"value":370},{"type":32,"tag":350,"props":480,"children":481},{"style":373},[482],{"type":37,"value":406},{"type":32,"tag":350,"props":484,"children":485},{"style":367},[486],{"type":37,"value":381},{"type":32,"tag":350,"props":488,"children":489},{"style":413},[490],{"type":37,"value":416},{"type":32,"tag":350,"props":492,"children":493},{"style":390},[494],{"type":37,"value":421},{"type":32,"tag":350,"props":496,"children":497},{"style":357},[498],{"type":37,"value":499},"\u002F\u002F SHA-256: a665a...\n",{"type":32,"tag":33,"props":501,"children":502},{},[503,505,511],{"type":37,"value":504},"En el request CAPI, el objeto ",{"type":32,"tag":52,"props":506,"children":508},{"className":507},[],[509],{"type":37,"value":510},"user_data",{"type":37,"value":512}," debe verse así:",{"type":32,"tag":340,"props":514,"children":518},{"className":515,"code":516,"language":517,"meta":16,"style":16},"language-json shiki shiki-themes github-dark","{\n  \"em\": [\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"],\n  \"ph\": [\"sha256_hash_telefono\"],\n  \"fbc\": \"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\",\n  \"fbp\": \"fb.1.1558571054389.1098115397\",\n  \"client_ip_address\": \"93.184.216.34\",\n  \"client_user_agent\": \"Mozilla\u002F5.0...\"\n}\n","json",[519],{"type":32,"tag":52,"props":520,"children":521},{"__ignoreMap":16},[522,530,553,574,597,618,639,656],{"type":32,"tag":350,"props":523,"children":524},{"class":352,"line":353},[525],{"type":32,"tag":350,"props":526,"children":527},{"style":390},[528],{"type":37,"value":529},"{\n",{"type":32,"tag":350,"props":531,"children":532},{"class":352,"line":363},[533,538,543,548],{"type":32,"tag":350,"props":534,"children":535},{"style":373},[536],{"type":37,"value":537},"  \"em\"",{"type":32,"tag":350,"props":539,"children":540},{"style":390},[541],{"type":37,"value":542},": [",{"type":32,"tag":350,"props":544,"children":545},{"style":384},[546],{"type":37,"value":547},"\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"",{"type":32,"tag":350,"props":549,"children":550},{"style":390},[551],{"type":37,"value":552},"],\n",{"type":32,"tag":350,"props":554,"children":555},{"class":352,"line":396},[556,561,565,570],{"type":32,"tag":350,"props":557,"children":558},{"style":373},[559],{"type":37,"value":560},"  \"ph\"",{"type":32,"tag":350,"props":562,"children":563},{"style":390},[564],{"type":37,"value":542},{"type":32,"tag":350,"props":566,"children":567},{"style":384},[568],{"type":37,"value":569},"\"sha256_hash_telefono\"",{"type":32,"tag":350,"props":571,"children":572},{"style":390},[573],{"type":37,"value":552},{"type":32,"tag":350,"props":575,"children":576},{"class":352,"line":429},[577,582,587,592],{"type":32,"tag":350,"props":578,"children":579},{"style":373},[580],{"type":37,"value":581},"  \"fbc\"",{"type":32,"tag":350,"props":583,"children":584},{"style":390},[585],{"type":37,"value":586},": ",{"type":32,"tag":350,"props":588,"children":589},{"style":384},[590],{"type":37,"value":591},"\"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\"",{"type":32,"tag":350,"props":593,"children":594},{"style":390},[595],{"type":37,"value":596},",\n",{"type":32,"tag":350,"props":598,"children":599},{"class":352,"line":439},[600,605,609,614],{"type":32,"tag":350,"props":601,"children":602},{"style":373},[603],{"type":37,"value":604},"  \"fbp\"",{"type":32,"tag":350,"props":606,"children":607},{"style":390},[608],{"type":37,"value":586},{"type":32,"tag":350,"props":610,"children":611},{"style":384},[612],{"type":37,"value":613},"\"fb.1.1558571054389.1098115397\"",{"type":32,"tag":350,"props":615,"children":616},{"style":390},[617],{"type":37,"value":596},{"type":32,"tag":350,"props":619,"children":620},{"class":352,"line":448},[621,626,630,635],{"type":32,"tag":350,"props":622,"children":623},{"style":373},[624],{"type":37,"value":625},"  \"client_ip_address\"",{"type":32,"tag":350,"props":627,"children":628},{"style":390},[629],{"type":37,"value":586},{"type":32,"tag":350,"props":631,"children":632},{"style":384},[633],{"type":37,"value":634},"\"93.184.216.34\"",{"type":32,"tag":350,"props":636,"children":637},{"style":390},[638],{"type":37,"value":596},{"type":32,"tag":350,"props":640,"children":641},{"class":352,"line":473},[642,647,651],{"type":32,"tag":350,"props":643,"children":644},{"style":373},[645],{"type":37,"value":646},"  \"client_user_agent\"",{"type":32,"tag":350,"props":648,"children":649},{"style":390},[650],{"type":37,"value":586},{"type":32,"tag":350,"props":652,"children":653},{"style":384},[654],{"type":37,"value":655},"\"Mozilla\u002F5.0...\"\n",{"type":32,"tag":350,"props":657,"children":658},{"class":352,"line":26},[659],{"type":32,"tag":350,"props":660,"children":661},{"style":390},[662],{"type":37,"value":663},"}\n",{"type":32,"tag":33,"props":665,"children":666},{},[667,669,675,677,682,684,690,692,697],{"type":37,"value":668},"sGTM captura automáticamente IP y user-agent, pero en algunos entornos de hosting (proxy Cloudflare), necesitarás parsear el header ",{"type":32,"tag":52,"props":670,"children":672},{"className":671},[],[673],{"type":37,"value":674},"X-Forwarded-For",{"type":37,"value":676},". El parámetro ",{"type":32,"tag":52,"props":678,"children":680},{"className":679},[],[681],{"type":37,"value":81},{"type":37,"value":683}," es el Facebook Click ID—cuando un usuario hace clic en un anuncio de Meta, la URL contiene ",{"type":32,"tag":52,"props":685,"children":687},{"className":686},[],[688],{"type":37,"value":689},"fbclid=...",{"type":37,"value":691},". Si escribes este valor en una cookie y lo envías a CAPI, cierras el loop de atribución. La mayoría de implementaciones omite ",{"type":32,"tag":52,"props":693,"children":695},{"className":694},[],[696],{"type":37,"value":81},{"type":37,"value":698},", resultando en que Meta no sepa qué anuncio disparó la conversión. EMQ se queda en 4.2.",{"type":32,"tag":40,"props":700,"children":702},{"id":701},"estrategia-de-deduplicación",[703],{"type":37,"value":704},"Estrategia de deduplicación",{"type":32,"tag":33,"props":706,"children":707},{},[708,710,715,717,722],{"type":37,"value":709},"Cuando el mismo evento ",{"type":32,"tag":52,"props":711,"children":713},{"className":712},[],[714],{"type":37,"value":118},{"type":37,"value":716}," llega tanto del píxel como de CAPI, para que Meta lo cuente como un único evento, el ",{"type":32,"tag":52,"props":718,"children":720},{"className":719},[],[721],{"type":37,"value":126},{"type":37,"value":723}," debe ser idéntico. Típicamente se usa UUID v4. Pero si se genera en el frontend, debe transportarse al backend. Solución: incluir el event_id como input oculto en el formulario de checkout o guardarlo en localStorage. Cuando el backend completa el pedido, toma ese mismo ID y lo pone en el request CAPI. La diferencia de tiempo debe estar dentro de 48 horas (ventana de dedup de Meta). Si supera 48 horas, se cuentan como dos eventos separados.",{"type":32,"tag":33,"props":725,"children":726},{},[727],{"type":37,"value":728},"Flujo de ejemplo:",{"type":32,"tag":161,"props":730,"children":731},{},[732,753,771],{"type":32,"tag":165,"props":733,"children":734},{},[735,737,743,745,751],{"type":37,"value":736},"El usuario hace clic en \"Comprar\" → el píxel dispara ",{"type":32,"tag":52,"props":738,"children":740},{"className":739},[],[741],{"type":37,"value":742},"InitiateCheckout",{"type":37,"value":744}," (event_id: ",{"type":32,"tag":52,"props":746,"children":748},{"className":747},[],[749],{"type":37,"value":750},"evt_12345",{"type":37,"value":752},", event_time: 1683820800)",{"type":32,"tag":165,"props":754,"children":755},{},[756,758,763,764,769],{"type":37,"value":757},"El backend valida el pago → CAPI envía ",{"type":32,"tag":52,"props":759,"children":761},{"className":760},[],[762],{"type":37,"value":118},{"type":37,"value":744},{"type":32,"tag":52,"props":765,"children":767},{"className":766},[],[768],{"type":37,"value":750},{"type":37,"value":770},", event_time: 1683820802)",{"type":32,"tag":165,"props":772,"children":773},{},[774],{"type":37,"value":775},"Meta ve ambos eventos, los event_id coinciden, diferencia de 2 segundos → procesa como un único evento.",{"type":32,"tag":33,"props":777,"children":778},{},[779,781,786,788,793],{"type":37,"value":780},"Sin esta configuración, el ",{"type":32,"tag":52,"props":782,"children":784},{"className":783},[],[785],{"type":37,"value":118},{"type":37,"value":787}," del píxel y el ",{"type":32,"tag":52,"props":789,"children":791},{"className":790},[],[792],{"type":37,"value":118},{"type":37,"value":794}," de CAPI se cuentan doblemente. En los reportes de ROAS, la cifra de conversiones se infla 2x. Ves \"100 conversiones\" pero realmente hay 50. Si no lo detectas, la asignación de presupuesto será incorrecta.",{"type":32,"tag":33,"props":796,"children":797},{},[798,800,805],{"type":37,"value":799},"En algunos casos, el evento del píxel se pierde completamente (ad blocker, sin consentimiento). Entonces CAPI funciona solo. Sin dedup, no hay problema. Pero si el evento del píxel llega con retraso (el usuario estuvo offline, el navegador envió el evento en cola 10 minutos después) y el event_id es incorrecto, Meta lo cuenta como nuevo evento. Para manejar este edge case, fija el ",{"type":32,"tag":52,"props":801,"children":803},{"className":802},[],[804],{"type":37,"value":134},{"type":37,"value":806}," del servidor en el timestamp de pedido del backend—no en la hora del navegador del usuario.",{"type":32,"tag":40,"props":808,"children":810},{"id":809},"incrementalidad-y-prueba-de-capi",[811],{"type":37,"value":812},"Incrementalidad y prueba de CAPI",{"type":32,"tag":33,"props":814,"children":815},{},[816],{"type":37,"value":817},"Una vez configurado CAPI, reportar \"EMQ 8.5, dedup funcionando\" no es suficiente. La pregunta real es: ¿ocurrirían estas conversiones sin CAPI? Para medirlo, necesitas geo-based holdout test o conversion lift study. Meta tiene su propia herramienta Conversion Lift, pero el threshold de gasto mínimo es alto ($30k+). Alternativa: un A\u002FB test simple. Mitad del tráfico con CAPI activo, mitad sin. Después de 14 días, observa el ROAS incremental. Si el grupo con CAPI rinde 15% mejor, la infraestructura ha probado su valor.",{"type":32,"tag":33,"props":819,"children":820},{},[821,823,828,829,834],{"type":37,"value":822},"Otra métrica: ver attribution windows. Con CAPI, la confiabilidad de atribución de click de 7 días aumenta porque los eventos post-click vienen del backend, no son bot. En píxel, el tráfico bot está entre 8–12%. En CAPI, con IP whitelist del servidor, cae por debajo de 1%. Esto significa que la optimización de campaña trabaja con señales más limpias. Según resultados de prueba, algunos anunciantes han desactivado el píxel completamente, continuando solo con CAPI (especialmente en B2B lead gen). Pero esta estrategia es riesgosa para ecommerce porque pierdes señales ",{"type":32,"tag":52,"props":824,"children":826},{"className":825},[],[827],{"type":37,"value":102},{"type":37,"value":237},{"type":32,"tag":52,"props":830,"children":832},{"className":831},[],[833],{"type":37,"value":110},{"type":37,"value":835},", debilitando tus audiencias de retargeting dinámico.",{"type":32,"tag":40,"props":837,"children":839},{"id":838},"nivel-avanzado-eventos-personalizados-y-conversiones-offline",[840],{"type":37,"value":841},"Nivel avanzado: eventos personalizados y conversiones offline",{"type":32,"tag":33,"props":843,"children":844},{},[845,847,853,855,861],{"type":37,"value":846},"Meta CAPI no se limita a eventos estándar. Puedes definir eventos personalizados y enviarlos desde el backend. Por ejemplo, ",{"type":32,"tag":52,"props":848,"children":850},{"className":849},[],[851],{"type":37,"value":852},"SubscriptionRenewal",{"type":37,"value":854}," o ",{"type":32,"tag":52,"props":856,"children":858},{"className":857},[],[859],{"type":37,"value":860},"TrialStarted",{"type":37,"value":862},". Declara estos eventos como conversiones personalizadas y asignalos al objetivo de optimización de campaña. Especialmente en modelos SaaS, es posible enviar eventos a largo plazo (retención de 90 días, upsell) vía CAPI e incluirlos en tu estrategia de pujas para optimizar LTV. Similar a la importación de conversiones offline de Google Ads.",{"type":32,"tag":33,"props":864,"children":865},{},[866,868,873,875,880],{"type":37,"value":867},"Escenario de conversión offline: el usuario completa un formulario de lead online, el equipo de ventas cierra el deal por teléfono 5 días después. Exportas ese deal desde el CRM y lo envías a CAPI como ",{"type":32,"tag":52,"props":869,"children":871},{"className":870},[],[872],{"type":37,"value":118},{"type":37,"value":874},". En este caso, ",{"type":32,"tag":52,"props":876,"children":878},{"className":877},[],[879],{"type":37,"value":134},{"type":37,"value":881}," será una fecha pasada. Meta acepta eventos retroactivos hasta 62 días. Pero el impacto en el algoritmo de atribución es limitado porque la optimización se hace sobre señales en tiempo real. Aun así, es necesario para precisión en reportes. Automatiza la integración CRM-CAPI con Zapier o n8n; cada \"Closed Won\" nuevo dispara un POST a CAPI.",{"type":32,"tag":40,"props":883,"children":885},{"id":884},"errores-comunes-y-soluciones",[886],{"type":37,"value":887},"Errores comunes y soluciones",{"type":32,"tag":33,"props":889,"children":890},{},[891,903,905,910,912,918,920,925],{"type":32,"tag":169,"props":892,"children":893},{},[894,896,901],{"type":37,"value":895},"1. Parámetro ",{"type":32,"tag":52,"props":897,"children":899},{"className":898},[],[900],{"type":37,"value":81},{"type":37,"value":902}," faltante:",{"type":37,"value":904}," Cuando el usuario hace clic en un anuncio de Meta, el URL contiene ",{"type":32,"tag":52,"props":906,"children":908},{"className":907},[],[909],{"type":37,"value":689},{"type":37,"value":911},". Si no escribes este valor en cookie, no puedes enviarlo a CAPI. Solución: crea una variable cookie en GTM con nombre ",{"type":32,"tag":52,"props":913,"children":915},{"className":914},[],[916],{"type":37,"value":917},"_fbc",{"type":37,"value":919},", configura 90 días de persistencia. En el tag CAPI, mapea esta variable al parámetro ",{"type":32,"tag":52,"props":921,"children":923},{"className":922},[],[924],{"type":37,"value":81},{"type":37,"value":209},{"type":32,"tag":33,"props":927,"children":928},{},[929,934,936,942],{"type":32,"tag":169,"props":930,"children":931},{},[932],{"type":37,"value":933},"2. Hash de email incorrecto:",{"type":37,"value":935}," Si quedan espacios o mayúsculas, el hash no coincide. Normaliza todas las strings con ",{"type":32,"tag":52,"props":937,"children":939},{"className":938},[],[940],{"type":37,"value":941},"trim().toLowerCase()",{"type":37,"value":943},", luego aplica SHA-256.",{"type":32,"tag":33,"props":945,"children":946},{},[947,952,954,960],{"type":32,"tag":169,"props":948,"children":949},{},[950],{"type":37,"value":951},"3. No cambiar de modo de prueba a producción:",{"type":37,"value":953}," En Events Manager, la pestaña \"Test Events\" muestra eventos pero el tráfico real no se envía. Elimina el parámetro ",{"type":32,"tag":52,"props":955,"children":957},{"className":956},[],[958],{"type":37,"value":959},"test_event_code",{"type":37,"value":961},", usa el token de producción.",{"type":32,"tag":33,"props":963,"children":964},{},[965,970],{"type":32,"tag":169,"props":966,"children":967},{},[968],{"type":37,"value":969},"4. No revisar logs del contenedor de servidor:",{"type":37,"value":971}," En los logs de Cloud Run de sGTM, ves respuestas CAPI. Si algo distinto de 200 OK (401, 400), el token o payload están mal.",{"type":32,"tag":33,"props":973,"children":974},{},[975,980,982,988,990,996],{"type":32,"tag":169,"props":976,"children":977},{},[978],{"type":37,"value":979},"5. Tipo de dato incompatible entre píxel y CAPI:",{"type":37,"value":981}," El píxel envía ",{"type":32,"tag":52,"props":983,"children":985},{"className":984},[],[986],{"type":37,"value":987},"value",{"type":37,"value":989}," como float, CAPI como integer. Meta puede redondear la moneda. Solución: en ambos lados, usa ",{"type":32,"tag":52,"props":991,"children":993},{"className":992},[],[994],{"type":37,"value":995},"value: parseFloat(orderTotal).toFixed(2)",{"type":37,"value":209},{"type":32,"tag":33,"props":998,"children":999},{},[1000,1002,1008],{"type":37,"value":1001},"Un punto final: la configuración de CAPI no es algo que se haga una vez y se olvide. Actualizaciones de iOS, cambios en versión de API de Meta, nuevos tipos de identificadores (como ",{"type":32,"tag":52,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":37,"value":1007},"anon_id",{"type":37,"value":1009}," que entró en beta en 2025) requieren mantenimiento continuo. Monitorea EMQ mensualmente; si cae por debajo de 8, revisa tu mapeo de identificadores. También monitorea tu tasa de deduplicación: idealmente debería ser >95% (es decir, 95% de tus eventos píxel+CAPI se deduplican exitosamente). No puedes ver esta métrica en Meta Events Manager; necesitas construir tu propio pipeline de logs—escribe IDs de request de sGTM en BigQuery y compara.",{"type":32,"tag":1011,"props":1012,"children":1013},"style",{},[1014],{"type":37,"value":1015},"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":396,"depth":396,"links":1017},[1018,1019,1020,1021,1022,1023,1024],{"id":42,"depth":363,"text":45},{"id":146,"depth":363,"text":149},{"id":294,"depth":363,"text":297},{"id":701,"depth":363,"text":704},{"id":809,"depth":363,"text":812},{"id":838,"depth":363,"text":841},{"id":884,"depth":363,"text":887},"markdown","content:es:marketing:configurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero.md","content","es\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero.md","es\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero","md",1778164175891]