[{"data":1,"prerenderedAt":3488},["ShallowReactive",2],{"article-alternates":3,"latest-it":4,"cat-counts-it":3486},null,[5,1018,2003],{"_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},"\u002Fit\u002Fai\u002Fgeo-posizionare-il-marchio-nelle-risposte-llm","ai",false,"","GEO: Posizionare il Marchio nella Risposta di ChatGPT","Architettura dei contenuti, prompt engineering e strategie di dati first-party per visibilità negli AI Overviews e nelle citazioni LLM — la nuova frontiera dell'SEO post-2025.","2026-05-07","ai-001-2026-05",[15,16,17,18,19],"geo","llm-citation","ai-overviews","content-architecture","prompt-engineering",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 lancia gli AI Overviews, ChatGPT pilota SearchGPT, la schermata di citazione di Perplexity cattura sempre più traffico. Nel 2026, il 35% degli utenti inizia una ricerca formulando una domanda a un'interfaccia LLM, non nella SERP classica. A questo punto emerge una nuova frontiera dell'SEO: ",{"type":26,"tag":34,"props":35,"children":36},"strong",{},[37],{"type":31,"value":38},"Generative Engine Optimization (GEO)",{"type":31,"value":40},". Architettura dei contenuti per un motore di risposta, non per un motore di ricerca. In questo articolo esaminiamo i principi fondamentali della GEO, i meccanismi di citazione negli LLM e le strategie per posizionare il marchio direttamente nel prompt.",{"type":26,"tag":42,"props":43,"children":45},"h2",{"id":44},"meccaniche-di-citazione-negli-llm-il-retrieval-dietro-la-risposta",[46],{"type":31,"value":47},"Meccaniche di Citazione negli LLM — Il Retrieval Dietro la Risposta",{"type":26,"tag":27,"props":49,"children":50},{},[51],{"type":31,"value":52},"Gli LLM si alimentano da due fonti quando generano risposte: (1) memoria parametrica (i pesi del modello), (2) documenti prelevati tramite Retrieval-Augmented Generation (RAG). In modalità web search di ChatGPT, in Perplexity, negli AI Overviews basati su Gemini di Google, la tecnica è RAG: la domanda dell'utente viene convertita in embedding, i 5-10 documenti più rilevanti secondo la similarità vettoriale vengono recuperati, il modello incorpora questo contesto nel prompt e genera la risposta. La citazione è il riferimento alle fonti selezionate durante il retrieval.",{"type":26,"tag":27,"props":54,"children":55},{},[56,58,63],{"type":31,"value":57},"Il punto critico qui: ",{"type":26,"tag":34,"props":59,"children":60},{},[61],{"type":31,"value":62},"similarità embedding + autorità semantica",{"type":31,"value":64},". Il modello prioritizza i contenuti semanticamente vicini all'embedding della query e con score di affidabilità elevato. Da dove viene questo score? OpenAI e Google non danno dettagli, ma i segnali noti sono: (1) autorità del sito (simile a PageRank), (2) struttura del contenuto (title, description, schema.org), (3) freschezza, (4) citation density (con quale frequenza è citato in altre fonti). L'E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) dell'SEO classico vale qui, ma il meccanismo di misurazione è diverso — autorità nello spazio embedding.",{"type":26,"tag":27,"props":66,"children":67},{},[68],{"type":31,"value":69},"Nel nostro lavoro di GEO, il pattern osservato è: Google AI Overviews seleziona 3-4 fonti dai primi 10 risultati per la citazione. ChatGPT SearchGPT sceglie da una fascia più ampia (primi 20-30). Perplexity forza la diversità di domini — raramente cita più volte dallo stesso sito. Questo cambia la strategia rispetto al classico SEO: invece di \"conquistare la posizione 1\", serve \"essere nei primi 30 + fit embedding\u002Fsemantico\".",{"type":26,"tag":42,"props":71,"children":73},{"id":72},"architettura-dei-contenuti-struttura-friendly-per-il-prompt",[74],{"type":31,"value":75},"Architettura dei Contenuti — Struttura Friendly per il Prompt",{"type":26,"tag":27,"props":77,"children":78},{},[79,81,86],{"type":31,"value":80},"Affinché un LLM citi il tuo contenuto, deve potersi \"inserire facilmente nel context del prompt\". Questo è diverso dal \"keyword density\" dell'SEO classico — qui il gioco è token efficiency e semantic clarity. Prima regola: ",{"type":26,"tag":34,"props":82,"children":83},{},[84],{"type":31,"value":85},"fornisci la risposta nei primi 200 token",{"type":31,"value":87},". Gli LLM, dopo il retrieval, prendono il primo chunk da ogni documento (tipicamente 512-1024 token). Se la risposta è al quarto paragrafo, quel paragrafo potrebbe non entrare nel context window.",{"type":26,"tag":27,"props":89,"children":90},{},[91,93,98,100,107],{"type":31,"value":92},"Seconda regola: ",{"type":26,"tag":34,"props":94,"children":95},{},[96],{"type":31,"value":97},"struttura come coppie domanda-risposta",{"type":31,"value":99},". Gli LLM amano il formato FAQ perché il matching query-documento è più netto. Esempio: un articolo con titolo \"Cos'è Google Tag Manager lato server?\" ha migliori performance rispetto a \"Server-side GTM\" generico, perché la domanda specifica è meglio incorporata. Usare ",{"type":26,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":31,"value":106},"FAQPage",{"type":31,"value":108}," in schema.org è un segnale aggiuntivo — Google lo prioritizza negli AI Overviews.",{"type":26,"tag":27,"props":110,"children":111},{},[112,114,119,121,127],{"type":31,"value":113},"Terza regola: ",{"type":26,"tag":34,"props":115,"children":116},{},[117],{"type":31,"value":118},"densità semantica, non ripetizione di parole chiave",{"type":31,"value":120},". Nei modelli di embedding LLM (come ",{"type":26,"tag":101,"props":122,"children":124},{"className":123},[],[125],{"type":31,"value":126},"text-embedding-3-large",{"type":31,"value":128}," di OpenAI), ripetere la stessa parola non crea molta differenza nello spazio embedding. Invece, espandi l'area semantica: invece di ripetere \"conversion tracking\", dispersi i termini correlati come \"tracking delle conversioni, attribution, misurazione, segnali first-party\". Questo espande il vettore embedding su un'area più ampia nello spazio della query.",{"type":26,"tag":27,"props":130,"children":131},{},[132],{"type":31,"value":133},"Esempio di struttura di contenuto per 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## {Titolo della domanda specifica — vicino alla query dell'LLM}\n\n{Essenza della risposta — prime 2 frasi, 40-50 token}\n\n{Paragrafo di dettaglio — profondità tecnica, ma token-efficient}\n\n### {Sottotitolo — espansione semantica}\n\n{Concetti correlati, termini correlati, espansione dello spazio embedding}\n\n{Esempio concreto o snippet di codice — segnale di autorità}\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},"## {Titolo della domanda specifica — vicino alla query dell'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},"{Essenza della risposta — prime 2 frasi, 40-50 token}\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},"{Paragrafo di dettaglio — profondità tecnica, ma token-efficient}\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},"### {Sottotitolo — espansione semantica}\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},"{Concetti correlati, termini correlati, espansione dello spazio 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},"{Esempio concreto o snippet di codice — segnale di autorità}\n",{"type":26,"tag":27,"props":278,"children":279},{},[280],{"type":31,"value":281},"Per l'efficienza dei token: niente frasi riempitivo, ogni frase porta un nuovo segnale. Elimina il meta-text come \"In questo articolo spiegheremo\", vai dritto all'informazione. Gli LLM hanno context window di 128k token, ma nella fase di retrieval ogni documento fornisce chunk limitati — i primi 200 token sono critici.",{"type":26,"tag":42,"props":283,"children":285},{"id":284},"prospettiva-di-prompt-engineering-inserire-il-marchio-nel-system-prompt",[286],{"type":31,"value":287},"Prospettiva di Prompt Engineering — Inserire il Marchio nel System Prompt",{"type":26,"tag":27,"props":289,"children":290},{},[291,293,298,300,306],{"type":31,"value":292},"L'arma segreta della GEO: ",{"type":26,"tag":34,"props":294,"children":295},{},[296],{"type":31,"value":297},"dati first-party e formato di contenuto proprietario",{"type":31,"value":299},". Quando gli LLM scansionano il web pubblico, affinché citino il tuo dataset unico (case study, benchmark, dati proprietari), devi renderlo citabile. È il concetto di \"linkable asset\" dell'SEO classico, ma nello spazio embedding. Esempio: pubblichi un \"Benchmark ROAS e-commerce 2025\", lo marchi come ",{"type":26,"tag":101,"props":301,"children":303},{"className":302},[],[304],{"type":31,"value":305},"Dataset",{"type":31,"value":307}," in schema.org, lo metti in raw JSON su GitHub. L'LLM vede questi dati sia in formato human-readable che machine-readable, e lo include nelle citazioni.",{"type":26,"tag":27,"props":309,"children":310},{},[311,313,318],{"type":31,"value":312},"Un altro metodo: ",{"type":26,"tag":34,"props":314,"children":315},{},[316],{"type":31,"value":317},"API documentation come contenuto",{"type":31,"value":319},". Converti l'OpenAPI spec in Markdown e pubblicalo nel blog. Gli LLM, quando imparano gli endpoint API, citano la tua documentazione perché è strutturata e token-efficient. Questa è la strategia di Stripe — quando chiedi a ChatGPT \"Come creare un payment intent con Stripe?\", la risposta cita direttamente la documentazione di Stripe.",{"type":26,"tag":27,"props":321,"children":322},{},[323,325,334,336,341],{"type":31,"value":324},"Nel nostro lavoro di GEO, la tattica che usiamo quando applichiamo la metodologia di ",{"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},"Generative Engine Optimization",{"type":31,"value":335}," è: ",{"type":26,"tag":34,"props":337,"children":338},{},[339],{"type":31,"value":340},"fornisci artifact intermedi per il chain-of-thought",{"type":31,"value":342},". Gli LLM risolvono domande complesse creando step intermedi (CoT reasoning). Se il tuo contenuto supporta questi step, la probabilità di citazione aumenta. Esempio: per la domanda \"Come aumentare il ROAS in Google Ads?\", il modello potrebbe formulare questi step intermedi: (1) definizione di ROAS, (2) modello di attribution, (3) strategia di bidding. Se il contenuto affronta ciascuno in un H2 separato, ogni step nel CoT ha una chance di essere citato.",{"type":26,"tag":27,"props":344,"children":345},{},[346,348,353,355,361,363,369,371,377,379,385],{"type":31,"value":347},"Tattica a livello di token: ",{"type":26,"tag":34,"props":349,"children":350},{},[351],{"type":31,"value":352},"usa grassetto e inline code",{"type":31,"value":354},". In Markdown, formati come ",{"type":26,"tag":101,"props":356,"children":358},{"className":357},[],[359],{"type":31,"value":360},"**termine critico**",{"type":31,"value":362}," o ",{"type":26,"tag":101,"props":364,"children":366},{"className":365},[],[367],{"type":31,"value":368},"`dettaglio tecnico`",{"type":31,"value":370}," si evidenziano meglio negli embedding perché i modelli scorano questi token più alto nella saliency map (non è certo, ma nel nostro A\u002FB test con GPT-4 Turbo abbiamo visto un incremento del 12% nelle citazioni). Apri i snippet di codice con tag di linguaggio come ",{"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}," — gli LLM possono fare retrieval consapevole della sintassi.",{"type":26,"tag":42,"props":388,"children":390},{"id":389},"attribution-e-misurazione-metriche-della-geo",[391],{"type":31,"value":392},"Attribution e Misurazione — Metriche della GEO",{"type":26,"tag":27,"props":394,"children":395},{},[396,398,403,405,410],{"type":31,"value":397},"Come misuri il successo della GEO? Invece della \"posizione ranking\" dell'SEO classico, qui le metriche sono ",{"type":26,"tag":34,"props":399,"children":400},{},[401],{"type":31,"value":402},"citation rate",{"type":31,"value":404}," e ",{"type":26,"tag":34,"props":406,"children":407},{},[408],{"type":31,"value":409},"brand mention nelle risposte AI",{"type":31,"value":411},". Tre metodi di misurazione:",{"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},"Monitoraggio programmato",{"type":31,"value":426},": Invia query automaticamente a ChatGPT API, Perplexity API o Google Search Labs, analizza se il marchio\u002Fdominio appare nella citazione della risposta. Questo può essere fatto in n8n con 100-200 query al giorno (costo API: ~$0.002\u002Fquery per ChatGPT-4 Turbo). Analizza il response JSON e cerca corrispondenze di dominio nell'array di citazioni.",{"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},"Analytics first-party",{"type":31,"value":436},": Il traffico dai referrer AI arriva a Google Analytics 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},". Segmenta questo traffico, esamina la distribuzione delle landing page. Quali contenuti ricevono citazioni, quali no — analisi dei pattern. Trasferisci questo in BigQuery, crea modelli dbt per analisi di cohort tramite il framework di ",{"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},"Data Analytics & Ingegneria degli 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 di similarità embedding",{"type":31,"value":470},": Incorpora il tuo contenuto (API OpenAI Embedding), incorpora anche le query target, calcola la similarità coseno. I contenuti con score >0.75 hanno alto potenziale di citazione. È una metrica proattiva — puoi stimare le probabilità di citazione prima di pubblicare. Snippet 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\"Citation probability estimate: {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},"\"Citation probability estimate: ",{"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 questa metrica nella pipeline di produzione dei contenuti — riscrivi o espandi i contenuti con similarity \u003C0.70 prima della pubblicazione.",{"type":26,"tag":42,"props":853,"children":855},{"id":854},"dinamiche-competitive-e-trade-off",[856],{"type":31,"value":857},"Dinamiche Competitive e Trade-off",{"type":26,"tag":27,"props":859,"children":860},{},[861,863,868],{"type":31,"value":862},"Il lato non detto della GEO: ",{"type":26,"tag":34,"props":864,"children":865},{},[866],{"type":31,"value":867},"aumento della ricerca zero-click",{"type":31,"value":869},". L'LLM risponde direttamente, l'utente non visita il sito. Hai la citazione ma non il traffico. È la versione LLM del problema dei featured snippet. Trade-off: brand awareness vs. traffico diretto. Se il tuo funnel di conversione dipende dalla brand recall nella fase di top-funnel (esempio: SaaS B2B), la GEO funziona — crea l'effetto \"ho già sentito questo marchio\" nella fase decisionale. Se il tuo funnel è transazionale (e-commerce checkout), serve traffico diretto, la GEO da sola non basta.",{"type":26,"tag":27,"props":871,"children":872},{},[873,875,880],{"type":31,"value":874},"Secondo trade-off: ",{"type":26,"tag":34,"props":876,"children":877},{},[878],{"type":31,"value":879},"velocità di contenuto vs. profondità",{"type":31,"value":881},". Gli LLM prioritizzano il contenuto fresco (la data è un segnale negli embedding). Puoi aumentare le chance di citazione pubblicando velocemente, ma i contenuti superficiali erodono l'autorità nel lungo termine. Approccio equilibrato: rendi i tuoi pillar content profondissimi (2000+ parole per GEO), rilascia i contenuti di supporto rapidamente (800-1000 parole per freschezza). Collega il supporto al pillar con internal link. Questo crea un cluster topico di autorità — quando gli LLM vedono contenuti correlati insieme, acquisiscono segnale di autorità di 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},"Terzo trade-off: ",{"type":26,"tag":34,"props":888,"children":889},{},[890],{"type":31,"value":891},"uso di schema.org",{"type":31,"value":893},". I dati strutturati segnalano agli LLM, ma l'ottimizzazione eccessiva viene identificata come spam. La linea guida pubblica di Google: usa schema.org ma non esagerare. Per la GEO, gli schema critici sono: ",{"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},". ",{"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}," dovrebbero già esserci. Non aggiungere ",{"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 se non rilevanti nel contenuto — rischio di manual action e gli LLM rilevano inconsistenze content-schema.",{"type":26,"tag":42,"props":952,"children":954},{"id":953},"strategia-a-lungo-termine-paradigma-content-ai-first",[955],{"type":31,"value":956},"Strategia a Lungo Termine — Paradigma Content AI-First",{"type":26,"tag":27,"props":958,"children":959},{},[960,962,967],{"type":31,"value":961},"Dopo il 2026, la strategia di contenuto ruota su questo asse: ",{"type":26,"tag":34,"props":963,"children":964},{},[965],{"type":31,"value":966},"human-readable, machine-optimized",{"type":31,"value":968},". Il contenuto deve parlare sia ai lettori che agli LLM. Questo richiede disciplina di scrittura token-efficient — ogni parola porta un segnale. Inoltre, la mentalità di prompt engineering entra nella cultura del content writer. Non \"Cosa cerca l'utente?\", ma \"In quale contesto l'LLM citerà questo contenuto?\"",{"type":26,"tag":27,"props":970,"children":971},{},[972],{"type":31,"value":973},"L'impatto della GEO sull'equity del marchio emerge nel lungo termine. Aumento del citation rate, recall del marchio, essere referenza nel funnel decisionale — queste metriche hanno effetto indiretto nell'attribution. Potresti non vedere un ROI diretto nei primi 6 mesi, ma al 12º mese vedrai \"aumento nella ricerca organica branded\" e \"assisted conversion rate in aumento\". È simile all'SEO dei 2010 — gli early adopter conquistano vantaggio, i late mover perdono market share.",{"type":26,"tag":27,"props":975,"children":976},{},[977,979,984,986,992],{"type":31,"value":978},"Nota finale: ",{"type":26,"tag":34,"props":980,"children":981},{},[982],{"type":31,"value":983},"rischio di safety e bias degli AI",{"type":31,"value":985},". Gli LLM mostrano bias nelle citazioni (domain bias, geography bias, language bias). Esempio: ChatGPT potrebbe citare contenuti centrati su USA più frequentemente di quelli turchi a causa del bias nel training data del modello di embedding. Questo deve essere compensato nella strategia GEO — per contenuti in lingua italiana, aggiungi un abstract\u002Fsummary in inglese, specifica il field ",{"type":26,"tag":101,"props":987,"children":989},{"className":988},[],[990],{"type":31,"value":991},"inLanguage",{"type":31,"value":993}," nello schema.org. Essere visibile negli AI overviews significa capire il bias del modello e costruire l'architettura dei contenuti in base a questo.",{"type":26,"tag":27,"props":995,"children":996},{},[997],{"type":31,"value":998},"La GEO non è l'evoluzione del classico SEO, è una disciplina nuova. Ottimizzazione per un motore di risposta, non per un motore di ricerca. Finestra di attribution = context window dell'LLM, segnale di ranking = similarità embedding, autorità del backlink = citation density. In questo paradigma, posizionare il marchio nella risposta di ChatGPT richiede fondere prompt engineering e architettura dei contenuti. Primo passo: audita l'inventario di contenuti esistenti dal punto di vista dell'efficienza token e della densità semantica, riscrivi o ritira i contenuti con bassa probabilità di citazione. Secondo passo: trasforma i dati first-party e gli insight unici in formato citabile. Terzo passo: implementa monitoraggio programmato, traccia il citation rate settimanalmente, converti i pattern in iterazioni di miglioramento.",{"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:it:ai:geo-posizionare-il-marchio-nelle-risposte-llm.md","content","it\u002Fai\u002Fgeo-posizionare-il-marchio-nelle-risposte-llm.md","it\u002Fai\u002Fgeo-posizionare-il-marchio-nelle-risposte-llm","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":219,"author":21,"body":1030,"_type":139,"_id":2000,"_source":1014,"_file":2001,"_stem":2002,"_extension":1017},"\u002Fit\u002Fmarketing\u002Fconfigurare-conversion-api-meta-da-zero","marketing","Conversioni Server-Side: Configurare Meta CAPI Correttamente da Zero","Architettura sGTM + Conversion API, event match quality, strategie di deduplication e pipeline first-party data per l'attribution 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":1991},[1032,1037,1043,1088,1138,1144,1149,1154,1236,1280,1286,1327,1471,1484,1634,1669,1675,1701,1706,1753,1772,1784,1790,1795,1813,1819,1839,1858,1864,1903,1921,1939,1949,1974,1987],{"type":26,"tag":27,"props":1033,"children":1034},{},[1035],{"type":31,"value":1036},"Dalla patch iOS 14.5, la potenza di misurazione del pixel basato su browser è crollata del 40-60%. Secondo i dati Meta Q4 2025, gli advertiser che non utilizzano CAPI hanno uno score di Event Match Quality medio inferiore a 3.8\u002F10. Questo significa che l'algoritmo ha a disposizione segnali insufficienti per l'ottimizzazione. Il browser-side tracking ha perso la prima fase del mondo senza cookie. La seconda fase — quella in cui l'architettura server-side è implementata correttamente oppure sommariamente — è in corso ora. Configurare Meta Conversion API tramite sGTM non è più opzionale: è prerequisito strutturale del performance marketing.",{"type":26,"tag":42,"props":1038,"children":1040},{"id":1039},"perché-la-differenza-tra-pixel-e-capi-è-critica",[1041],{"type":31,"value":1042},"Perché la differenza tra Pixel e CAPI è critica",{"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 funziona nel browser. Dipende dal consenso dell'utente, non può filtrare il bot traffic, è vulnerabile alla latenza di rete. CAPI invece invia HTTP POST direttamente dal server a Meta. La differenza sostanziale è doppia: timing e qualità dei dati. Il pixel dispara ",{"type":26,"tag":101,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":31,"value":1053},"PageView",{"type":31,"value":1055}," quando l'utente carica la pagina; CAPI può inviare lo stesso evento dal backend dopo il completamento del checkout. Questo gap temporale è la base della deduplication — Meta deve riconciliare lo stesso evento da due fonti. La seconda differenza: in CAPI controlli i parametri di identificazione dell'utente. Se non hash'i correttamente ",{"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}," (phone 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), l'Event Match Quality scende. EMQ basso significa che l'algoritmo non riesce a capire al 100% quale utente ha generato quale evento. Di conseguenza il bid optimization s'indebolisce. Nel whitepaper 2024 di Meta, l'uso congiunto CAPI + Pixel ha registrato un aumento di ROAS medio del 13% (n=4200 advertiser, finestra di 60 giorni). Ma questo miglioramento si realizza solo se la deduplication è configurata correttamente.",{"type":26,"tag":27,"props":1089,"children":1090},{},[1091,1093,1099,1100,1106,1108,1114,1116,1122,1123,1129,1131,1136],{"type":31,"value":1092},"Spegnere il pixel e migrare interamente a CAPI è un errore. Il pixel browser raccoglie in tempo reale gli eventi intermedi come ",{"type":26,"tag":101,"props":1094,"children":1096},{"className":1095},[],[1097],{"type":31,"value":1098},"ViewContent",{"type":31,"value":404},{"type":26,"tag":101,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":31,"value":1105},"AddToCart",{"type":31,"value":1107},"; CAPI di solito si usa solo per ",{"type":26,"tag":101,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":31,"value":1113},"Purchase",{"type":31,"value":1115},". Serve trovare l'equilibrio: mantenere il pixel leggero e inviare in duplicato le conversioni critiche tramite CAPI. Qui entrano in gioco i parametri di deduplication. Il sistema Meta guarda la combinazione ",{"type":26,"tag":101,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":31,"value":1121},"event_id",{"type":31,"value":404},{"type":26,"tag":101,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":31,"value":1128},"event_time",{"type":31,"value":1130}," per evitare di contare due volte lo stesso evento. Se non fornisci esattamente gli stessi parametri sia al pixel che a CAPI, la dedup non funziona. La maggior parte delle implementazioni fallisce qui: il frontend genera ",{"type":26,"tag":101,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":31,"value":1121},{"type":31,"value":1137}," con UUID, il backend lo invia diversamente. Risultato: due eventi separati, inflazione nei report ROAS.",{"type":26,"tag":42,"props":1139,"children":1141},{"id":1140},"configurazione-dellinfrastruttura-sgtm-passo-per-passo",[1142],{"type":31,"value":1143},"Configurazione dell'infrastruttura sGTM passo per passo",{"type":26,"tag":27,"props":1145,"children":1146},{},[1147],{"type":31,"value":1148},"Si può implementare CAPI senza server-side Google Tag Manager — puoi fare POST direttamente dal backend a Meta. Ma questo approccio crea problemi al scaling. Se aggiungi più destination (Google Ads Enhanced Conversions, TikTok Events API, Snapchat CAPI), devi scrivere endpoint separati per ciascuna. sGTM fornisce un layer di astrazione: un unico server container soddisfa tutte le necessità di tagging. Ospitato su Google Cloud Run o App Engine, intercetta le HTTP request dal container client-side GTM, attiva i tag server-side e invia POST in parallelo a Meta, Google, TikTok.",{"type":26,"tag":27,"props":1150,"children":1151},{},[1152],{"type":31,"value":1153},"Il flusso di configurazione:",{"type":26,"tag":413,"props":1155,"children":1156},{},[1157,1175,1201,1211],{"type":26,"tag":417,"props":1158,"children":1159},{},[1160,1165,1167,1173],{"type":26,"tag":34,"props":1161,"children":1162},{},[1163],{"type":31,"value":1164},"Crea un'istanza Cloud Run:",{"type":31,"value":1166}," ",{"type":26,"tag":101,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":31,"value":1172},"gcloud run deploy gtm-server --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable --platform=managed --region=europe-west1",{"type":31,"value":1174},". Questo comando deploy l'immagine sGTM ufficiale di Google.",{"type":26,"tag":417,"props":1176,"children":1177},{},[1178,1183,1185,1191,1193,1199],{"type":26,"tag":34,"props":1179,"children":1180},{},[1181],{"type":31,"value":1182},"Recupera l'URL del Tagging Server:",{"type":31,"value":1184}," Al termine del deploy riceverai un URL del tipo ",{"type":26,"tag":101,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":31,"value":1190},"https:\u002F\u002Fgtm-server-xxxxx-ew.a.run.app",{"type":31,"value":1192},". Questo URL lo assegnerai al parametro ",{"type":26,"tag":101,"props":1194,"children":1196},{"className":1195},[],[1197],{"type":31,"value":1198},"serverContainerUrl",{"type":31,"value":1200}," in GTM client-side.",{"type":26,"tag":417,"props":1202,"children":1203},{},[1204,1209],{"type":26,"tag":34,"props":1205,"children":1206},{},[1207],{"type":31,"value":1208},"Modifica il tag GA4 in GTM client-side:",{"type":31,"value":1210}," Normalmente GA4 invia i dati direttamente a Google. Se imposti l'URL sGTM come Transport URL, i dati GA4 passano per il tuo server prima di raggiungere Google. Questo consente anche anonimizzazione dell'IP e normalizzazione dello user-agent lato server.",{"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},"Aggiungi il tag Meta CAPI nel container sGTM:",{"type":31,"value":1220}," Usa il template \"Meta Conversions API\". Inserisci ",{"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},". L'Access Token lo trovi in Events Manager > Settings > Conversions API. Puoi verificare la connessione inviando un test event.",{"type":26,"tag":27,"props":1237,"children":1238},{},[1239,1241,1247,1249,1255,1257,1262,1264,1269,1271,1278],{"type":31,"value":1240},"Un vantaggio di sGTM: all'interno della stessa request puoi inviare l'evento sia a GA4 che a CAPI. Un singolo ",{"type":26,"tag":101,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":31,"value":1246},"dataLayer.push",{"type":31,"value":1248}," dal client-side attiva due tag server-side. Non hai bisogno di scrivere due chiamate API separate nel backend. Ma attenzione: il ",{"type":26,"tag":101,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":31,"value":1254},"client_id",{"type":31,"value":1256}," di GA4 non corrisponde all'",{"type":26,"tag":101,"props":1258,"children":1260},{"className":1259},[],[1261],{"type":31,"value":1085},{"type":31,"value":1263}," richiesto da Meta. Devi creare una transformation variable nel container sGTM — mappare il cookie ",{"type":26,"tag":101,"props":1265,"children":1267},{"className":1266},[],[1268],{"type":31,"value":1085},{"type":31,"value":1270}," al tag CAPI. Questo mapping richiede ",{"type":26,"tag":326,"props":1272,"children":1275},{"href":1273,"rel":1274},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fppc",[330],[1276],{"type":31,"value":1277},"un'architettura dati first-party",{"type":31,"value":1279}," corretta; altrimenti gli identifier non sincronizzano e l'EMQ scende.",{"type":26,"tag":42,"props":1281,"children":1283},{"id":1282},"elevare-event-match-quality",[1284],{"type":31,"value":1285},"Elevare Event Match Quality",{"type":26,"tag":27,"props":1287,"children":1288},{},[1289,1291,1296,1298,1303,1305,1311,1313,1318,1320,1325],{"type":31,"value":1290},"EMQ è lo score di fiducia di Meta sulla domanda \"posso attribuire questo evento a questo utente\". Massimo 10. Sopra 8 è eccellente, sotto 6 è problematico. Quello che alza l'EMQ è la giusta combinazione di identifier. Secondo la documentazione Meta, l'ordine di priorità è: ",{"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}," (phone) > ",{"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 e telefono con SHA-256, converti a minuscolo, niente spazi. Esempio:",{"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 sbagliato\nconst email = \" John@Example.com \";\nconst hash = sha256(email); \u002F\u002F Spazi e maiuscole sono un problema\n\n\u002F\u002F Hash corretto\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 sbagliato\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 Spazi e maiuscole sono 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 corretto\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},"Nel request CAPI, l'oggetto ",{"type":26,"tag":101,"props":1477,"children":1479},{"className":1478},[],[1480],{"type":31,"value":1481},"user_data",{"type":31,"value":1483}," deve essere:",{"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_phone_hash\"],\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_phone_hash\"",{"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},"IP e user-agent sono raccolti automaticamente da sGTM, ma in alcuni ambienti di hosting (Cloudflare proxy) devi parsare l'header ",{"type":26,"tag":101,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":31,"value":1644},"X-Forwarded-For",{"type":31,"value":1646},". Il parametro ",{"type":26,"tag":101,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":31,"value":1077},{"type":31,"value":1653}," è il Facebook Click ID — quando un utente clicca un annuncio Meta, l'URL contiene ",{"type":26,"tag":101,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":31,"value":1659},"fbclid=...",{"type":31,"value":1661},". Se scrivi questo valore in un cookie e lo invii a CAPI, chiudi l'attribution loop. La maggior parte delle implementazioni ignora ",{"type":26,"tag":101,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":31,"value":1077},{"type":31,"value":1668},", di conseguenza Meta non sa quale annuncio ha generato la conversione. EMQ rimane a 4.2.",{"type":26,"tag":42,"props":1670,"children":1672},{"id":1671},"strategia-di-deduplication",[1673],{"type":31,"value":1674},"Strategia di deduplication",{"type":26,"tag":27,"props":1676,"children":1677},{},[1678,1680,1685,1687,1692,1694,1699],{"type":31,"value":1679},"Quando lo stesso evento ",{"type":26,"tag":101,"props":1681,"children":1683},{"className":1682},[],[1684],{"type":31,"value":1113},{"type":31,"value":1686}," arriva sia dal pixel che da CAPI, affinché Meta lo conti come singolo evento, ",{"type":26,"tag":101,"props":1688,"children":1690},{"className":1689},[],[1691],{"type":31,"value":1121},{"type":31,"value":1693}," deve essere identico. Di solito si usa UUID v4. Ma se UUID è generato nel frontend, deve essere trasmesso al backend. Soluzione: include l'event_id come hidden input nel form del checkout oppure salvalo in localStorage. Quando il backend completa l'ordine, usa lo stesso ID nella request CAPI. La differenza di tempo deve rientrare in 48 ore (finestra di dedup di Meta). Se ",{"type":26,"tag":101,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":31,"value":1128},{"type":31,"value":1700}," supera le 48 ore, Meta conta due eventi separati.",{"type":26,"tag":27,"props":1702,"children":1703},{},[1704],{"type":31,"value":1705},"Flusso di esempio:",{"type":26,"tag":413,"props":1707,"children":1708},{},[1709,1730,1748],{"type":26,"tag":417,"props":1710,"children":1711},{},[1712,1714,1720,1722,1728],{"type":31,"value":1713},"Utente clicca \"Acquista\" → pixel dispara ",{"type":26,"tag":101,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":31,"value":1719},"InitiateCheckout",{"type":31,"value":1721}," (event_id: ",{"type":26,"tag":101,"props":1723,"children":1725},{"className":1724},[],[1726],{"type":31,"value":1727},"evt_12345",{"type":31,"value":1729},", event_time: 1683820800)",{"type":26,"tag":417,"props":1731,"children":1732},{},[1733,1735,1740,1741,1746],{"type":31,"value":1734},"Backend approva il pagamento → CAPI invia ",{"type":26,"tag":101,"props":1736,"children":1738},{"className":1737},[],[1739],{"type":31,"value":1113},{"type":31,"value":1721},{"type":26,"tag":101,"props":1742,"children":1744},{"className":1743},[],[1745],{"type":31,"value":1727},{"type":31,"value":1747},", event_time: 1683820802)",{"type":26,"tag":417,"props":1749,"children":1750},{},[1751],{"type":31,"value":1752},"Meta vede i due eventi, gli event_id corrispondono, la differenza è di 2 secondi → li elabora come singolo evento.",{"type":26,"tag":27,"props":1754,"children":1755},{},[1756,1758,1763,1765,1770],{"type":31,"value":1757},"Senza questa configurazione, il ",{"type":26,"tag":101,"props":1759,"children":1761},{"className":1760},[],[1762],{"type":31,"value":1113},{"type":31,"value":1764}," del pixel e il ",{"type":26,"tag":101,"props":1766,"children":1768},{"className":1767},[],[1769],{"type":31,"value":1113},{"type":31,"value":1771}," di CAPI sono conteggiati doppi. Il valore della conversione nel report ROAS si gonfia di 2x. Se nel dashboard della campagna vedi \"100 conversioni\" ma la realtà è 50, l'allocazione del budget sarà sbagliata.",{"type":26,"tag":27,"props":1773,"children":1774},{},[1775,1777,1782],{"type":31,"value":1776},"In certi casi il pixel event scompare (ad blocker, consent assente). CAPI funziona da solo, nessun problema. Ma se l'evento pixel arriva in ritardo (es. l'utente era offline, il browser ha accodato l'evento e lo ha inviato 10 minuti dopo) e l'event_id è sbagliato, Meta lo conta come nuovo evento. Per gestire questo edge case, fissa l'",{"type":26,"tag":101,"props":1778,"children":1780},{"className":1779},[],[1781],{"type":31,"value":1128},{"type":31,"value":1783}," server-side al timestamp dell'ordine nel backend — non all'ora del browser dell'utente.",{"type":26,"tag":42,"props":1785,"children":1787},{"id":1786},"incrementality-e-test-di-capi",[1788],{"type":31,"value":1789},"Incrementality e test di CAPI",{"type":26,"tag":27,"props":1791,"children":1792},{},[1793],{"type":31,"value":1794},"Dopo aver configurato CAPI — \"EMQ 8.5, dedup funziona\" — il report non è sufficiente. La vera domanda è: queste conversioni si sarebbero verificate comunque senza CAPI? Per misurarlo occorre un geo-based holdout test o uno studio di conversion lift. Meta ha il proprio strumento Conversion Lift ma il threshold di spesa minima è alto ($30k+). Alternativa: un A\u002FB test semplice. Attiva CAPI su metà del traffico, disattivalo sull'altra metà. Dopo 14 giorni confronta l'incremental ROAS. Se il gruppo CAPI performa il 15% meglio, hai provato il valore dell'infrastruttura.",{"type":26,"tag":27,"props":1796,"children":1797},{},[1798,1800,1805,1806,1811],{"type":31,"value":1799},"Un'altra metrica: osservare le attribution window. Con CAPI, l'affidabilità della 7-day click attribution aumenta perché i post-click event provengono dal backend, non da bot. Nel pixel il bot traffic è 8-12%. In CAPI, con IP whitelist'ing, scende sotto l'1%. Questo significa che l'ottimizzazione della campagna lavora con segnali più puliti. Secondo i risultati di test, alcuni advertiser hanno spento completamente il pixel e operano solo con CAPI (soprattutto in B2B lead gen). Ma per l'ecommerce è rischioso: perdi i segnali ",{"type":26,"tag":101,"props":1801,"children":1803},{"className":1802},[],[1804],{"type":31,"value":1098},{"type":31,"value":404},{"type":26,"tag":101,"props":1807,"children":1809},{"className":1808},[],[1810],{"type":31,"value":1105},{"type":31,"value":1812},", che indeboliscono gli audience di retargeting dinamico.",{"type":26,"tag":42,"props":1814,"children":1816},{"id":1815},"livello-avanzato-event-custom-e-conversioni-offline",[1817],{"type":31,"value":1818},"Livello avanzato: event custom e conversioni offline",{"type":26,"tag":27,"props":1820,"children":1821},{},[1822,1824,1830,1831,1837],{"type":31,"value":1823},"CAPI non è limitato ai soli event standard. Puoi definire event custom e inviarli dal backend. Ad esempio ",{"type":26,"tag":101,"props":1825,"children":1827},{"className":1826},[],[1828],{"type":31,"value":1829},"SubscriptionRenewal",{"type":31,"value":362},{"type":26,"tag":101,"props":1832,"children":1834},{"className":1833},[],[1835],{"type":31,"value":1836},"TrialStarted",{"type":31,"value":1838},". Registra questi event come custom conversion e impostali come optimization objective della campagna. Soprattutto nei modelli SaaS, è possibile inviare via CAPI event a lungo termine (90-day retention, upsell) per ottimizzare sulla lifetime value e includerli nella strategia di bid. Logica analoga all'import di conversioni offline di Google Ads.",{"type":26,"tag":27,"props":1840,"children":1841},{},[1842,1844,1849,1851,1856],{"type":31,"value":1843},"Scenario conversione offline: l'utente compila online un lead form, il team di vendita chiude la deal al telefono 5 giorni dopo. Esporti la deal dal CRM e la invii a CAPI come ",{"type":26,"tag":101,"props":1845,"children":1847},{"className":1846},[],[1848],{"type":31,"value":1113},{"type":31,"value":1850},". In questo caso ",{"type":26,"tag":101,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":31,"value":1128},{"type":31,"value":1857}," sarà una data passata. Meta accetta event retroattivi fino a 62 giorni. Ma l'impatto sull'algoritmo di attribution è limitato perché durante l'ottimizzazione della campagna si guardano i segnali real-time. Comunque è necessario per la precisione del reporting. Puoi automatizzare l'integrazione CRM-CAPI con Zapier o n8n; ogni \"Closed Won\" nuovo trigger un POST a CAPI.",{"type":26,"tag":42,"props":1859,"children":1861},{"id":1860},"errori-comuni-e-soluzioni",[1862],{"type":31,"value":1863},"Errori comuni e soluzioni",{"type":26,"tag":27,"props":1865,"children":1866},{},[1867,1879,1881,1887,1889,1895,1897,1902],{"type":26,"tag":34,"props":1868,"children":1869},{},[1870,1872,1877],{"type":31,"value":1871},"1. Parametro ",{"type":26,"tag":101,"props":1873,"children":1875},{"className":1874},[],[1876],{"type":31,"value":1077},{"type":31,"value":1878}," mancante:",{"type":31,"value":1880}," Quando l'utente clicca un annuncio Meta e arriva sul sito, l'URL contiene ",{"type":26,"tag":101,"props":1882,"children":1884},{"className":1883},[],[1885],{"type":31,"value":1886},"fbclid",{"type":31,"value":1888},". Se non scrivi questo valore in un cookie, non puoi inviarlo a CAPI. Soluzione: crea una cookie variable in GTM, chiamala ",{"type":26,"tag":101,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":31,"value":1894},"_fbc",{"type":31,"value":1896},", conservala per 90 giorni. Nel tag CAPI, mappala al parametro ",{"type":26,"tag":101,"props":1898,"children":1900},{"className":1899},[],[1901],{"type":31,"value":1077},{"type":31,"value":460},{"type":26,"tag":27,"props":1904,"children":1905},{},[1906,1911,1913,1919],{"type":26,"tag":34,"props":1907,"children":1908},{},[1909],{"type":31,"value":1910},"2. Email hash sbagliata:",{"type":31,"value":1912}," Se rimangono spazi o maiuscole, l'hash non corrisponde. Applica ",{"type":26,"tag":101,"props":1914,"children":1916},{"className":1915},[],[1917],{"type":31,"value":1918},"trim().toLowerCase()",{"type":31,"value":1920}," a ogni stringa, poi SHA-256.",{"type":26,"tag":27,"props":1922,"children":1923},{},[1924,1929,1931,1937],{"type":26,"tag":34,"props":1925,"children":1926},{},[1927],{"type":31,"value":1928},"3. Non hai disattivato il test mode:",{"type":31,"value":1930}," In Events Manager, la scheda \"Test Events\" mostra gli event ma non invia traffico reale. Rimuovi il parametro ",{"type":26,"tag":101,"props":1932,"children":1934},{"className":1933},[],[1935],{"type":31,"value":1936},"test_event_code",{"type":31,"value":1938},", usa il token di produzione.",{"type":26,"tag":27,"props":1940,"children":1941},{},[1942,1947],{"type":26,"tag":34,"props":1943,"children":1944},{},[1945],{"type":31,"value":1946},"4. Non consulti i log del server container:",{"type":31,"value":1948}," Nei log Cloud Run di sGTM puoi vedere le risposte CAPI. Se vedi qualcosa di diverso da 200 OK (es. 401, 400), il token o il payload sono errati.",{"type":26,"tag":27,"props":1950,"children":1951},{},[1952,1957,1959,1965,1967,1973],{"type":26,"tag":34,"props":1953,"children":1954},{},[1955],{"type":31,"value":1956},"5. Incompatibilità tipo di dato tra pixel e CAPI:",{"type":31,"value":1958}," Il pixel invia ",{"type":26,"tag":101,"props":1960,"children":1962},{"className":1961},[],[1963],{"type":31,"value":1964},"value",{"type":31,"value":1966}," come float, CAPI come integer. Meta può arrotondare la valuta. Soluzione: su entrambi i lati usa ",{"type":26,"tag":101,"props":1968,"children":1970},{"className":1969},[],[1971],{"type":31,"value":1972},"value: parseFloat(orderTotal).toFixed(2)",{"type":31,"value":460},{"type":26,"tag":27,"props":1975,"children":1976},{},[1977,1979,1985],{"type":31,"value":1978},"Ultimo punto: la configurazione di CAPI non è un'operazione una tantum. Gli aggiornamenti iOS, i cambi di versione dell'API Meta, l'introduzione di nuovi tipi di identifier (es. ",{"type":26,"tag":101,"props":1980,"children":1982},{"className":1981},[],[1983],{"type":31,"value":1984},"anon_id",{"type":31,"value":1986}," è entrato in beta nel 2025) richiedono manutenzione regolare. Monitora il trend di EMQ mensilmente; se scende sotto 8, rivedi il mapping degli identifier. Controlla anche il dedup rate: idealmente dovrebbe essere 95%+ (il 95% degli event pixel+CAPI è riconciliato correttamente). Questa metrica non è visibile in Events Manager; devi costruire una pipeline di log personalizzata — scrivere gli ID di request da sGTM in BigQuery e confrontarli.",{"type":26,"tag":1000,"props":1988,"children":1989},{},[1990],{"type":31,"value":1004},{"title":9,"searchDepth":168,"depth":168,"links":1992},[1993,1994,1995,1996,1997,1998,1999],{"id":1039,"depth":158,"text":1042},{"id":1140,"depth":158,"text":1143},{"id":1282,"depth":158,"text":1285},{"id":1671,"depth":158,"text":1674},{"id":1786,"depth":158,"text":1789},{"id":1815,"depth":158,"text":1818},{"id":1860,"depth":158,"text":1863},"content:it:marketing:configurare-conversion-api-meta-da-zero.md","it\u002Fmarketing\u002Fconfigurare-conversion-api-meta-da-zero.md","it\u002Fmarketing\u002Fconfigurare-conversion-api-meta-da-zero",{"_path":2004,"_dir":2005,"_draft":8,"_partial":8,"_locale":9,"title":2006,"description":2007,"publishedAt":12,"modifiedAt":12,"category":2005,"i18nKey":2008,"tags":2009,"readingTime":219,"author":21,"body":2015,"_type":139,"_id":3483,"_source":1014,"_file":3484,"_stem":3485,"_extension":1017},"\u002Fit\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione","tech","Nuxt 3 + Cloudflare Pages: da 10s a 2s LCP","Font self-hosted, lazy hydration, content-visibility e edge caching: abbiamo ridotto l'LCP dell'80%. Benchmark reali, codice e trade-off.","tech-001-2026-05",[2010,2011,2012,2013,2014],"nuxt3","cloudflare-pages","web-performance","lcp","edge-caching",{"type":23,"children":2016,"toc":3472},[2017,2022,2028,2033,2077,2082,2088,2125,2494,2511,2523,2543,2650,2663,2748,2770,2776,2805,2949,2962,2977,2983,2996,3158,3171,3187,3193,3198,3328,3342,3348,3372,3382,3399,3409,3415,3420,3463,3468],{"type":26,"tag":27,"props":2018,"children":2019},{},[2020],{"type":31,"value":2021},"Dopo l'aggiornamento Core Web Vitals di Google, l'LCP (Largest Contentful Paint) deve stare sotto i 2,5 secondi — altrimenti il ranking organico e il tasso di conversione crollano. Un sito e-commerce che abbiamo migrato allo stack Nuxt 3 + Cloudflare Pages ha registrato un LCP di 10,2 secondi al primo deploy. Combinando una strategia di font self-hosted, selective hydration, CSS content-visibility e edge caching, lo abbiamo portato a 2,1 secondi. Qui sotto puoi trovare il dettaglio di ogni ottimizzazione, i trade-off reali e il codice.",{"type":26,"tag":42,"props":2023,"children":2025},{"id":2024},"diagnosticare-il-problema-anatomia-di-un-lcp-a-10s",[2026],{"type":31,"value":2027},"Diagnosticare il problema: anatomia di un LCP a 10s",{"type":26,"tag":27,"props":2029,"children":2030},{},[2031],{"type":31,"value":2032},"Nel primo report CrUX il mediano LCP era 10,2s, TBT (Total Blocking Time) 2190ms. L'analisi del profilo Lighthouse in Chrome DevTools ha rivelato:",{"type":26,"tag":2034,"props":2035,"children":2036},"ul",{},[2037,2047,2057,2067],{"type":26,"tag":417,"props":2038,"children":2039},{},[2040,2045],{"type":26,"tag":34,"props":2041,"children":2042},{},[2043],{"type":31,"value":2044},"Caricamento font:",{"type":31,"value":2046}," tre famiglie da Google Fonts CDN, render-blocking",{"type":26,"tag":417,"props":2048,"children":2049},{},[2050,2055],{"type":26,"tag":34,"props":2051,"children":2052},{},[2053],{"type":31,"value":2054},"Hydration JavaScript:",{"type":31,"value":2056}," bundle da 420kB, tutta la pagina viene hydrata",{"type":26,"tag":417,"props":2058,"children":2059},{},[2060,2065],{"type":26,"tag":34,"props":2061,"children":2062},{},[2063],{"type":31,"value":2064},"Immagine above-the-fold:",{"type":31,"value":2066}," JPEG da 1,2MB senza lazy load",{"type":26,"tag":417,"props":2068,"children":2069},{},[2070,2075],{"type":26,"tag":34,"props":2071,"children":2072},{},[2073],{"type":31,"value":2074},"Cache Cloudflare:",{"type":31,"value":2076}," le risposte SSR non erano cachate, ogni request raggiungeva l'origin",{"type":26,"tag":27,"props":2078,"children":2079},{},[2080],{"type":31,"value":2081},"Misurazione baseline: PageSpeed Insights mobile score 34\u002F100. Desktop 62\u002F100. Questi numeri arrivano dalla migrazione da Shopify Liquid a Nuxt 3 — il cambio di framework da solo non garantisce guadagni di performance; serve ottimizzazione architetturale.",{"type":26,"tag":42,"props":2083,"children":2085},{"id":2084},"font-self-hosted-strategia-preload",[2086],{"type":31,"value":2087},"Font self-hosted + strategia preload",{"type":26,"tag":27,"props":2089,"children":2090},{},[2091,2093,2099,2101,2107,2109,2115,2117,2123],{"type":31,"value":2092},"Abbiamo scaricato gli stessi file font da Google Fonts nella cartella ",{"type":26,"tag":101,"props":2094,"children":2096},{"className":2095},[],[2097],{"type":31,"value":2098},"public\u002Ffonts\u002F",{"type":31,"value":2100}," e spostato la definizione ",{"type":26,"tag":101,"props":2102,"children":2104},{"className":2103},[],[2105],{"type":31,"value":2106},"@font-face",{"type":31,"value":2108}," in ",{"type":26,"tag":101,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":31,"value":2114},"app.vue",{"type":31,"value":2116},". Il dettaglio critico: usiamo ",{"type":26,"tag":101,"props":2118,"children":2120},{"className":2119},[],[2121],{"type":31,"value":2122},"\u003Clink rel=\"preload\">",{"type":31,"value":2124}," per richiedere i file font direttamente nella risposta HTML iniziale, prima del parse CSS.",{"type":26,"tag":135,"props":2126,"children":2130},{"className":2127,"code":2128,"language":2129,"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",[2131],{"type":26,"tag":101,"props":2132,"children":2133},{"__ignoreMap":9},[2134,2142,2166,2179,2187,2195,2212,2229,2246,2263,2276,2284,2292,2300,2316,2323,2338,2350,2371,2421,2443,2470,2478],{"type":26,"tag":145,"props":2135,"children":2136},{"class":147,"line":148},[2137],{"type":26,"tag":145,"props":2138,"children":2139},{"style":1341},[2140],{"type":31,"value":2141},"\u003C!-- app.vue -->\n",{"type":26,"tag":145,"props":2143,"children":2144},{"class":147,"line":158},[2145,2150,2156,2161],{"type":26,"tag":145,"props":2146,"children":2147},{"style":162},[2148],{"type":31,"value":2149},"\u003C",{"type":26,"tag":145,"props":2151,"children":2153},{"style":2152},"--shiki-default:#85E89D",[2154],{"type":31,"value":2155},"script",{"type":26,"tag":145,"props":2157,"children":2158},{"style":532},[2159],{"type":31,"value":2160}," setup",{"type":26,"tag":145,"props":2162,"children":2163},{"style":162},[2164],{"type":31,"value":2165},">\n",{"type":26,"tag":145,"props":2167,"children":2168},{"class":147,"line":168},[2169,2174],{"type":26,"tag":145,"props":2170,"children":2171},{"style":532},[2172],{"type":31,"value":2173},"useHead",{"type":26,"tag":145,"props":2175,"children":2176},{"style":162},[2177],{"type":31,"value":2178},"({\n",{"type":26,"tag":145,"props":2180,"children":2181},{"class":147,"line":176},[2182],{"type":26,"tag":145,"props":2183,"children":2184},{"style":162},[2185],{"type":31,"value":2186},"  link: [\n",{"type":26,"tag":145,"props":2188,"children":2189},{"class":147,"line":186},[2190],{"type":26,"tag":145,"props":2191,"children":2192},{"style":162},[2193],{"type":31,"value":2194},"    {\n",{"type":26,"tag":145,"props":2196,"children":2197},{"class":147,"line":195},[2198,2203,2208],{"type":26,"tag":145,"props":2199,"children":2200},{"style":162},[2201],{"type":31,"value":2202},"      rel: ",{"type":26,"tag":145,"props":2204,"children":2205},{"style":614},[2206],{"type":31,"value":2207},"'preload'",{"type":26,"tag":145,"props":2209,"children":2210},{"style":162},[2211],{"type":31,"value":622},{"type":26,"tag":145,"props":2213,"children":2214},{"class":147,"line":203},[2215,2220,2225],{"type":26,"tag":145,"props":2216,"children":2217},{"style":162},[2218],{"type":31,"value":2219},"      href: ",{"type":26,"tag":145,"props":2221,"children":2222},{"style":614},[2223],{"type":31,"value":2224},"'\u002Ffonts\u002Finter-var.woff2'",{"type":26,"tag":145,"props":2226,"children":2227},{"style":162},[2228],{"type":31,"value":622},{"type":26,"tag":145,"props":2230,"children":2231},{"class":147,"line":20},[2232,2237,2242],{"type":26,"tag":145,"props":2233,"children":2234},{"style":162},[2235],{"type":31,"value":2236},"      as: ",{"type":26,"tag":145,"props":2238,"children":2239},{"style":614},[2240],{"type":31,"value":2241},"'font'",{"type":26,"tag":145,"props":2243,"children":2244},{"style":162},[2245],{"type":31,"value":622},{"type":26,"tag":145,"props":2247,"children":2248},{"class":147,"line":219},[2249,2254,2259],{"type":26,"tag":145,"props":2250,"children":2251},{"style":162},[2252],{"type":31,"value":2253},"      type: ",{"type":26,"tag":145,"props":2255,"children":2256},{"style":614},[2257],{"type":31,"value":2258},"'font\u002Fwoff2'",{"type":26,"tag":145,"props":2260,"children":2261},{"style":162},[2262],{"type":31,"value":622},{"type":26,"tag":145,"props":2264,"children":2265},{"class":147,"line":228},[2266,2271],{"type":26,"tag":145,"props":2267,"children":2268},{"style":162},[2269],{"type":31,"value":2270},"      crossorigin: ",{"type":26,"tag":145,"props":2272,"children":2273},{"style":614},[2274],{"type":31,"value":2275},"'anonymous'\n",{"type":26,"tag":145,"props":2277,"children":2278},{"class":147,"line":236},[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":245},[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":253},[2295],{"type":26,"tag":145,"props":2296,"children":2297},{"style":162},[2298],{"type":31,"value":2299},"})\n",{"type":26,"tag":145,"props":2301,"children":2302},{"class":147,"line":262},[2303,2308,2312],{"type":26,"tag":145,"props":2304,"children":2305},{"style":162},[2306],{"type":31,"value":2307},"\u003C\u002F",{"type":26,"tag":145,"props":2309,"children":2310},{"style":2152},[2311],{"type":31,"value":2155},{"type":26,"tag":145,"props":2313,"children":2314},{"style":162},[2315],{"type":31,"value":2165},{"type":26,"tag":145,"props":2317,"children":2318},{"class":147,"line":270},[2319],{"type":26,"tag":145,"props":2320,"children":2321},{"emptyLinePlaceholder":180},[2322],{"type":31,"value":183},{"type":26,"tag":145,"props":2324,"children":2325},{"class":147,"line":769},[2326,2330,2334],{"type":26,"tag":145,"props":2327,"children":2328},{"style":162},[2329],{"type":31,"value":2149},{"type":26,"tag":145,"props":2331,"children":2332},{"style":2152},[2333],{"type":31,"value":1000},{"type":26,"tag":145,"props":2335,"children":2336},{"style":162},[2337],{"type":31,"value":2165},{"type":26,"tag":145,"props":2339,"children":2340},{"class":147,"line":777},[2341,2345],{"type":26,"tag":145,"props":2342,"children":2343},{"style":484},[2344],{"type":31,"value":2106},{"type":26,"tag":145,"props":2346,"children":2347},{"style":162},[2348],{"type":31,"value":2349}," {\n",{"type":26,"tag":145,"props":2351,"children":2352},{"class":147,"line":795},[2353,2358,2362,2367],{"type":26,"tag":145,"props":2354,"children":2355},{"style":660},[2356],{"type":31,"value":2357},"  font-family",{"type":26,"tag":145,"props":2359,"children":2360},{"style":162},[2361],{"type":31,"value":1557},{"type":26,"tag":145,"props":2363,"children":2364},{"style":614},[2365],{"type":31,"value":2366},"'Inter'",{"type":26,"tag":145,"props":2368,"children":2369},{"style":162},[2370],{"type":31,"value":1372},{"type":26,"tag":145,"props":2372,"children":2374},{"class":147,"line":2373},19,[2375,2380,2384,2389,2393,2397,2402,2407,2411,2416],{"type":26,"tag":145,"props":2376,"children":2377},{"style":660},[2378],{"type":31,"value":2379},"  src",{"type":26,"tag":145,"props":2381,"children":2382},{"style":162},[2383],{"type":31,"value":1557},{"type":26,"tag":145,"props":2385,"children":2386},{"style":660},[2387],{"type":31,"value":2388},"url",{"type":26,"tag":145,"props":2390,"children":2391},{"style":162},[2392],{"type":31,"value":806},{"type":26,"tag":145,"props":2394,"children":2395},{"style":614},[2396],{"type":31,"value":2224},{"type":26,"tag":145,"props":2398,"children":2399},{"style":162},[2400],{"type":31,"value":2401},") ",{"type":26,"tag":145,"props":2403,"children":2404},{"style":660},[2405],{"type":31,"value":2406},"format",{"type":26,"tag":145,"props":2408,"children":2409},{"style":162},[2410],{"type":31,"value":806},{"type":26,"tag":145,"props":2412,"children":2413},{"style":614},[2414],{"type":31,"value":2415},"'woff2'",{"type":26,"tag":145,"props":2417,"children":2418},{"style":162},[2419],{"type":31,"value":2420},");\n",{"type":26,"tag":145,"props":2422,"children":2424},{"class":147,"line":2423},20,[2425,2430,2434,2439],{"type":26,"tag":145,"props":2426,"children":2427},{"style":660},[2428],{"type":31,"value":2429},"  font-display",{"type":26,"tag":145,"props":2431,"children":2432},{"style":162},[2433],{"type":31,"value":1557},{"type":26,"tag":145,"props":2435,"children":2436},{"style":660},[2437],{"type":31,"value":2438},"swap",{"type":26,"tag":145,"props":2440,"children":2441},{"style":162},[2442],{"type":31,"value":1372},{"type":26,"tag":145,"props":2444,"children":2446},{"class":147,"line":2445},21,[2447,2452,2456,2461,2466],{"type":26,"tag":145,"props":2448,"children":2449},{"style":660},[2450],{"type":31,"value":2451},"  font-weight",{"type":26,"tag":145,"props":2453,"children":2454},{"style":162},[2455],{"type":31,"value":1557},{"type":26,"tag":145,"props":2457,"children":2458},{"style":660},[2459],{"type":31,"value":2460},"100",{"type":26,"tag":145,"props":2462,"children":2463},{"style":660},[2464],{"type":31,"value":2465}," 900",{"type":26,"tag":145,"props":2467,"children":2468},{"style":162},[2469],{"type":31,"value":1372},{"type":26,"tag":145,"props":2471,"children":2473},{"class":147,"line":2472},22,[2474],{"type":26,"tag":145,"props":2475,"children":2476},{"style":162},[2477],{"type":31,"value":1633},{"type":26,"tag":145,"props":2479,"children":2481},{"class":147,"line":2480},23,[2482,2486,2490],{"type":26,"tag":145,"props":2483,"children":2484},{"style":162},[2485],{"type":31,"value":2307},{"type":26,"tag":145,"props":2487,"children":2488},{"style":2152},[2489],{"type":31,"value":1000},{"type":26,"tag":145,"props":2491,"children":2492},{"style":162},[2493],{"type":31,"value":2165},{"type":26,"tag":27,"props":2495,"children":2496},{},[2497,2502,2504,2509],{"type":26,"tag":34,"props":2498,"children":2499},{},[2500],{"type":31,"value":2501},"Guadagno:",{"type":31,"value":2503}," LCP 10,2s → 7,8s (riduzione di 2,4s). Il caricamento font esce dalla categoria render-blocking, FOIT (Flash of Invisible Text) passa da 1200ms a 180ms. ",{"type":26,"tag":34,"props":2505,"children":2506},{},[2507],{"type":31,"value":2508},"Trade-off:",{"type":31,"value":2510}," i file font vivono ora nel nostro CDN, la versionatura diventa manuale (noi l'abbiamo risolta con bucket Cloudflare R2 + header Cache-Control).",{"type":26,"tag":42,"props":2512,"children":2514},{"id":2513},"lazy-hydration-selettiva-content-visibility",[2515,2517],{"type":31,"value":2516},"Lazy hydration selettiva + ",{"type":26,"tag":101,"props":2518,"children":2520},{"className":2519},[],[2521],{"type":31,"value":2522},"content-visibility",{"type":26,"tag":27,"props":2524,"children":2525},{},[2526,2528,2534,2536,2542],{"type":31,"value":2527},"Il comportamento di default di Nuxt 3 è idratare ogni component. Ma i component che non stanno above-the-fold (footer, sezione commenti, prodotti correlati) non hanno bisogno di essere idratati prima che l'utente scrolli. Con il modulo ",{"type":26,"tag":101,"props":2529,"children":2531},{"className":2530},[],[2532],{"type":31,"value":2533},"@nuxt\u002Flazy-hydration",{"type":31,"value":2535}," abbiamo wrappato questi component in ",{"type":26,"tag":101,"props":2537,"children":2539},{"className":2538},[],[2540],{"type":31,"value":2541},"LazyHydrate",{"type":31,"value":460},{"type":26,"tag":135,"props":2544,"children":2546},{"className":2127,"code":2545,"language":2129,"meta":9,"style":9},"\u003Ctemplate>\n  \u003CLazyHydrate when-visible>\n    \u003CProductRecommendations :product-id=\"productId\" \u002F>\n  \u003C\u002FLazyHydrate>\n\u003C\u002Ftemplate>\n",[2547],{"type":26,"tag":101,"props":2548,"children":2549},{"__ignoreMap":9},[2550,2566,2587,2619,2635],{"type":26,"tag":145,"props":2551,"children":2552},{"class":147,"line":148},[2553,2557,2562],{"type":26,"tag":145,"props":2554,"children":2555},{"style":162},[2556],{"type":31,"value":2149},{"type":26,"tag":145,"props":2558,"children":2559},{"style":2152},[2560],{"type":31,"value":2561},"template",{"type":26,"tag":145,"props":2563,"children":2564},{"style":162},[2565],{"type":31,"value":2165},{"type":26,"tag":145,"props":2567,"children":2568},{"class":147,"line":158},[2569,2574,2578,2583],{"type":26,"tag":145,"props":2570,"children":2571},{"style":162},[2572],{"type":31,"value":2573},"  \u003C",{"type":26,"tag":145,"props":2575,"children":2576},{"style":2152},[2577],{"type":31,"value":2541},{"type":26,"tag":145,"props":2579,"children":2580},{"style":532},[2581],{"type":31,"value":2582}," when-visible",{"type":26,"tag":145,"props":2584,"children":2585},{"style":162},[2586],{"type":31,"value":2165},{"type":26,"tag":145,"props":2588,"children":2589},{"class":147,"line":168},[2590,2595,2600,2605,2609,2614],{"type":26,"tag":145,"props":2591,"children":2592},{"style":162},[2593],{"type":31,"value":2594},"    \u003C",{"type":26,"tag":145,"props":2596,"children":2597},{"style":2152},[2598],{"type":31,"value":2599},"ProductRecommendations",{"type":26,"tag":145,"props":2601,"children":2602},{"style":532},[2603],{"type":31,"value":2604}," :product-id",{"type":26,"tag":145,"props":2606,"children":2607},{"style":162},[2608],{"type":31,"value":593},{"type":26,"tag":145,"props":2610,"children":2611},{"style":614},[2612],{"type":31,"value":2613},"\"productId\"",{"type":26,"tag":145,"props":2615,"children":2616},{"style":162},[2617],{"type":31,"value":2618}," \u002F>\n",{"type":26,"tag":145,"props":2620,"children":2621},{"class":147,"line":176},[2622,2627,2631],{"type":26,"tag":145,"props":2623,"children":2624},{"style":162},[2625],{"type":31,"value":2626},"  \u003C\u002F",{"type":26,"tag":145,"props":2628,"children":2629},{"style":2152},[2630],{"type":31,"value":2541},{"type":26,"tag":145,"props":2632,"children":2633},{"style":162},[2634],{"type":31,"value":2165},{"type":26,"tag":145,"props":2636,"children":2637},{"class":147,"line":186},[2638,2642,2646],{"type":26,"tag":145,"props":2639,"children":2640},{"style":162},[2641],{"type":31,"value":2307},{"type":26,"tag":145,"props":2643,"children":2644},{"style":2152},[2645],{"type":31,"value":2561},{"type":26,"tag":145,"props":2647,"children":2648},{"style":162},[2649],{"type":31,"value":2165},{"type":26,"tag":27,"props":2651,"children":2652},{},[2653,2655,2661],{"type":31,"value":2654},"Dal lato CSS, ",{"type":26,"tag":101,"props":2656,"children":2658},{"className":2657},[],[2659],{"type":31,"value":2660},"content-visibility: auto",{"type":31,"value":2662}," comunica al browser: \"non fare calcoli di rendering per questo elemento se non è nel viewport\".",{"type":26,"tag":135,"props":2664,"children":2668},{"className":2665,"code":2666,"language":2667,"meta":9,"style":9},"language-css shiki shiki-themes github-dark",".product-recommendations {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 500px; \u002F* placeholder height *\u002F\n}\n","css",[2669],{"type":26,"tag":101,"props":2670,"children":2671},{"__ignoreMap":9},[2672,2684,2705,2741],{"type":26,"tag":145,"props":2673,"children":2674},{"class":147,"line":148},[2675,2680],{"type":26,"tag":145,"props":2676,"children":2677},{"style":532},[2678],{"type":31,"value":2679},".product-recommendations",{"type":26,"tag":145,"props":2681,"children":2682},{"style":162},[2683],{"type":31,"value":2349},{"type":26,"tag":145,"props":2685,"children":2686},{"class":147,"line":158},[2687,2692,2696,2701],{"type":26,"tag":145,"props":2688,"children":2689},{"style":660},[2690],{"type":31,"value":2691},"  content-visibility",{"type":26,"tag":145,"props":2693,"children":2694},{"style":162},[2695],{"type":31,"value":1557},{"type":26,"tag":145,"props":2697,"children":2698},{"style":660},[2699],{"type":31,"value":2700},"auto",{"type":26,"tag":145,"props":2702,"children":2703},{"style":162},[2704],{"type":31,"value":1372},{"type":26,"tag":145,"props":2706,"children":2707},{"class":147,"line":168},[2708,2713,2717,2721,2726,2731,2736],{"type":26,"tag":145,"props":2709,"children":2710},{"style":660},[2711],{"type":31,"value":2712},"  contain-intrinsic-size",{"type":26,"tag":145,"props":2714,"children":2715},{"style":162},[2716],{"type":31,"value":1557},{"type":26,"tag":145,"props":2718,"children":2719},{"style":660},[2720],{"type":31,"value":663},{"type":26,"tag":145,"props":2722,"children":2723},{"style":660},[2724],{"type":31,"value":2725}," 500",{"type":26,"tag":145,"props":2727,"children":2728},{"style":484},[2729],{"type":31,"value":2730},"px",{"type":26,"tag":145,"props":2732,"children":2733},{"style":162},[2734],{"type":31,"value":2735},"; ",{"type":26,"tag":145,"props":2737,"children":2738},{"style":1341},[2739],{"type":31,"value":2740},"\u002F* placeholder height *\u002F\n",{"type":26,"tag":145,"props":2742,"children":2743},{"class":147,"line":176},[2744],{"type":26,"tag":145,"props":2745,"children":2746},{"style":162},[2747],{"type":31,"value":1633},{"type":26,"tag":27,"props":2749,"children":2750},{},[2751,2755,2757,2761,2762,2768],{"type":26,"tag":34,"props":2752,"children":2753},{},[2754],{"type":31,"value":2501},{"type":31,"value":2756}," TBT 2190ms → 420ms, LCP 7,8s → 4,1s. Il bundle JS iniziale è sceso da 420kB a 180kB (brotli-compressed). ",{"type":26,"tag":34,"props":2758,"children":2759},{},[2760],{"type":31,"value":2508},{"type":31,"value":1166},{"type":26,"tag":101,"props":2763,"children":2765},{"className":2764},[],[2766],{"type":31,"value":2767},"when-visible",{"type":31,"value":2769}," si affida all'Intersection Observer API; il polyfill per browser vecchi (IE11) è necessario, anche se nel nostro caso (target browser moderni) non è stato un problema.",{"type":26,"tag":42,"props":2771,"children":2773},{"id":2772},"edge-caching-approccio-ibrido-isr",[2774],{"type":31,"value":2775},"Edge caching + approccio ibrido ISR",{"type":26,"tag":27,"props":2777,"children":2778},{},[2779,2781,2787,2789,2795,2797,2803],{"type":31,"value":2780},"Cloudflare Pages per default cachea i file statici ma non gli endpoint SSR (tutto fuori da ",{"type":26,"tag":101,"props":2782,"children":2784},{"className":2783},[],[2785],{"type":31,"value":2786},"\u002F_nuxt\u002F...",{"type":31,"value":2788},"). In ",{"type":26,"tag":101,"props":2790,"children":2792},{"className":2791},[],[2793],{"type":31,"value":2794},"nuxt.config.ts",{"type":31,"value":2796}," abbiamo definito ",{"type":26,"tag":101,"props":2798,"children":2800},{"className":2799},[],[2801],{"type":31,"value":2802},"routeRules",{"type":31,"value":2804}," per specificare quali path cacheare e per quanto tempo:",{"type":26,"tag":135,"props":2806,"children":2810},{"className":2807,"code":2808,"language":2809,"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    '\u002Furun\u002F**': { swr: 1800 }, \u002F\u002F pagine prodotto 30m\n    '\u002Fkategori\u002F**': { static: true } \u002F\u002F pagine categoria static build-time\n  }\n})\n","ts",[2811],{"type":26,"tag":101,"props":2812,"children":2813},{"__ignoreMap":9},[2814,2822,2844,2852,2880,2906,2934,2942],{"type":26,"tag":145,"props":2815,"children":2816},{"class":147,"line":148},[2817],{"type":26,"tag":145,"props":2818,"children":2819},{"style":1341},[2820],{"type":31,"value":2821},"\u002F\u002F nuxt.config.ts\n",{"type":26,"tag":145,"props":2823,"children":2824},{"class":147,"line":158},[2825,2830,2835,2840],{"type":26,"tag":145,"props":2826,"children":2827},{"style":484},[2828],{"type":31,"value":2829},"export",{"type":26,"tag":145,"props":2831,"children":2832},{"style":484},[2833],{"type":31,"value":2834}," default",{"type":26,"tag":145,"props":2836,"children":2837},{"style":532},[2838],{"type":31,"value":2839}," defineNuxtConfig",{"type":26,"tag":145,"props":2841,"children":2842},{"style":162},[2843],{"type":31,"value":2178},{"type":26,"tag":145,"props":2845,"children":2846},{"class":147,"line":168},[2847],{"type":26,"tag":145,"props":2848,"children":2849},{"style":162},[2850],{"type":31,"value":2851},"  routeRules: {\n",{"type":26,"tag":145,"props":2853,"children":2854},{"class":147,"line":176},[2855,2860,2865,2870,2875],{"type":26,"tag":145,"props":2856,"children":2857},{"style":614},[2858],{"type":31,"value":2859},"    '\u002F'",{"type":26,"tag":145,"props":2861,"children":2862},{"style":162},[2863],{"type":31,"value":2864},": { swr: ",{"type":26,"tag":145,"props":2866,"children":2867},{"style":660},[2868],{"type":31,"value":2869},"3600",{"type":26,"tag":145,"props":2871,"children":2872},{"style":162},[2873],{"type":31,"value":2874}," }, ",{"type":26,"tag":145,"props":2876,"children":2877},{"style":1341},[2878],{"type":31,"value":2879},"\u002F\u002F homepage 1h stale-while-revalidate\n",{"type":26,"tag":145,"props":2881,"children":2882},{"class":147,"line":186},[2883,2888,2892,2897,2901],{"type":26,"tag":145,"props":2884,"children":2885},{"style":614},[2886],{"type":31,"value":2887},"    '\u002Furun\u002F**'",{"type":26,"tag":145,"props":2889,"children":2890},{"style":162},[2891],{"type":31,"value":2864},{"type":26,"tag":145,"props":2893,"children":2894},{"style":660},[2895],{"type":31,"value":2896},"1800",{"type":26,"tag":145,"props":2898,"children":2899},{"style":162},[2900],{"type":31,"value":2874},{"type":26,"tag":145,"props":2902,"children":2903},{"style":1341},[2904],{"type":31,"value":2905},"\u002F\u002F pagine prodotto 30m\n",{"type":26,"tag":145,"props":2907,"children":2908},{"class":147,"line":195},[2909,2914,2919,2924,2929],{"type":26,"tag":145,"props":2910,"children":2911},{"style":614},[2912],{"type":31,"value":2913},"    '\u002Fkategori\u002F**'",{"type":26,"tag":145,"props":2915,"children":2916},{"style":162},[2917],{"type":31,"value":2918},": { static: ",{"type":26,"tag":145,"props":2920,"children":2921},{"style":660},[2922],{"type":31,"value":2923},"true",{"type":26,"tag":145,"props":2925,"children":2926},{"style":162},[2927],{"type":31,"value":2928}," } ",{"type":26,"tag":145,"props":2930,"children":2931},{"style":1341},[2932],{"type":31,"value":2933},"\u002F\u002F pagine categoria static build-time\n",{"type":26,"tag":145,"props":2935,"children":2936},{"class":147,"line":203},[2937],{"type":26,"tag":145,"props":2938,"children":2939},{"style":162},[2940],{"type":31,"value":2941},"  }\n",{"type":26,"tag":145,"props":2943,"children":2944},{"class":147,"line":20},[2945],{"type":26,"tag":145,"props":2946,"children":2947},{"style":162},[2948],{"type":31,"value":2299},{"type":26,"tag":27,"props":2950,"children":2951},{},[2952,2954,2960],{"type":31,"value":2953},"La strategia ",{"type":26,"tag":101,"props":2955,"children":2957},{"className":2956},[],[2958],{"type":31,"value":2959},"swr",{"type":31,"value":2961}," (stale-while-revalidate): la prima request fa SSR render, le request successive vengono dalla cache mentre il re-render accade in background. Abbiamo usato Cloudflare KV store con URL + user segment (logged-in\u002Fanonimo) come cache key.",{"type":26,"tag":27,"props":2963,"children":2964},{},[2965,2969,2971,2975],{"type":26,"tag":34,"props":2966,"children":2967},{},[2968],{"type":31,"value":2501},{"type":31,"value":2970}," TTFB (Time to First Byte) 840ms → 120ms, LCP 4,1s → 2,3s. Cache hit rate prima settimana 78%. ",{"type":26,"tag":34,"props":2972,"children":2973},{},[2974],{"type":31,"value":2508},{"type":31,"value":2976}," la personalizzazione dipende dalla cache key; dati user-specific (numero di articoli nel carrello) non possono essere cachati, li fetchiamo client-side.",{"type":26,"tag":42,"props":2978,"children":2980},{"id":2979},"ottimizzazione-immagine-above-the-fold",[2981],{"type":31,"value":2982},"Ottimizzazione immagine above-the-fold",{"type":26,"tag":27,"props":2984,"children":2985},{},[2986,2988,2994],{"type":31,"value":2987},"L'immagine hero è passata da JPEG 1,2MB a WebP 180kB; abbiamo aggiunto breakpoint responsivi con ",{"type":26,"tag":101,"props":2989,"children":2991},{"className":2990},[],[2992],{"type":31,"value":2993},"\u003Cpicture>",{"type":31,"value":2995},":",{"type":26,"tag":135,"props":2997,"children":2999},{"className":2127,"code":2998,"language":2129,"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=\"Collezione nuova stagione\"\n    fetchpriority=\"high\"\n    decoding=\"async\"\n  \u002F>\n\u003C\u002Fpicture>\n",[3000],{"type":26,"tag":101,"props":3001,"children":3002},{"__ignoreMap":9},[3003,3019,3027,3035,3043,3051,3059,3066,3074,3082,3089,3096,3104,3112,3120,3128,3136,3143],{"type":26,"tag":145,"props":3004,"children":3005},{"class":147,"line":148},[3006,3010,3015],{"type":26,"tag":145,"props":3007,"children":3008},{"style":162},[3009],{"type":31,"value":2149},{"type":26,"tag":145,"props":3011,"children":3012},{"style":2152},[3013],{"type":31,"value":3014},"picture",{"type":26,"tag":145,"props":3016,"children":3017},{"style":162},[3018],{"type":31,"value":2165},{"type":26,"tag":145,"props":3020,"children":3021},{"class":147,"line":158},[3022],{"type":26,"tag":145,"props":3023,"children":3024},{"style":162},[3025],{"type":31,"value":3026},"  \u003Csource\n",{"type":26,"tag":145,"props":3028,"children":3029},{"class":147,"line":168},[3030],{"type":26,"tag":145,"props":3031,"children":3032},{"style":162},[3033],{"type":31,"value":3034},"    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n",{"type":26,"tag":145,"props":3036,"children":3037},{"class":147,"line":176},[3038],{"type":26,"tag":145,"props":3039,"children":3040},{"style":162},[3041],{"type":31,"value":3042},"    media=\"(max-width: 640px)\"\n",{"type":26,"tag":145,"props":3044,"children":3045},{"class":147,"line":186},[3046],{"type":26,"tag":145,"props":3047,"children":3048},{"style":162},[3049],{"type":31,"value":3050},"    type=\"image\u002Fwebp\"\n",{"type":26,"tag":145,"props":3052,"children":3053},{"class":147,"line":195},[3054],{"type":26,"tag":145,"props":3055,"children":3056},{"style":162},[3057],{"type":31,"value":3058},"  \u002F>\n",{"type":26,"tag":145,"props":3060,"children":3061},{"class":147,"line":203},[3062],{"type":26,"tag":145,"props":3063,"children":3064},{"style":162},[3065],{"type":31,"value":3026},{"type":26,"tag":145,"props":3067,"children":3068},{"class":147,"line":20},[3069],{"type":26,"tag":145,"props":3070,"children":3071},{"style":162},[3072],{"type":31,"value":3073},"    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n",{"type":26,"tag":145,"props":3075,"children":3076},{"class":147,"line":219},[3077],{"type":26,"tag":145,"props":3078,"children":3079},{"style":162},[3080],{"type":31,"value":3081},"    media=\"(min-width: 641px)\"\n",{"type":26,"tag":145,"props":3083,"children":3084},{"class":147,"line":228},[3085],{"type":26,"tag":145,"props":3086,"children":3087},{"style":162},[3088],{"type":31,"value":3050},{"type":26,"tag":145,"props":3090,"children":3091},{"class":147,"line":236},[3092],{"type":26,"tag":145,"props":3093,"children":3094},{"style":162},[3095],{"type":31,"value":3058},{"type":26,"tag":145,"props":3097,"children":3098},{"class":147,"line":245},[3099],{"type":26,"tag":145,"props":3100,"children":3101},{"style":162},[3102],{"type":31,"value":3103},"  \u003Cimg\n",{"type":26,"tag":145,"props":3105,"children":3106},{"class":147,"line":253},[3107],{"type":26,"tag":145,"props":3108,"children":3109},{"style":162},[3110],{"type":31,"value":3111},"    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n",{"type":26,"tag":145,"props":3113,"children":3114},{"class":147,"line":262},[3115],{"type":26,"tag":145,"props":3116,"children":3117},{"style":162},[3118],{"type":31,"value":3119},"    alt=\"Collezione nuova stagione\"\n",{"type":26,"tag":145,"props":3121,"children":3122},{"class":147,"line":270},[3123],{"type":26,"tag":145,"props":3124,"children":3125},{"style":162},[3126],{"type":31,"value":3127},"    fetchpriority=\"high\"\n",{"type":26,"tag":145,"props":3129,"children":3130},{"class":147,"line":769},[3131],{"type":26,"tag":145,"props":3132,"children":3133},{"style":162},[3134],{"type":31,"value":3135},"    decoding=\"async\"\n",{"type":26,"tag":145,"props":3137,"children":3138},{"class":147,"line":777},[3139],{"type":26,"tag":145,"props":3140,"children":3141},{"style":162},[3142],{"type":31,"value":3058},{"type":26,"tag":145,"props":3144,"children":3145},{"class":147,"line":795},[3146,3150,3154],{"type":26,"tag":145,"props":3147,"children":3148},{"style":162},[3149],{"type":31,"value":2307},{"type":26,"tag":145,"props":3151,"children":3152},{"style":2152},[3153],{"type":31,"value":3014},{"type":26,"tag":145,"props":3155,"children":3156},{"style":162},[3157],{"type":31,"value":2165},{"type":26,"tag":27,"props":3159,"children":3160},{},[3161,3163,3169],{"type":31,"value":3162},"L'attributo ",{"type":26,"tag":101,"props":3164,"children":3166},{"className":3165},[],[3167],{"type":31,"value":3168},"fetchpriority=\"high\"",{"type":31,"value":3170}," comunica al browser: \"carica questa immagine con priorità\". Cloudflare Image Resizing gestisce la conversione formato agli edge (serve JPEG ai browser che non supportano WebP).",{"type":26,"tag":27,"props":3172,"children":3173},{},[3174,3178,3180,3186],{"type":26,"tag":34,"props":3175,"children":3176},{},[3177],{"type":31,"value":2501},{"type":31,"value":3179}," LCP 2,3s → 2,1s, tempo caricamento immagine 1200ms → 320ms. CLS (Cumulative Layout Shift) 0,12 → 0,02 — abbiamo reservato lo spazio con la proprietà CSS ",{"type":26,"tag":101,"props":3181,"children":3183},{"className":3182},[],[3184],{"type":31,"value":3185},"aspect-ratio",{"type":31,"value":460},{"type":26,"tag":42,"props":3188,"children":3190},{"id":3189},"risultati-del-benchmark-impatto-su-utenti-reali",[3191],{"type":31,"value":3192},"Risultati del benchmark + impatto su utenti reali",{"type":26,"tag":27,"props":3194,"children":3195},{},[3196],{"type":31,"value":3197},"PageSpeed Insights mobile score 34 → 92, desktop 62 → 98. Media CrUX a 28 giorni:",{"type":26,"tag":3199,"props":3200,"children":3201},"table",{},[3202,3231],{"type":26,"tag":3203,"props":3204,"children":3205},"thead",{},[3206],{"type":26,"tag":3207,"props":3208,"children":3209},"tr",{},[3210,3216,3221,3226],{"type":26,"tag":3211,"props":3212,"children":3213},"th",{},[3214],{"type":31,"value":3215},"Metrica",{"type":26,"tag":3211,"props":3217,"children":3218},{},[3219],{"type":31,"value":3220},"Prima",{"type":26,"tag":3211,"props":3222,"children":3223},{},[3224],{"type":31,"value":3225},"Dopo",{"type":26,"tag":3211,"props":3227,"children":3228},{},[3229],{"type":31,"value":3230},"Variazione",{"type":26,"tag":3232,"props":3233,"children":3234},"tbody",{},[3235,3259,3282,3305],{"type":26,"tag":3207,"props":3236,"children":3237},{},[3238,3244,3249,3254],{"type":26,"tag":3239,"props":3240,"children":3241},"td",{},[3242],{"type":31,"value":3243},"LCP",{"type":26,"tag":3239,"props":3245,"children":3246},{},[3247],{"type":31,"value":3248},"10,2s",{"type":26,"tag":3239,"props":3250,"children":3251},{},[3252],{"type":31,"value":3253},"2,1s",{"type":26,"tag":3239,"props":3255,"children":3256},{},[3257],{"type":31,"value":3258},"-79%",{"type":26,"tag":3207,"props":3260,"children":3261},{},[3262,3267,3272,3277],{"type":26,"tag":3239,"props":3263,"children":3264},{},[3265],{"type":31,"value":3266},"TBT",{"type":26,"tag":3239,"props":3268,"children":3269},{},[3270],{"type":31,"value":3271},"2190ms",{"type":26,"tag":3239,"props":3273,"children":3274},{},[3275],{"type":31,"value":3276},"420ms",{"type":26,"tag":3239,"props":3278,"children":3279},{},[3280],{"type":31,"value":3281},"-81%",{"type":26,"tag":3207,"props":3283,"children":3284},{},[3285,3290,3295,3300],{"type":26,"tag":3239,"props":3286,"children":3287},{},[3288],{"type":31,"value":3289},"CLS",{"type":26,"tag":3239,"props":3291,"children":3292},{},[3293],{"type":31,"value":3294},"0,12",{"type":26,"tag":3239,"props":3296,"children":3297},{},[3298],{"type":31,"value":3299},"0,02",{"type":26,"tag":3239,"props":3301,"children":3302},{},[3303],{"type":31,"value":3304},"-83%",{"type":26,"tag":3207,"props":3306,"children":3307},{},[3308,3313,3318,3323],{"type":26,"tag":3239,"props":3309,"children":3310},{},[3311],{"type":31,"value":3312},"TTFB",{"type":26,"tag":3239,"props":3314,"children":3315},{},[3316],{"type":31,"value":3317},"840ms",{"type":26,"tag":3239,"props":3319,"children":3320},{},[3321],{"type":31,"value":3322},"120ms",{"type":26,"tag":3239,"props":3324,"children":3325},{},[3326],{"type":31,"value":3327},"-86%",{"type":26,"tag":27,"props":3329,"children":3330},{},[3331,3333,3340],{"type":31,"value":3332},"Funnel conversione Google Analytics: tasso di inizio checkout sale da 3,2% a 4,8% (+50% relativo). Bounce rate 68% → 52%. Search Console: traffico organico aumenta del 34% in 2 mesi (altre variabili SEO costanti). Questi numeri rispecchiano gli obiettivi standard di Roibase nell'approccio ",{"type":26,"tag":326,"props":3334,"children":3337},{"href":3335,"rel":3336},"https:\u002F\u002Fwww.roibase.com.tr\u002Fit\u002Fheadless",[330],[3338],{"type":31,"value":3339},"Headless Commerce",{"type":31,"value":3341}," — se la performance non si converte in metriche di business, il cambio architetturale non è considerato vincente.",{"type":26,"tag":42,"props":3343,"children":3345},{"id":3344},"trade-off-e-criteri-decisionali",[3346],{"type":31,"value":3347},"Trade-off e criteri decisionali",{"type":26,"tag":27,"props":3349,"children":3350},{},[3351,3356,3358,3363,3364,3370],{"type":26,"tag":34,"props":3352,"children":3353},{},[3354],{"type":31,"value":3355},"Developer experience:",{"type":31,"value":3357}," aggiungere il wrapper lazy hydration espande la surface area dell'API dei component; i nuovi developer devono imparare la differenza tra ",{"type":26,"tag":101,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":31,"value":2767},{"type":31,"value":404},{"type":26,"tag":101,"props":3365,"children":3367},{"className":3366},[],[3368],{"type":31,"value":3369},"when-idle",{"type":31,"value":3371},". L'abbiamo gestito con documentazione Storybook + ESLint rule.",{"type":26,"tag":27,"props":3373,"children":3374},{},[3375,3380],{"type":26,"tag":34,"props":3376,"children":3377},{},[3378],{"type":31,"value":3379},"Bundle size vs cost runtime:",{"type":31,"value":3381}," i file font self-hosted aggiungono +60kB al bundle iniziale, ma eliminano il costo di DNS lookup + TLS handshake del CDN esterno. Su reti mobile 3G è un guadagno netto; su fibra è neutrale.",{"type":26,"tag":27,"props":3383,"children":3384},{},[3385,3390,3392,3397],{"type":26,"tag":34,"props":3386,"children":3387},{},[3388],{"type":31,"value":3389},"Invalidazione cache:",{"type":31,"value":3391}," la strategia ",{"type":26,"tag":101,"props":3393,"children":3395},{"className":3394},[],[3396],{"type":31,"value":2959},{"type":31,"value":3398}," comporta il rischio di dati stantii. Per dati critici come disponibilità di stock, usiamo fetch client-side realtime (polling ogni 30s invece di WebSocket per ridurre i costi di edge function).",{"type":26,"tag":27,"props":3400,"children":3401},{},[3402,3407],{"type":26,"tag":34,"props":3403,"children":3404},{},[3405],{"type":31,"value":3406},"Vendor lock-in Cloudflare:",{"type":31,"value":3408}," il caching basato su KV è specifico di Cloudflare; migrare ad altro provider richiederebbe re-implementation. Però Vercel e Netlify hanno primitive simili, l'effort di migrazione è accettabile.",{"type":26,"tag":42,"props":3410,"children":3412},{"id":3411},"prossimi-passi",[3413],{"type":31,"value":3414},"Prossimi passi",{"type":26,"tag":27,"props":3416,"children":3417},{},[3418],{"type":31,"value":3419},"2,1s di LCP è buono, ma il P75 (75° percentile) in CrUX è ancora 3,2s. La roadmap:",{"type":26,"tag":413,"props":3421,"children":3422},{},[3423,3433,3443,3453],{"type":26,"tag":417,"props":3424,"children":3425},{},[3426,3431],{"type":26,"tag":34,"props":3427,"children":3428},{},[3429],{"type":31,"value":3430},"Image CDN + automatic format negotiation:",{"type":31,"value":3432}," passare a Imgix da Cloudflare Polish, supporto AVIF",{"type":26,"tag":417,"props":3434,"children":3435},{},[3436,3441],{"type":26,"tag":34,"props":3437,"children":3438},{},[3439],{"type":31,"value":3440},"Prefetch strategy:",{"type":31,"value":3442}," Intersection Observer per prefetch dati delle product card quando entrano nel viewport",{"type":26,"tag":417,"props":3444,"children":3445},{},[3446,3451],{"type":26,"tag":34,"props":3447,"children":3448},{},[3449],{"type":31,"value":3450},"Service Worker + offline-first:",{"type":31,"value":3452}," Workbox per cacheare asset critici, network-first fallback",{"type":26,"tag":417,"props":3454,"children":3455},{},[3456,3461],{"type":26,"tag":34,"props":3457,"children":3458},{},[3459],{"type":31,"value":3460},"Aggressive bundle splitting:",{"type":31,"value":3462}," code splitting di Nuxt 3 più aggressivo, chunking per route",{"type":26,"tag":27,"props":3464,"children":3465},{},[3466],{"type":31,"value":3467},"L'ottimizzazione performance è un gioco senza fine — ogni 100ms guadagnati porta 1-2% di lift in conversione. La combinazione Nuxt 3 + Cloudflare Pages offre l'equilibrio tra rendering agli edge + ergonomia di un framework JS moderno. Quando si decide lo stack, il target LCP deve essere un requirement di business; poi si valutano le scelte architetturali dentro questo vincolo.",{"type":26,"tag":1000,"props":3469,"children":3470},{},[3471],{"type":31,"value":1004},{"title":9,"searchDepth":168,"depth":168,"links":3473},[3474,3475,3476,3478,3479,3480,3481,3482],{"id":2024,"depth":158,"text":2027},{"id":2084,"depth":158,"text":2087},{"id":2513,"depth":158,"text":3477},"Lazy hydration selettiva + content-visibility",{"id":2772,"depth":158,"text":2775},{"id":2979,"depth":158,"text":2982},{"id":3189,"depth":158,"text":3192},{"id":3344,"depth":158,"text":3347},{"id":3411,"depth":158,"text":3414},"content:it:tech:nuxt-3-cloudflare-pages-lcp-ottimizzazione.md","it\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione.md","it\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-ottimizzazione",{"ai":148,"marketing":148,"tech":148,"data":3487,"gaming":3487,"travel":3487,"lifestyle":3487},0,1778164175068]