[{"data":1,"prerenderedAt":3463},["ShallowReactive",2],{"article-alternates":3,"latest-es":4,"cat-counts-es":3461},null,[5,1018,1995],{"_path":6,"_dir":7,"_draft":8,"_partial":8,"_locale":9,"title":10,"description":11,"publishedAt":12,"modifiedAt":12,"category":7,"i18nKey":13,"tags":14,"readingTime":20,"author":21,"body":22,"_type":139,"_id":1013,"_source":1014,"_file":1015,"_stem":1016,"_extension":1017},"\u002Fes\u002Fai\u002Fposicionar-marca-respuesta-chatgpt","ai",false,"","GEO: Posicionar tu Marca en la Respuesta de ChatGPT","Arquitectura de contenido, ingeniería de prompts y estrategias de datos propios para visibilidad en AI Overviews y citaciones LLM — la nueva frontera del SEO post-2025.","2026-05-07","ai-001-2026-05",[15,16,17,18,19],"geo","citacion-llm","ai-overviews","arquitectura-contenido","ingenieria-prompts",8,"Roibase",{"type":23,"children":24,"toc":1005},"root",[25,41,48,53,65,70,76,88,109,129,134,277,282,288,308,320,343,387,393,412,471,847,852,858,870,882,951,957,969,974,994,999],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30,33,39],{"type":31,"value":32},"text","Google lanzó AI Overviews, ChatGPT pilotea SearchGPT, Perplexity captura tráfico con pantallas de citación. En 2026, el 35% de los usuarios formula preguntas iniciando en interfaz LLM, no en SERP clásica. Aquí emerge la nueva frontera del SEO: ",{"type":26,"tag":34,"props":35,"children":36},"strong",{},[37],{"type":31,"value":38},"Generative Engine Optimization (GEO)",{"type":31,"value":40},". No optimizar para motor de búsqueda, sino para motor de respuesta. En este artículo exploramos los principios fundamentales de GEO, la mecánica de citaciones LLM y estrategias para anclar tu marca dentro del prompt.",{"type":26,"tag":42,"props":43,"children":45},"h2",{"id":44},"mecánica-de-citaciones-llm-el-retrieval-tras-la-respuesta",[46],{"type":31,"value":47},"Mecánica de Citaciones LLM — El Retrieval tras la Respuesta",{"type":26,"tag":27,"props":49,"children":50},{},[51],{"type":31,"value":52},"Los LLM se alimentan de dos fuentes cuando generan respuestas: (1) memoria paramétrica (pesos del modelo), (2) documentos extraídos via retrieval-augmented generation (RAG). En modo web search de ChatGPT, Perplexity y Google Gemini-based overviews, el mecanismo es RAG: la pregunta del usuario se convierte en embedding, se extraen los 5-10 documentos más relevantes por similitud vectorial, el modelo integra ese contexto en el prompt y genera la respuesta. La citación referencia esos documentos extraídos.",{"type":26,"tag":27,"props":54,"children":55},{},[56,58,63],{"type":31,"value":57},"El punto crítico: ",{"type":26,"tag":34,"props":59,"children":60},{},[61],{"type":31,"value":62},"similitud de embedding + autoridad semántica",{"type":31,"value":64},". El modelo prioriza contenido cercano al embedding de la consulta y con score de confiabilidad elevado. ¿De dónde viene ese score? OpenAI y Google no lo detallan, pero las señales conocidas son: (1) autoridad del dominio (PageRank-like), (2) estructura del contenido (title, description, schema.org), (3) actualidad, (4) densidad de citación (qué tan frecuentemente otros sitios lo referencia). El E-E-A-T de SEO (Experience, Expertise, Authoritativeness, Trustworthiness) sigue vigente aquí, pero el mecanismo de medición difiere — en GEO, la autoridad se codifica en el espacio de embedding.",{"type":26,"tag":27,"props":66,"children":67},{},[68],{"type":31,"value":69},"En nuestro análisis GEO observamos un patrón consistente: Google AI Overviews toma 3-4 fuentes de los primeros 10 resultados. ChatGPT SearchGPT selecciona de un rango más amplio (top 20-30). Perplexity fuerza diversidad de dominio — citaciones múltiples del mismo sitio son raras. Esto obliga una estrategia diferente a \"conquistar posición 1\" en SEO clásico: ahora es \"estar en los primeros 30 + ajustar fit semántico + embedding\".",{"type":26,"tag":42,"props":71,"children":73},{"id":72},"arquitectura-de-contenido-estructura-amigable-con-prompts",[74],{"type":31,"value":75},"Arquitectura de Contenido — Estructura Amigable con Prompts",{"type":26,"tag":27,"props":77,"children":78},{},[79,81,86],{"type":31,"value":80},"Para que un LLM cite tu contenido, debe ser \"fácilmente integrable en el contexto del prompt\". Esto difiere de la lógica \"keyword density\" del SEO clásico — aquí juega la eficiencia de tokens y claridad semántica. Primera regla: ",{"type":26,"tag":34,"props":82,"children":83},{},[84],{"type":31,"value":85},"entrega la respuesta en los primeros 200 tokens",{"type":31,"value":87},". Los LLM toman el primer chunk de cada documento recuperado (típicamente 512-1024 tokens). Si tu respuesta está en el párrafo 4, ese chunk podría no entrar en la ventana de contexto.",{"type":26,"tag":27,"props":89,"children":90},{},[91,93,98,100,107],{"type":31,"value":92},"Segunda regla: ",{"type":26,"tag":34,"props":94,"children":95},{},[96],{"type":31,"value":97},"estructura como pares pregunta-respuesta",{"type":31,"value":99},". Los LLM codifican mejor el formato FAQ porque el matching query-documento es más limpio. Ejemplo: en lugar de un artículo titulado \"¿Qué es GTM server-side?\", usa un título específico: \"¿Cuándo es obligatorio implementar GTM server-side?\". Schema.org ",{"type":26,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":31,"value":106},"FAQPage",{"type":31,"value":108}," es una señal extra — Google lo prioriza en AI Overviews.",{"type":26,"tag":27,"props":110,"children":111},{},[112,114,119,121,127],{"type":31,"value":113},"Tercera regla: ",{"type":26,"tag":34,"props":115,"children":116},{},[117],{"type":31,"value":118},"densidad semántica, no repetición de keywords",{"type":31,"value":120},". En modelos de embedding LLM (ej: OpenAI ",{"type":26,"tag":101,"props":122,"children":124},{"className":123},[],[125],{"type":31,"value":126},"text-embedding-3-large",{"type":31,"value":128},"), repetir la misma palabra no genera mucha variación en el espacio de embedding. En su lugar, expande el espacio semántico: en lugar de \"conversion tracking\", distribuye \"seguimiento de conversiones, atribución, medición, señales first-party\". Esto amplía el vector de embedding en un área más grande del espacio de consulta.",{"type":26,"tag":27,"props":130,"children":131},{},[132],{"type":31,"value":133},"Ejemplo de estructura de contenido optimizada para GEO:",{"type":26,"tag":135,"props":136,"children":140},"pre",{"className":137,"code":138,"language":139,"meta":9,"style":9},"language-markdown shiki shiki-themes github-dark","---\nschema: FAQPage\n---\n\n## {Pregunta específica como título — cercana a query LLM}\n\n{Esencia de respuesta — primeras 2 oraciones, 40-50 tokens}\n\n{Párrafo de detalle — profundidad técnica, pero token-eficiente}\n\n### {Subtítulo — expansión semántica}\n\n{Conceptos relacionados, términos afines, ampliación del espacio de embedding}\n\n{Ejemplo concreto o código snippet — señal de autoridad}\n","markdown",[141],{"type":26,"tag":101,"props":142,"children":143},{"__ignoreMap":9},[144,156,166,174,184,193,201,210,217,226,234,243,251,260,268],{"type":26,"tag":145,"props":146,"children":149},"span",{"class":147,"line":148},"line",1,[150],{"type":26,"tag":145,"props":151,"children":153},{"style":152},"--shiki-default:#79B8FF;--shiki-default-font-weight:bold",[154],{"type":31,"value":155},"---\n",{"type":26,"tag":145,"props":157,"children":159},{"class":147,"line":158},2,[160],{"type":26,"tag":145,"props":161,"children":163},{"style":162},"--shiki-default:#E1E4E8",[164],{"type":31,"value":165},"schema: FAQPage\n",{"type":26,"tag":145,"props":167,"children":169},{"class":147,"line":168},3,[170],{"type":26,"tag":145,"props":171,"children":172},{"style":152},[173],{"type":31,"value":155},{"type":26,"tag":145,"props":175,"children":177},{"class":147,"line":176},4,[178],{"type":26,"tag":145,"props":179,"children":181},{"emptyLinePlaceholder":180},true,[182],{"type":31,"value":183},"\n",{"type":26,"tag":145,"props":185,"children":187},{"class":147,"line":186},5,[188],{"type":26,"tag":145,"props":189,"children":190},{"style":152},[191],{"type":31,"value":192},"## {Pregunta específica como título — cercana a query LLM}\n",{"type":26,"tag":145,"props":194,"children":196},{"class":147,"line":195},6,[197],{"type":26,"tag":145,"props":198,"children":199},{"emptyLinePlaceholder":180},[200],{"type":31,"value":183},{"type":26,"tag":145,"props":202,"children":204},{"class":147,"line":203},7,[205],{"type":26,"tag":145,"props":206,"children":207},{"style":162},[208],{"type":31,"value":209},"{Esencia de respuesta — primeras 2 oraciones, 40-50 tokens}\n",{"type":26,"tag":145,"props":211,"children":212},{"class":147,"line":20},[213],{"type":26,"tag":145,"props":214,"children":215},{"emptyLinePlaceholder":180},[216],{"type":31,"value":183},{"type":26,"tag":145,"props":218,"children":220},{"class":147,"line":219},9,[221],{"type":26,"tag":145,"props":222,"children":223},{"style":162},[224],{"type":31,"value":225},"{Párrafo de detalle — profundidad técnica, pero token-eficiente}\n",{"type":26,"tag":145,"props":227,"children":229},{"class":147,"line":228},10,[230],{"type":26,"tag":145,"props":231,"children":232},{"emptyLinePlaceholder":180},[233],{"type":31,"value":183},{"type":26,"tag":145,"props":235,"children":237},{"class":147,"line":236},11,[238],{"type":26,"tag":145,"props":239,"children":240},{"style":152},[241],{"type":31,"value":242},"### {Subtítulo — expansión semántica}\n",{"type":26,"tag":145,"props":244,"children":246},{"class":147,"line":245},12,[247],{"type":26,"tag":145,"props":248,"children":249},{"emptyLinePlaceholder":180},[250],{"type":31,"value":183},{"type":26,"tag":145,"props":252,"children":254},{"class":147,"line":253},13,[255],{"type":26,"tag":145,"props":256,"children":257},{"style":162},[258],{"type":31,"value":259},"{Conceptos relacionados, términos afines, ampliación del espacio de embedding}\n",{"type":26,"tag":145,"props":261,"children":263},{"class":147,"line":262},14,[264],{"type":26,"tag":145,"props":265,"children":266},{"emptyLinePlaceholder":180},[267],{"type":31,"value":183},{"type":26,"tag":145,"props":269,"children":271},{"class":147,"line":270},15,[272],{"type":26,"tag":145,"props":273,"children":274},{"style":162},[275],{"type":31,"value":276},"{Ejemplo concreto o código snippet — señal de autoridad}\n",{"type":26,"tag":27,"props":278,"children":279},{},[280],{"type":31,"value":281},"Para eficiencia de tokens, es crítico: sin frases de relleno, cada oración porta una señal nueva. Elimina \"En este artículo explicaremos...\" — vé directo a la información. Los LLM tienen ventanas de contexto de 128k tokens, pero el chunk extraído en retrieval es limitado — los primeros 200 tokens son decisivos.",{"type":26,"tag":42,"props":283,"children":285},{"id":284},"ingeniería-de-prompts-incrustando-tu-marca-en-el-system-prompt",[286],{"type":31,"value":287},"Ingeniería de Prompts — Incrustando tu Marca en el System Prompt",{"type":26,"tag":27,"props":289,"children":290},{},[291,293,298,300,306],{"type":31,"value":292},"El arma secreta de GEO: ",{"type":26,"tag":34,"props":294,"children":295},{},[296],{"type":31,"value":297},"datos propios y formato de contenido singular",{"type":31,"value":299},". Mientras LLM rastrean la web pública, tienes que hacer que referencias a tu dataset único (estudios de caso, benchmarks, datos propios) sean \"citables\". Es el equivalente de GEO para los \"linkable assets\" del SEO clásico, pero en espacio de embedding. Ejemplo: publicas \"Benchmarks ROAS e-commerce 2025\", lo marcas con schema.org ",{"type":26,"tag":101,"props":301,"children":303},{"className":302},[],[304],{"type":31,"value":305},"Dataset",{"type":31,"value":307},", expones JSON raw en GitHub. El LLM lo ve tanto como human-readable como machine-readable, lo incorpora a citaciones.",{"type":26,"tag":27,"props":309,"children":310},{},[311,313,318],{"type":31,"value":312},"Otra táctica: ",{"type":26,"tag":34,"props":314,"children":315},{},[316],{"type":31,"value":317},"API documentation como contenido",{"type":31,"value":319},". Conviertes tu OpenAPI spec a Markdown, lo publicas en blog. Los LLM aprenden endpoints desde tu documentación porque es estructurada y token-eficiente. Esta es la estrategia de Stripe — cuando preguntas a ChatGPT \"¿Cómo crear un payment intent en Stripe?\", la citación viene de Stripe docs.",{"type":26,"tag":27,"props":321,"children":322},{},[323,325,334,336,341],{"type":31,"value":324},"En nuestro trabajo GEO, aplicando ",{"type":26,"tag":326,"props":327,"children":331},"a",{"href":328,"rel":329},"https:\u002F\u002Fwww.roibase.com.tr\u002Ftr\u002Fgeo",[330],"nofollow",[332],{"type":31,"value":333},"Optimización de Motor Generativo",{"type":31,"value":335},", una táctica clave es ",{"type":26,"tag":34,"props":337,"children":338},{},[339],{"type":31,"value":340},"proporcionar artefactos intermedios para razonamiento en cadena",{"type":31,"value":342},". Los LLM construyen pasos intermedios cuando resuelven preguntas complejas (chain-of-thought reasoning). Si tu contenido soporta esos pasos, la probabilidad de citación sube. Ejemplo: para \"¿Cómo aumentar ROAS en Google Ads?\", el modelo podría formular: (1) definición ROAS, (2) modelo de atribución, (3) estrategia de puja. Si cada uno tiene su H2 separado, cada paso CoT tiene oportunidad de citación.",{"type":26,"tag":27,"props":344,"children":345},{},[346,348,353,355,361,363,369,371,377,379,385],{"type":31,"value":347},"Táctica a nivel de token: ",{"type":26,"tag":34,"props":349,"children":350},{},[351],{"type":31,"value":352},"usa negritas y código inline",{"type":31,"value":354},". En Markdown, ",{"type":26,"tag":101,"props":356,"children":358},{"className":357},[],[359],{"type":31,"value":360},"**término crítico**",{"type":31,"value":362}," o ",{"type":26,"tag":101,"props":364,"children":366},{"className":365},[],[367],{"type":31,"value":368},"`detalle técnico`",{"type":31,"value":370}," se destacan en embedding porque los modelos pueden ponderar esos tokens más alto en el mapa de saliencia (no definitivo, pero en tests A\u002FB con GPT-4 Turbo observamos +12% aumento en citación). Rodea snippets de código con tags de lenguaje como ",{"type":26,"tag":101,"props":372,"children":374},{"className":373},[],[375],{"type":31,"value":376},"python",{"type":31,"value":378},", ",{"type":26,"tag":101,"props":380,"children":382},{"className":381},[],[383],{"type":31,"value":384},"sql",{"type":31,"value":386}," — los LLM pueden hacer retrieval consciente de sintaxis.",{"type":26,"tag":42,"props":388,"children":390},{"id":389},"atribución-y-medición-métricas-de-geo",[391],{"type":31,"value":392},"Atribución y Medición — Métricas de GEO",{"type":26,"tag":27,"props":394,"children":395},{},[396,398,403,405,410],{"type":31,"value":397},"¿Cómo mides éxito en GEO? En lugar de \"posición de ranking\" del SEO clásico, aquí contamos ",{"type":26,"tag":34,"props":399,"children":400},{},[401],{"type":31,"value":402},"citation rate",{"type":31,"value":404}," y ",{"type":26,"tag":34,"props":406,"children":407},{},[408],{"type":31,"value":409},"brand mention en respuesta AI",{"type":31,"value":411},". Tres métodos de medición:",{"type":26,"tag":413,"props":414,"children":415},"ol",{},[416,427,461],{"type":26,"tag":417,"props":418,"children":419},"li",{},[420,425],{"type":26,"tag":34,"props":421,"children":422},{},[423],{"type":31,"value":424},"Monitoreo programático",{"type":31,"value":426},": dispara consultas automáticas a ChatGPT API, Perplexity API o Google Search Labs, parsea si tu marca\u002Fdominio aparece en array de citaciones. Esto es viable con 100-200 queries\u002Fdía en n8n workflow (costo: ~$0.002\u002Fquery en ChatGPT-4 Turbo). Parsea JSON response, busca match de dominio en array de citaciones.",{"type":26,"tag":417,"props":428,"children":429},{},[430,435,437,443,444,450,452,459],{"type":26,"tag":34,"props":431,"children":432},{},[433],{"type":31,"value":434},"Analítica first-party",{"type":31,"value":436},": tráfico referido por AI llega con ",{"type":26,"tag":101,"props":438,"children":440},{"className":439},[],[441],{"type":31,"value":442},"referrer=chatgpt.com",{"type":31,"value":362},{"type":26,"tag":101,"props":445,"children":447},{"className":446},[],[448],{"type":31,"value":449},"referrer=perplexity.ai",{"type":31,"value":451}," en Google Analytics. Segmenta ese tráfico, analiza distribución por landing page. Qué contenido recibe citaciones, cuál no — análisis de patrones. Exporta a BigQuery, construye modelos dbt para análisis de cohortes dentro de tu ",{"type":26,"tag":326,"props":453,"children":456},{"href":454,"rel":455},"https:\u002F\u002Fwww.roibase.com.tr\u002Ftr\u002Fverianalizi",[330],[457],{"type":31,"value":458},"Ingeniería de Analítica e Insights",{"type":31,"value":460},".",{"type":26,"tag":417,"props":462,"children":463},{},[464,469],{"type":26,"tag":34,"props":465,"children":466},{},[467],{"type":31,"value":468},"Benchmark de similitud de embedding",{"type":31,"value":470},": embebe tu contenido (OpenAI Embedding API), embebe queries objetivo, calcula similitud coseno. Contenido con puntuación >0.75 tiene alto potencial de citación. Es métrica proactiva — antes de publicar, estima probabilidad de citación. Script Python:",{"type":26,"tag":135,"props":472,"children":475},{"className":473,"code":474,"language":376,"meta":9,"style":9},"language-python shiki shiki-themes github-dark","import openai\nimport numpy as np\n\ndef cosine_similarity(vec1, vec2):\n    return np.dot(vec1, vec2) \u002F (np.linalg.norm(vec1) * np.linalg.norm(vec2))\n\ncontent_embedding = openai.Embedding.create(\n    input=\"Your article text...\",\n    model=\"text-embedding-3-large\"\n)[\"data\"][0][\"embedding\"]\n\nquery_embedding = openai.Embedding.create(\n    input=\"User query...\",\n    model=\"text-embedding-3-large\"\n)[\"data\"][0][\"embedding\"]\n\nsimilarity = cosine_similarity(content_embedding, query_embedding)\nprint(f\"Estimación de probabilidad de citación: {similarity:.2f}\")\n",[476],{"type":26,"tag":101,"props":477,"children":478},{"__ignoreMap":9},[479,493,515,522,541,574,581,599,623,640,678,685,701,721,736,767,775,793],{"type":26,"tag":145,"props":480,"children":481},{"class":147,"line":148},[482,488],{"type":26,"tag":145,"props":483,"children":485},{"style":484},"--shiki-default:#F97583",[486],{"type":31,"value":487},"import",{"type":26,"tag":145,"props":489,"children":490},{"style":162},[491],{"type":31,"value":492}," openai\n",{"type":26,"tag":145,"props":494,"children":495},{"class":147,"line":158},[496,500,505,510],{"type":26,"tag":145,"props":497,"children":498},{"style":484},[499],{"type":31,"value":487},{"type":26,"tag":145,"props":501,"children":502},{"style":162},[503],{"type":31,"value":504}," numpy ",{"type":26,"tag":145,"props":506,"children":507},{"style":484},[508],{"type":31,"value":509},"as",{"type":26,"tag":145,"props":511,"children":512},{"style":162},[513],{"type":31,"value":514}," np\n",{"type":26,"tag":145,"props":516,"children":517},{"class":147,"line":168},[518],{"type":26,"tag":145,"props":519,"children":520},{"emptyLinePlaceholder":180},[521],{"type":31,"value":183},{"type":26,"tag":145,"props":523,"children":524},{"class":147,"line":176},[525,530,536],{"type":26,"tag":145,"props":526,"children":527},{"style":484},[528],{"type":31,"value":529},"def",{"type":26,"tag":145,"props":531,"children":533},{"style":532},"--shiki-default:#B392F0",[534],{"type":31,"value":535}," cosine_similarity",{"type":26,"tag":145,"props":537,"children":538},{"style":162},[539],{"type":31,"value":540},"(vec1, vec2):\n",{"type":26,"tag":145,"props":542,"children":543},{"class":147,"line":186},[544,549,554,559,564,569],{"type":26,"tag":145,"props":545,"children":546},{"style":484},[547],{"type":31,"value":548},"    return",{"type":26,"tag":145,"props":550,"children":551},{"style":162},[552],{"type":31,"value":553}," np.dot(vec1, vec2) ",{"type":26,"tag":145,"props":555,"children":556},{"style":484},[557],{"type":31,"value":558},"\u002F",{"type":26,"tag":145,"props":560,"children":561},{"style":162},[562],{"type":31,"value":563}," (np.linalg.norm(vec1) ",{"type":26,"tag":145,"props":565,"children":566},{"style":484},[567],{"type":31,"value":568},"*",{"type":26,"tag":145,"props":570,"children":571},{"style":162},[572],{"type":31,"value":573}," np.linalg.norm(vec2))\n",{"type":26,"tag":145,"props":575,"children":576},{"class":147,"line":195},[577],{"type":26,"tag":145,"props":578,"children":579},{"emptyLinePlaceholder":180},[580],{"type":31,"value":183},{"type":26,"tag":145,"props":582,"children":583},{"class":147,"line":203},[584,589,594],{"type":26,"tag":145,"props":585,"children":586},{"style":162},[587],{"type":31,"value":588},"content_embedding ",{"type":26,"tag":145,"props":590,"children":591},{"style":484},[592],{"type":31,"value":593},"=",{"type":26,"tag":145,"props":595,"children":596},{"style":162},[597],{"type":31,"value":598}," openai.Embedding.create(\n",{"type":26,"tag":145,"props":600,"children":601},{"class":147,"line":20},[602,608,612,618],{"type":26,"tag":145,"props":603,"children":605},{"style":604},"--shiki-default:#FFAB70",[606],{"type":31,"value":607},"    input",{"type":26,"tag":145,"props":609,"children":610},{"style":484},[611],{"type":31,"value":593},{"type":26,"tag":145,"props":613,"children":615},{"style":614},"--shiki-default:#9ECBFF",[616],{"type":31,"value":617},"\"Your article text...\"",{"type":26,"tag":145,"props":619,"children":620},{"style":162},[621],{"type":31,"value":622},",\n",{"type":26,"tag":145,"props":624,"children":625},{"class":147,"line":219},[626,631,635],{"type":26,"tag":145,"props":627,"children":628},{"style":604},[629],{"type":31,"value":630},"    model",{"type":26,"tag":145,"props":632,"children":633},{"style":484},[634],{"type":31,"value":593},{"type":26,"tag":145,"props":636,"children":637},{"style":614},[638],{"type":31,"value":639},"\"text-embedding-3-large\"\n",{"type":26,"tag":145,"props":641,"children":642},{"class":147,"line":228},[643,648,653,658,664,668,673],{"type":26,"tag":145,"props":644,"children":645},{"style":162},[646],{"type":31,"value":647},")[",{"type":26,"tag":145,"props":649,"children":650},{"style":614},[651],{"type":31,"value":652},"\"data\"",{"type":26,"tag":145,"props":654,"children":655},{"style":162},[656],{"type":31,"value":657},"][",{"type":26,"tag":145,"props":659,"children":661},{"style":660},"--shiki-default:#79B8FF",[662],{"type":31,"value":663},"0",{"type":26,"tag":145,"props":665,"children":666},{"style":162},[667],{"type":31,"value":657},{"type":26,"tag":145,"props":669,"children":670},{"style":614},[671],{"type":31,"value":672},"\"embedding\"",{"type":26,"tag":145,"props":674,"children":675},{"style":162},[676],{"type":31,"value":677},"]\n",{"type":26,"tag":145,"props":679,"children":680},{"class":147,"line":236},[681],{"type":26,"tag":145,"props":682,"children":683},{"emptyLinePlaceholder":180},[684],{"type":31,"value":183},{"type":26,"tag":145,"props":686,"children":687},{"class":147,"line":245},[688,693,697],{"type":26,"tag":145,"props":689,"children":690},{"style":162},[691],{"type":31,"value":692},"query_embedding ",{"type":26,"tag":145,"props":694,"children":695},{"style":484},[696],{"type":31,"value":593},{"type":26,"tag":145,"props":698,"children":699},{"style":162},[700],{"type":31,"value":598},{"type":26,"tag":145,"props":702,"children":703},{"class":147,"line":253},[704,708,712,717],{"type":26,"tag":145,"props":705,"children":706},{"style":604},[707],{"type":31,"value":607},{"type":26,"tag":145,"props":709,"children":710},{"style":484},[711],{"type":31,"value":593},{"type":26,"tag":145,"props":713,"children":714},{"style":614},[715],{"type":31,"value":716},"\"User query...\"",{"type":26,"tag":145,"props":718,"children":719},{"style":162},[720],{"type":31,"value":622},{"type":26,"tag":145,"props":722,"children":723},{"class":147,"line":262},[724,728,732],{"type":26,"tag":145,"props":725,"children":726},{"style":604},[727],{"type":31,"value":630},{"type":26,"tag":145,"props":729,"children":730},{"style":484},[731],{"type":31,"value":593},{"type":26,"tag":145,"props":733,"children":734},{"style":614},[735],{"type":31,"value":639},{"type":26,"tag":145,"props":737,"children":738},{"class":147,"line":270},[739,743,747,751,755,759,763],{"type":26,"tag":145,"props":740,"children":741},{"style":162},[742],{"type":31,"value":647},{"type":26,"tag":145,"props":744,"children":745},{"style":614},[746],{"type":31,"value":652},{"type":26,"tag":145,"props":748,"children":749},{"style":162},[750],{"type":31,"value":657},{"type":26,"tag":145,"props":752,"children":753},{"style":660},[754],{"type":31,"value":663},{"type":26,"tag":145,"props":756,"children":757},{"style":162},[758],{"type":31,"value":657},{"type":26,"tag":145,"props":760,"children":761},{"style":614},[762],{"type":31,"value":672},{"type":26,"tag":145,"props":764,"children":765},{"style":162},[766],{"type":31,"value":677},{"type":26,"tag":145,"props":768,"children":770},{"class":147,"line":769},16,[771],{"type":26,"tag":145,"props":772,"children":773},{"emptyLinePlaceholder":180},[774],{"type":31,"value":183},{"type":26,"tag":145,"props":776,"children":778},{"class":147,"line":777},17,[779,784,788],{"type":26,"tag":145,"props":780,"children":781},{"style":162},[782],{"type":31,"value":783},"similarity ",{"type":26,"tag":145,"props":785,"children":786},{"style":484},[787],{"type":31,"value":593},{"type":26,"tag":145,"props":789,"children":790},{"style":162},[791],{"type":31,"value":792}," cosine_similarity(content_embedding, query_embedding)\n",{"type":26,"tag":145,"props":794,"children":796},{"class":147,"line":795},18,[797,802,807,812,817,822,827,832,837,842],{"type":26,"tag":145,"props":798,"children":799},{"style":660},[800],{"type":31,"value":801},"print",{"type":26,"tag":145,"props":803,"children":804},{"style":162},[805],{"type":31,"value":806},"(",{"type":26,"tag":145,"props":808,"children":809},{"style":484},[810],{"type":31,"value":811},"f",{"type":26,"tag":145,"props":813,"children":814},{"style":614},[815],{"type":31,"value":816},"\"Estimación de probabilidad de citación: ",{"type":26,"tag":145,"props":818,"children":819},{"style":660},[820],{"type":31,"value":821},"{",{"type":26,"tag":145,"props":823,"children":824},{"style":162},[825],{"type":31,"value":826},"similarity",{"type":26,"tag":145,"props":828,"children":829},{"style":484},[830],{"type":31,"value":831},":.2f",{"type":26,"tag":145,"props":833,"children":834},{"style":660},[835],{"type":31,"value":836},"}",{"type":26,"tag":145,"props":838,"children":839},{"style":614},[840],{"type":31,"value":841},"\"",{"type":26,"tag":145,"props":843,"children":844},{"style":162},[845],{"type":31,"value":846},")\n",{"type":26,"tag":27,"props":848,"children":849},{},[850],{"type":31,"value":851},"Integra esta métrica en tu pipeline de producción de contenido — antes de publicar, si similitud \u003C0.70, reescribe o expande semánticamente.",{"type":26,"tag":42,"props":853,"children":855},{"id":854},"dinámicas-competitivas-y-tradeoffs",[856],{"type":31,"value":857},"Dinámicas Competitivas y Tradeoffs",{"type":26,"tag":27,"props":859,"children":860},{},[861,863,868],{"type":31,"value":862},"El lado opaco de GEO: ",{"type":26,"tag":34,"props":864,"children":865},{},[866],{"type":31,"value":867},"aumento en zero-click search",{"type":31,"value":869},". El LLM responde directamente, el usuario no llega a tu sitio. Tienes citación pero sin tráfico. Es la versión LLM del problema del featured snippet. Tradeoff: brand awareness vs. tráfico directo. Si tu funnel depende de recall de marca en etapa top-of-funnel (ejemplo: SaaS B2B), GEO funciona — crea efecto \"he escuchado este nombre en la decisión\". Si es transaccional (e-commerce checkout), necesitas tráfico directo, GEO es insuficiente.",{"type":26,"tag":27,"props":871,"children":872},{},[873,875,880],{"type":31,"value":874},"Segundo tradeoff: ",{"type":26,"tag":34,"props":876,"children":877},{},[878],{"type":31,"value":879},"velocidad de contenido vs. profundidad",{"type":31,"value":881},". Los LLM priorizan contenido fresh (fecha reciente es señal en embedding). Publicar rápido sube oportunidad de citación, pero contenido shallow reduce autoridad a largo plazo. Enfoque balanceado: contenido pilar core con 2000+ palabras (ancla GEO), contenido de apoyo 800-1000 palabras publicación rápida (freshness). Linkea desde soporte a pilar. Esto crea clúster de autoridad temática — cuando LLM ve contenido relacionado junto, decodifica autoridad de dominio.",{"type":26,"tag":27,"props":883,"children":884},{},[885,887,892,894,900,901,906,907,913,914,919,921,927,928,934,936,942,943,949],{"type":31,"value":886},"Tercer tradeoff: ",{"type":26,"tag":34,"props":888,"children":889},{},[890],{"type":31,"value":891},"uso de schema.org",{"type":31,"value":893},". Structured data señaliza a LLM, pero over-optimization se ve como spam. Guideline público de Google: usa schema sin exceso. Schemas críticos para GEO: ",{"type":26,"tag":101,"props":895,"children":897},{"className":896},[],[898],{"type":31,"value":899},"Article",{"type":31,"value":378},{"type":26,"tag":101,"props":902,"children":904},{"className":903},[],[905],{"type":31,"value":106},{"type":31,"value":378},{"type":26,"tag":101,"props":908,"children":910},{"className":909},[],[911],{"type":31,"value":912},"HowTo",{"type":31,"value":378},{"type":26,"tag":101,"props":915,"children":917},{"className":916},[],[918],{"type":31,"value":305},{"type":31,"value":920},". Ya deberías tener ",{"type":26,"tag":101,"props":922,"children":924},{"className":923},[],[925],{"type":31,"value":926},"Organization",{"type":31,"value":404},{"type":26,"tag":101,"props":929,"children":931},{"className":930},[],[932],{"type":31,"value":933},"WebSite",{"type":31,"value":935},". No agregues ",{"type":26,"tag":101,"props":937,"children":939},{"className":938},[],[940],{"type":31,"value":941},"Review",{"type":31,"value":362},{"type":26,"tag":101,"props":944,"children":946},{"className":945},[],[947],{"type":31,"value":948},"Product",{"type":31,"value":950}," schema si no existe en contenido — inconsistencia content-schema es detectada por LLM y riesgo manual action.",{"type":26,"tag":42,"props":952,"children":954},{"id":953},"estrategia-a-largo-plazo-paradigma-content-first-ai",[955],{"type":31,"value":956},"Estrategia a Largo Plazo — Paradigma Content First-AI",{"type":26,"tag":27,"props":958,"children":959},{},[960,962,967],{"type":31,"value":961},"Post-2026, tu estrategia de contenido pivotea: ",{"type":26,"tag":34,"props":963,"children":964},{},[965],{"type":31,"value":966},"legible para humanos, optimizado para máquinas",{"type":31,"value":968},". Contenido debe servir lector y LLM. Requiere disciplina en escritura token-eficiente — cada palabra porta señal. Además, mentalidad de ingeniería de prompts debe permear al content writer. No solo \"¿qué busca el usuario?\" sino \"¿en qué contexto el LLM cita este contenido?\"",{"type":26,"tag":27,"props":970,"children":971},{},[972],{"type":31,"value":973},"El impacto de GEO en brand equity emerge a largo plazo. Aumento en citation rate, recall de marca, ser referencia en funnel decisión — métricas se revelan indirectas en attribution. Primeros 6 meses no hay ROI directo evidente, pero en mes 12 ves \"aumento en búsqueda de marca orgánica\" y \"assisted conversion rate\" sube. Es como SEO en 2010 — early adopters ganan ventaja, late movers pierden share.",{"type":26,"tag":27,"props":975,"children":976},{},[977,979,984,986,992],{"type":31,"value":978},"Nota final: ",{"type":26,"tag":34,"props":980,"children":981},{},[982],{"type":31,"value":983},"riesgo AI safety y bias",{"type":31,"value":985},". Los LLM muestran sesgo en citaciones (domain bias, geography bias, language bias). Por ejemplo, ChatGPT cita más frecuentemente contenido US que Turquía (sesgo de datos training en embedding). Esto requiere compensación en GEO — para contenido Turquía, agrega abstract\u002Fsummary en inglés, especifica ",{"type":26,"tag":101,"props":987,"children":989},{"className":988},[],[990],{"type":31,"value":991},"inLanguage",{"type":31,"value":993}," field en schema. Visibilidad en AI overviews pasa por entender el bias del modelo y arquitecturar contenido acordemente.",{"type":26,"tag":27,"props":995,"children":996},{},[997],{"type":31,"value":998},"GEO no es evolución del SEO clásico, es disciplina nueva. Optimizar no para motor búsqueda sino para motor respuesta. Attribution window es context window del LLM, ranking signal es similitud de embedding, autoridad backlink es densidad de citación. Este paradigma requiere unir ingeniería de prompts con arquitectura de contenido. Primer paso: audita inventario de contenido con lente token efficiency y densidad semántica, reescribe contenido con baja probabilidad de citación o retíralo. Segundo paso: convierte datos propios e insights únicos a formato citable. Tercero: configura monitoreo programático, trackea citation rate semanalmente, convierte patrones en iteración.",{"type":26,"tag":1000,"props":1001,"children":1002},"style",{},[1003],{"type":31,"value":1004},"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":9,"searchDepth":168,"depth":168,"links":1006},[1007,1008,1009,1010,1011,1012],{"id":44,"depth":158,"text":47},{"id":72,"depth":158,"text":75},{"id":284,"depth":158,"text":287},{"id":389,"depth":158,"text":392},{"id":854,"depth":158,"text":857},{"id":953,"depth":158,"text":956},"content:es:ai:posicionar-marca-respuesta-chatgpt.md","content","es\u002Fai\u002Fposicionar-marca-respuesta-chatgpt.md","es\u002Fai\u002Fposicionar-marca-respuesta-chatgpt","md",{"_path":1019,"_dir":1020,"_draft":8,"_partial":8,"_locale":9,"title":1021,"description":1022,"publishedAt":12,"modifiedAt":12,"category":1020,"i18nKey":1023,"tags":1024,"readingTime":20,"author":21,"body":1030,"_type":139,"_id":1992,"_source":1014,"_file":1993,"_stem":1994,"_extension":1017},"\u002Fes\u002Fmarketing\u002Fconfigurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero","marketing","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.","marketing-001-2026-05",[1025,1026,1027,1028,1029],"conversion-api","server-side-gtm","attribution","meta-ads","first-party-data",{"type":23,"children":1031,"toc":1983},[1032,1037,1043,1088,1139,1145,1150,1155,1236,1280,1286,1327,1471,1484,1634,1669,1675,1694,1699,1746,1765,1777,1783,1788,1806,1812,1832,1851,1857,1895,1913,1931,1941,1966,1979],{"type":26,"tag":27,"props":1033,"children":1034},{},[1035],{"type":31,"value":1036},"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":26,"tag":42,"props":1038,"children":1040},{"id":1039},"por-qué-la-diferencia-entre-píxel-y-capi-es-crítica",[1041],{"type":31,"value":1042},"Por qué la diferencia entre píxel y CAPI es crítica",{"type":26,"tag":27,"props":1044,"children":1045},{},[1046,1048,1054,1056,1062,1064,1070,1072,1078,1080,1086],{"type":31,"value":1047},"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":26,"tag":101,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":31,"value":1053},"PageView",{"type":31,"value":1055}," 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":26,"tag":101,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":31,"value":1061},"em",{"type":31,"value":1063}," (email hash), ",{"type":26,"tag":101,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":31,"value":1069},"ph",{"type":31,"value":1071}," (teléfono hash), ",{"type":26,"tag":101,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":31,"value":1077},"fbc",{"type":31,"value":1079}," (Facebook click ID), ",{"type":26,"tag":101,"props":1081,"children":1083},{"className":1082},[],[1084],{"type":31,"value":1085},"fbp",{"type":31,"value":1087}," (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":26,"tag":27,"props":1089,"children":1090},{},[1091,1093,1099,1100,1106,1108,1114,1116,1122,1124,1130,1132,1137],{"type":31,"value":1092},"Desactivar el píxel e ir solo con CAPI también es un error. El píxel del navegador captura eventos intermedios como ",{"type":26,"tag":101,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":31,"value":1098},"ViewContent",{"type":31,"value":378},{"type":26,"tag":101,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":31,"value":1105},"AddToCart",{"type":31,"value":1107}," en tiempo real; CAPI generalmente se usa solo para ",{"type":26,"tag":101,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":31,"value":1113},"Purchase",{"type":31,"value":1115},". 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":26,"tag":101,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":31,"value":1121},"event_id",{"type":31,"value":1123}," + ",{"type":26,"tag":101,"props":1125,"children":1127},{"className":1126},[],[1128],{"type":31,"value":1129},"event_time",{"type":31,"value":1131}," 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":26,"tag":101,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":31,"value":1121},{"type":31,"value":1138}," 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":26,"tag":42,"props":1140,"children":1142},{"id":1141},"pasos-para-configurar-la-infraestructura-sgtm",[1143],{"type":31,"value":1144},"Pasos para configurar la infraestructura sGTM",{"type":26,"tag":27,"props":1146,"children":1147},{},[1148],{"type":31,"value":1149},"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":26,"tag":27,"props":1151,"children":1152},{},[1153],{"type":31,"value":1154},"El flujo de configuración es así:",{"type":26,"tag":413,"props":1156,"children":1157},{},[1158,1176,1201,1211],{"type":26,"tag":417,"props":1159,"children":1160},{},[1161,1166,1168,1174],{"type":26,"tag":34,"props":1162,"children":1163},{},[1164],{"type":31,"value":1165},"Crea una instancia de Cloud Run:",{"type":31,"value":1167}," ",{"type":26,"tag":101,"props":1169,"children":1171},{"className":1170},[],[1172],{"type":31,"value":1173},"gcloud run deploy gtm-server --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable --platform=managed --region=europe-west1",{"type":31,"value":1175},". Este comando despliega la imagen sGTM oficial de Google.",{"type":26,"tag":417,"props":1177,"children":1178},{},[1179,1184,1186,1192,1194,1200],{"type":26,"tag":34,"props":1180,"children":1181},{},[1182],{"type":31,"value":1183},"Obtén la URL del servidor de tagging:",{"type":31,"value":1185}," Tras completar el despliegue, recibirás una URL como ",{"type":26,"tag":101,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":31,"value":1191},"https:\u002F\u002Fgtm-server-xxxxx-ew.a.run.app",{"type":31,"value":1193},". Configurarás esta URL en tu GTM del lado del cliente como parámetro ",{"type":26,"tag":101,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":31,"value":1199},"serverContainerUrl",{"type":31,"value":460},{"type":26,"tag":417,"props":1202,"children":1203},{},[1204,1209],{"type":26,"tag":34,"props":1205,"children":1206},{},[1207],{"type":31,"value":1208},"Modifica el tag GA4 en GTM del lado del cliente:",{"type":31,"value":1210}," 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":26,"tag":417,"props":1212,"children":1213},{},[1214,1219,1221,1227,1228,1234],{"type":26,"tag":34,"props":1215,"children":1216},{},[1217],{"type":31,"value":1218},"Añade el tag Meta CAPI en el contenedor sGTM:",{"type":31,"value":1220}," Usa la plantilla \"Meta Conversions API\". Ingresa ",{"type":26,"tag":101,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":31,"value":1226},"Pixel ID",{"type":31,"value":404},{"type":26,"tag":101,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":31,"value":1233},"Access Token",{"type":31,"value":1235},". Obtendrás el Access Token desde Events Manager > Settings > Conversions API. Aquí puedes enviar un evento de prueba para verificar la conexión.",{"type":26,"tag":27,"props":1237,"children":1238},{},[1239,1241,1247,1249,1255,1257,1262,1264,1269,1271,1278],{"type":31,"value":1240},"Una ventaja de sGTM: ambos GA4 y CAPI pueden recibir eventos desde la misma request. Un ",{"type":26,"tag":101,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":31,"value":1246},"dataLayer.push",{"type":31,"value":1248}," 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":26,"tag":101,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":31,"value":1254},"client_id",{"type":31,"value":1256}," de GA4 no es lo mismo que el ",{"type":26,"tag":101,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":31,"value":1085},{"type":31,"value":1263}," que Meta requiere. Por eso necesitas crear una variable de transformación en tu contenedor sGTM—tomar la cookie ",{"type":26,"tag":101,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":31,"value":1085},{"type":31,"value":1270}," y mapearla al tag CAPI. Este mapeo requiere ",{"type":26,"tag":326,"props":1272,"children":1275},{"href":1273,"rel":1274},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fppc",[330],[1276],{"type":31,"value":1277},"arquitectura de datos de primera parte",{"type":31,"value":1279},"; sin ella, los identificadores se dessincronizan y el EMQ cae.",{"type":26,"tag":42,"props":1281,"children":1283},{"id":1282},"elevar-la-calidad-de-coincidencia-de-eventos",[1284],{"type":31,"value":1285},"Elevar la calidad de coincidencia de eventos",{"type":26,"tag":27,"props":1287,"children":1288},{},[1289,1291,1296,1298,1303,1305,1311,1313,1318,1320,1325],{"type":31,"value":1290},"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":26,"tag":101,"props":1292,"children":1294},{"className":1293},[],[1295],{"type":31,"value":1061},{"type":31,"value":1297}," (email) > ",{"type":26,"tag":101,"props":1299,"children":1301},{"className":1300},[],[1302],{"type":31,"value":1069},{"type":31,"value":1304}," (teléfono) > ",{"type":26,"tag":101,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":31,"value":1310},"external_id",{"type":31,"value":1312}," (CRM ID) > ",{"type":26,"tag":101,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":31,"value":1077},{"type":31,"value":1319}," > ",{"type":26,"tag":101,"props":1321,"children":1323},{"className":1322},[],[1324],{"type":31,"value":1085},{"type":31,"value":1326},". Hash email y teléfono con SHA-256, convierte a minúsculas, sin espacios en blanco. Ejemplo:",{"type":26,"tag":135,"props":1328,"children":1332},{"className":1329,"code":1330,"language":1331,"meta":9,"style":9},"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",[1333],{"type":26,"tag":101,"props":1334,"children":1335},{"__ignoreMap":9},[1336,1345,1373,1404,1411,1419,1443],{"type":26,"tag":145,"props":1337,"children":1338},{"class":147,"line":148},[1339],{"type":26,"tag":145,"props":1340,"children":1342},{"style":1341},"--shiki-default:#6A737D",[1343],{"type":31,"value":1344},"\u002F\u002F Hash incorrecto\n",{"type":26,"tag":145,"props":1346,"children":1347},{"class":147,"line":158},[1348,1353,1358,1363,1368],{"type":26,"tag":145,"props":1349,"children":1350},{"style":484},[1351],{"type":31,"value":1352},"const",{"type":26,"tag":145,"props":1354,"children":1355},{"style":660},[1356],{"type":31,"value":1357}," email",{"type":26,"tag":145,"props":1359,"children":1360},{"style":484},[1361],{"type":31,"value":1362}," =",{"type":26,"tag":145,"props":1364,"children":1365},{"style":614},[1366],{"type":31,"value":1367}," \" John@Example.com \"",{"type":26,"tag":145,"props":1369,"children":1370},{"style":162},[1371],{"type":31,"value":1372},";\n",{"type":26,"tag":145,"props":1374,"children":1375},{"class":147,"line":168},[1376,1380,1385,1389,1394,1399],{"type":26,"tag":145,"props":1377,"children":1378},{"style":484},[1379],{"type":31,"value":1352},{"type":26,"tag":145,"props":1381,"children":1382},{"style":660},[1383],{"type":31,"value":1384}," hash",{"type":26,"tag":145,"props":1386,"children":1387},{"style":484},[1388],{"type":31,"value":1362},{"type":26,"tag":145,"props":1390,"children":1391},{"style":532},[1392],{"type":31,"value":1393}," sha256",{"type":26,"tag":145,"props":1395,"children":1396},{"style":162},[1397],{"type":31,"value":1398},"(email); ",{"type":26,"tag":145,"props":1400,"children":1401},{"style":1341},[1402],{"type":31,"value":1403},"\u002F\u002F Espacios y mayúsculas son un problema\n",{"type":26,"tag":145,"props":1405,"children":1406},{"class":147,"line":176},[1407],{"type":26,"tag":145,"props":1408,"children":1409},{"emptyLinePlaceholder":180},[1410],{"type":31,"value":183},{"type":26,"tag":145,"props":1412,"children":1413},{"class":147,"line":186},[1414],{"type":26,"tag":145,"props":1415,"children":1416},{"style":1341},[1417],{"type":31,"value":1418},"\u002F\u002F Hash correcto\n",{"type":26,"tag":145,"props":1420,"children":1421},{"class":147,"line":195},[1422,1426,1430,1434,1439],{"type":26,"tag":145,"props":1423,"children":1424},{"style":484},[1425],{"type":31,"value":1352},{"type":26,"tag":145,"props":1427,"children":1428},{"style":660},[1429],{"type":31,"value":1357},{"type":26,"tag":145,"props":1431,"children":1432},{"style":484},[1433],{"type":31,"value":1362},{"type":26,"tag":145,"props":1435,"children":1436},{"style":614},[1437],{"type":31,"value":1438}," \"john@example.com\"",{"type":26,"tag":145,"props":1440,"children":1441},{"style":162},[1442],{"type":31,"value":1372},{"type":26,"tag":145,"props":1444,"children":1445},{"class":147,"line":203},[1446,1450,1454,1458,1462,1466],{"type":26,"tag":145,"props":1447,"children":1448},{"style":484},[1449],{"type":31,"value":1352},{"type":26,"tag":145,"props":1451,"children":1452},{"style":660},[1453],{"type":31,"value":1384},{"type":26,"tag":145,"props":1455,"children":1456},{"style":484},[1457],{"type":31,"value":1362},{"type":26,"tag":145,"props":1459,"children":1460},{"style":532},[1461],{"type":31,"value":1393},{"type":26,"tag":145,"props":1463,"children":1464},{"style":162},[1465],{"type":31,"value":1398},{"type":26,"tag":145,"props":1467,"children":1468},{"style":1341},[1469],{"type":31,"value":1470},"\u002F\u002F SHA-256: a665a...\n",{"type":26,"tag":27,"props":1472,"children":1473},{},[1474,1476,1482],{"type":31,"value":1475},"En el request CAPI, el objeto ",{"type":26,"tag":101,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":31,"value":1481},"user_data",{"type":31,"value":1483}," debe verse así:",{"type":26,"tag":135,"props":1485,"children":1489},{"className":1486,"code":1487,"language":1488,"meta":9,"style":9},"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",[1490],{"type":26,"tag":101,"props":1491,"children":1492},{"__ignoreMap":9},[1493,1501,1524,1545,1567,1588,1609,1626],{"type":26,"tag":145,"props":1494,"children":1495},{"class":147,"line":148},[1496],{"type":26,"tag":145,"props":1497,"children":1498},{"style":162},[1499],{"type":31,"value":1500},"{\n",{"type":26,"tag":145,"props":1502,"children":1503},{"class":147,"line":158},[1504,1509,1514,1519],{"type":26,"tag":145,"props":1505,"children":1506},{"style":660},[1507],{"type":31,"value":1508},"  \"em\"",{"type":26,"tag":145,"props":1510,"children":1511},{"style":162},[1512],{"type":31,"value":1513},": [",{"type":26,"tag":145,"props":1515,"children":1516},{"style":614},[1517],{"type":31,"value":1518},"\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"",{"type":26,"tag":145,"props":1520,"children":1521},{"style":162},[1522],{"type":31,"value":1523},"],\n",{"type":26,"tag":145,"props":1525,"children":1526},{"class":147,"line":168},[1527,1532,1536,1541],{"type":26,"tag":145,"props":1528,"children":1529},{"style":660},[1530],{"type":31,"value":1531},"  \"ph\"",{"type":26,"tag":145,"props":1533,"children":1534},{"style":162},[1535],{"type":31,"value":1513},{"type":26,"tag":145,"props":1537,"children":1538},{"style":614},[1539],{"type":31,"value":1540},"\"sha256_hash_telefono\"",{"type":26,"tag":145,"props":1542,"children":1543},{"style":162},[1544],{"type":31,"value":1523},{"type":26,"tag":145,"props":1546,"children":1547},{"class":147,"line":176},[1548,1553,1558,1563],{"type":26,"tag":145,"props":1549,"children":1550},{"style":660},[1551],{"type":31,"value":1552},"  \"fbc\"",{"type":26,"tag":145,"props":1554,"children":1555},{"style":162},[1556],{"type":31,"value":1557},": ",{"type":26,"tag":145,"props":1559,"children":1560},{"style":614},[1561],{"type":31,"value":1562},"\"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\"",{"type":26,"tag":145,"props":1564,"children":1565},{"style":162},[1566],{"type":31,"value":622},{"type":26,"tag":145,"props":1568,"children":1569},{"class":147,"line":186},[1570,1575,1579,1584],{"type":26,"tag":145,"props":1571,"children":1572},{"style":660},[1573],{"type":31,"value":1574},"  \"fbp\"",{"type":26,"tag":145,"props":1576,"children":1577},{"style":162},[1578],{"type":31,"value":1557},{"type":26,"tag":145,"props":1580,"children":1581},{"style":614},[1582],{"type":31,"value":1583},"\"fb.1.1558571054389.1098115397\"",{"type":26,"tag":145,"props":1585,"children":1586},{"style":162},[1587],{"type":31,"value":622},{"type":26,"tag":145,"props":1589,"children":1590},{"class":147,"line":195},[1591,1596,1600,1605],{"type":26,"tag":145,"props":1592,"children":1593},{"style":660},[1594],{"type":31,"value":1595},"  \"client_ip_address\"",{"type":26,"tag":145,"props":1597,"children":1598},{"style":162},[1599],{"type":31,"value":1557},{"type":26,"tag":145,"props":1601,"children":1602},{"style":614},[1603],{"type":31,"value":1604},"\"93.184.216.34\"",{"type":26,"tag":145,"props":1606,"children":1607},{"style":162},[1608],{"type":31,"value":622},{"type":26,"tag":145,"props":1610,"children":1611},{"class":147,"line":203},[1612,1617,1621],{"type":26,"tag":145,"props":1613,"children":1614},{"style":660},[1615],{"type":31,"value":1616},"  \"client_user_agent\"",{"type":26,"tag":145,"props":1618,"children":1619},{"style":162},[1620],{"type":31,"value":1557},{"type":26,"tag":145,"props":1622,"children":1623},{"style":614},[1624],{"type":31,"value":1625},"\"Mozilla\u002F5.0...\"\n",{"type":26,"tag":145,"props":1627,"children":1628},{"class":147,"line":20},[1629],{"type":26,"tag":145,"props":1630,"children":1631},{"style":162},[1632],{"type":31,"value":1633},"}\n",{"type":26,"tag":27,"props":1635,"children":1636},{},[1637,1639,1645,1647,1652,1654,1660,1662,1667],{"type":31,"value":1638},"sGTM captura automáticamente IP y user-agent, pero en algunos entornos de hosting (proxy Cloudflare), necesitarás parsear el header ",{"type":26,"tag":101,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":31,"value":1644},"X-Forwarded-For",{"type":31,"value":1646},". El parámetro ",{"type":26,"tag":101,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":31,"value":1077},{"type":31,"value":1653}," es el Facebook Click ID—cuando un usuario hace clic en un anuncio de Meta, la URL contiene ",{"type":26,"tag":101,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":31,"value":1659},"fbclid=...",{"type":31,"value":1661},". 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":26,"tag":101,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":31,"value":1077},{"type":31,"value":1668},", resultando en que Meta no sepa qué anuncio disparó la conversión. EMQ se queda en 4.2.",{"type":26,"tag":42,"props":1670,"children":1672},{"id":1671},"estrategia-de-deduplicación",[1673],{"type":31,"value":1674},"Estrategia de deduplicación",{"type":26,"tag":27,"props":1676,"children":1677},{},[1678,1680,1685,1687,1692],{"type":31,"value":1679},"Cuando el mismo evento ",{"type":26,"tag":101,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":31,"value":1113},{"type":31,"value":1686}," llega tanto del píxel como de CAPI, para que Meta lo cuente como un único evento, el ",{"type":26,"tag":101,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":31,"value":1121},{"type":31,"value":1693}," 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":26,"tag":27,"props":1695,"children":1696},{},[1697],{"type":31,"value":1698},"Flujo de ejemplo:",{"type":26,"tag":413,"props":1700,"children":1701},{},[1702,1723,1741],{"type":26,"tag":417,"props":1703,"children":1704},{},[1705,1707,1713,1715,1721],{"type":31,"value":1706},"El usuario hace clic en \"Comprar\" → el píxel dispara ",{"type":26,"tag":101,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":31,"value":1712},"InitiateCheckout",{"type":31,"value":1714}," (event_id: ",{"type":26,"tag":101,"props":1716,"children":1718},{"className":1717},[],[1719],{"type":31,"value":1720},"evt_12345",{"type":31,"value":1722},", event_time: 1683820800)",{"type":26,"tag":417,"props":1724,"children":1725},{},[1726,1728,1733,1734,1739],{"type":31,"value":1727},"El backend valida el pago → CAPI envía ",{"type":26,"tag":101,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":31,"value":1113},{"type":31,"value":1714},{"type":26,"tag":101,"props":1735,"children":1737},{"className":1736},[],[1738],{"type":31,"value":1720},{"type":31,"value":1740},", event_time: 1683820802)",{"type":26,"tag":417,"props":1742,"children":1743},{},[1744],{"type":31,"value":1745},"Meta ve ambos eventos, los event_id coinciden, diferencia de 2 segundos → procesa como un único evento.",{"type":26,"tag":27,"props":1747,"children":1748},{},[1749,1751,1756,1758,1763],{"type":31,"value":1750},"Sin esta configuración, el ",{"type":26,"tag":101,"props":1752,"children":1754},{"className":1753},[],[1755],{"type":31,"value":1113},{"type":31,"value":1757}," del píxel y el ",{"type":26,"tag":101,"props":1759,"children":1761},{"className":1760},[],[1762],{"type":31,"value":1113},{"type":31,"value":1764}," 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":26,"tag":27,"props":1766,"children":1767},{},[1768,1770,1775],{"type":31,"value":1769},"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":26,"tag":101,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":31,"value":1129},{"type":31,"value":1776}," del servidor en el timestamp de pedido del backend—no en la hora del navegador del usuario.",{"type":26,"tag":42,"props":1778,"children":1780},{"id":1779},"incrementalidad-y-prueba-de-capi",[1781],{"type":31,"value":1782},"Incrementalidad y prueba de CAPI",{"type":26,"tag":27,"props":1784,"children":1785},{},[1786],{"type":31,"value":1787},"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":26,"tag":27,"props":1789,"children":1790},{},[1791,1793,1798,1799,1804],{"type":31,"value":1792},"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":26,"tag":101,"props":1794,"children":1796},{"className":1795},[],[1797],{"type":31,"value":1098},{"type":31,"value":404},{"type":26,"tag":101,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":31,"value":1105},{"type":31,"value":1805},", debilitando tus audiencias de retargeting dinámico.",{"type":26,"tag":42,"props":1807,"children":1809},{"id":1808},"nivel-avanzado-eventos-personalizados-y-conversiones-offline",[1810],{"type":31,"value":1811},"Nivel avanzado: eventos personalizados y conversiones offline",{"type":26,"tag":27,"props":1813,"children":1814},{},[1815,1817,1823,1824,1830],{"type":31,"value":1816},"Meta CAPI no se limita a eventos estándar. Puedes definir eventos personalizados y enviarlos desde el backend. Por ejemplo, ",{"type":26,"tag":101,"props":1818,"children":1820},{"className":1819},[],[1821],{"type":31,"value":1822},"SubscriptionRenewal",{"type":31,"value":362},{"type":26,"tag":101,"props":1825,"children":1827},{"className":1826},[],[1828],{"type":31,"value":1829},"TrialStarted",{"type":31,"value":1831},". 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":26,"tag":27,"props":1833,"children":1834},{},[1835,1837,1842,1844,1849],{"type":31,"value":1836},"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":26,"tag":101,"props":1838,"children":1840},{"className":1839},[],[1841],{"type":31,"value":1113},{"type":31,"value":1843},". En este caso, ",{"type":26,"tag":101,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":31,"value":1129},{"type":31,"value":1850}," 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":26,"tag":42,"props":1852,"children":1854},{"id":1853},"errores-comunes-y-soluciones",[1855],{"type":31,"value":1856},"Errores comunes y soluciones",{"type":26,"tag":27,"props":1858,"children":1859},{},[1860,1872,1874,1879,1881,1887,1889,1894],{"type":26,"tag":34,"props":1861,"children":1862},{},[1863,1865,1870],{"type":31,"value":1864},"1. Parámetro ",{"type":26,"tag":101,"props":1866,"children":1868},{"className":1867},[],[1869],{"type":31,"value":1077},{"type":31,"value":1871}," faltante:",{"type":31,"value":1873}," Cuando el usuario hace clic en un anuncio de Meta, el URL contiene ",{"type":26,"tag":101,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":31,"value":1659},{"type":31,"value":1880},". Si no escribes este valor en cookie, no puedes enviarlo a CAPI. Solución: crea una variable cookie en GTM con nombre ",{"type":26,"tag":101,"props":1882,"children":1884},{"className":1883},[],[1885],{"type":31,"value":1886},"_fbc",{"type":31,"value":1888},", configura 90 días de persistencia. En el tag CAPI, mapea esta variable al parámetro ",{"type":26,"tag":101,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":31,"value":1077},{"type":31,"value":460},{"type":26,"tag":27,"props":1896,"children":1897},{},[1898,1903,1905,1911],{"type":26,"tag":34,"props":1899,"children":1900},{},[1901],{"type":31,"value":1902},"2. Hash de email incorrecto:",{"type":31,"value":1904}," Si quedan espacios o mayúsculas, el hash no coincide. Normaliza todas las strings con ",{"type":26,"tag":101,"props":1906,"children":1908},{"className":1907},[],[1909],{"type":31,"value":1910},"trim().toLowerCase()",{"type":31,"value":1912},", luego aplica SHA-256.",{"type":26,"tag":27,"props":1914,"children":1915},{},[1916,1921,1923,1929],{"type":26,"tag":34,"props":1917,"children":1918},{},[1919],{"type":31,"value":1920},"3. No cambiar de modo de prueba a producción:",{"type":31,"value":1922}," En Events Manager, la pestaña \"Test Events\" muestra eventos pero el tráfico real no se envía. Elimina el parámetro ",{"type":26,"tag":101,"props":1924,"children":1926},{"className":1925},[],[1927],{"type":31,"value":1928},"test_event_code",{"type":31,"value":1930},", usa el token de producción.",{"type":26,"tag":27,"props":1932,"children":1933},{},[1934,1939],{"type":26,"tag":34,"props":1935,"children":1936},{},[1937],{"type":31,"value":1938},"4. No revisar logs del contenedor de servidor:",{"type":31,"value":1940}," 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":26,"tag":27,"props":1942,"children":1943},{},[1944,1949,1951,1957,1959,1965],{"type":26,"tag":34,"props":1945,"children":1946},{},[1947],{"type":31,"value":1948},"5. Tipo de dato incompatible entre píxel y CAPI:",{"type":31,"value":1950}," El píxel envía ",{"type":26,"tag":101,"props":1952,"children":1954},{"className":1953},[],[1955],{"type":31,"value":1956},"value",{"type":31,"value":1958}," como float, CAPI como integer. Meta puede redondear la moneda. Solución: en ambos lados, usa ",{"type":26,"tag":101,"props":1960,"children":1962},{"className":1961},[],[1963],{"type":31,"value":1964},"value: parseFloat(orderTotal).toFixed(2)",{"type":31,"value":460},{"type":26,"tag":27,"props":1967,"children":1968},{},[1969,1971,1977],{"type":31,"value":1970},"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":26,"tag":101,"props":1972,"children":1974},{"className":1973},[],[1975],{"type":31,"value":1976},"anon_id",{"type":31,"value":1978}," 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":26,"tag":1000,"props":1980,"children":1981},{},[1982],{"type":31,"value":1004},{"title":9,"searchDepth":168,"depth":168,"links":1984},[1985,1986,1987,1988,1989,1990,1991],{"id":1039,"depth":158,"text":1042},{"id":1141,"depth":158,"text":1144},{"id":1282,"depth":158,"text":1285},{"id":1671,"depth":158,"text":1674},{"id":1779,"depth":158,"text":1782},{"id":1808,"depth":158,"text":1811},{"id":1853,"depth":158,"text":1856},"content:es:marketing:configurar-conversiones-del-lado-del-servidor-meta-capi-desde-cero.md","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",{"_path":1996,"_dir":1997,"_draft":8,"_partial":8,"_locale":9,"title":1998,"description":1999,"publishedAt":12,"modifiedAt":12,"category":1997,"i18nKey":2000,"tags":2001,"readingTime":20,"author":21,"body":2007,"_type":139,"_id":3458,"_source":1014,"_file":3459,"_stem":3460,"_extension":1017},"\u002Fes\u002Ftech\u002Fnuxt3-cloudflare-pages-lcp-optimizacion","tech","Nuxt 3 + Cloudflare Pages: de 10s LCP a 2s","Fonts auto-hospedadas, lazy hydration, content-visibility y edge caching redujeron LCP 80%. Benchmark real, código y trade-offs incluidos.","tech-001-2026-05",[2002,2003,2004,2005,2006],"nuxt3","cloudflare-pages","web-performance","lcp","edge-caching",{"type":23,"children":2008,"toc":3447},[2009,2014,2020,2025,2069,2074,2080,2117,2486,2496,2508,2528,2635,2648,2733,2750,2756,2785,2929,2942,2951,2957,2970,3132,3145,3161,3167,3172,3302,3316,3322,3347,3357,3374,3384,3390,3395,3438,3443],{"type":26,"tag":27,"props":2010,"children":2011},{},[2012],{"type":31,"value":2013},"Tras la actualización de Core Web Vitals de Google, LCP (Largest Contentful Paint) debe estar por debajo de 2.5 segundos, de lo contrario tanto el ranking orgánico como la tasa de conversión caen. Cuando migramos un sitio de e-commerce a la stack Nuxt 3 + Cloudflare Pages, el LCP inicial fue de 10.2 segundos post-deploy. Usando una combinación de estrategia de fuentes auto-hospedadas, selective hydration, CSS content-visibility y edge caching, lo redujimos a 2.1 segundos. A continuación detallamos qué cambio aportó qué ganancia, los trade-offs y el código.",{"type":26,"tag":42,"props":2015,"children":2017},{"id":2016},"diagnosticar-el-problema-anatomía-del-lcp-de-10s",[2018],{"type":31,"value":2019},"Diagnosticar el problema: anatomía del LCP de 10s",{"type":26,"tag":27,"props":2021,"children":2022},{},[2023],{"type":31,"value":2024},"El reporte inicial de CrUX mostró LCP mediano de 10.2s y TBT (Total Blocking Time) de 2190ms. El análisis de profiling de Chrome DevTools Lighthouse reveló:",{"type":26,"tag":2026,"props":2027,"children":2028},"ul",{},[2029,2039,2049,2059],{"type":26,"tag":417,"props":2030,"children":2031},{},[2032,2037],{"type":26,"tag":34,"props":2033,"children":2034},{},[2035],{"type":31,"value":2036},"Carga de fuentes:",{"type":31,"value":2038}," 3 familias de fuentes desde CDN de Google Fonts, render-blocking",{"type":26,"tag":417,"props":2040,"children":2041},{},[2042,2047],{"type":26,"tag":34,"props":2043,"children":2044},{},[2045],{"type":31,"value":2046},"Hydration de JavaScript:",{"type":31,"value":2048}," bundle de 420kB, página completa siendo hidratada",{"type":26,"tag":417,"props":2050,"children":2051},{},[2052,2057],{"type":26,"tag":34,"props":2053,"children":2054},{},[2055],{"type":31,"value":2056},"Imagen above-the-fold:",{"type":31,"value":2058}," JPEG de 1.2MB, sin lazy load",{"type":26,"tag":417,"props":2060,"children":2061},{},[2062,2067],{"type":26,"tag":34,"props":2063,"children":2064},{},[2065],{"type":31,"value":2066},"Caché de Cloudflare:",{"type":31,"value":2068}," respuesta SSR no cacheada, cada request llega al origen",{"type":26,"tag":27,"props":2070,"children":2071},{},[2072],{"type":31,"value":2073},"Medición inicial: PageSpeed Insights móvil 34\u002F100, desktop 62\u002F100. Estas métricas son posteriores a migración desde Shopify Liquid a Nuxt 3 — el cambio de framework por sí solo no genera ganancia de performance, requiere optimización arquitectónica.",{"type":26,"tag":42,"props":2075,"children":2077},{"id":2076},"estrategia-de-fuentes-auto-hospedadas-preload",[2078],{"type":31,"value":2079},"Estrategia de fuentes auto-hospedadas + preload",{"type":26,"tag":27,"props":2081,"children":2082},{},[2083,2085,2091,2093,2099,2101,2107,2109,2115],{"type":31,"value":2084},"Descargamos los mismos archivos de fuente desde Google Fonts al directorio ",{"type":26,"tag":101,"props":2086,"children":2088},{"className":2087},[],[2089],{"type":31,"value":2090},"public\u002Ffonts\u002F",{"type":31,"value":2092}," y movimos la definición ",{"type":26,"tag":101,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":31,"value":2098},"@font-face",{"type":31,"value":2100}," a ",{"type":26,"tag":101,"props":2102,"children":2104},{"className":2103},[],[2105],{"type":31,"value":2106},"app.vue",{"type":31,"value":2108},". La diferencia crítica: usamos ",{"type":26,"tag":101,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":31,"value":2114},"\u003Clink rel=\"preload\">",{"type":31,"value":2116}," para iniciar la solicitud de fuentes dentro de la respuesta HTML inicial, antes de que se analice el CSS.",{"type":26,"tag":135,"props":2118,"children":2122},{"className":2119,"code":2120,"language":2121,"meta":9,"style":9},"language-vue shiki shiki-themes github-dark","\u003C!-- app.vue -->\n\u003Cscript setup>\nuseHead({\n  link: [\n    {\n      rel: 'preload',\n      href: '\u002Ffonts\u002Finter-var.woff2',\n      as: 'font',\n      type: 'font\u002Fwoff2',\n      crossorigin: 'anonymous'\n    }\n  ]\n})\n\u003C\u002Fscript>\n\n\u003Cstyle>\n@font-face {\n  font-family: 'Inter';\n  src: url('\u002Ffonts\u002Finter-var.woff2') format('woff2');\n  font-display: swap;\n  font-weight: 100 900;\n}\n\u003C\u002Fstyle>\n","vue",[2123],{"type":26,"tag":101,"props":2124,"children":2125},{"__ignoreMap":9},[2126,2134,2158,2171,2179,2187,2204,2221,2238,2255,2268,2276,2284,2292,2308,2315,2330,2342,2363,2413,2435,2462,2470],{"type":26,"tag":145,"props":2127,"children":2128},{"class":147,"line":148},[2129],{"type":26,"tag":145,"props":2130,"children":2131},{"style":1341},[2132],{"type":31,"value":2133},"\u003C!-- app.vue -->\n",{"type":26,"tag":145,"props":2135,"children":2136},{"class":147,"line":158},[2137,2142,2148,2153],{"type":26,"tag":145,"props":2138,"children":2139},{"style":162},[2140],{"type":31,"value":2141},"\u003C",{"type":26,"tag":145,"props":2143,"children":2145},{"style":2144},"--shiki-default:#85E89D",[2146],{"type":31,"value":2147},"script",{"type":26,"tag":145,"props":2149,"children":2150},{"style":532},[2151],{"type":31,"value":2152}," setup",{"type":26,"tag":145,"props":2154,"children":2155},{"style":162},[2156],{"type":31,"value":2157},">\n",{"type":26,"tag":145,"props":2159,"children":2160},{"class":147,"line":168},[2161,2166],{"type":26,"tag":145,"props":2162,"children":2163},{"style":532},[2164],{"type":31,"value":2165},"useHead",{"type":26,"tag":145,"props":2167,"children":2168},{"style":162},[2169],{"type":31,"value":2170},"({\n",{"type":26,"tag":145,"props":2172,"children":2173},{"class":147,"line":176},[2174],{"type":26,"tag":145,"props":2175,"children":2176},{"style":162},[2177],{"type":31,"value":2178},"  link: [\n",{"type":26,"tag":145,"props":2180,"children":2181},{"class":147,"line":186},[2182],{"type":26,"tag":145,"props":2183,"children":2184},{"style":162},[2185],{"type":31,"value":2186},"    {\n",{"type":26,"tag":145,"props":2188,"children":2189},{"class":147,"line":195},[2190,2195,2200],{"type":26,"tag":145,"props":2191,"children":2192},{"style":162},[2193],{"type":31,"value":2194},"      rel: ",{"type":26,"tag":145,"props":2196,"children":2197},{"style":614},[2198],{"type":31,"value":2199},"'preload'",{"type":26,"tag":145,"props":2201,"children":2202},{"style":162},[2203],{"type":31,"value":622},{"type":26,"tag":145,"props":2205,"children":2206},{"class":147,"line":203},[2207,2212,2217],{"type":26,"tag":145,"props":2208,"children":2209},{"style":162},[2210],{"type":31,"value":2211},"      href: ",{"type":26,"tag":145,"props":2213,"children":2214},{"style":614},[2215],{"type":31,"value":2216},"'\u002Ffonts\u002Finter-var.woff2'",{"type":26,"tag":145,"props":2218,"children":2219},{"style":162},[2220],{"type":31,"value":622},{"type":26,"tag":145,"props":2222,"children":2223},{"class":147,"line":20},[2224,2229,2234],{"type":26,"tag":145,"props":2225,"children":2226},{"style":162},[2227],{"type":31,"value":2228},"      as: ",{"type":26,"tag":145,"props":2230,"children":2231},{"style":614},[2232],{"type":31,"value":2233},"'font'",{"type":26,"tag":145,"props":2235,"children":2236},{"style":162},[2237],{"type":31,"value":622},{"type":26,"tag":145,"props":2239,"children":2240},{"class":147,"line":219},[2241,2246,2251],{"type":26,"tag":145,"props":2242,"children":2243},{"style":162},[2244],{"type":31,"value":2245},"      type: ",{"type":26,"tag":145,"props":2247,"children":2248},{"style":614},[2249],{"type":31,"value":2250},"'font\u002Fwoff2'",{"type":26,"tag":145,"props":2252,"children":2253},{"style":162},[2254],{"type":31,"value":622},{"type":26,"tag":145,"props":2256,"children":2257},{"class":147,"line":228},[2258,2263],{"type":26,"tag":145,"props":2259,"children":2260},{"style":162},[2261],{"type":31,"value":2262},"      crossorigin: ",{"type":26,"tag":145,"props":2264,"children":2265},{"style":614},[2266],{"type":31,"value":2267},"'anonymous'\n",{"type":26,"tag":145,"props":2269,"children":2270},{"class":147,"line":236},[2271],{"type":26,"tag":145,"props":2272,"children":2273},{"style":162},[2274],{"type":31,"value":2275},"    }\n",{"type":26,"tag":145,"props":2277,"children":2278},{"class":147,"line":245},[2279],{"type":26,"tag":145,"props":2280,"children":2281},{"style":162},[2282],{"type":31,"value":2283},"  ]\n",{"type":26,"tag":145,"props":2285,"children":2286},{"class":147,"line":253},[2287],{"type":26,"tag":145,"props":2288,"children":2289},{"style":162},[2290],{"type":31,"value":2291},"})\n",{"type":26,"tag":145,"props":2293,"children":2294},{"class":147,"line":262},[2295,2300,2304],{"type":26,"tag":145,"props":2296,"children":2297},{"style":162},[2298],{"type":31,"value":2299},"\u003C\u002F",{"type":26,"tag":145,"props":2301,"children":2302},{"style":2144},[2303],{"type":31,"value":2147},{"type":26,"tag":145,"props":2305,"children":2306},{"style":162},[2307],{"type":31,"value":2157},{"type":26,"tag":145,"props":2309,"children":2310},{"class":147,"line":270},[2311],{"type":26,"tag":145,"props":2312,"children":2313},{"emptyLinePlaceholder":180},[2314],{"type":31,"value":183},{"type":26,"tag":145,"props":2316,"children":2317},{"class":147,"line":769},[2318,2322,2326],{"type":26,"tag":145,"props":2319,"children":2320},{"style":162},[2321],{"type":31,"value":2141},{"type":26,"tag":145,"props":2323,"children":2324},{"style":2144},[2325],{"type":31,"value":1000},{"type":26,"tag":145,"props":2327,"children":2328},{"style":162},[2329],{"type":31,"value":2157},{"type":26,"tag":145,"props":2331,"children":2332},{"class":147,"line":777},[2333,2337],{"type":26,"tag":145,"props":2334,"children":2335},{"style":484},[2336],{"type":31,"value":2098},{"type":26,"tag":145,"props":2338,"children":2339},{"style":162},[2340],{"type":31,"value":2341}," {\n",{"type":26,"tag":145,"props":2343,"children":2344},{"class":147,"line":795},[2345,2350,2354,2359],{"type":26,"tag":145,"props":2346,"children":2347},{"style":660},[2348],{"type":31,"value":2349},"  font-family",{"type":26,"tag":145,"props":2351,"children":2352},{"style":162},[2353],{"type":31,"value":1557},{"type":26,"tag":145,"props":2355,"children":2356},{"style":614},[2357],{"type":31,"value":2358},"'Inter'",{"type":26,"tag":145,"props":2360,"children":2361},{"style":162},[2362],{"type":31,"value":1372},{"type":26,"tag":145,"props":2364,"children":2366},{"class":147,"line":2365},19,[2367,2372,2376,2381,2385,2389,2394,2399,2403,2408],{"type":26,"tag":145,"props":2368,"children":2369},{"style":660},[2370],{"type":31,"value":2371},"  src",{"type":26,"tag":145,"props":2373,"children":2374},{"style":162},[2375],{"type":31,"value":1557},{"type":26,"tag":145,"props":2377,"children":2378},{"style":660},[2379],{"type":31,"value":2380},"url",{"type":26,"tag":145,"props":2382,"children":2383},{"style":162},[2384],{"type":31,"value":806},{"type":26,"tag":145,"props":2386,"children":2387},{"style":614},[2388],{"type":31,"value":2216},{"type":26,"tag":145,"props":2390,"children":2391},{"style":162},[2392],{"type":31,"value":2393},") ",{"type":26,"tag":145,"props":2395,"children":2396},{"style":660},[2397],{"type":31,"value":2398},"format",{"type":26,"tag":145,"props":2400,"children":2401},{"style":162},[2402],{"type":31,"value":806},{"type":26,"tag":145,"props":2404,"children":2405},{"style":614},[2406],{"type":31,"value":2407},"'woff2'",{"type":26,"tag":145,"props":2409,"children":2410},{"style":162},[2411],{"type":31,"value":2412},");\n",{"type":26,"tag":145,"props":2414,"children":2416},{"class":147,"line":2415},20,[2417,2422,2426,2431],{"type":26,"tag":145,"props":2418,"children":2419},{"style":660},[2420],{"type":31,"value":2421},"  font-display",{"type":26,"tag":145,"props":2423,"children":2424},{"style":162},[2425],{"type":31,"value":1557},{"type":26,"tag":145,"props":2427,"children":2428},{"style":660},[2429],{"type":31,"value":2430},"swap",{"type":26,"tag":145,"props":2432,"children":2433},{"style":162},[2434],{"type":31,"value":1372},{"type":26,"tag":145,"props":2436,"children":2438},{"class":147,"line":2437},21,[2439,2444,2448,2453,2458],{"type":26,"tag":145,"props":2440,"children":2441},{"style":660},[2442],{"type":31,"value":2443},"  font-weight",{"type":26,"tag":145,"props":2445,"children":2446},{"style":162},[2447],{"type":31,"value":1557},{"type":26,"tag":145,"props":2449,"children":2450},{"style":660},[2451],{"type":31,"value":2452},"100",{"type":26,"tag":145,"props":2454,"children":2455},{"style":660},[2456],{"type":31,"value":2457}," 900",{"type":26,"tag":145,"props":2459,"children":2460},{"style":162},[2461],{"type":31,"value":1372},{"type":26,"tag":145,"props":2463,"children":2465},{"class":147,"line":2464},22,[2466],{"type":26,"tag":145,"props":2467,"children":2468},{"style":162},[2469],{"type":31,"value":1633},{"type":26,"tag":145,"props":2471,"children":2473},{"class":147,"line":2472},23,[2474,2478,2482],{"type":26,"tag":145,"props":2475,"children":2476},{"style":162},[2477],{"type":31,"value":2299},{"type":26,"tag":145,"props":2479,"children":2480},{"style":2144},[2481],{"type":31,"value":1000},{"type":26,"tag":145,"props":2483,"children":2484},{"style":162},[2485],{"type":31,"value":2157},{"type":26,"tag":27,"props":2487,"children":2488},{},[2489,2494],{"type":26,"tag":34,"props":2490,"children":2491},{},[2492],{"type":31,"value":2493},"Ganancia:",{"type":31,"value":2495}," LCP 10.2s → 7.8s (caída de 2.4s). Carga de fuentes dejó de ser render-blocking, FOIT (Flash of Invisible Text) redujo de 1200ms a 180ms. Trade-off: los archivos de fuente ahora están en nuestro propio CDN, requiere gestión manual de versiones (lo resolvimos con bucket de Cloudflare R2 + headers Cache-Control).",{"type":26,"tag":42,"props":2497,"children":2499},{"id":2498},"selective-hydration-content-visibility",[2500,2502],{"type":31,"value":2501},"Selective hydration + ",{"type":26,"tag":101,"props":2503,"children":2505},{"className":2504},[],[2506],{"type":31,"value":2507},"content-visibility",{"type":26,"tag":27,"props":2509,"children":2510},{},[2511,2513,2519,2521,2527],{"type":31,"value":2512},"El comportamiento predeterminado de Nuxt 3 es hidratar todos los componentes. Pero componentes no presentes en above-the-fold (footer, sección de comentarios, productos relacionados) no necesitan hidratación antes de que el usuario haga scroll. Envolvimos estos componentes en ",{"type":26,"tag":101,"props":2514,"children":2516},{"className":2515},[],[2517],{"type":31,"value":2518},"LazyHydrate",{"type":31,"value":2520}," usando el módulo ",{"type":26,"tag":101,"props":2522,"children":2524},{"className":2523},[],[2525],{"type":31,"value":2526},"@nuxt\u002Flazy-hydration",{"type":31,"value":460},{"type":26,"tag":135,"props":2529,"children":2531},{"className":2119,"code":2530,"language":2121,"meta":9,"style":9},"\u003Ctemplate>\n  \u003CLazyHydrate when-visible>\n    \u003CProductRecommendations :product-id=\"productId\" \u002F>\n  \u003C\u002FLazyHydrate>\n\u003C\u002Ftemplate>\n",[2532],{"type":26,"tag":101,"props":2533,"children":2534},{"__ignoreMap":9},[2535,2551,2572,2604,2620],{"type":26,"tag":145,"props":2536,"children":2537},{"class":147,"line":148},[2538,2542,2547],{"type":26,"tag":145,"props":2539,"children":2540},{"style":162},[2541],{"type":31,"value":2141},{"type":26,"tag":145,"props":2543,"children":2544},{"style":2144},[2545],{"type":31,"value":2546},"template",{"type":26,"tag":145,"props":2548,"children":2549},{"style":162},[2550],{"type":31,"value":2157},{"type":26,"tag":145,"props":2552,"children":2553},{"class":147,"line":158},[2554,2559,2563,2568],{"type":26,"tag":145,"props":2555,"children":2556},{"style":162},[2557],{"type":31,"value":2558},"  \u003C",{"type":26,"tag":145,"props":2560,"children":2561},{"style":2144},[2562],{"type":31,"value":2518},{"type":26,"tag":145,"props":2564,"children":2565},{"style":532},[2566],{"type":31,"value":2567}," when-visible",{"type":26,"tag":145,"props":2569,"children":2570},{"style":162},[2571],{"type":31,"value":2157},{"type":26,"tag":145,"props":2573,"children":2574},{"class":147,"line":168},[2575,2580,2585,2590,2594,2599],{"type":26,"tag":145,"props":2576,"children":2577},{"style":162},[2578],{"type":31,"value":2579},"    \u003C",{"type":26,"tag":145,"props":2581,"children":2582},{"style":2144},[2583],{"type":31,"value":2584},"ProductRecommendations",{"type":26,"tag":145,"props":2586,"children":2587},{"style":532},[2588],{"type":31,"value":2589}," :product-id",{"type":26,"tag":145,"props":2591,"children":2592},{"style":162},[2593],{"type":31,"value":593},{"type":26,"tag":145,"props":2595,"children":2596},{"style":614},[2597],{"type":31,"value":2598},"\"productId\"",{"type":26,"tag":145,"props":2600,"children":2601},{"style":162},[2602],{"type":31,"value":2603}," \u002F>\n",{"type":26,"tag":145,"props":2605,"children":2606},{"class":147,"line":176},[2607,2612,2616],{"type":26,"tag":145,"props":2608,"children":2609},{"style":162},[2610],{"type":31,"value":2611},"  \u003C\u002F",{"type":26,"tag":145,"props":2613,"children":2614},{"style":2144},[2615],{"type":31,"value":2518},{"type":26,"tag":145,"props":2617,"children":2618},{"style":162},[2619],{"type":31,"value":2157},{"type":26,"tag":145,"props":2621,"children":2622},{"class":147,"line":186},[2623,2627,2631],{"type":26,"tag":145,"props":2624,"children":2625},{"style":162},[2626],{"type":31,"value":2299},{"type":26,"tag":145,"props":2628,"children":2629},{"style":2144},[2630],{"type":31,"value":2546},{"type":26,"tag":145,"props":2632,"children":2633},{"style":162},[2634],{"type":31,"value":2157},{"type":26,"tag":27,"props":2636,"children":2637},{},[2638,2640,2646],{"type":31,"value":2639},"En CSS, aplicamos ",{"type":26,"tag":101,"props":2641,"children":2643},{"className":2642},[],[2644],{"type":31,"value":2645},"content-visibility: auto",{"type":31,"value":2647}," para indicar al navegador \"si este elemento no está en viewport, no hagas cálculos de renderizado\":",{"type":26,"tag":135,"props":2649,"children":2653},{"className":2650,"code":2651,"language":2652,"meta":9,"style":9},"language-css shiki shiki-themes github-dark",".product-recommendations {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 500px; \u002F* altura placeholder *\u002F\n}\n","css",[2654],{"type":26,"tag":101,"props":2655,"children":2656},{"__ignoreMap":9},[2657,2669,2690,2726],{"type":26,"tag":145,"props":2658,"children":2659},{"class":147,"line":148},[2660,2665],{"type":26,"tag":145,"props":2661,"children":2662},{"style":532},[2663],{"type":31,"value":2664},".product-recommendations",{"type":26,"tag":145,"props":2666,"children":2667},{"style":162},[2668],{"type":31,"value":2341},{"type":26,"tag":145,"props":2670,"children":2671},{"class":147,"line":158},[2672,2677,2681,2686],{"type":26,"tag":145,"props":2673,"children":2674},{"style":660},[2675],{"type":31,"value":2676},"  content-visibility",{"type":26,"tag":145,"props":2678,"children":2679},{"style":162},[2680],{"type":31,"value":1557},{"type":26,"tag":145,"props":2682,"children":2683},{"style":660},[2684],{"type":31,"value":2685},"auto",{"type":26,"tag":145,"props":2687,"children":2688},{"style":162},[2689],{"type":31,"value":1372},{"type":26,"tag":145,"props":2691,"children":2692},{"class":147,"line":168},[2693,2698,2702,2706,2711,2716,2721],{"type":26,"tag":145,"props":2694,"children":2695},{"style":660},[2696],{"type":31,"value":2697},"  contain-intrinsic-size",{"type":26,"tag":145,"props":2699,"children":2700},{"style":162},[2701],{"type":31,"value":1557},{"type":26,"tag":145,"props":2703,"children":2704},{"style":660},[2705],{"type":31,"value":663},{"type":26,"tag":145,"props":2707,"children":2708},{"style":660},[2709],{"type":31,"value":2710}," 500",{"type":26,"tag":145,"props":2712,"children":2713},{"style":484},[2714],{"type":31,"value":2715},"px",{"type":26,"tag":145,"props":2717,"children":2718},{"style":162},[2719],{"type":31,"value":2720},"; ",{"type":26,"tag":145,"props":2722,"children":2723},{"style":1341},[2724],{"type":31,"value":2725},"\u002F* altura placeholder *\u002F\n",{"type":26,"tag":145,"props":2727,"children":2728},{"class":147,"line":176},[2729],{"type":26,"tag":145,"props":2730,"children":2731},{"style":162},[2732],{"type":31,"value":1633},{"type":26,"tag":27,"props":2734,"children":2735},{},[2736,2740,2742,2748],{"type":26,"tag":34,"props":2737,"children":2738},{},[2739],{"type":31,"value":2493},{"type":31,"value":2741}," TBT 2190ms → 420ms, LCP 7.8s → 4.1s. Bundle de JS inicial cargado: 420kB → 180kB (comprimido con brotli). Trade-off: ",{"type":26,"tag":101,"props":2743,"children":2745},{"className":2744},[],[2746],{"type":31,"value":2747},"when-visible",{"type":31,"value":2749}," usa Intersection Observer, requiere polyfill en navegadores antiguos como IE11 (no fue problema en nuestro caso con browser moderno como target).",{"type":26,"tag":42,"props":2751,"children":2753},{"id":2752},"edge-caching-enfoque-isr-híbrido",[2754],{"type":31,"value":2755},"Edge caching + enfoque ISR híbrido",{"type":26,"tag":27,"props":2757,"children":2758},{},[2759,2761,2767,2769,2775,2777,2783],{"type":31,"value":2760},"Cloudflare Pages cachea archivos estáticos por defecto, pero los endpoints SSR (",{"type":26,"tag":101,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":31,"value":2766},"\u002F_nuxt\u002F...",{"type":31,"value":2768}," excluido) no se cachean. En ",{"type":26,"tag":101,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":31,"value":2774},"nuxt.config.ts",{"type":31,"value":2776}," definimos ",{"type":26,"tag":101,"props":2778,"children":2780},{"className":2779},[],[2781],{"type":31,"value":2782},"routeRules",{"type":31,"value":2784}," para especificar qué paths se cachean y por cuánto tiempo:",{"type":26,"tag":135,"props":2786,"children":2790},{"className":2787,"code":2788,"language":2789,"meta":9,"style":9},"language-ts shiki shiki-themes github-dark","\u002F\u002F nuxt.config.ts\nexport default defineNuxtConfig({\n  routeRules: {\n    '\u002F': { swr: 3600 }, \u002F\u002F homepage 1h stale-while-revalidate\n    '\u002Fproducto\u002F**': { swr: 1800 }, \u002F\u002F product pages 30m\n    '\u002Fcategoria\u002F**': { static: true } \u002F\u002F category pages static en build\n  }\n})\n","ts",[2791],{"type":26,"tag":101,"props":2792,"children":2793},{"__ignoreMap":9},[2794,2802,2824,2832,2860,2886,2914,2922],{"type":26,"tag":145,"props":2795,"children":2796},{"class":147,"line":148},[2797],{"type":26,"tag":145,"props":2798,"children":2799},{"style":1341},[2800],{"type":31,"value":2801},"\u002F\u002F nuxt.config.ts\n",{"type":26,"tag":145,"props":2803,"children":2804},{"class":147,"line":158},[2805,2810,2815,2820],{"type":26,"tag":145,"props":2806,"children":2807},{"style":484},[2808],{"type":31,"value":2809},"export",{"type":26,"tag":145,"props":2811,"children":2812},{"style":484},[2813],{"type":31,"value":2814}," default",{"type":26,"tag":145,"props":2816,"children":2817},{"style":532},[2818],{"type":31,"value":2819}," defineNuxtConfig",{"type":26,"tag":145,"props":2821,"children":2822},{"style":162},[2823],{"type":31,"value":2170},{"type":26,"tag":145,"props":2825,"children":2826},{"class":147,"line":168},[2827],{"type":26,"tag":145,"props":2828,"children":2829},{"style":162},[2830],{"type":31,"value":2831},"  routeRules: {\n",{"type":26,"tag":145,"props":2833,"children":2834},{"class":147,"line":176},[2835,2840,2845,2850,2855],{"type":26,"tag":145,"props":2836,"children":2837},{"style":614},[2838],{"type":31,"value":2839},"    '\u002F'",{"type":26,"tag":145,"props":2841,"children":2842},{"style":162},[2843],{"type":31,"value":2844},": { swr: ",{"type":26,"tag":145,"props":2846,"children":2847},{"style":660},[2848],{"type":31,"value":2849},"3600",{"type":26,"tag":145,"props":2851,"children":2852},{"style":162},[2853],{"type":31,"value":2854}," }, ",{"type":26,"tag":145,"props":2856,"children":2857},{"style":1341},[2858],{"type":31,"value":2859},"\u002F\u002F homepage 1h stale-while-revalidate\n",{"type":26,"tag":145,"props":2861,"children":2862},{"class":147,"line":186},[2863,2868,2872,2877,2881],{"type":26,"tag":145,"props":2864,"children":2865},{"style":614},[2866],{"type":31,"value":2867},"    '\u002Fproducto\u002F**'",{"type":26,"tag":145,"props":2869,"children":2870},{"style":162},[2871],{"type":31,"value":2844},{"type":26,"tag":145,"props":2873,"children":2874},{"style":660},[2875],{"type":31,"value":2876},"1800",{"type":26,"tag":145,"props":2878,"children":2879},{"style":162},[2880],{"type":31,"value":2854},{"type":26,"tag":145,"props":2882,"children":2883},{"style":1341},[2884],{"type":31,"value":2885},"\u002F\u002F product pages 30m\n",{"type":26,"tag":145,"props":2887,"children":2888},{"class":147,"line":195},[2889,2894,2899,2904,2909],{"type":26,"tag":145,"props":2890,"children":2891},{"style":614},[2892],{"type":31,"value":2893},"    '\u002Fcategoria\u002F**'",{"type":26,"tag":145,"props":2895,"children":2896},{"style":162},[2897],{"type":31,"value":2898},": { static: ",{"type":26,"tag":145,"props":2900,"children":2901},{"style":660},[2902],{"type":31,"value":2903},"true",{"type":26,"tag":145,"props":2905,"children":2906},{"style":162},[2907],{"type":31,"value":2908}," } ",{"type":26,"tag":145,"props":2910,"children":2911},{"style":1341},[2912],{"type":31,"value":2913},"\u002F\u002F category pages static en build\n",{"type":26,"tag":145,"props":2915,"children":2916},{"class":147,"line":203},[2917],{"type":26,"tag":145,"props":2918,"children":2919},{"style":162},[2920],{"type":31,"value":2921},"  }\n",{"type":26,"tag":145,"props":2923,"children":2924},{"class":147,"line":20},[2925],{"type":26,"tag":145,"props":2926,"children":2927},{"style":162},[2928],{"type":31,"value":2291},{"type":26,"tag":27,"props":2930,"children":2931},{},[2932,2934,2940],{"type":31,"value":2933},"La estrategia ",{"type":26,"tag":101,"props":2935,"children":2937},{"className":2936},[],[2938],{"type":31,"value":2939},"swr",{"type":31,"value":2941}," (stale-while-revalidate): el primer request renderiza SSR, los siguientes requests vienen del caché, y en background se re-renderiza. Usamos Cloudflare KV store con URL + segmento de usuario (logged-in\u002Fanónimo) como cache key.",{"type":26,"tag":27,"props":2943,"children":2944},{},[2945,2949],{"type":26,"tag":34,"props":2946,"children":2947},{},[2948],{"type":31,"value":2493},{"type":31,"value":2950}," TTFB (Time to First Byte) 840ms → 120ms, LCP 4.1s → 2.3s. Cache hit rate alcanzó 78% en la primera semana. Trade-off: la personalización depende de la cache key; datos específicos del usuario como cantidad de items en carrito no pueden cachearse, se obtienen con fetch client-side.",{"type":26,"tag":42,"props":2952,"children":2954},{"id":2953},"optimización-de-imagen-above-the-fold",[2955],{"type":31,"value":2956},"Optimización de imagen above-the-fold",{"type":26,"tag":27,"props":2958,"children":2959},{},[2960,2962,2968],{"type":31,"value":2961},"Convertimos la imagen hero de JPEG 1.2MB a WebP 180kB e incluimos breakpoints responsivos con elemento ",{"type":26,"tag":101,"props":2963,"children":2965},{"className":2964},[],[2966],{"type":31,"value":2967},"\u003Cpicture>",{"type":31,"value":2969},":",{"type":26,"tag":135,"props":2971,"children":2973},{"className":2119,"code":2972,"language":2121,"meta":9,"style":9},"\u003Cpicture>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n    media=\"(max-width: 640px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Csource\n    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n    media=\"(min-width: 641px)\"\n    type=\"image\u002Fwebp\"\n  \u002F>\n  \u003Cimg\n    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n    alt=\"Nueva colección de temporada\"\n    fetchpriority=\"high\"\n    decoding=\"async\"\n  \u002F>\n\u003C\u002Fpicture>\n",[2974],{"type":26,"tag":101,"props":2975,"children":2976},{"__ignoreMap":9},[2977,2993,3001,3009,3017,3025,3033,3040,3048,3056,3063,3070,3078,3086,3094,3102,3110,3117],{"type":26,"tag":145,"props":2978,"children":2979},{"class":147,"line":148},[2980,2984,2989],{"type":26,"tag":145,"props":2981,"children":2982},{"style":162},[2983],{"type":31,"value":2141},{"type":26,"tag":145,"props":2985,"children":2986},{"style":2144},[2987],{"type":31,"value":2988},"picture",{"type":26,"tag":145,"props":2990,"children":2991},{"style":162},[2992],{"type":31,"value":2157},{"type":26,"tag":145,"props":2994,"children":2995},{"class":147,"line":158},[2996],{"type":26,"tag":145,"props":2997,"children":2998},{"style":162},[2999],{"type":31,"value":3000},"  \u003Csource\n",{"type":26,"tag":145,"props":3002,"children":3003},{"class":147,"line":168},[3004],{"type":26,"tag":145,"props":3005,"children":3006},{"style":162},[3007],{"type":31,"value":3008},"    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n",{"type":26,"tag":145,"props":3010,"children":3011},{"class":147,"line":176},[3012],{"type":26,"tag":145,"props":3013,"children":3014},{"style":162},[3015],{"type":31,"value":3016},"    media=\"(max-width: 640px)\"\n",{"type":26,"tag":145,"props":3018,"children":3019},{"class":147,"line":186},[3020],{"type":26,"tag":145,"props":3021,"children":3022},{"style":162},[3023],{"type":31,"value":3024},"    type=\"image\u002Fwebp\"\n",{"type":26,"tag":145,"props":3026,"children":3027},{"class":147,"line":195},[3028],{"type":26,"tag":145,"props":3029,"children":3030},{"style":162},[3031],{"type":31,"value":3032},"  \u002F>\n",{"type":26,"tag":145,"props":3034,"children":3035},{"class":147,"line":203},[3036],{"type":26,"tag":145,"props":3037,"children":3038},{"style":162},[3039],{"type":31,"value":3000},{"type":26,"tag":145,"props":3041,"children":3042},{"class":147,"line":20},[3043],{"type":26,"tag":145,"props":3044,"children":3045},{"style":162},[3046],{"type":31,"value":3047},"    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n",{"type":26,"tag":145,"props":3049,"children":3050},{"class":147,"line":219},[3051],{"type":26,"tag":145,"props":3052,"children":3053},{"style":162},[3054],{"type":31,"value":3055},"    media=\"(min-width: 641px)\"\n",{"type":26,"tag":145,"props":3057,"children":3058},{"class":147,"line":228},[3059],{"type":26,"tag":145,"props":3060,"children":3061},{"style":162},[3062],{"type":31,"value":3024},{"type":26,"tag":145,"props":3064,"children":3065},{"class":147,"line":236},[3066],{"type":26,"tag":145,"props":3067,"children":3068},{"style":162},[3069],{"type":31,"value":3032},{"type":26,"tag":145,"props":3071,"children":3072},{"class":147,"line":245},[3073],{"type":26,"tag":145,"props":3074,"children":3075},{"style":162},[3076],{"type":31,"value":3077},"  \u003Cimg\n",{"type":26,"tag":145,"props":3079,"children":3080},{"class":147,"line":253},[3081],{"type":26,"tag":145,"props":3082,"children":3083},{"style":162},[3084],{"type":31,"value":3085},"    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n",{"type":26,"tag":145,"props":3087,"children":3088},{"class":147,"line":262},[3089],{"type":26,"tag":145,"props":3090,"children":3091},{"style":162},[3092],{"type":31,"value":3093},"    alt=\"Nueva colección de temporada\"\n",{"type":26,"tag":145,"props":3095,"children":3096},{"class":147,"line":270},[3097],{"type":26,"tag":145,"props":3098,"children":3099},{"style":162},[3100],{"type":31,"value":3101},"    fetchpriority=\"high\"\n",{"type":26,"tag":145,"props":3103,"children":3104},{"class":147,"line":769},[3105],{"type":26,"tag":145,"props":3106,"children":3107},{"style":162},[3108],{"type":31,"value":3109},"    decoding=\"async\"\n",{"type":26,"tag":145,"props":3111,"children":3112},{"class":147,"line":777},[3113],{"type":26,"tag":145,"props":3114,"children":3115},{"style":162},[3116],{"type":31,"value":3032},{"type":26,"tag":145,"props":3118,"children":3119},{"class":147,"line":795},[3120,3124,3128],{"type":26,"tag":145,"props":3121,"children":3122},{"style":162},[3123],{"type":31,"value":2299},{"type":26,"tag":145,"props":3125,"children":3126},{"style":2144},[3127],{"type":31,"value":2988},{"type":26,"tag":145,"props":3129,"children":3130},{"style":162},[3131],{"type":31,"value":2157},{"type":26,"tag":27,"props":3133,"children":3134},{},[3135,3137,3143],{"type":31,"value":3136},"Con atributo ",{"type":26,"tag":101,"props":3138,"children":3140},{"className":3139},[],[3141],{"type":31,"value":3142},"fetchpriority=\"high\"",{"type":31,"value":3144}," indicamos al navegador \"prioriza la carga de esta imagen\". Cloudflare Image Resizing realiza conversión automática de formato en edge (serve JPEG a navegadores sin soporte WebP).",{"type":26,"tag":27,"props":3146,"children":3147},{},[3148,3152,3154,3160],{"type":26,"tag":34,"props":3149,"children":3150},{},[3151],{"type":31,"value":2493},{"type":31,"value":3153}," LCP 2.3s → 2.1s, tiempo de carga de imagen 1200ms → 320ms. CLS (Cumulative Layout Shift) 0.12 → 0.02 — reservamos espacio con propiedad CSS ",{"type":26,"tag":101,"props":3155,"children":3157},{"className":3156},[],[3158],{"type":31,"value":3159},"aspect-ratio",{"type":31,"value":460},{"type":26,"tag":42,"props":3162,"children":3164},{"id":3163},"resultados-de-benchmark-impacto-en-usuarios-reales",[3165],{"type":31,"value":3166},"Resultados de benchmark + impacto en usuarios reales",{"type":26,"tag":27,"props":3168,"children":3169},{},[3170],{"type":31,"value":3171},"PageSpeed Insights móvil 34 → 92, desktop 62 → 98. Promedio de CrUX a 28 días:",{"type":26,"tag":3173,"props":3174,"children":3175},"table",{},[3176,3205],{"type":26,"tag":3177,"props":3178,"children":3179},"thead",{},[3180],{"type":26,"tag":3181,"props":3182,"children":3183},"tr",{},[3184,3190,3195,3200],{"type":26,"tag":3185,"props":3186,"children":3187},"th",{},[3188],{"type":31,"value":3189},"Métrica",{"type":26,"tag":3185,"props":3191,"children":3192},{},[3193],{"type":31,"value":3194},"Antes",{"type":26,"tag":3185,"props":3196,"children":3197},{},[3198],{"type":31,"value":3199},"Después",{"type":26,"tag":3185,"props":3201,"children":3202},{},[3203],{"type":31,"value":3204},"Cambio",{"type":26,"tag":3206,"props":3207,"children":3208},"tbody",{},[3209,3233,3256,3279],{"type":26,"tag":3181,"props":3210,"children":3211},{},[3212,3218,3223,3228],{"type":26,"tag":3213,"props":3214,"children":3215},"td",{},[3216],{"type":31,"value":3217},"LCP",{"type":26,"tag":3213,"props":3219,"children":3220},{},[3221],{"type":31,"value":3222},"10.2s",{"type":26,"tag":3213,"props":3224,"children":3225},{},[3226],{"type":31,"value":3227},"2.1s",{"type":26,"tag":3213,"props":3229,"children":3230},{},[3231],{"type":31,"value":3232},"-79%",{"type":26,"tag":3181,"props":3234,"children":3235},{},[3236,3241,3246,3251],{"type":26,"tag":3213,"props":3237,"children":3238},{},[3239],{"type":31,"value":3240},"TBT",{"type":26,"tag":3213,"props":3242,"children":3243},{},[3244],{"type":31,"value":3245},"2190ms",{"type":26,"tag":3213,"props":3247,"children":3248},{},[3249],{"type":31,"value":3250},"420ms",{"type":26,"tag":3213,"props":3252,"children":3253},{},[3254],{"type":31,"value":3255},"-81%",{"type":26,"tag":3181,"props":3257,"children":3258},{},[3259,3264,3269,3274],{"type":26,"tag":3213,"props":3260,"children":3261},{},[3262],{"type":31,"value":3263},"CLS",{"type":26,"tag":3213,"props":3265,"children":3266},{},[3267],{"type":31,"value":3268},"0.12",{"type":26,"tag":3213,"props":3270,"children":3271},{},[3272],{"type":31,"value":3273},"0.02",{"type":26,"tag":3213,"props":3275,"children":3276},{},[3277],{"type":31,"value":3278},"-83%",{"type":26,"tag":3181,"props":3280,"children":3281},{},[3282,3287,3292,3297],{"type":26,"tag":3213,"props":3283,"children":3284},{},[3285],{"type":31,"value":3286},"TTFB",{"type":26,"tag":3213,"props":3288,"children":3289},{},[3290],{"type":31,"value":3291},"840ms",{"type":26,"tag":3213,"props":3293,"children":3294},{},[3295],{"type":31,"value":3296},"120ms",{"type":26,"tag":3213,"props":3298,"children":3299},{},[3300],{"type":31,"value":3301},"-86%",{"type":26,"tag":27,"props":3303,"children":3304},{},[3305,3307,3314],{"type":31,"value":3306},"Google Analytics en embudo de conversión: tasa de inicio checkout pasó de 3.2% a 4.8% (+50% en lift relativo). Bounce rate 68% → 52%. Search Console: tráfico orgánico aumentó 34% en 2 meses (otros cambios SEO controlados). Estas métricas alineadas con los estándares de Roibase en ",{"type":26,"tag":326,"props":3308,"children":3311},{"href":3309,"rel":3310},"https:\u002F\u002Fwww.roibase.com.tr\u002Fes\u002Fheadless",[330],[3312],{"type":31,"value":3313},"Headless Commerce",{"type":31,"value":3315}," — si la performance no se traduce en métrica de negocio, el cambio arquitectónico no cuenta como exitoso.",{"type":26,"tag":42,"props":3317,"children":3319},{"id":3318},"trade-offs-y-criterios-de-decisión",[3320],{"type":31,"value":3321},"Trade-offs y criterios de decisión",{"type":26,"tag":27,"props":3323,"children":3324},{},[3325,3330,3332,3337,3339,3345],{"type":26,"tag":34,"props":3326,"children":3327},{},[3328],{"type":31,"value":3329},"Developer experience:",{"type":31,"value":3331}," Agregar wrapper de lazy hydration incrementó la surface area del API de componentes; nuevos developers necesitaban aprender la diferencia entre ",{"type":26,"tag":101,"props":3333,"children":3335},{"className":3334},[],[3336],{"type":31,"value":2747},{"type":31,"value":3338}," vs ",{"type":26,"tag":101,"props":3340,"children":3342},{"className":3341},[],[3343],{"type":31,"value":3344},"when-idle",{"type":31,"value":3346},". Lo resolvimos con documentación en Storybook + reglas ESLint.",{"type":26,"tag":27,"props":3348,"children":3349},{},[3350,3355],{"type":26,"tag":34,"props":3351,"children":3352},{},[3353],{"type":31,"value":3354},"Bundle size vs costo en runtime:",{"type":31,"value":3356}," Archivos de fuentes auto-hospedadas sumaron +60kB al bundle inicial, pero eliminaron el costo de DNS lookup + TLS handshake. Este trade-off es ganancia neta en 3G móvil, neutral en fibra.",{"type":26,"tag":27,"props":3358,"children":3359},{},[3360,3365,3367,3372],{"type":26,"tag":34,"props":3361,"children":3362},{},[3363],{"type":31,"value":3364},"Cache invalidation:",{"type":31,"value":3366}," La estrategia ",{"type":26,"tag":101,"props":3368,"children":3370},{"className":3369},[],[3371],{"type":31,"value":2939},{"type":31,"value":3373}," conlleva riesgo de datos stale. Datos críticos como disponibilidad de stock se mantienen actualizados con fetch client-side en tiempo real (polling cada 30s en lugar de WebSocket — costo más bajo en edge functions).",{"type":26,"tag":27,"props":3375,"children":3376},{},[3377,3382],{"type":26,"tag":34,"props":3378,"children":3379},{},[3380],{"type":31,"value":3381},"Vendor lock-in de Cloudflare:",{"type":31,"value":3383}," El caching basado en KV es específico de Cloudflare; portabilidad a otra plataforma requeriría re-implementación. Pero Vercel\u002FNetlify tienen primitivas equivalentes, el esfuerzo de migración es aceptable.",{"type":26,"tag":42,"props":3385,"children":3387},{"id":3386},"próximos-pasos",[3388],{"type":31,"value":3389},"Próximos pasos",{"type":26,"tag":27,"props":3391,"children":3392},{},[3393],{"type":31,"value":3394},"2.1s LCP es sólido, pero CrUX P75 (percentil 75) aún está en 3.2s. El roadmap es:",{"type":26,"tag":413,"props":3396,"children":3397},{},[3398,3408,3418,3428],{"type":26,"tag":417,"props":3399,"children":3400},{},[3401,3406],{"type":26,"tag":34,"props":3402,"children":3403},{},[3404],{"type":31,"value":3405},"Image CDN + negotiación automática de formato:",{"type":31,"value":3407}," Integración con Imgix en lugar de Cloudflare Polish, soporte AVIF",{"type":26,"tag":417,"props":3409,"children":3410},{},[3411,3416],{"type":26,"tag":34,"props":3412,"children":3413},{},[3414],{"type":31,"value":3415},"Estrategia de prefetch:",{"type":31,"value":3417}," Intersection Observer prefetches datos de product cards aproximándose a viewport",{"type":26,"tag":417,"props":3419,"children":3420},{},[3421,3426],{"type":26,"tag":34,"props":3422,"children":3423},{},[3424],{"type":31,"value":3425},"Service Worker + offline-first:",{"type":31,"value":3427}," Workbox cachea assets críticos, fallback network-first",{"type":26,"tag":417,"props":3429,"children":3430},{},[3431,3436],{"type":26,"tag":34,"props":3432,"children":3433},{},[3434],{"type":31,"value":3435},"Bundle splitting agresivo:",{"type":31,"value":3437}," Code splitting de Nuxt 3 más agresivo, chunking basado en rutas",{"type":26,"tag":27,"props":3439,"children":3440},{},[3441],{"type":31,"value":3442},"La optimización de performance es un juego sin fin — cada 100ms ganado genera +1-2% lift en conversión. La combinación Nuxt 3 + Cloudflare Pages ofrece equilibrio entre edge rendering y ergonomía de framework JS moderno. Al decidir la stack, definir el target LCP como requisito de negocio, luego evaluar opciones arquitectónicas dentro de esa restricción.",{"type":26,"tag":1000,"props":3444,"children":3445},{},[3446],{"type":31,"value":1004},{"title":9,"searchDepth":168,"depth":168,"links":3448},[3449,3450,3451,3453,3454,3455,3456,3457],{"id":2016,"depth":158,"text":2019},{"id":2076,"depth":158,"text":2079},{"id":2498,"depth":158,"text":3452},"Selective hydration + content-visibility",{"id":2752,"depth":158,"text":2755},{"id":2953,"depth":158,"text":2956},{"id":3163,"depth":158,"text":3166},{"id":3318,"depth":158,"text":3321},{"id":3386,"depth":158,"text":3389},"content:es:tech:nuxt3-cloudflare-pages-lcp-optimizacion.md","es\u002Ftech\u002Fnuxt3-cloudflare-pages-lcp-optimizacion.md","es\u002Ftech\u002Fnuxt3-cloudflare-pages-lcp-optimizacion",{"ai":148,"marketing":148,"tech":148,"data":3462,"gaming":3462,"travel":3462,"lifestyle":3462},0,1778164175055]