[{"data":1,"prerenderedAt":3415},["ShallowReactive",2],{"article-alternates":3,"latest-fr":4,"cat-counts-fr":3413},null,[5,1010,1935],{"_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":1005,"_source":1006,"_file":1007,"_stem":1008,"_extension":1009},"\u002Ffr\u002Fai\u002Fgeo-placer-votre-marque-dans-la-reponse-chatgpt","ai",false,"","GEO : Positionner votre marque dans la réponse de ChatGPT","Architecture de contenu, prompt engineering et stratégies de données propriétaires pour la visibilité dans les AI Overviews et les citations LLM — le nouveau front du SEO après 2025.","2026-05-07","ai-001-2026-05",[15,16,17,18,19],"geo","llm-citation","ai-overviews","content-architecture","prompt-engineering",7,"Roibase",{"type":23,"children":24,"toc":997},"root",[25,41,48,53,65,70,76,88,109,129,134,277,282,288,308,320,343,387,393,412,462,838,843,849,861,873,943,949,961,966,986,991],{"type":26,"tag":27,"props":28,"children":29},"element","p",{},[30,33,39],{"type":31,"value":32},"text","Google déploie ses AI Overviews, ChatGPT teste SearchGPT en version bêta, Perplexity capture une part croissante du trafic via ses écrans de citations. En 2026, 35 % des utilisateurs commencent leurs recherches en interrogeant une interface LLM plutôt que d'accéder directement aux résultats classiques. Un nouveau front du SEO émerge : ",{"type":26,"tag":34,"props":35,"children":36},"strong",{},[37],{"type":31,"value":38},"Generative Engine Optimization (GEO)",{"type":31,"value":40},". Il s'agit d'optimiser le contenu non pas pour les moteurs de recherche, mais pour les moteurs de réponse. Cet article explore les principes fondamentaux de la GEO, les mécanismes de citation des LLM et les stratégies pour placer votre marque au cœur du prompt.",{"type":26,"tag":42,"props":43,"children":45},"h2",{"id":44},"mécaniques-de-citation-llm-la-retrieval-derrière-la-réponse",[46],{"type":31,"value":47},"Mécaniques de citation LLM — la Retrieval derrière la réponse",{"type":26,"tag":27,"props":49,"children":50},{},[51],{"type":31,"value":52},"Quand un LLM génère une réponse, il s'appuie sur deux sources : (1) la mémoire paramétrique (les poids du modèle), (2) les documents extraits via Retrieval-Augmented Generation (RAG). Dans le mode web search de ChatGPT, chez Perplexity, ou dans les AI Overviews de Google alimentés par Gemini, la technique est la même : la question de l'utilisateur est convertie en embedding, puis 5 à 10 sources les plus pertinentes sont extraites selon la similarité vectorielle. La citation référence ces sources sélectionnées lors du processus de retrieval.",{"type":26,"tag":27,"props":54,"children":55},{},[56,58,63],{"type":31,"value":57},"Le point critique ici : ",{"type":26,"tag":34,"props":59,"children":60},{},[61],{"type":31,"value":62},"similarité d'embedding + autorité sémantique",{"type":31,"value":64},". Le modèle priorise les contenus dont l'embedding est proche de celui de la requête, tout en tenant compte d'un score de fiabilité. D'où provient ce score ? OpenAI et Google ne divulguent pas les détails, mais les signaux observés sont : (1) l'autorité du site (type PageRank), (2) la structure du contenu (titre, description, schema.org), (3) la fraîcheur, (4) la densité de citations (fréquence d'apparition dans d'autres sources). Le concept SEO d'E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) reste pertinent, mais le mécanisme de mesure diffère — l'autorité dans l'espace d'embedding.",{"type":26,"tag":27,"props":66,"children":67},{},[68],{"type":31,"value":69},"D'après nos observations en GEO, les AI Overviews de Google sélectionnent 3 à 4 sources parmi les 10 premiers résultats. ChatGPT SearchGPT puise dans une plage plus large (top 20-30). Perplexity encourage la diversité des domaines — il est rare qu'une même source soit citée plusieurs fois. Cette dynamique force une nouvelle stratégie : au lieu de « décrocher la première position », il faut « figurer dans le top 30 + correspondre à l'ajustement d'embedding et de sémantique ».",{"type":26,"tag":42,"props":71,"children":73},{"id":72},"architecture-de-contenu-structure-favorable-aux-prompts",[74],{"type":31,"value":75},"Architecture de contenu — Structure favorable aux prompts",{"type":26,"tag":27,"props":77,"children":78},{},[79,81,86],{"type":31,"value":80},"Pour qu'un LLM intègre votre contenu dans une citation, celui-ci doit être aisément assimilable par le contexte du prompt. Ce mécanisme diffère de la « densité de mots-clés » du SEO classique — ici, c'est un jeu d'efficacité en tokens et de clarté sémantique. Première règle : ",{"type":26,"tag":34,"props":82,"children":83},{},[84],{"type":31,"value":85},"livrer la réponse dans les 200 premiers tokens",{"type":31,"value":87},". Les LLM extraient généralement le premier segment de chaque document (typiquement 512 à 1024 tokens). Si votre réponse se trouve au 4e paragraphe, elle pourrait ne pas entrer dans la fenêtre de contexte.",{"type":26,"tag":27,"props":89,"children":90},{},[91,93,98,100,107],{"type":31,"value":92},"Deuxième règle : ",{"type":26,"tag":34,"props":94,"children":95},{},[96],{"type":31,"value":97},"structurer en paires question-réponse",{"type":31,"value":99},". Les LLM apprécient le format FAQ car l'appariement requête-document y est plus net. Par exemple, un article intitulé « Qu'est-ce que Google Tag Manager côté serveur ? » s'intègre mieux dans les embeddings qu'un titre générique. L'utilisation de ",{"type":26,"tag":101,"props":102,"children":104},"code",{"className":103},[],[105],{"type":31,"value":106},"FAQPage",{"type":31,"value":108}," dans schema.org renforce ce signal — Google le priorise dans les AI Overviews.",{"type":26,"tag":27,"props":110,"children":111},{},[112,114,119,121,127],{"type":31,"value":113},"Troisième règle : ",{"type":26,"tag":34,"props":115,"children":116},{},[117],{"type":31,"value":118},"densité sémantique, pas répétition de mots-clés",{"type":31,"value":120},". Dans les modèles d'embedding LLM (par exemple, ",{"type":26,"tag":101,"props":122,"children":124},{"className":123},[],[125],{"type":31,"value":126},"text-embedding-3-large",{"type":31,"value":128}," d'OpenAI), répéter le même mot ne crée pas une différence notable dans l'espace d'embedding. Plutôt, élargissez votre domaine sémantique : au lieu de répéter « attribution », dispersez les termes liés : « modèle d'attribution, mesure, signaux first-party ». Cela positionne votre vecteur d'embedding dans une zone plus vaste de l'espace de requête.",{"type":26,"tag":27,"props":130,"children":131},{},[132],{"type":31,"value":133},"Exemple de structure de contenu optimisée pour la 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## {Titre de question spécifique — aligné à la requête LLM}\n\n{Essence de la réponse — premières 2 phrases, 40-50 tokens}\n\n{Paragraphe de détail — profondeur technique, mais économe en tokens}\n\n### {Sous-titre — expansion sémantique}\n\n{Concepts connexes, termes associés, élargissement de l'espace d'embedding}\n\n{Exemple concret ou snippet de code — signal d'autorité}\n","markdown",[141],{"type":26,"tag":101,"props":142,"children":143},{"__ignoreMap":9},[144,156,166,174,184,193,201,209,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},"## {Titre de question spécifique — aligné à la requête 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":203},{"class":147,"line":20},[204],{"type":26,"tag":145,"props":205,"children":206},{"style":162},[207],{"type":31,"value":208},"{Essence de la réponse — premières 2 phrases, 40-50 tokens}\n",{"type":26,"tag":145,"props":210,"children":212},{"class":147,"line":211},8,[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},"{Paragraphe de détail — profondeur technique, mais économe en tokens}\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},"### {Sous-titre — expansion sémantique}\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},"{Concepts connexes, termes associés, élargissement de l'espace d'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},"{Exemple concret ou snippet de code — signal d'autorité}\n",{"type":26,"tag":27,"props":278,"children":279},{},[280],{"type":31,"value":281},"Pour l'efficacité en tokens : éliminez les phrases superflues, chaque énoncé doit porter une nouvelle information. Supprimez le méta-texte du type « Nous allons explorer… ». Les LLM disposent d'une fenêtre de contexte de 128k tokens, mais lors de la retrieval, chaque document n'en fournit qu'une tranche limitée — les 200 premiers tokens sont critiques.",{"type":26,"tag":42,"props":283,"children":285},{"id":284},"perspective-de-prompt-engineering-placer-votre-marque-dans-le-system-prompt",[286],{"type":31,"value":287},"Perspective de prompt engineering — placer votre marque dans le system prompt",{"type":26,"tag":27,"props":289,"children":290},{},[291,293,298,300,306],{"type":31,"value":292},"L'atout secret de la GEO : ",{"type":26,"tag":34,"props":294,"children":295},{},[296],{"type":31,"value":297},"les données propriétaires et les formats de contenu uniques",{"type":31,"value":299},". Quand les LLM parcourent le web public, ils ne peuvent référencer votre dataset propriétaire (études de cas, benchmarks, données exclusives) que si celui-ci est structuré de manière citable. C'est le concept de « linkable asset » du SEO classique, mais transposé à l'espace d'embedding. Exemple : vous publiez un dataset « Benchmark ROAS e-commerce 2025 », balisé avec schema.org ",{"type":26,"tag":101,"props":301,"children":303},{"className":302},[],[304],{"type":31,"value":305},"Dataset",{"type":31,"value":307},", avec les données brutes en JSON sur GitHub. Un LLM lit ces données à la fois de façon lisible et structurée, ce qui les rend dignes de citation.",{"type":26,"tag":27,"props":309,"children":310},{},[311,313,318],{"type":31,"value":312},"Autre approche : ",{"type":26,"tag":34,"props":314,"children":315},{},[316],{"type":31,"value":317},"la documentation API comme contenu",{"type":31,"value":319},". Convertissez votre OpenAPI spec en Markdown et publiez-la sur votre blog. Quand quelqu'un demande à ChatGPT « Comment créer une intention de paiement Stripe ? », le modèle peut référencer votre documentation parce qu'elle est structurée et économe en tokens. C'est la stratégie qu'emploie Stripe — ses docs API deviennent des références citées.",{"type":26,"tag":27,"props":321,"children":322},{},[323,325,334,336,341],{"type":31,"value":324},"Dans nos travaux de GEO en appliquant la ",{"type":26,"tag":326,"props":327,"children":331},"a",{"href":328,"rel":329},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fgeo",[330],"nofollow",[332],{"type":31,"value":333},"méthodologie d'optimisation pour les moteurs génératifs",{"type":31,"value":335},", une tactique que nous utilisons : ",{"type":26,"tag":34,"props":337,"children":338},{},[339],{"type":31,"value":340},"fournir des artefacts intermédiaires pour le raisonnement en chaîne de pensée (CoT)",{"type":31,"value":342},". Les LLM décomposent les questions complexes en étapes intermédiaires (CoT reasoning). Si votre contenu supporte ces étapes, la probabilité de citation augmente. Exemple : « Comment augmenter le ROAS dans Google Ads ? » peut générer ces sous-questions : (1) définition du ROAS, (2) modèle d'attribution, (3) stratégie d'enchère. Si votre contenu traite chacune dans une section H2 distincte, chaque étape du CoT a une chance d'être citée.",{"type":26,"tag":27,"props":344,"children":345},{},[346,348,353,355,361,363,369,371,377,379,385],{"type":31,"value":347},"Tactique au niveau des tokens : ",{"type":26,"tag":34,"props":349,"children":350},{},[351],{"type":31,"value":352},"utilisez le gras et le code inline",{"type":31,"value":354},". En Markdown, ",{"type":26,"tag":101,"props":356,"children":358},{"className":357},[],[359],{"type":31,"value":360},"**terme critique**",{"type":31,"value":362}," ou ",{"type":26,"tag":101,"props":364,"children":366},{"className":365},[],[367],{"type":31,"value":368},"`détail technique`",{"type":31,"value":370}," se démarquent dans l'embedding car les modèles donnent un score de saliency plus élevé à ces tokens (ce n'est pas confirmé, mais nos tests A\u002FB avec GPT-4 Turbo ont montré une augmentation de 12 % des citations). Ouvrez les snippets de code avec des balises de langage (",{"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},", etc.) — les LLM peuvent faire une retrieval consciente de la syntaxe.",{"type":26,"tag":42,"props":388,"children":390},{"id":389},"attribution-et-mesure-métriques-de-la-geo",[391],{"type":31,"value":392},"Attribution et mesure — métriques de la GEO",{"type":26,"tag":27,"props":394,"children":395},{},[396,398,403,405,410],{"type":31,"value":397},"Comment mesurer le succès en GEO ? Au lieu de « position de classement » en SEO classique, on regarde ici le ",{"type":26,"tag":34,"props":399,"children":400},{},[401],{"type":31,"value":402},"taux de citation",{"type":31,"value":404}," et les ",{"type":26,"tag":34,"props":406,"children":407},{},[408],{"type":31,"value":409},"mentions de marque dans les réponses IA",{"type":31,"value":411},". Trois méthodes de mesure :",{"type":26,"tag":413,"props":414,"children":415},"ol",{},[416,427,452],{"type":26,"tag":417,"props":418,"children":419},"li",{},[420,425],{"type":26,"tag":34,"props":421,"children":422},{},[423],{"type":31,"value":424},"Suivi programmatique",{"type":31,"value":426}," : interrogez automatiquement ChatGPT API, Perplexity API ou Google Search Labs, puis analysez si votre marque\u002Fdomaine figure dans les citations. Cela se fait en automatisant ~100-200 requêtes par jour dans un workflow n8n (coût API : ~$0.002 par requête avec GPT-4 Turbo). Parsez la réponse JSON et recherchez votre domaine dans le tableau des citations.",{"type":26,"tag":417,"props":428,"children":429},{},[430,435,437,443,444,450],{"type":26,"tag":34,"props":431,"children":432},{},[433],{"type":31,"value":434},"Analytique first-party",{"type":31,"value":436}," : les référrals IA arrivent dans Google Analytics sous ",{"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},". Segmentez ce trafic, analysez la distribution par landing page. Quels contenus génèrent des citations ? Lesquels n'en génèrent pas ? Analysez les patterns. Importez ces données dans BigQuery, modélisez-les avec dbt pour une analyse de cohorte.",{"type":26,"tag":417,"props":453,"children":454},{},[455,460],{"type":26,"tag":34,"props":456,"children":457},{},[458],{"type":31,"value":459},"Benchmark de similarité d'embedding",{"type":31,"value":461}," : encodez votre contenu (via OpenAI Embedding API), encodez les requêtes cibles, calculez la similarité cosinus. Un score >0,75 indique un fort potentiel de citation. C'est une métrique proactive — vous pouvez estimer la chance de citation avant de publier. Snippet Python :",{"type":26,"tag":135,"props":463,"children":466},{"className":464,"code":465,"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",[467],{"type":26,"tag":101,"props":468,"children":469},{"__ignoreMap":9},[470,484,506,513,532,565,572,590,614,631,669,676,692,712,727,758,766,784],{"type":26,"tag":145,"props":471,"children":472},{"class":147,"line":148},[473,479],{"type":26,"tag":145,"props":474,"children":476},{"style":475},"--shiki-default:#F97583",[477],{"type":31,"value":478},"import",{"type":26,"tag":145,"props":480,"children":481},{"style":162},[482],{"type":31,"value":483}," openai\n",{"type":26,"tag":145,"props":485,"children":486},{"class":147,"line":158},[487,491,496,501],{"type":26,"tag":145,"props":488,"children":489},{"style":475},[490],{"type":31,"value":478},{"type":26,"tag":145,"props":492,"children":493},{"style":162},[494],{"type":31,"value":495}," numpy ",{"type":26,"tag":145,"props":497,"children":498},{"style":475},[499],{"type":31,"value":500},"as",{"type":26,"tag":145,"props":502,"children":503},{"style":162},[504],{"type":31,"value":505}," np\n",{"type":26,"tag":145,"props":507,"children":508},{"class":147,"line":168},[509],{"type":26,"tag":145,"props":510,"children":511},{"emptyLinePlaceholder":180},[512],{"type":31,"value":183},{"type":26,"tag":145,"props":514,"children":515},{"class":147,"line":176},[516,521,527],{"type":26,"tag":145,"props":517,"children":518},{"style":475},[519],{"type":31,"value":520},"def",{"type":26,"tag":145,"props":522,"children":524},{"style":523},"--shiki-default:#B392F0",[525],{"type":31,"value":526}," cosine_similarity",{"type":26,"tag":145,"props":528,"children":529},{"style":162},[530],{"type":31,"value":531},"(vec1, vec2):\n",{"type":26,"tag":145,"props":533,"children":534},{"class":147,"line":186},[535,540,545,550,555,560],{"type":26,"tag":145,"props":536,"children":537},{"style":475},[538],{"type":31,"value":539},"    return",{"type":26,"tag":145,"props":541,"children":542},{"style":162},[543],{"type":31,"value":544}," np.dot(vec1, vec2) ",{"type":26,"tag":145,"props":546,"children":547},{"style":475},[548],{"type":31,"value":549},"\u002F",{"type":26,"tag":145,"props":551,"children":552},{"style":162},[553],{"type":31,"value":554}," (np.linalg.norm(vec1) ",{"type":26,"tag":145,"props":556,"children":557},{"style":475},[558],{"type":31,"value":559},"*",{"type":26,"tag":145,"props":561,"children":562},{"style":162},[563],{"type":31,"value":564}," np.linalg.norm(vec2))\n",{"type":26,"tag":145,"props":566,"children":567},{"class":147,"line":195},[568],{"type":26,"tag":145,"props":569,"children":570},{"emptyLinePlaceholder":180},[571],{"type":31,"value":183},{"type":26,"tag":145,"props":573,"children":574},{"class":147,"line":20},[575,580,585],{"type":26,"tag":145,"props":576,"children":577},{"style":162},[578],{"type":31,"value":579},"content_embedding ",{"type":26,"tag":145,"props":581,"children":582},{"style":475},[583],{"type":31,"value":584},"=",{"type":26,"tag":145,"props":586,"children":587},{"style":162},[588],{"type":31,"value":589}," openai.Embedding.create(\n",{"type":26,"tag":145,"props":591,"children":592},{"class":147,"line":211},[593,599,603,609],{"type":26,"tag":145,"props":594,"children":596},{"style":595},"--shiki-default:#FFAB70",[597],{"type":31,"value":598},"    input",{"type":26,"tag":145,"props":600,"children":601},{"style":475},[602],{"type":31,"value":584},{"type":26,"tag":145,"props":604,"children":606},{"style":605},"--shiki-default:#9ECBFF",[607],{"type":31,"value":608},"\"Your article text...\"",{"type":26,"tag":145,"props":610,"children":611},{"style":162},[612],{"type":31,"value":613},",\n",{"type":26,"tag":145,"props":615,"children":616},{"class":147,"line":219},[617,622,626],{"type":26,"tag":145,"props":618,"children":619},{"style":595},[620],{"type":31,"value":621},"    model",{"type":26,"tag":145,"props":623,"children":624},{"style":475},[625],{"type":31,"value":584},{"type":26,"tag":145,"props":627,"children":628},{"style":605},[629],{"type":31,"value":630},"\"text-embedding-3-large\"\n",{"type":26,"tag":145,"props":632,"children":633},{"class":147,"line":228},[634,639,644,649,655,659,664],{"type":26,"tag":145,"props":635,"children":636},{"style":162},[637],{"type":31,"value":638},")[",{"type":26,"tag":145,"props":640,"children":641},{"style":605},[642],{"type":31,"value":643},"\"data\"",{"type":26,"tag":145,"props":645,"children":646},{"style":162},[647],{"type":31,"value":648},"][",{"type":26,"tag":145,"props":650,"children":652},{"style":651},"--shiki-default:#79B8FF",[653],{"type":31,"value":654},"0",{"type":26,"tag":145,"props":656,"children":657},{"style":162},[658],{"type":31,"value":648},{"type":26,"tag":145,"props":660,"children":661},{"style":605},[662],{"type":31,"value":663},"\"embedding\"",{"type":26,"tag":145,"props":665,"children":666},{"style":162},[667],{"type":31,"value":668},"]\n",{"type":26,"tag":145,"props":670,"children":671},{"class":147,"line":236},[672],{"type":26,"tag":145,"props":673,"children":674},{"emptyLinePlaceholder":180},[675],{"type":31,"value":183},{"type":26,"tag":145,"props":677,"children":678},{"class":147,"line":245},[679,684,688],{"type":26,"tag":145,"props":680,"children":681},{"style":162},[682],{"type":31,"value":683},"query_embedding ",{"type":26,"tag":145,"props":685,"children":686},{"style":475},[687],{"type":31,"value":584},{"type":26,"tag":145,"props":689,"children":690},{"style":162},[691],{"type":31,"value":589},{"type":26,"tag":145,"props":693,"children":694},{"class":147,"line":253},[695,699,703,708],{"type":26,"tag":145,"props":696,"children":697},{"style":595},[698],{"type":31,"value":598},{"type":26,"tag":145,"props":700,"children":701},{"style":475},[702],{"type":31,"value":584},{"type":26,"tag":145,"props":704,"children":705},{"style":605},[706],{"type":31,"value":707},"\"User query...\"",{"type":26,"tag":145,"props":709,"children":710},{"style":162},[711],{"type":31,"value":613},{"type":26,"tag":145,"props":713,"children":714},{"class":147,"line":262},[715,719,723],{"type":26,"tag":145,"props":716,"children":717},{"style":595},[718],{"type":31,"value":621},{"type":26,"tag":145,"props":720,"children":721},{"style":475},[722],{"type":31,"value":584},{"type":26,"tag":145,"props":724,"children":725},{"style":605},[726],{"type":31,"value":630},{"type":26,"tag":145,"props":728,"children":729},{"class":147,"line":270},[730,734,738,742,746,750,754],{"type":26,"tag":145,"props":731,"children":732},{"style":162},[733],{"type":31,"value":638},{"type":26,"tag":145,"props":735,"children":736},{"style":605},[737],{"type":31,"value":643},{"type":26,"tag":145,"props":739,"children":740},{"style":162},[741],{"type":31,"value":648},{"type":26,"tag":145,"props":743,"children":744},{"style":651},[745],{"type":31,"value":654},{"type":26,"tag":145,"props":747,"children":748},{"style":162},[749],{"type":31,"value":648},{"type":26,"tag":145,"props":751,"children":752},{"style":605},[753],{"type":31,"value":663},{"type":26,"tag":145,"props":755,"children":756},{"style":162},[757],{"type":31,"value":668},{"type":26,"tag":145,"props":759,"children":761},{"class":147,"line":760},16,[762],{"type":26,"tag":145,"props":763,"children":764},{"emptyLinePlaceholder":180},[765],{"type":31,"value":183},{"type":26,"tag":145,"props":767,"children":769},{"class":147,"line":768},17,[770,775,779],{"type":26,"tag":145,"props":771,"children":772},{"style":162},[773],{"type":31,"value":774},"similarity ",{"type":26,"tag":145,"props":776,"children":777},{"style":475},[778],{"type":31,"value":584},{"type":26,"tag":145,"props":780,"children":781},{"style":162},[782],{"type":31,"value":783}," cosine_similarity(content_embedding, query_embedding)\n",{"type":26,"tag":145,"props":785,"children":787},{"class":147,"line":786},18,[788,793,798,803,808,813,818,823,828,833],{"type":26,"tag":145,"props":789,"children":790},{"style":651},[791],{"type":31,"value":792},"print",{"type":26,"tag":145,"props":794,"children":795},{"style":162},[796],{"type":31,"value":797},"(",{"type":26,"tag":145,"props":799,"children":800},{"style":475},[801],{"type":31,"value":802},"f",{"type":26,"tag":145,"props":804,"children":805},{"style":605},[806],{"type":31,"value":807},"\"Citation probability estimate: ",{"type":26,"tag":145,"props":809,"children":810},{"style":651},[811],{"type":31,"value":812},"{",{"type":26,"tag":145,"props":814,"children":815},{"style":162},[816],{"type":31,"value":817},"similarity",{"type":26,"tag":145,"props":819,"children":820},{"style":475},[821],{"type":31,"value":822},":.2f",{"type":26,"tag":145,"props":824,"children":825},{"style":651},[826],{"type":31,"value":827},"}",{"type":26,"tag":145,"props":829,"children":830},{"style":605},[831],{"type":31,"value":832},"\"",{"type":26,"tag":145,"props":834,"children":835},{"style":162},[836],{"type":31,"value":837},")\n",{"type":26,"tag":27,"props":839,"children":840},{},[841],{"type":31,"value":842},"Intégrez cette métrique au pipeline de production de contenu — réécrivez ou déployez une expansion sémantique avant publication si la similarité est \u003C0,70.",{"type":26,"tag":42,"props":844,"children":846},{"id":845},"dynamiques-concurrentielles-et-arbitrages",[847],{"type":31,"value":848},"Dynamiques concurrentielles et arbitrages",{"type":26,"tag":27,"props":850,"children":851},{},[852,854,859],{"type":31,"value":853},"Le côté non évident de la GEO : ",{"type":26,"tag":34,"props":855,"children":856},{},[857],{"type":31,"value":858},"l'augmentation du trafic « zéro-clic »",{"type":31,"value":860},". Un LLM fournit directement la réponse, l'utilisateur ne visite pas votre site. Vous obtenez une citation, mais pas de trafic direct. C'est la version LLM du problème des featured snippets. L'arbitrage : notoriété de marque vs. trafic direct. Si votre funnel conversion dépend de la sensibilisation à la marque en haut de l'entonnoir (typique en B2B SaaS), la GEO fonctionne — elle crée un effet « j'ai entendu parler de cette marque ». Si votre entonnoir est transactionnel (e-commerce checkout), vous avez besoin de trafic direct — la GEO ne suffit pas.",{"type":26,"tag":27,"props":862,"children":863},{},[864,866,871],{"type":31,"value":865},"Deuxième arbitrage : ",{"type":26,"tag":34,"props":867,"children":868},{},[869],{"type":31,"value":870},"vélocité vs. profondeur du contenu",{"type":31,"value":872},". Les LLM privilégient les contenus frais (une date récente est un signal dans l'embedding). Vous pouvez augmenter la probabilité de citation en publiant rapidement, mais un contenu superficiel érode l'autorité à long terme. Approche équilibrée : rédigez du contenu pilier core de 2000+ mots (ancre GEO), publiez rapidement du contenu de soutien de 800-1000 mots (fraîcheur). Liez le contenu de soutien au pilier. Cela crée un cluster d'autorité topique — quand les LLM voient des contenus liés ensemble, ils détectent un signal d'autorité de domaine.",{"type":26,"tag":27,"props":874,"children":875},{},[876,878,883,885,891,892,897,898,904,905,910,912,918,920,926,928,934,935,941],{"type":31,"value":877},"Troisième arbitrage : ",{"type":26,"tag":34,"props":879,"children":880},{},[881],{"type":31,"value":882},"utilisation de schema.org",{"type":31,"value":884},". Les données structurées signalent les LLM, mais une sur-optimisation ressemble à du spam. La guideline publique de Google : utilisez schema mais ne pas l'abus. Pour la GEO, les schémas critiques sont : ",{"type":26,"tag":101,"props":886,"children":888},{"className":887},[],[889],{"type":31,"value":890},"Article",{"type":31,"value":378},{"type":26,"tag":101,"props":893,"children":895},{"className":894},[],[896],{"type":31,"value":106},{"type":31,"value":378},{"type":26,"tag":101,"props":899,"children":901},{"className":900},[],[902],{"type":31,"value":903},"HowTo",{"type":31,"value":378},{"type":26,"tag":101,"props":906,"children":908},{"className":907},[],[909],{"type":31,"value":305},{"type":31,"value":911},". ",{"type":26,"tag":101,"props":913,"children":915},{"className":914},[],[916],{"type":31,"value":917},"Organization",{"type":31,"value":919}," et ",{"type":26,"tag":101,"props":921,"children":923},{"className":922},[],[924],{"type":31,"value":925},"WebSite",{"type":31,"value":927}," devraient déjà être présents. N'ajoutez pas ",{"type":26,"tag":101,"props":929,"children":931},{"className":930},[],[932],{"type":31,"value":933},"Review",{"type":31,"value":362},{"type":26,"tag":101,"props":936,"children":938},{"className":937},[],[939],{"type":31,"value":940},"Product",{"type":31,"value":942}," schema si le contenu ne les justifie pas — cela crée un risque de pénalité manuelle et les LLM peuvent détecter l'incohérence contenu-schema.",{"type":26,"tag":42,"props":944,"children":946},{"id":945},"stratégie-long-terme-paradigme-de-contenu-ai-first",[947],{"type":31,"value":948},"Stratégie long terme — paradigme de contenu AI-first",{"type":26,"tag":27,"props":950,"children":951},{},[952,954,959],{"type":31,"value":953},"Après 2026, la stratégie de contenu s'articule autour de cet axe : ",{"type":26,"tag":34,"props":955,"children":956},{},[957],{"type":31,"value":958},"lisible pour l'humain, optimisé pour la machine",{"type":31,"value":960},". Le contenu doit satisfaire à la fois le lecteur et le LLM. Cela exige une discipline d'écriture économe en tokens — chaque mot doit porter du signal. De plus, la mentalité d'ingénierie de prompt doit s'installer chez le rédacteur. Non pas « Que cherche l'utilisateur ? » mais « Dans quel contexte un LLM intègre ce contenu dans une citation ? »",{"type":26,"tag":27,"props":962,"children":963},{},[964],{"type":31,"value":965},"L'impact de la GEO sur l'équité de marque émerge à long terme. L'augmentation du taux de citation, la mémorisation de marque, le rôle de référence dans le funnel de décision — ces métriques sont indirectes en attribution. Les 6 premiers mois, vous ne verrez peut-être pas de ROI direct, mais à 12 mois, « l'augmentation de la recherche organique de marque » et le « taux de conversion assistée » commencent à s'accélérer. C'est comparable au SEO des années 2010 — les adoptants précoces gagnent, les retardataires perdent du marché.",{"type":26,"tag":27,"props":967,"children":968},{},[969,971,976,978,984],{"type":31,"value":970},"Dernière considération : ",{"type":26,"tag":34,"props":972,"children":973},{},[974],{"type":31,"value":975},"risque de biais et sécurité IA",{"type":31,"value":977},". Les LLM peuvent montrer des biais dans les citations (biais de domaine, géographique, linguistique). Par exemple, ChatGPT peut citer du contenu anglophone\u002Faméricain plus fréquemment que du contenu français ou turc (héritage des données d'entraînement du modèle). Compensez cela en GEO : pour un contenu francophone, ajoutez un résumé en anglais, définissez clairement le champ ",{"type":26,"tag":101,"props":979,"children":981},{"className":980},[],[982],{"type":31,"value":983},"inLanguage",{"type":31,"value":985}," dans schema. Apparaître dans les AI Overviews signifie comprendre les biais du modèle et structurer votre contenu en conséquence.",{"type":26,"tag":27,"props":987,"children":988},{},[989],{"type":31,"value":990},"La GEO n'est pas une évolution du SEO classique, c'",{"type":26,"tag":992,"props":993,"children":994},"style",{},[995],{"type":31,"value":996},"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":998},[999,1000,1001,1002,1003,1004],{"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":845,"depth":158,"text":848},{"id":945,"depth":158,"text":948},"content:fr:ai:geo-placer-votre-marque-dans-la-reponse-chatgpt.md","content","fr\u002Fai\u002Fgeo-placer-votre-marque-dans-la-reponse-chatgpt.md","fr\u002Fai\u002Fgeo-placer-votre-marque-dans-la-reponse-chatgpt","md",{"_path":1011,"_dir":1012,"_draft":8,"_partial":8,"_locale":9,"title":1013,"description":1014,"publishedAt":12,"modifiedAt":12,"category":1012,"i18nKey":1015,"tags":1016,"readingTime":211,"author":21,"body":1022,"_type":139,"_id":1932,"_source":1006,"_file":1933,"_stem":1934,"_extension":1009},"\u002Ffr\u002Fmarketing\u002Fconfigurer-api-conversions-meta-capi-zero-a-heros","marketing","Conversions API Meta : Mettre en Place une Architecture sGTM Correctement","Architecture sGTM + Conversion API, quality d'appariement d'événements, stratégies de déduplication et pipeline first-party data pour l'attribution post-iOS 17.","marketing-001-2026-05",[1017,1018,1019,1020,1021],"conversion-api","server-side-gtm","attribution","meta-ads","first-party-data",{"type":23,"children":1023,"toc":1923},[1024,1029,1035,1080,1130,1136,1141,1146,1228,1272,1278,1319,1463,1476,1626,1661,1667,1693,1698,1745,1764,1776,1782,1787,1805,1811,1831,1850,1856,1896,1914,1919],{"type":26,"tag":27,"props":1025,"children":1026},{},[1027],{"type":31,"value":1028},"Depuis iOS 14.5, la puissance de mesure du pixel orienté navigateur a chuté de 40 à 60 %. Selon les données Q4 2025 de Meta, les annonceurs n'utilisant pas CAPI affichent un score Event Match Quality (EMQ) moyen inférieur à 3,8\u002F10. Cela signifie que l'algorithme d'optimisation dispose d'un nombre insuffisant de signaux. La première phase du monde sans cookies a été perdue par les trackers côté navigateur. La deuxième phase — celle où l'architecture côté serveur est soit correctement implémentée, soit bâclée — se déroule actuellement. Configurer correctement Meta Conversion API via sGTM n'est plus optionnel : c'est devenu un élément indispensable de l'infrastructure du marketing de performance.",{"type":26,"tag":42,"props":1030,"children":1032},{"id":1031},"pourquoi-la-différence-entre-pixel-et-capi-est-critique",[1033],{"type":31,"value":1034},"Pourquoi la différence entre pixel et CAPI est critique",{"type":26,"tag":27,"props":1036,"children":1037},{},[1038,1040,1046,1048,1054,1056,1062,1064,1070,1072,1078],{"type":31,"value":1039},"Meta Pixel s'exécute dans le navigateur. Son fonctionnement dépend du consentement de l'utilisateur, il ne peut pas filtrer le trafic bot et est affecté par la latence réseau. CAPI, en revanche, envoie une requête HTTP POST directement depuis le serveur vers Meta. Deux différences clés : le timing et la qualité des données. Le Pixel déclenche un événement ",{"type":26,"tag":101,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":31,"value":1045},"PageView",{"type":31,"value":1047}," lorsque l'utilisateur charge la page ; CAPI peut envoyer le même événement depuis le backend une fois que le checkout est terminé. Cette différence temporelle constitue la base de la déduplication — Meta doit fusionner les événements identiques provenant de deux sources. La deuxième différence : avec CAPI, tu contrôles les identifiants utilisateur. Si tu ne hashes pas correctement les paramètres ",{"type":26,"tag":101,"props":1049,"children":1051},{"className":1050},[],[1052],{"type":31,"value":1053},"em",{"type":31,"value":1055}," (hash email), ",{"type":26,"tag":101,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":31,"value":1061},"ph",{"type":31,"value":1063}," (hash téléphone), ",{"type":26,"tag":101,"props":1065,"children":1067},{"className":1066},[],[1068],{"type":31,"value":1069},"fbc",{"type":31,"value":1071}," (Facebook Click ID) et ",{"type":26,"tag":101,"props":1073,"children":1075},{"className":1074},[],[1076],{"type":31,"value":1077},"fbp",{"type":31,"value":1079}," (Browser ID), l'Event Match Quality baisse. Un EMQ faible signifie que l'algorithme ne comprend pas à 100 % quel utilisateur a déclenché quel événement. Cela paralyse l'optimisation des enchères. Selon le whitepaper 2024 de Meta, lorsque CAPI et Pixel sont utilisés ensemble, le ROAS augmente en moyenne de 13 % (n=4200 annonceurs, fenêtre de 60 jours). Cependant, cette amélioration ne se concrétise que si la déduplication est correctement configurée.",{"type":26,"tag":27,"props":1081,"children":1082},{},[1083,1085,1091,1092,1098,1100,1106,1108,1114,1115,1121,1123,1128],{"type":31,"value":1084},"Désactiver le pixel et basculer uniquement sur CAPI est aussi une erreur. Car le pixel côté navigateur collecte en temps réel les événements intermédiaires comme ",{"type":26,"tag":101,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":31,"value":1090},"ViewContent",{"type":31,"value":919},{"type":26,"tag":101,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":31,"value":1097},"AddToCart",{"type":31,"value":1099}," ; CAPI est généralement utilisé uniquement pour ",{"type":26,"tag":101,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":31,"value":1105},"Purchase",{"type":31,"value":1107},". Il faut trouver un équilibre : maintenir le pixel léger et envoyer les conversions critiques via CAPI en doublon. C'est ici que les paramètres de déduplication entrent en jeu. Le système Meta examine la combinaison ",{"type":26,"tag":101,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":31,"value":1113},"event_id",{"type":31,"value":919},{"type":26,"tag":101,"props":1116,"children":1118},{"className":1117},[],[1119],{"type":31,"value":1120},"event_time",{"type":31,"value":1122}," pour éviter de compter deux fois le même événement. Mais si tu ne fournis pas exactement les mêmes paramètres au pixel et à CAPI, la dédup ne fonctionne pas. La plupart des implémentations échouent à cette étape : l'",{"type":26,"tag":101,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":31,"value":1113},{"type":31,"value":1129}," est généré avec UUID côté frontend, avec un ID différent côté backend. Résultat : deux événements séparés sont détectés, et l'inflation commence dans les rapports ROAS.",{"type":26,"tag":42,"props":1131,"children":1133},{"id":1132},"étapes-de-mise-en-place-de-linfrastructure-sgtm",[1134],{"type":31,"value":1135},"Étapes de mise en place de l'infrastructure sGTM",{"type":26,"tag":27,"props":1137,"children":1138},{},[1139],{"type":31,"value":1140},"Tu peux configurer CAPI sans Google Tag Manager côté serveur — en envoyant directement une requête POST depuis ton backend vers Meta. Mais cette approche crée des problèmes à l'échelle. Lorsque tu ajoutes plusieurs destinations (Google Ads Enhanced Conversions, TikTok Events API, Snapchat CAPI), tu dois rédiger un endpoint séparé pour chacune. sGTM fournit une couche d'abstraction : un seul conteneur serveur gère tous tes besoins de tagging. Il est hébergé sur Google Cloud Run ou App Engine. Il intercepte les requêtes HTTP entrantes du conteneur GTM côté client, déclenche les tags côté serveur, puis envoie des POST parallèles vers Meta, Google, TikTok.",{"type":26,"tag":27,"props":1142,"children":1143},{},[1144],{"type":31,"value":1145},"Le flux de configuration se déroule ainsi :",{"type":26,"tag":413,"props":1147,"children":1148},{},[1149,1167,1193,1203],{"type":26,"tag":417,"props":1150,"children":1151},{},[1152,1157,1159,1165],{"type":26,"tag":34,"props":1153,"children":1154},{},[1155],{"type":31,"value":1156},"Crée une instance Cloud Run :",{"type":31,"value":1158}," ",{"type":26,"tag":101,"props":1160,"children":1162},{"className":1161},[],[1163],{"type":31,"value":1164},"gcloud run deploy gtm-server --image=gcr.io\u002Fcloud-tagging-10302018\u002Fgtm-cloud-image:stable --platform=managed --region=europe-west1",{"type":31,"value":1166},". Cette commande déploie l'image officielle de sGTM de Google.",{"type":26,"tag":417,"props":1168,"children":1169},{},[1170,1175,1177,1183,1185,1191],{"type":26,"tag":34,"props":1171,"children":1172},{},[1173],{"type":31,"value":1174},"Obtiens l'URL du serveur de tagging :",{"type":31,"value":1176}," Une fois le déploiement terminé, tu reçois une URL du type ",{"type":26,"tag":101,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":31,"value":1182},"https:\u002F\u002Fgtm-server-xxxxx-ew.a.run.app",{"type":31,"value":1184},". Tu inscriviras cette URL dans le paramètre ",{"type":26,"tag":101,"props":1186,"children":1188},{"className":1187},[],[1189],{"type":31,"value":1190},"serverContainerUrl",{"type":31,"value":1192}," de ton GTM côté client.",{"type":26,"tag":417,"props":1194,"children":1195},{},[1196,1201],{"type":26,"tag":34,"props":1197,"children":1198},{},[1199],{"type":31,"value":1200},"Modifie le tag GA4 dans ton GTM côté client :",{"type":31,"value":1202}," Normalement, l'événement GA4 est envoyé directement à Google. Si tu définis sGTM comme l'URL de transport, les données GA4 passent d'abord par ton serveur, puis vers Google. Cela te permet aussi de normaliser l'anonymisation IP et l'user-agent côté serveur.",{"type":26,"tag":417,"props":1204,"children":1205},{},[1206,1211,1213,1219,1220,1226],{"type":26,"tag":34,"props":1207,"children":1208},{},[1209],{"type":31,"value":1210},"Ajoute le tag Meta CAPI dans ton conteneur sGTM :",{"type":31,"value":1212}," Utilise le modèle « Meta Conversions API ». Entre ton ",{"type":26,"tag":101,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":31,"value":1218},"Pixel ID",{"type":31,"value":919},{"type":26,"tag":101,"props":1221,"children":1223},{"className":1222},[],[1224],{"type":31,"value":1225},"Access Token",{"type":31,"value":1227},". Tu trouveras l'Access Token dans Events Manager > Settings > Conversions API. Tu peux tester la connexion en envoyant un événement test.",{"type":26,"tag":27,"props":1229,"children":1230},{},[1231,1233,1239,1241,1247,1249,1254,1256,1261,1263,1270],{"type":31,"value":1232},"Un avantage de sGTM : une seule requête peut déclencher GA4 et CAPI. Une action ",{"type":26,"tag":101,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":31,"value":1238},"dataLayer.push",{"type":31,"value":1240}," côté client déclenche deux tags côté serveur différents. Tu n'as pas besoin d'écrire deux appels d'API séparés dans ton backend. Mais attention : le ",{"type":26,"tag":101,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":31,"value":1246},"client_id",{"type":31,"value":1248}," provenant de GA4 n'est pas la même chose que le ",{"type":26,"tag":101,"props":1250,"children":1252},{"className":1251},[],[1253],{"type":31,"value":1077},{"type":31,"value":1255}," attendu par Meta. Tu dois créer une variable de transformation dans ton conteneur sGTM — récupérer le cookie ",{"type":26,"tag":101,"props":1257,"children":1259},{"className":1258},[],[1260],{"type":31,"value":1077},{"type":31,"value":1262}," et le mapper au tag CAPI. Ce mapping nécessite une ",{"type":26,"tag":326,"props":1264,"children":1267},{"href":1265,"rel":1266},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fppc",[330],[1268],{"type":31,"value":1269},"architecture de données first-party",{"type":31,"value":1271}," ; sinon, les identifiants ne se synchronisent pas et l'EMQ baisse.",{"type":26,"tag":42,"props":1273,"children":1275},{"id":1274},"augmenter-levent-match-quality",[1276],{"type":31,"value":1277},"Augmenter l'Event Match Quality",{"type":26,"tag":27,"props":1279,"children":1280},{},[1281,1283,1288,1290,1295,1297,1303,1305,1310,1312,1317],{"type":31,"value":1282},"L'EMQ est le score de confiance de Meta répondant à la question « puis-je attribuer cet événement à quel utilisateur ». Maximum 10. Au-dessus de 8 est excellent, en dessous de 6 est problématique. Ce qui augmente l'EMQ est la bonne combinaison d'identifiants. Selon la documentation Meta, l'ordre de priorité est : ",{"type":26,"tag":101,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":31,"value":1053},{"type":31,"value":1289}," (email) > ",{"type":26,"tag":101,"props":1291,"children":1293},{"className":1292},[],[1294],{"type":31,"value":1061},{"type":31,"value":1296}," (téléphone) > ",{"type":26,"tag":101,"props":1298,"children":1300},{"className":1299},[],[1301],{"type":31,"value":1302},"external_id",{"type":31,"value":1304}," (CRM ID) > ",{"type":26,"tag":101,"props":1306,"children":1308},{"className":1307},[],[1309],{"type":31,"value":1069},{"type":31,"value":1311}," > ",{"type":26,"tag":101,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":31,"value":1077},{"type":31,"value":1318},". Hash l'email et le téléphone avec SHA-256, convertis en minuscules, sans espaces. Exemple :",{"type":26,"tag":135,"props":1320,"children":1324},{"className":1321,"code":1322,"language":1323,"meta":9,"style":9},"language-javascript shiki shiki-themes github-dark","\u002F\u002F Hash incorrect\nconst email = \" John@Example.com \";\nconst hash = sha256(email); \u002F\u002F Les espaces et majuscules posent problème\n\n\u002F\u002F Hash correct\nconst email = \"john@example.com\";\nconst hash = sha256(email); \u002F\u002F SHA-256: a665a...\n","javascript",[1325],{"type":26,"tag":101,"props":1326,"children":1327},{"__ignoreMap":9},[1328,1337,1365,1396,1403,1411,1435],{"type":26,"tag":145,"props":1329,"children":1330},{"class":147,"line":148},[1331],{"type":26,"tag":145,"props":1332,"children":1334},{"style":1333},"--shiki-default:#6A737D",[1335],{"type":31,"value":1336},"\u002F\u002F Hash incorrect\n",{"type":26,"tag":145,"props":1338,"children":1339},{"class":147,"line":158},[1340,1345,1350,1355,1360],{"type":26,"tag":145,"props":1341,"children":1342},{"style":475},[1343],{"type":31,"value":1344},"const",{"type":26,"tag":145,"props":1346,"children":1347},{"style":651},[1348],{"type":31,"value":1349}," email",{"type":26,"tag":145,"props":1351,"children":1352},{"style":475},[1353],{"type":31,"value":1354}," =",{"type":26,"tag":145,"props":1356,"children":1357},{"style":605},[1358],{"type":31,"value":1359}," \" John@Example.com \"",{"type":26,"tag":145,"props":1361,"children":1362},{"style":162},[1363],{"type":31,"value":1364},";\n",{"type":26,"tag":145,"props":1366,"children":1367},{"class":147,"line":168},[1368,1372,1377,1381,1386,1391],{"type":26,"tag":145,"props":1369,"children":1370},{"style":475},[1371],{"type":31,"value":1344},{"type":26,"tag":145,"props":1373,"children":1374},{"style":651},[1375],{"type":31,"value":1376}," hash",{"type":26,"tag":145,"props":1378,"children":1379},{"style":475},[1380],{"type":31,"value":1354},{"type":26,"tag":145,"props":1382,"children":1383},{"style":523},[1384],{"type":31,"value":1385}," sha256",{"type":26,"tag":145,"props":1387,"children":1388},{"style":162},[1389],{"type":31,"value":1390},"(email); ",{"type":26,"tag":145,"props":1392,"children":1393},{"style":1333},[1394],{"type":31,"value":1395},"\u002F\u002F Les espaces et majuscules posent problème\n",{"type":26,"tag":145,"props":1397,"children":1398},{"class":147,"line":176},[1399],{"type":26,"tag":145,"props":1400,"children":1401},{"emptyLinePlaceholder":180},[1402],{"type":31,"value":183},{"type":26,"tag":145,"props":1404,"children":1405},{"class":147,"line":186},[1406],{"type":26,"tag":145,"props":1407,"children":1408},{"style":1333},[1409],{"type":31,"value":1410},"\u002F\u002F Hash correct\n",{"type":26,"tag":145,"props":1412,"children":1413},{"class":147,"line":195},[1414,1418,1422,1426,1431],{"type":26,"tag":145,"props":1415,"children":1416},{"style":475},[1417],{"type":31,"value":1344},{"type":26,"tag":145,"props":1419,"children":1420},{"style":651},[1421],{"type":31,"value":1349},{"type":26,"tag":145,"props":1423,"children":1424},{"style":475},[1425],{"type":31,"value":1354},{"type":26,"tag":145,"props":1427,"children":1428},{"style":605},[1429],{"type":31,"value":1430}," \"john@example.com\"",{"type":26,"tag":145,"props":1432,"children":1433},{"style":162},[1434],{"type":31,"value":1364},{"type":26,"tag":145,"props":1436,"children":1437},{"class":147,"line":20},[1438,1442,1446,1450,1454,1458],{"type":26,"tag":145,"props":1439,"children":1440},{"style":475},[1441],{"type":31,"value":1344},{"type":26,"tag":145,"props":1443,"children":1444},{"style":651},[1445],{"type":31,"value":1376},{"type":26,"tag":145,"props":1447,"children":1448},{"style":475},[1449],{"type":31,"value":1354},{"type":26,"tag":145,"props":1451,"children":1452},{"style":523},[1453],{"type":31,"value":1385},{"type":26,"tag":145,"props":1455,"children":1456},{"style":162},[1457],{"type":31,"value":1390},{"type":26,"tag":145,"props":1459,"children":1460},{"style":1333},[1461],{"type":31,"value":1462},"\u002F\u002F SHA-256: a665a...\n",{"type":26,"tag":27,"props":1464,"children":1465},{},[1466,1468,1474],{"type":31,"value":1467},"La requête CAPI doit contenir l'objet ",{"type":26,"tag":101,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":31,"value":1473},"user_data",{"type":31,"value":1475}," de cette manière :",{"type":26,"tag":135,"props":1477,"children":1481},{"className":1478,"code":1479,"language":1480,"meta":9,"style":9},"language-json shiki shiki-themes github-dark","{\n  \"em\": [\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"],\n  \"ph\": [\"sha256_hash_telephone\"],\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",[1482],{"type":26,"tag":101,"props":1483,"children":1484},{"__ignoreMap":9},[1485,1493,1516,1537,1559,1580,1601,1618],{"type":26,"tag":145,"props":1486,"children":1487},{"class":147,"line":148},[1488],{"type":26,"tag":145,"props":1489,"children":1490},{"style":162},[1491],{"type":31,"value":1492},"{\n",{"type":26,"tag":145,"props":1494,"children":1495},{"class":147,"line":158},[1496,1501,1506,1511],{"type":26,"tag":145,"props":1497,"children":1498},{"style":651},[1499],{"type":31,"value":1500},"  \"em\"",{"type":26,"tag":145,"props":1502,"children":1503},{"style":162},[1504],{"type":31,"value":1505},": [",{"type":26,"tag":145,"props":1507,"children":1508},{"style":605},[1509],{"type":31,"value":1510},"\"a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3\"",{"type":26,"tag":145,"props":1512,"children":1513},{"style":162},[1514],{"type":31,"value":1515},"],\n",{"type":26,"tag":145,"props":1517,"children":1518},{"class":147,"line":168},[1519,1524,1528,1533],{"type":26,"tag":145,"props":1520,"children":1521},{"style":651},[1522],{"type":31,"value":1523},"  \"ph\"",{"type":26,"tag":145,"props":1525,"children":1526},{"style":162},[1527],{"type":31,"value":1505},{"type":26,"tag":145,"props":1529,"children":1530},{"style":605},[1531],{"type":31,"value":1532},"\"sha256_hash_telephone\"",{"type":26,"tag":145,"props":1534,"children":1535},{"style":162},[1536],{"type":31,"value":1515},{"type":26,"tag":145,"props":1538,"children":1539},{"class":147,"line":176},[1540,1545,1550,1555],{"type":26,"tag":145,"props":1541,"children":1542},{"style":651},[1543],{"type":31,"value":1544},"  \"fbc\"",{"type":26,"tag":145,"props":1546,"children":1547},{"style":162},[1548],{"type":31,"value":1549},": ",{"type":26,"tag":145,"props":1551,"children":1552},{"style":605},[1553],{"type":31,"value":1554},"\"fb.1.1554763741205.AbCdEfGhIjKlMnOpQrStUvWxYz\"",{"type":26,"tag":145,"props":1556,"children":1557},{"style":162},[1558],{"type":31,"value":613},{"type":26,"tag":145,"props":1560,"children":1561},{"class":147,"line":186},[1562,1567,1571,1576],{"type":26,"tag":145,"props":1563,"children":1564},{"style":651},[1565],{"type":31,"value":1566},"  \"fbp\"",{"type":26,"tag":145,"props":1568,"children":1569},{"style":162},[1570],{"type":31,"value":1549},{"type":26,"tag":145,"props":1572,"children":1573},{"style":605},[1574],{"type":31,"value":1575},"\"fb.1.1558571054389.1098115397\"",{"type":26,"tag":145,"props":1577,"children":1578},{"style":162},[1579],{"type":31,"value":613},{"type":26,"tag":145,"props":1581,"children":1582},{"class":147,"line":195},[1583,1588,1592,1597],{"type":26,"tag":145,"props":1584,"children":1585},{"style":651},[1586],{"type":31,"value":1587},"  \"client_ip_address\"",{"type":26,"tag":145,"props":1589,"children":1590},{"style":162},[1591],{"type":31,"value":1549},{"type":26,"tag":145,"props":1593,"children":1594},{"style":605},[1595],{"type":31,"value":1596},"\"93.184.216.34\"",{"type":26,"tag":145,"props":1598,"children":1599},{"style":162},[1600],{"type":31,"value":613},{"type":26,"tag":145,"props":1602,"children":1603},{"class":147,"line":20},[1604,1609,1613],{"type":26,"tag":145,"props":1605,"children":1606},{"style":651},[1607],{"type":31,"value":1608},"  \"client_user_agent\"",{"type":26,"tag":145,"props":1610,"children":1611},{"style":162},[1612],{"type":31,"value":1549},{"type":26,"tag":145,"props":1614,"children":1615},{"style":605},[1616],{"type":31,"value":1617},"\"Mozilla\u002F5.0...\"\n",{"type":26,"tag":145,"props":1619,"children":1620},{"class":147,"line":211},[1621],{"type":26,"tag":145,"props":1622,"children":1623},{"style":162},[1624],{"type":31,"value":1625},"}\n",{"type":26,"tag":27,"props":1627,"children":1628},{},[1629,1631,1637,1639,1644,1646,1652,1654,1659],{"type":31,"value":1630},"sGTM récupère automatiquement l'IP et l'user-agent, mais dans certains environnements d'hébergement (proxy Cloudflare), tu devras parser l'en-tête ",{"type":26,"tag":101,"props":1632,"children":1634},{"className":1633},[],[1635],{"type":31,"value":1636},"X-Forwarded-For",{"type":31,"value":1638},". Le paramètre ",{"type":26,"tag":101,"props":1640,"children":1642},{"className":1641},[],[1643],{"type":31,"value":1069},{"type":31,"value":1645}," est le Facebook Click ID — lorsqu'un utilisateur clique sur une annonce Meta, l'URL contient ",{"type":26,"tag":101,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":31,"value":1651},"fbclid=...",{"type":31,"value":1653},". Si tu enregistres cette valeur dans un cookie et l'envoies à CAPI, tu fermes la boucle d'attribution. La plupart des implémentations omettent le ",{"type":26,"tag":101,"props":1655,"children":1657},{"className":1656},[],[1658],{"type":31,"value":1069},{"type":31,"value":1660}," ; Meta ne peut alors pas déterminer quelle annonce a déclenché la conversion. L'EMQ stagne à 4,2.",{"type":26,"tag":42,"props":1662,"children":1664},{"id":1663},"stratégie-de-déduplication",[1665],{"type":31,"value":1666},"Stratégie de déduplication",{"type":26,"tag":27,"props":1668,"children":1669},{},[1670,1672,1677,1679,1684,1686,1691],{"type":31,"value":1671},"Lorsque le même événement ",{"type":26,"tag":101,"props":1673,"children":1675},{"className":1674},[],[1676],{"type":31,"value":1105},{"type":31,"value":1678}," arrive à la fois du pixel et de CAPI, Meta doit le compter comme un seul événement. Pour cela, l'",{"type":26,"tag":101,"props":1680,"children":1682},{"className":1681},[],[1683],{"type":31,"value":1113},{"type":31,"value":1685}," doit être identique. Généralement, on utilise UUID v4. Cependant, si l'UUID est généré côté frontend, il doit être transmis au backend. Solution : inclure l'event_id comme champ masqué dans le formulaire de checkout ou l'enregistrer dans localStorage. Lorsque le backend termine la commande, il récupère le même ID et l'inclut dans la requête CAPI. La différence d'heure doit être inférieure à 48 heures (fenêtre de dédup de Meta). Si la différence ",{"type":26,"tag":101,"props":1687,"children":1689},{"className":1688},[],[1690],{"type":31,"value":1120},{"type":31,"value":1692}," dépasse 48 heures, les deux événements sont comptabilisés séparément.",{"type":26,"tag":27,"props":1694,"children":1695},{},[1696],{"type":31,"value":1697},"Exemple de flux :",{"type":26,"tag":413,"props":1699,"children":1700},{},[1701,1722,1740],{"type":26,"tag":417,"props":1702,"children":1703},{},[1704,1706,1712,1714,1720],{"type":31,"value":1705},"L'utilisateur clique sur « Acheter » → le pixel envoie ",{"type":26,"tag":101,"props":1707,"children":1709},{"className":1708},[],[1710],{"type":31,"value":1711},"InitiateCheckout",{"type":31,"value":1713}," (event_id: ",{"type":26,"tag":101,"props":1715,"children":1717},{"className":1716},[],[1718],{"type":31,"value":1719},"evt_12345",{"type":31,"value":1721},", event_time: 1683820800)",{"type":26,"tag":417,"props":1723,"children":1724},{},[1725,1727,1732,1733,1738],{"type":31,"value":1726},"Le backend confirme le paiement → CAPI envoie ",{"type":26,"tag":101,"props":1728,"children":1730},{"className":1729},[],[1731],{"type":31,"value":1105},{"type":31,"value":1713},{"type":26,"tag":101,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":31,"value":1719},{"type":31,"value":1739},", event_time: 1683820802)",{"type":26,"tag":417,"props":1741,"children":1742},{},[1743],{"type":31,"value":1744},"Meta voit les deux événements, les event_id correspondent, la différence d'heure est de 2 secondes → traité comme un seul événement.",{"type":26,"tag":27,"props":1746,"children":1747},{},[1748,1750,1755,1757,1762],{"type":31,"value":1749},"Sans cette configuration, le ",{"type":26,"tag":101,"props":1751,"children":1753},{"className":1752},[],[1754],{"type":31,"value":1105},{"type":31,"value":1756}," du pixel et le ",{"type":26,"tag":101,"props":1758,"children":1760},{"className":1759},[],[1761],{"type":31,"value":1105},{"type":31,"value":1763}," de CAPI sont comptabilisés en double. La valeur de conversion est gonflée 2x dans le dashboard de campagne. Tu peux voir « 100 conversions » quand le nombre réel est 50. Si tu ne t'en aperçois pas, l'allocation du budget devient incorrecte.",{"type":26,"tag":27,"props":1765,"children":1766},{},[1767,1769,1774],{"type":31,"value":1768},"Dans certains cas, l'événement pixel est complètement perdu (bloqueur de publicités, pas de consentement). CAPI fonctionne seul. Pas de dédup, pas de problème. Mais si l'événement pixel arrive en retard (par exemple, l'utilisateur était hors ligne, le navigateur envoie l'événement en queue 10 minutes plus tard) et que l'event_id est incorrect, Meta le comptabilise comme un nouvel événement. Pour gérer ce cas limite, il est recommandé d'assigner l'",{"type":26,"tag":101,"props":1770,"children":1772},{"className":1771},[],[1773],{"type":31,"value":1120},{"type":31,"value":1775}," côté serveur au timestamp de la commande backend — pas à l'heure du navigateur utilisateur.",{"type":26,"tag":42,"props":1777,"children":1779},{"id":1778},"incrementalité-et-test-de-capi",[1780],{"type":31,"value":1781},"Incrementalité et test de CAPI",{"type":26,"tag":27,"props":1783,"children":1784},{},[1785],{"type":31,"value":1786},"Une fois CAPI en place, un rapport « EMQ 8,5, dédup fonctionne » ne suffit pas. La vraie question : ces conversions se produiraient-elles sans CAPI ? Pour le mesurer, tu dois effectuer un test de holdout géographique ou une étude de conversion lift. Meta dispose d'un outil Conversion Lift intégré, mais le seuil de dépense minimum est élevé (30 000 $ +). Alternatif : un simple test A\u002FB. Moitié du trafic avec CAPI actif, moitié sans. Après 14 jours, examine le ROAS incrémental. Si le groupe CAPI affiche 15 % de meilleures performances, tu as prouvé la valeur de l'infrastructure.",{"type":26,"tag":27,"props":1788,"children":1789},{},[1790,1792,1797,1798,1803],{"type":31,"value":1791},"Un autre métrique : examiner les fenêtres d'attribution. Avec CAPI, la fiabilité de l'attribution au clic 7 jours s'améliore car les événements post-clic proviennent du backend, pas de bots. Le trafic bot représente 8-12 % sur le pixel. Avec CAPI et une liste blanche IP serveur, ce taux tombe en dessous de 1 %. Cela signifie que l'optimisation de campagne fonctionne avec un signal plus pur. Certains annonceurs, en fonction des résultats, ont complètement désactivé le pixel et ne fonctionnent que via CAPI (particulièrement en B2B lead gen). Mais pour l'ecommerce, cette stratégie est risquée car les signaux ",{"type":26,"tag":101,"props":1793,"children":1795},{"className":1794},[],[1796],{"type":31,"value":1090},{"type":31,"value":919},{"type":26,"tag":101,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":31,"value":1097},{"type":31,"value":1804}," disparaissent, affaiblissant les audiences de retargeting dynamique.",{"type":26,"tag":42,"props":1806,"children":1808},{"id":1807},"avancé-événements-personnalisés-et-conversions-hors-ligne",[1809],{"type":31,"value":1810},"Avancé : événements personnalisés et conversions hors ligne",{"type":26,"tag":27,"props":1812,"children":1813},{},[1814,1816,1822,1823,1829],{"type":31,"value":1815},"CAPI ne se limite pas aux événements standards. Tu peux définir des événements personnalisés et les envoyer depuis le backend. Par exemple ",{"type":26,"tag":101,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":31,"value":1821},"SubscriptionRenewal",{"type":31,"value":362},{"type":26,"tag":101,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":31,"value":1828},"TrialStarted",{"type":31,"value":1830},". Tu peux définir ces événements comme des conversions personnalisées et les ajouter à l'objectif d'optimisation de campagne. Particulièrement en SaaS, envoyer via CAPI des événements long-terme (rétention 90 jours, upsell) et les inclure dans la stratégie d'enchères permet d'optimiser le LTV. C'est similaire à l'import de conversions hors ligne de Google Ads.",{"type":26,"tag":27,"props":1832,"children":1833},{},[1834,1836,1841,1843,1848],{"type":31,"value":1835},"Scénario de conversion hors ligne : l'utilisateur remplit un formulaire de prospect en ligne, l'équipe commerciale conclut un deal par téléphone 5 jours plus tard. Tu dois exporter ce deal depuis le CRM et l'envoyer à CAPI en tant que ",{"type":26,"tag":101,"props":1837,"children":1839},{"className":1838},[],[1840],{"type":31,"value":1105},{"type":31,"value":1842},". Dans ce cas, l'",{"type":26,"tag":101,"props":1844,"children":1846},{"className":1845},[],[1847],{"type":31,"value":1120},{"type":31,"value":1849}," sera une date passée. Meta accepte les événements rétroactifs jusqu'à 62 jours. Cependant, l'impact de cet événement sur l'algorithme d'attribution est limité car l'optimisation de campagne repose sur des signaux temps réel. Néanmoins, c'est nécessaire pour la précision du reporting. Tu peux automatiser l'intégration CRM-CAPI avec Zapier ou n8n ; chaque nouvel accord « Closed Won » déclenche une requête POST CAPI.",{"type":26,"tag":42,"props":1851,"children":1853},{"id":1852},"erreurs-courantes-et-solutions",[1854],{"type":31,"value":1855},"Erreurs courantes et solutions",{"type":26,"tag":27,"props":1857,"children":1858},{},[1859,1871,1873,1879,1881,1887,1889,1894],{"type":26,"tag":34,"props":1860,"children":1861},{},[1862,1864,1869],{"type":31,"value":1863},"1. Paramètre ",{"type":26,"tag":101,"props":1865,"children":1867},{"className":1866},[],[1868],{"type":31,"value":1069},{"type":31,"value":1870}," manquant :",{"type":31,"value":1872}," Lorsqu'un utilisateur clique sur une annonce Meta et accède au site, l'URL contient ",{"type":26,"tag":101,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":31,"value":1878},"fbclid",{"type":31,"value":1880},". Si tu n'enregistres pas cette valeur dans un cookie, tu ne peux pas l'envoyer à CAPI. Solution : crée une variable de cookie dans GTM, nomme-la ",{"type":26,"tag":101,"props":1882,"children":1884},{"className":1883},[],[1885],{"type":31,"value":1886},"_fbc",{"type":31,"value":1888},", conserve-la 90 jours. Dans le tag CAPI, mappe cette variable au paramètre ",{"type":26,"tag":101,"props":1890,"children":1892},{"className":1891},[],[1893],{"type":31,"value":1069},{"type":31,"value":1895},".",{"type":26,"tag":27,"props":1897,"children":1898},{},[1899,1904,1906,1912],{"type":26,"tag":34,"props":1900,"children":1901},{},[1902],{"type":31,"value":1903},"2. Hash email incorrect :",{"type":31,"value":1905}," Si des espaces ou majuscules subsistent, le hash ne correspond pas. Pour toutes les chaînes, applique ",{"type":26,"tag":101,"props":1907,"children":1909},{"className":1908},[],[1910],{"type":31,"value":1911},"trim().toLowerCase()",{"type":31,"value":1913}," avant SHA-256.",{"type":26,"tag":27,"props":1915,"children":1916},{},[1917],{"type":31,"value":1918},"**3. Le passage du mode test à la production n'a pas été",{"type":26,"tag":992,"props":1920,"children":1921},{},[1922],{"type":31,"value":996},{"title":9,"searchDepth":168,"depth":168,"links":1924},[1925,1926,1927,1928,1929,1930,1931],{"id":1031,"depth":158,"text":1034},{"id":1132,"depth":158,"text":1135},{"id":1274,"depth":158,"text":1277},{"id":1663,"depth":158,"text":1666},{"id":1778,"depth":158,"text":1781},{"id":1807,"depth":158,"text":1810},{"id":1852,"depth":158,"text":1855},"content:fr:marketing:configurer-api-conversions-meta-capi-zero-a-heros.md","fr\u002Fmarketing\u002Fconfigurer-api-conversions-meta-capi-zero-a-heros.md","fr\u002Fmarketing\u002Fconfigurer-api-conversions-meta-capi-zero-a-heros",{"_path":1936,"_dir":1937,"_draft":8,"_partial":8,"_locale":9,"title":1938,"description":1939,"publishedAt":12,"modifiedAt":12,"category":1937,"i18nKey":1940,"tags":1941,"readingTime":219,"author":21,"body":1947,"_type":139,"_id":3410,"_source":1006,"_file":3411,"_stem":3412,"_extension":1009},"\u002Ffr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation","tech","Nuxt 3 + Cloudflare Pages : réduire le LCP de 10s à 2s","Polices auto-hébergées, hydratation sélective, content-visibility et cache edge : nous avons réduit le LCP de 80%. Benchmarks réels, code et compromis.","tech-001-2026-05",[1942,1943,1944,1945,1946],"nuxt3","cloudflare-pages","web-performance","lcp","edge-caching",{"type":23,"children":1948,"toc":3399},[1949,1961,1967,1972,2016,2021,2027,2064,2433,2443,2454,2474,2581,2594,2679,2696,2702,2731,2875,2888,2897,2903,2916,3078,3091,3107,3113,3118,3248,3262,3268,3292,3302,3319,3336,3342,3347,3390,3395],{"type":26,"tag":27,"props":1950,"children":1951},{},[1952,1954,1959],{"type":31,"value":1953},"Après la mise à jour des Core Web Vitals de Google, le LCP (Largest Contentful Paint) doit rester en dessous de 2,5 secondes, sinon le classement organique et le taux de conversion chutent. Lorsque nous avons migré un site e-commerce vers la pile Nuxt 3 + Cloudflare Pages, le premier déploiement a laissé le LCP à 10,2 secondes. En combinant une stratégie de polices auto-hébergées, une hydratation sélective, la propriété CSS ",{"type":26,"tag":1053,"props":1955,"children":1956},{},[1957],{"type":31,"value":1958},"content-visibility",{"type":31,"value":1960}," et le cache edge, nous avons ramené cela à 2,1 secondes. Voici comment chaque modification a contribué au gain, les compromis et le code.",{"type":26,"tag":42,"props":1962,"children":1964},{"id":1963},"diagnostiquer-le-problème-lanatomie-du-lcp-de-10s",[1965],{"type":31,"value":1966},"Diagnostiquer le problème : l'anatomie du LCP de 10s",{"type":26,"tag":27,"props":1968,"children":1969},{},[1970],{"type":31,"value":1971},"Le rapport CrUX initial montrait un LCP médian de 10,2s et un TBT (Total Blocking Time) de 2190ms. L'analyse du profil Lighthouse de Chrome DevTools a révélé :",{"type":26,"tag":1973,"props":1974,"children":1975},"ul",{},[1976,1986,1996,2006],{"type":26,"tag":417,"props":1977,"children":1978},{},[1979,1984],{"type":26,"tag":34,"props":1980,"children":1981},{},[1982],{"type":31,"value":1983},"Chargement des polices :",{"type":31,"value":1985}," trois familles de polices depuis le CDN Google Fonts, bloquant le rendu",{"type":26,"tag":417,"props":1987,"children":1988},{},[1989,1994],{"type":26,"tag":34,"props":1990,"children":1991},{},[1992],{"type":31,"value":1993},"Hydratation JavaScript :",{"type":31,"value":1995}," bundle de 420kB, toute la page s'hydrate",{"type":26,"tag":417,"props":1997,"children":1998},{},[1999,2004],{"type":26,"tag":34,"props":2000,"children":2001},{},[2002],{"type":31,"value":2003},"Image au-dessus de la ligne de flottaison :",{"type":31,"value":2005}," JPEG 1,2MB, pas de chargement différé",{"type":26,"tag":417,"props":2007,"children":2008},{},[2009,2014],{"type":26,"tag":34,"props":2010,"children":2011},{},[2012],{"type":31,"value":2013},"Cache Cloudflare :",{"type":31,"value":2015}," la réponse SSR n'est pas mise en cache, chaque requête atteint l'origine",{"type":26,"tag":27,"props":2017,"children":2018},{},[2019],{"type":31,"value":2020},"Mesure de base : score mobile PageSpeed Insights 34\u002F100. Desktop 62\u002F100. Ces chiffres après migration depuis Shopify Liquid vers Nuxt 3 — le changement de framework seul n'apporte aucun gain de performance, une optimisation architecturale est nécessaire.",{"type":26,"tag":42,"props":2022,"children":2024},{"id":2023},"stratégie-de-polices-auto-hébergées-preload",[2025],{"type":31,"value":2026},"Stratégie de polices auto-hébergées + preload",{"type":26,"tag":27,"props":2028,"children":2029},{},[2030,2032,2038,2040,2046,2048,2054,2056,2062],{"type":31,"value":2031},"Nous avons téléchargé les mêmes fichiers de polices du service Google Fonts dans le répertoire ",{"type":26,"tag":101,"props":2033,"children":2035},{"className":2034},[],[2036],{"type":31,"value":2037},"public\u002Ffonts\u002F",{"type":31,"value":2039}," et déplacé la définition ",{"type":26,"tag":101,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":31,"value":2045},"@font-face",{"type":31,"value":2047}," dans ",{"type":26,"tag":101,"props":2049,"children":2051},{"className":2050},[],[2052],{"type":31,"value":2053},"app.vue",{"type":31,"value":2055},". La différence clé : avec ",{"type":26,"tag":101,"props":2057,"children":2059},{"className":2058},[],[2060],{"type":31,"value":2061},"\u003Clink rel=\"preload\">",{"type":31,"value":2063},", nous demandons les fichiers de polices dans la réponse HTML initiale, avant le parsing CSS.",{"type":26,"tag":135,"props":2065,"children":2069},{"className":2066,"code":2067,"language":2068,"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",[2070],{"type":26,"tag":101,"props":2071,"children":2072},{"__ignoreMap":9},[2073,2081,2105,2118,2126,2134,2151,2168,2185,2202,2215,2223,2231,2239,2255,2262,2277,2289,2310,2360,2382,2409,2417],{"type":26,"tag":145,"props":2074,"children":2075},{"class":147,"line":148},[2076],{"type":26,"tag":145,"props":2077,"children":2078},{"style":1333},[2079],{"type":31,"value":2080},"\u003C!-- app.vue -->\n",{"type":26,"tag":145,"props":2082,"children":2083},{"class":147,"line":158},[2084,2089,2095,2100],{"type":26,"tag":145,"props":2085,"children":2086},{"style":162},[2087],{"type":31,"value":2088},"\u003C",{"type":26,"tag":145,"props":2090,"children":2092},{"style":2091},"--shiki-default:#85E89D",[2093],{"type":31,"value":2094},"script",{"type":26,"tag":145,"props":2096,"children":2097},{"style":523},[2098],{"type":31,"value":2099}," setup",{"type":26,"tag":145,"props":2101,"children":2102},{"style":162},[2103],{"type":31,"value":2104},">\n",{"type":26,"tag":145,"props":2106,"children":2107},{"class":147,"line":168},[2108,2113],{"type":26,"tag":145,"props":2109,"children":2110},{"style":523},[2111],{"type":31,"value":2112},"useHead",{"type":26,"tag":145,"props":2114,"children":2115},{"style":162},[2116],{"type":31,"value":2117},"({\n",{"type":26,"tag":145,"props":2119,"children":2120},{"class":147,"line":176},[2121],{"type":26,"tag":145,"props":2122,"children":2123},{"style":162},[2124],{"type":31,"value":2125},"  link: [\n",{"type":26,"tag":145,"props":2127,"children":2128},{"class":147,"line":186},[2129],{"type":26,"tag":145,"props":2130,"children":2131},{"style":162},[2132],{"type":31,"value":2133},"    {\n",{"type":26,"tag":145,"props":2135,"children":2136},{"class":147,"line":195},[2137,2142,2147],{"type":26,"tag":145,"props":2138,"children":2139},{"style":162},[2140],{"type":31,"value":2141},"      rel: ",{"type":26,"tag":145,"props":2143,"children":2144},{"style":605},[2145],{"type":31,"value":2146},"'preload'",{"type":26,"tag":145,"props":2148,"children":2149},{"style":162},[2150],{"type":31,"value":613},{"type":26,"tag":145,"props":2152,"children":2153},{"class":147,"line":20},[2154,2159,2164],{"type":26,"tag":145,"props":2155,"children":2156},{"style":162},[2157],{"type":31,"value":2158},"      href: ",{"type":26,"tag":145,"props":2160,"children":2161},{"style":605},[2162],{"type":31,"value":2163},"'\u002Ffonts\u002Finter-var.woff2'",{"type":26,"tag":145,"props":2165,"children":2166},{"style":162},[2167],{"type":31,"value":613},{"type":26,"tag":145,"props":2169,"children":2170},{"class":147,"line":211},[2171,2176,2181],{"type":26,"tag":145,"props":2172,"children":2173},{"style":162},[2174],{"type":31,"value":2175},"      as: ",{"type":26,"tag":145,"props":2177,"children":2178},{"style":605},[2179],{"type":31,"value":2180},"'font'",{"type":26,"tag":145,"props":2182,"children":2183},{"style":162},[2184],{"type":31,"value":613},{"type":26,"tag":145,"props":2186,"children":2187},{"class":147,"line":219},[2188,2193,2198],{"type":26,"tag":145,"props":2189,"children":2190},{"style":162},[2191],{"type":31,"value":2192},"      type: ",{"type":26,"tag":145,"props":2194,"children":2195},{"style":605},[2196],{"type":31,"value":2197},"'font\u002Fwoff2'",{"type":26,"tag":145,"props":2199,"children":2200},{"style":162},[2201],{"type":31,"value":613},{"type":26,"tag":145,"props":2203,"children":2204},{"class":147,"line":228},[2205,2210],{"type":26,"tag":145,"props":2206,"children":2207},{"style":162},[2208],{"type":31,"value":2209},"      crossorigin: ",{"type":26,"tag":145,"props":2211,"children":2212},{"style":605},[2213],{"type":31,"value":2214},"'anonymous'\n",{"type":26,"tag":145,"props":2216,"children":2217},{"class":147,"line":236},[2218],{"type":26,"tag":145,"props":2219,"children":2220},{"style":162},[2221],{"type":31,"value":2222},"    }\n",{"type":26,"tag":145,"props":2224,"children":2225},{"class":147,"line":245},[2226],{"type":26,"tag":145,"props":2227,"children":2228},{"style":162},[2229],{"type":31,"value":2230},"  ]\n",{"type":26,"tag":145,"props":2232,"children":2233},{"class":147,"line":253},[2234],{"type":26,"tag":145,"props":2235,"children":2236},{"style":162},[2237],{"type":31,"value":2238},"})\n",{"type":26,"tag":145,"props":2240,"children":2241},{"class":147,"line":262},[2242,2247,2251],{"type":26,"tag":145,"props":2243,"children":2244},{"style":162},[2245],{"type":31,"value":2246},"\u003C\u002F",{"type":26,"tag":145,"props":2248,"children":2249},{"style":2091},[2250],{"type":31,"value":2094},{"type":26,"tag":145,"props":2252,"children":2253},{"style":162},[2254],{"type":31,"value":2104},{"type":26,"tag":145,"props":2256,"children":2257},{"class":147,"line":270},[2258],{"type":26,"tag":145,"props":2259,"children":2260},{"emptyLinePlaceholder":180},[2261],{"type":31,"value":183},{"type":26,"tag":145,"props":2263,"children":2264},{"class":147,"line":760},[2265,2269,2273],{"type":26,"tag":145,"props":2266,"children":2267},{"style":162},[2268],{"type":31,"value":2088},{"type":26,"tag":145,"props":2270,"children":2271},{"style":2091},[2272],{"type":31,"value":992},{"type":26,"tag":145,"props":2274,"children":2275},{"style":162},[2276],{"type":31,"value":2104},{"type":26,"tag":145,"props":2278,"children":2279},{"class":147,"line":768},[2280,2284],{"type":26,"tag":145,"props":2281,"children":2282},{"style":475},[2283],{"type":31,"value":2045},{"type":26,"tag":145,"props":2285,"children":2286},{"style":162},[2287],{"type":31,"value":2288}," {\n",{"type":26,"tag":145,"props":2290,"children":2291},{"class":147,"line":786},[2292,2297,2301,2306],{"type":26,"tag":145,"props":2293,"children":2294},{"style":651},[2295],{"type":31,"value":2296},"  font-family",{"type":26,"tag":145,"props":2298,"children":2299},{"style":162},[2300],{"type":31,"value":1549},{"type":26,"tag":145,"props":2302,"children":2303},{"style":605},[2304],{"type":31,"value":2305},"'Inter'",{"type":26,"tag":145,"props":2307,"children":2308},{"style":162},[2309],{"type":31,"value":1364},{"type":26,"tag":145,"props":2311,"children":2313},{"class":147,"line":2312},19,[2314,2319,2323,2328,2332,2336,2341,2346,2350,2355],{"type":26,"tag":145,"props":2315,"children":2316},{"style":651},[2317],{"type":31,"value":2318},"  src",{"type":26,"tag":145,"props":2320,"children":2321},{"style":162},[2322],{"type":31,"value":1549},{"type":26,"tag":145,"props":2324,"children":2325},{"style":651},[2326],{"type":31,"value":2327},"url",{"type":26,"tag":145,"props":2329,"children":2330},{"style":162},[2331],{"type":31,"value":797},{"type":26,"tag":145,"props":2333,"children":2334},{"style":605},[2335],{"type":31,"value":2163},{"type":26,"tag":145,"props":2337,"children":2338},{"style":162},[2339],{"type":31,"value":2340},") ",{"type":26,"tag":145,"props":2342,"children":2343},{"style":651},[2344],{"type":31,"value":2345},"format",{"type":26,"tag":145,"props":2347,"children":2348},{"style":162},[2349],{"type":31,"value":797},{"type":26,"tag":145,"props":2351,"children":2352},{"style":605},[2353],{"type":31,"value":2354},"'woff2'",{"type":26,"tag":145,"props":2356,"children":2357},{"style":162},[2358],{"type":31,"value":2359},");\n",{"type":26,"tag":145,"props":2361,"children":2363},{"class":147,"line":2362},20,[2364,2369,2373,2378],{"type":26,"tag":145,"props":2365,"children":2366},{"style":651},[2367],{"type":31,"value":2368},"  font-display",{"type":26,"tag":145,"props":2370,"children":2371},{"style":162},[2372],{"type":31,"value":1549},{"type":26,"tag":145,"props":2374,"children":2375},{"style":651},[2376],{"type":31,"value":2377},"swap",{"type":26,"tag":145,"props":2379,"children":2380},{"style":162},[2381],{"type":31,"value":1364},{"type":26,"tag":145,"props":2383,"children":2385},{"class":147,"line":2384},21,[2386,2391,2395,2400,2405],{"type":26,"tag":145,"props":2387,"children":2388},{"style":651},[2389],{"type":31,"value":2390},"  font-weight",{"type":26,"tag":145,"props":2392,"children":2393},{"style":162},[2394],{"type":31,"value":1549},{"type":26,"tag":145,"props":2396,"children":2397},{"style":651},[2398],{"type":31,"value":2399},"100",{"type":26,"tag":145,"props":2401,"children":2402},{"style":651},[2403],{"type":31,"value":2404}," 900",{"type":26,"tag":145,"props":2406,"children":2407},{"style":162},[2408],{"type":31,"value":1364},{"type":26,"tag":145,"props":2410,"children":2412},{"class":147,"line":2411},22,[2413],{"type":26,"tag":145,"props":2414,"children":2415},{"style":162},[2416],{"type":31,"value":1625},{"type":26,"tag":145,"props":2418,"children":2420},{"class":147,"line":2419},23,[2421,2425,2429],{"type":26,"tag":145,"props":2422,"children":2423},{"style":162},[2424],{"type":31,"value":2246},{"type":26,"tag":145,"props":2426,"children":2427},{"style":2091},[2428],{"type":31,"value":992},{"type":26,"tag":145,"props":2430,"children":2431},{"style":162},[2432],{"type":31,"value":2104},{"type":26,"tag":27,"props":2434,"children":2435},{},[2436,2441],{"type":26,"tag":34,"props":2437,"children":2438},{},[2439],{"type":31,"value":2440},"Gain :",{"type":31,"value":2442}," LCP 10,2s → 7,8s (baisse de 2,4s). Le chargement des polices n'est plus bloquant, le délai FOIT (Flash of Invisible Text) passe de 1200ms à 180ms. Compromis : les fichiers de polices se trouvent désormais sur notre CDN, la gestion des versions doit être manuelle (nous avons résolu cela avec un bucket Cloudflare R2 + en-têtes Cache-Control).",{"type":26,"tag":42,"props":2444,"children":2446},{"id":2445},"hydratation-sélective-content-visibility",[2447,2449],{"type":31,"value":2448},"Hydratation sélective + ",{"type":26,"tag":101,"props":2450,"children":2452},{"className":2451},[],[2453],{"type":31,"value":1958},{"type":26,"tag":27,"props":2455,"children":2456},{},[2457,2459,2465,2467,2473],{"type":31,"value":2458},"Le comportement par défaut de Nuxt 3 est d'hydrater tous les composants. Or, les composants en dehors de la zone visible au-dessus de la ligne de flottaison (pied de page, section des commentaires, produits associés) n'ont pas besoin de s'hydrater avant que l'utilisateur ne fasse défiler. Avec le module ",{"type":26,"tag":101,"props":2460,"children":2462},{"className":2461},[],[2463],{"type":31,"value":2464},"@nuxt\u002Flazy-hydration",{"type":31,"value":2466},", nous avons enveloppé ces composants dans un wrapper ",{"type":26,"tag":101,"props":2468,"children":2470},{"className":2469},[],[2471],{"type":31,"value":2472},"LazyHydrate",{"type":31,"value":1895},{"type":26,"tag":135,"props":2475,"children":2477},{"className":2066,"code":2476,"language":2068,"meta":9,"style":9},"\u003Ctemplate>\n  \u003CLazyHydrate when-visible>\n    \u003CProductRecommendations :product-id=\"productId\" \u002F>\n  \u003C\u002FLazyHydrate>\n\u003C\u002Ftemplate>\n",[2478],{"type":26,"tag":101,"props":2479,"children":2480},{"__ignoreMap":9},[2481,2497,2518,2550,2566],{"type":26,"tag":145,"props":2482,"children":2483},{"class":147,"line":148},[2484,2488,2493],{"type":26,"tag":145,"props":2485,"children":2486},{"style":162},[2487],{"type":31,"value":2088},{"type":26,"tag":145,"props":2489,"children":2490},{"style":2091},[2491],{"type":31,"value":2492},"template",{"type":26,"tag":145,"props":2494,"children":2495},{"style":162},[2496],{"type":31,"value":2104},{"type":26,"tag":145,"props":2498,"children":2499},{"class":147,"line":158},[2500,2505,2509,2514],{"type":26,"tag":145,"props":2501,"children":2502},{"style":162},[2503],{"type":31,"value":2504},"  \u003C",{"type":26,"tag":145,"props":2506,"children":2507},{"style":2091},[2508],{"type":31,"value":2472},{"type":26,"tag":145,"props":2510,"children":2511},{"style":523},[2512],{"type":31,"value":2513}," when-visible",{"type":26,"tag":145,"props":2515,"children":2516},{"style":162},[2517],{"type":31,"value":2104},{"type":26,"tag":145,"props":2519,"children":2520},{"class":147,"line":168},[2521,2526,2531,2536,2540,2545],{"type":26,"tag":145,"props":2522,"children":2523},{"style":162},[2524],{"type":31,"value":2525},"    \u003C",{"type":26,"tag":145,"props":2527,"children":2528},{"style":2091},[2529],{"type":31,"value":2530},"ProductRecommendations",{"type":26,"tag":145,"props":2532,"children":2533},{"style":523},[2534],{"type":31,"value":2535}," :product-id",{"type":26,"tag":145,"props":2537,"children":2538},{"style":162},[2539],{"type":31,"value":584},{"type":26,"tag":145,"props":2541,"children":2542},{"style":605},[2543],{"type":31,"value":2544},"\"productId\"",{"type":26,"tag":145,"props":2546,"children":2547},{"style":162},[2548],{"type":31,"value":2549}," \u002F>\n",{"type":26,"tag":145,"props":2551,"children":2552},{"class":147,"line":176},[2553,2558,2562],{"type":26,"tag":145,"props":2554,"children":2555},{"style":162},[2556],{"type":31,"value":2557},"  \u003C\u002F",{"type":26,"tag":145,"props":2559,"children":2560},{"style":2091},[2561],{"type":31,"value":2472},{"type":26,"tag":145,"props":2563,"children":2564},{"style":162},[2565],{"type":31,"value":2104},{"type":26,"tag":145,"props":2567,"children":2568},{"class":147,"line":186},[2569,2573,2577],{"type":26,"tag":145,"props":2570,"children":2571},{"style":162},[2572],{"type":31,"value":2246},{"type":26,"tag":145,"props":2574,"children":2575},{"style":2091},[2576],{"type":31,"value":2492},{"type":26,"tag":145,"props":2578,"children":2579},{"style":162},[2580],{"type":31,"value":2104},{"type":26,"tag":27,"props":2582,"children":2583},{},[2584,2586,2592],{"type":31,"value":2585},"Côté CSS, ",{"type":26,"tag":101,"props":2587,"children":2589},{"className":2588},[],[2590],{"type":31,"value":2591},"content-visibility: auto",{"type":31,"value":2593}," envoie au navigateur le signal « ne calcule pas le rendu pour cet élément s'il n'est pas dans le viewport » :",{"type":26,"tag":135,"props":2595,"children":2599},{"className":2596,"code":2597,"language":2598,"meta":9,"style":9},"language-css shiki shiki-themes github-dark",".product-recommendations {\n  content-visibility: auto;\n  contain-intrinsic-size: 0 500px; \u002F* hauteur placeholder *\u002F\n}\n","css",[2600],{"type":26,"tag":101,"props":2601,"children":2602},{"__ignoreMap":9},[2603,2615,2636,2672],{"type":26,"tag":145,"props":2604,"children":2605},{"class":147,"line":148},[2606,2611],{"type":26,"tag":145,"props":2607,"children":2608},{"style":523},[2609],{"type":31,"value":2610},".product-recommendations",{"type":26,"tag":145,"props":2612,"children":2613},{"style":162},[2614],{"type":31,"value":2288},{"type":26,"tag":145,"props":2616,"children":2617},{"class":147,"line":158},[2618,2623,2627,2632],{"type":26,"tag":145,"props":2619,"children":2620},{"style":651},[2621],{"type":31,"value":2622},"  content-visibility",{"type":26,"tag":145,"props":2624,"children":2625},{"style":162},[2626],{"type":31,"value":1549},{"type":26,"tag":145,"props":2628,"children":2629},{"style":651},[2630],{"type":31,"value":2631},"auto",{"type":26,"tag":145,"props":2633,"children":2634},{"style":162},[2635],{"type":31,"value":1364},{"type":26,"tag":145,"props":2637,"children":2638},{"class":147,"line":168},[2639,2644,2648,2652,2657,2662,2667],{"type":26,"tag":145,"props":2640,"children":2641},{"style":651},[2642],{"type":31,"value":2643},"  contain-intrinsic-size",{"type":26,"tag":145,"props":2645,"children":2646},{"style":162},[2647],{"type":31,"value":1549},{"type":26,"tag":145,"props":2649,"children":2650},{"style":651},[2651],{"type":31,"value":654},{"type":26,"tag":145,"props":2653,"children":2654},{"style":651},[2655],{"type":31,"value":2656}," 500",{"type":26,"tag":145,"props":2658,"children":2659},{"style":475},[2660],{"type":31,"value":2661},"px",{"type":26,"tag":145,"props":2663,"children":2664},{"style":162},[2665],{"type":31,"value":2666},"; ",{"type":26,"tag":145,"props":2668,"children":2669},{"style":1333},[2670],{"type":31,"value":2671},"\u002F* hauteur placeholder *\u002F\n",{"type":26,"tag":145,"props":2673,"children":2674},{"class":147,"line":176},[2675],{"type":26,"tag":145,"props":2676,"children":2677},{"style":162},[2678],{"type":31,"value":1625},{"type":26,"tag":27,"props":2680,"children":2681},{},[2682,2686,2688,2694],{"type":26,"tag":34,"props":2683,"children":2684},{},[2685],{"type":31,"value":2440},{"type":31,"value":2687}," TBT 2190ms → 420ms, LCP 7,8s → 4,1s. Le bundle JS initialement chargé passe de 420kB à 180kB (compressé en brotli). Compromis : ",{"type":26,"tag":101,"props":2689,"children":2691},{"className":2690},[],[2692],{"type":31,"value":2693},"when-visible",{"type":31,"value":2695}," utilise l'Intersection Observer API, un polyfill est nécessaire pour les anciens navigateurs comme IE11 (nous ciblions les navigateurs modernes, pas de problème).",{"type":26,"tag":42,"props":2697,"children":2699},{"id":2698},"cache-edge-approche-hybride-isr",[2700],{"type":31,"value":2701},"Cache edge + approche hybride ISR",{"type":26,"tag":27,"props":2703,"children":2704},{},[2705,2707,2713,2715,2721,2723,2729],{"type":31,"value":2706},"Cloudflare Pages met en cache les fichiers statiques par défaut, mais pas les endpoints SSR (en dehors de ",{"type":26,"tag":101,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":31,"value":2712},"\u002F_nuxt\u002F...",{"type":31,"value":2714},"). Nous avons défini dans ",{"type":26,"tag":101,"props":2716,"children":2718},{"className":2717},[],[2719],{"type":31,"value":2720},"nuxt.config.ts",{"type":31,"value":2722}," via ",{"type":26,"tag":101,"props":2724,"children":2726},{"className":2725},[],[2727],{"type":31,"value":2728},"routeRules",{"type":31,"value":2730}," quels chemins sont mis en cache et pour combien de temps :",{"type":26,"tag":135,"props":2732,"children":2736},{"className":2733,"code":2734,"language":2735,"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 page d'accueil 1h stale-while-revalidate\n    '\u002Fproduit\u002F**': { swr: 1800 }, \u002F\u002F pages produit 30m\n    '\u002Fcategorie\u002F**': { static: true } \u002F\u002F pages catégorie statique build-time\n  }\n})\n","ts",[2737],{"type":26,"tag":101,"props":2738,"children":2739},{"__ignoreMap":9},[2740,2748,2770,2778,2806,2832,2860,2868],{"type":26,"tag":145,"props":2741,"children":2742},{"class":147,"line":148},[2743],{"type":26,"tag":145,"props":2744,"children":2745},{"style":1333},[2746],{"type":31,"value":2747},"\u002F\u002F nuxt.config.ts\n",{"type":26,"tag":145,"props":2749,"children":2750},{"class":147,"line":158},[2751,2756,2761,2766],{"type":26,"tag":145,"props":2752,"children":2753},{"style":475},[2754],{"type":31,"value":2755},"export",{"type":26,"tag":145,"props":2757,"children":2758},{"style":475},[2759],{"type":31,"value":2760}," default",{"type":26,"tag":145,"props":2762,"children":2763},{"style":523},[2764],{"type":31,"value":2765}," defineNuxtConfig",{"type":26,"tag":145,"props":2767,"children":2768},{"style":162},[2769],{"type":31,"value":2117},{"type":26,"tag":145,"props":2771,"children":2772},{"class":147,"line":168},[2773],{"type":26,"tag":145,"props":2774,"children":2775},{"style":162},[2776],{"type":31,"value":2777},"  routeRules: {\n",{"type":26,"tag":145,"props":2779,"children":2780},{"class":147,"line":176},[2781,2786,2791,2796,2801],{"type":26,"tag":145,"props":2782,"children":2783},{"style":605},[2784],{"type":31,"value":2785},"    '\u002F'",{"type":26,"tag":145,"props":2787,"children":2788},{"style":162},[2789],{"type":31,"value":2790},": { swr: ",{"type":26,"tag":145,"props":2792,"children":2793},{"style":651},[2794],{"type":31,"value":2795},"3600",{"type":26,"tag":145,"props":2797,"children":2798},{"style":162},[2799],{"type":31,"value":2800}," }, ",{"type":26,"tag":145,"props":2802,"children":2803},{"style":1333},[2804],{"type":31,"value":2805},"\u002F\u002F page d'accueil 1h stale-while-revalidate\n",{"type":26,"tag":145,"props":2807,"children":2808},{"class":147,"line":186},[2809,2814,2818,2823,2827],{"type":26,"tag":145,"props":2810,"children":2811},{"style":605},[2812],{"type":31,"value":2813},"    '\u002Fproduit\u002F**'",{"type":26,"tag":145,"props":2815,"children":2816},{"style":162},[2817],{"type":31,"value":2790},{"type":26,"tag":145,"props":2819,"children":2820},{"style":651},[2821],{"type":31,"value":2822},"1800",{"type":26,"tag":145,"props":2824,"children":2825},{"style":162},[2826],{"type":31,"value":2800},{"type":26,"tag":145,"props":2828,"children":2829},{"style":1333},[2830],{"type":31,"value":2831},"\u002F\u002F pages produit 30m\n",{"type":26,"tag":145,"props":2833,"children":2834},{"class":147,"line":195},[2835,2840,2845,2850,2855],{"type":26,"tag":145,"props":2836,"children":2837},{"style":605},[2838],{"type":31,"value":2839},"    '\u002Fcategorie\u002F**'",{"type":26,"tag":145,"props":2841,"children":2842},{"style":162},[2843],{"type":31,"value":2844},": { static: ",{"type":26,"tag":145,"props":2846,"children":2847},{"style":651},[2848],{"type":31,"value":2849},"true",{"type":26,"tag":145,"props":2851,"children":2852},{"style":162},[2853],{"type":31,"value":2854}," } ",{"type":26,"tag":145,"props":2856,"children":2857},{"style":1333},[2858],{"type":31,"value":2859},"\u002F\u002F pages catégorie statique build-time\n",{"type":26,"tag":145,"props":2861,"children":2862},{"class":147,"line":20},[2863],{"type":26,"tag":145,"props":2864,"children":2865},{"style":162},[2866],{"type":31,"value":2867},"  }\n",{"type":26,"tag":145,"props":2869,"children":2870},{"class":147,"line":211},[2871],{"type":26,"tag":145,"props":2872,"children":2873},{"style":162},[2874],{"type":31,"value":2238},{"type":26,"tag":27,"props":2876,"children":2877},{},[2878,2880,2886],{"type":31,"value":2879},"La stratégie ",{"type":26,"tag":101,"props":2881,"children":2883},{"className":2882},[],[2884],{"type":31,"value":2885},"swr",{"type":31,"value":2887}," (stale-while-revalidate) : la première requête rend le SSR, les requêtes suivantes viennent du cache, le serveur le re-rend en arrière-plan. Nous avons utilisé le KV store de Cloudflare avec comme clé de cache l'URL + le segment utilisateur (connecté\u002Fanonyme).",{"type":26,"tag":27,"props":2889,"children":2890},{},[2891,2895],{"type":26,"tag":34,"props":2892,"children":2893},{},[2894],{"type":31,"value":2440},{"type":31,"value":2896}," TTFB (Time to First Byte) 840ms → 120ms, LCP 4,1s → 2,3s. Le taux de hit cache s'est élevé à 78% la première semaine. Compromis : la personnalisation dépend de la clé de cache ; par exemple, le nombre de produits dans le panier ne peut pas être mis en cache, les données utilisateur spécifiques sont récupérées côté client.",{"type":26,"tag":42,"props":2898,"children":2900},{"id":2899},"optimisation-des-images-au-dessus-de-la-ligne-de-flottaison",[2901],{"type":31,"value":2902},"Optimisation des images au-dessus de la ligne de flottaison",{"type":26,"tag":27,"props":2904,"children":2905},{},[2906,2908,2914],{"type":31,"value":2907},"Nous avons converti l'image héros d'un JPEG de 1,2MB en WebP de 180kB et ajouté des points de rupture responsifs avec l'élément ",{"type":26,"tag":101,"props":2909,"children":2911},{"className":2910},[],[2912],{"type":31,"value":2913},"\u003Cpicture>",{"type":31,"value":2915}," :",{"type":26,"tag":135,"props":2917,"children":2919},{"className":2066,"code":2918,"language":2068,"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=\"Nouvelle collection de saison\"\n    fetchpriority=\"high\"\n    decoding=\"async\"\n  \u002F>\n\u003C\u002Fpicture>\n",[2920],{"type":26,"tag":101,"props":2921,"children":2922},{"__ignoreMap":9},[2923,2939,2947,2955,2963,2971,2979,2986,2994,3002,3009,3016,3024,3032,3040,3048,3056,3063],{"type":26,"tag":145,"props":2924,"children":2925},{"class":147,"line":148},[2926,2930,2935],{"type":26,"tag":145,"props":2927,"children":2928},{"style":162},[2929],{"type":31,"value":2088},{"type":26,"tag":145,"props":2931,"children":2932},{"style":2091},[2933],{"type":31,"value":2934},"picture",{"type":26,"tag":145,"props":2936,"children":2937},{"style":162},[2938],{"type":31,"value":2104},{"type":26,"tag":145,"props":2940,"children":2941},{"class":147,"line":158},[2942],{"type":26,"tag":145,"props":2943,"children":2944},{"style":162},[2945],{"type":31,"value":2946},"  \u003Csource\n",{"type":26,"tag":145,"props":2948,"children":2949},{"class":147,"line":168},[2950],{"type":26,"tag":145,"props":2951,"children":2952},{"style":162},[2953],{"type":31,"value":2954},"    srcset=\"\u002Fimages\u002Fhero-mobile.webp\"\n",{"type":26,"tag":145,"props":2956,"children":2957},{"class":147,"line":176},[2958],{"type":26,"tag":145,"props":2959,"children":2960},{"style":162},[2961],{"type":31,"value":2962},"    media=\"(max-width: 640px)\"\n",{"type":26,"tag":145,"props":2964,"children":2965},{"class":147,"line":186},[2966],{"type":26,"tag":145,"props":2967,"children":2968},{"style":162},[2969],{"type":31,"value":2970},"    type=\"image\u002Fwebp\"\n",{"type":26,"tag":145,"props":2972,"children":2973},{"class":147,"line":195},[2974],{"type":26,"tag":145,"props":2975,"children":2976},{"style":162},[2977],{"type":31,"value":2978},"  \u002F>\n",{"type":26,"tag":145,"props":2980,"children":2981},{"class":147,"line":20},[2982],{"type":26,"tag":145,"props":2983,"children":2984},{"style":162},[2985],{"type":31,"value":2946},{"type":26,"tag":145,"props":2987,"children":2988},{"class":147,"line":211},[2989],{"type":26,"tag":145,"props":2990,"children":2991},{"style":162},[2992],{"type":31,"value":2993},"    srcset=\"\u002Fimages\u002Fhero-desktop.webp\"\n",{"type":26,"tag":145,"props":2995,"children":2996},{"class":147,"line":219},[2997],{"type":26,"tag":145,"props":2998,"children":2999},{"style":162},[3000],{"type":31,"value":3001},"    media=\"(min-width: 641px)\"\n",{"type":26,"tag":145,"props":3003,"children":3004},{"class":147,"line":228},[3005],{"type":26,"tag":145,"props":3006,"children":3007},{"style":162},[3008],{"type":31,"value":2970},{"type":26,"tag":145,"props":3010,"children":3011},{"class":147,"line":236},[3012],{"type":26,"tag":145,"props":3013,"children":3014},{"style":162},[3015],{"type":31,"value":2978},{"type":26,"tag":145,"props":3017,"children":3018},{"class":147,"line":245},[3019],{"type":26,"tag":145,"props":3020,"children":3021},{"style":162},[3022],{"type":31,"value":3023},"  \u003Cimg\n",{"type":26,"tag":145,"props":3025,"children":3026},{"class":147,"line":253},[3027],{"type":26,"tag":145,"props":3028,"children":3029},{"style":162},[3030],{"type":31,"value":3031},"    src=\"\u002Fimages\u002Fhero-desktop.jpg\"\n",{"type":26,"tag":145,"props":3033,"children":3034},{"class":147,"line":262},[3035],{"type":26,"tag":145,"props":3036,"children":3037},{"style":162},[3038],{"type":31,"value":3039},"    alt=\"Nouvelle collection de saison\"\n",{"type":26,"tag":145,"props":3041,"children":3042},{"class":147,"line":270},[3043],{"type":26,"tag":145,"props":3044,"children":3045},{"style":162},[3046],{"type":31,"value":3047},"    fetchpriority=\"high\"\n",{"type":26,"tag":145,"props":3049,"children":3050},{"class":147,"line":760},[3051],{"type":26,"tag":145,"props":3052,"children":3053},{"style":162},[3054],{"type":31,"value":3055},"    decoding=\"async\"\n",{"type":26,"tag":145,"props":3057,"children":3058},{"class":147,"line":768},[3059],{"type":26,"tag":145,"props":3060,"children":3061},{"style":162},[3062],{"type":31,"value":2978},{"type":26,"tag":145,"props":3064,"children":3065},{"class":147,"line":786},[3066,3070,3074],{"type":26,"tag":145,"props":3067,"children":3068},{"style":162},[3069],{"type":31,"value":2246},{"type":26,"tag":145,"props":3071,"children":3072},{"style":2091},[3073],{"type":31,"value":2934},{"type":26,"tag":145,"props":3075,"children":3076},{"style":162},[3077],{"type":31,"value":2104},{"type":26,"tag":27,"props":3079,"children":3080},{},[3081,3083,3089],{"type":31,"value":3082},"Avec l'attribut ",{"type":26,"tag":101,"props":3084,"children":3086},{"className":3085},[],[3087],{"type":31,"value":3088},"fetchpriority=\"high\"",{"type":31,"value":3090},", nous signalons au navigateur « charge cette image en priorité ». Le service Cloudflare Image Resizing effectue la conversion de format automatique sur l'edge du CDN (les navigateurs ne supportant pas WebP reçoivent du JPEG).",{"type":26,"tag":27,"props":3092,"children":3093},{},[3094,3098,3100,3106],{"type":26,"tag":34,"props":3095,"children":3096},{},[3097],{"type":31,"value":2440},{"type":31,"value":3099}," LCP 2,3s → 2,1s, durée de chargement de l'image 1200ms → 320ms. CLS (Cumulative Layout Shift) 0,12 → 0,02 — nous avons réservé l'espace du placeholder avec la propriété CSS ",{"type":26,"tag":101,"props":3101,"children":3103},{"className":3102},[],[3104],{"type":31,"value":3105},"aspect-ratio",{"type":31,"value":1895},{"type":26,"tag":42,"props":3108,"children":3110},{"id":3109},"résultats-benchmark-impact-sur-les-utilisateurs-réels",[3111],{"type":31,"value":3112},"Résultats benchmark + impact sur les utilisateurs réels",{"type":26,"tag":27,"props":3114,"children":3115},{},[3116],{"type":31,"value":3117},"Score mobile PageSpeed Insights 34 → 92, desktop 62 → 98. Moyennes CrUX sur 28 jours :",{"type":26,"tag":3119,"props":3120,"children":3121},"table",{},[3122,3151],{"type":26,"tag":3123,"props":3124,"children":3125},"thead",{},[3126],{"type":26,"tag":3127,"props":3128,"children":3129},"tr",{},[3130,3136,3141,3146],{"type":26,"tag":3131,"props":3132,"children":3133},"th",{},[3134],{"type":31,"value":3135},"Métrique",{"type":26,"tag":3131,"props":3137,"children":3138},{},[3139],{"type":31,"value":3140},"Avant",{"type":26,"tag":3131,"props":3142,"children":3143},{},[3144],{"type":31,"value":3145},"Après",{"type":26,"tag":3131,"props":3147,"children":3148},{},[3149],{"type":31,"value":3150},"Changement",{"type":26,"tag":3152,"props":3153,"children":3154},"tbody",{},[3155,3179,3202,3225],{"type":26,"tag":3127,"props":3156,"children":3157},{},[3158,3164,3169,3174],{"type":26,"tag":3159,"props":3160,"children":3161},"td",{},[3162],{"type":31,"value":3163},"LCP",{"type":26,"tag":3159,"props":3165,"children":3166},{},[3167],{"type":31,"value":3168},"10,2s",{"type":26,"tag":3159,"props":3170,"children":3171},{},[3172],{"type":31,"value":3173},"2,1s",{"type":26,"tag":3159,"props":3175,"children":3176},{},[3177],{"type":31,"value":3178},"-79%",{"type":26,"tag":3127,"props":3180,"children":3181},{},[3182,3187,3192,3197],{"type":26,"tag":3159,"props":3183,"children":3184},{},[3185],{"type":31,"value":3186},"TBT",{"type":26,"tag":3159,"props":3188,"children":3189},{},[3190],{"type":31,"value":3191},"2190ms",{"type":26,"tag":3159,"props":3193,"children":3194},{},[3195],{"type":31,"value":3196},"420ms",{"type":26,"tag":3159,"props":3198,"children":3199},{},[3200],{"type":31,"value":3201},"-81%",{"type":26,"tag":3127,"props":3203,"children":3204},{},[3205,3210,3215,3220],{"type":26,"tag":3159,"props":3206,"children":3207},{},[3208],{"type":31,"value":3209},"CLS",{"type":26,"tag":3159,"props":3211,"children":3212},{},[3213],{"type":31,"value":3214},"0,12",{"type":26,"tag":3159,"props":3216,"children":3217},{},[3218],{"type":31,"value":3219},"0,02",{"type":26,"tag":3159,"props":3221,"children":3222},{},[3223],{"type":31,"value":3224},"-83%",{"type":26,"tag":3127,"props":3226,"children":3227},{},[3228,3233,3238,3243],{"type":26,"tag":3159,"props":3229,"children":3230},{},[3231],{"type":31,"value":3232},"TTFB",{"type":26,"tag":3159,"props":3234,"children":3235},{},[3236],{"type":31,"value":3237},"840ms",{"type":26,"tag":3159,"props":3239,"children":3240},{},[3241],{"type":31,"value":3242},"120ms",{"type":26,"tag":3159,"props":3244,"children":3245},{},[3246],{"type":31,"value":3247},"-86%",{"type":26,"tag":27,"props":3249,"children":3250},{},[3251,3253,3260],{"type":31,"value":3252},"Google Analytics — entonnoir de conversion : taux de lancement du paiement %3,2 → %4,8 (+50% lift relatif). Taux de rebond %68 → %52. Search Console : le trafic organique a augmenté de 34% en deux mois (autres modifications SEO maintenues constantes). Ces chiffres correspondent aux objectifs standard de ",{"type":26,"tag":326,"props":3254,"children":3257},{"href":3255,"rel":3256},"https:\u002F\u002Fwww.roibase.com.tr\u002Ffr\u002Fheadless",[330],[3258],{"type":31,"value":3259},"Commerce Headless",{"type":31,"value":3261}," de Roibase — si les améliorations de performance ne se traduisent pas par une métrique commerciale, le changement architectural n'est pas considéré comme réussi.",{"type":26,"tag":42,"props":3263,"children":3265},{"id":3264},"compromis-et-critères-décisionnels",[3266],{"type":31,"value":3267},"Compromis et critères décisionnels",{"type":26,"tag":27,"props":3269,"children":3270},{},[3271,3276,3278,3283,3284,3290],{"type":26,"tag":34,"props":3272,"children":3273},{},[3274],{"type":31,"value":3275},"Expérience développeur :",{"type":31,"value":3277}," Nous avons ajouté des wrappers d'hydratation sélective, ce qui augmente la surface de l'API des composants. Les nouveaux développeurs doivent apprendre la différence entre ",{"type":26,"tag":101,"props":3279,"children":3281},{"className":3280},[],[3282],{"type":31,"value":2693},{"type":31,"value":919},{"type":26,"tag":101,"props":3285,"children":3287},{"className":3286},[],[3288],{"type":31,"value":3289},"when-idle",{"type":31,"value":3291},". Nous avons résolu cela avec la documentation Storybook + des règles ESLint.",{"type":26,"tag":27,"props":3293,"children":3294},{},[3295,3300],{"type":26,"tag":34,"props":3296,"children":3297},{},[3298],{"type":31,"value":3299},"Taille du bundle vs coût runtime :",{"type":31,"value":3301}," Les fichiers de polices auto-hébergées ajoutent +60kB au bundle de chargement initial, mais éliminent le coût DNS lookup + TLS handshake. Ce compromis représente un gain net sur réseau 3G mobile, neutre sur connexion fibre.",{"type":26,"tag":27,"props":3303,"children":3304},{},[3305,3310,3312,3317],{"type":26,"tag":34,"props":3306,"children":3307},{},[3308],{"type":31,"value":3309},"Invalidation du cache :",{"type":31,"value":3311}," La stratégie ",{"type":26,"tag":101,"props":3313,"children":3315},{"className":3314},[],[3316],{"type":31,"value":2885},{"type":31,"value":3318}," comporte un risque de données obsolètes. Nous gardons les données critiques comme l'inventaire à jour via une récupération realtime côté client (polling toutes les 30 secondes au lieu de WebSocket — le coût des fonctions edge est plus faible).",{"type":26,"tag":27,"props":3320,"children":3321},{},[3322,3327,3329,3334],{"type":26,"tag":34,"props":3323,"children":3324},{},[3325],{"type":31,"value":3326},"Verrouillage fournisseur Cloudflare :",{"type":31,"value":3328}," Le cache basé sur KV de ",{"type":26,"tag":101,"props":3330,"children":3332},{"className":3331},[],[3333],{"type":31,"value":2728},{"type":31,"value":3335}," est spécifique à Cloudflare. Une migration vers une autre plateforme nécessiterait une réimplémentation. Cependant, Vercel et Netlify offrent des primitives similaires, l'effort de migration est acceptable.",{"type":26,"tag":42,"props":3337,"children":3339},{"id":3338},"étapes-suivantes",[3340],{"type":31,"value":3341},"Étapes suivantes",{"type":26,"tag":27,"props":3343,"children":3344},{},[3345],{"type":31,"value":3346},"2,1s c'est bien, mais le P75 (75e percentile) de CrUX est encore à 3,2s. Voici la feuille de route :",{"type":26,"tag":413,"props":3348,"children":3349},{},[3350,3360,3370,3380],{"type":26,"tag":417,"props":3351,"children":3352},{},[3353,3358],{"type":26,"tag":34,"props":3354,"children":3355},{},[3356],{"type":31,"value":3357},"Image CDN + négociation de format automatique :",{"type":31,"value":3359}," intégration Imgix au lieu de Cloudflare Polish, support AVIF",{"type":26,"tag":417,"props":3361,"children":3362},{},[3363,3368],{"type":26,"tag":34,"props":3364,"children":3365},{},[3366],{"type":31,"value":3367},"Stratégie de préchargement :",{"type":31,"value":3369}," précharger les données des product cards approchant du viewport via Intersection Observer",{"type":26,"tag":417,"props":3371,"children":3372},{},[3373,3378],{"type":26,"tag":34,"props":3374,"children":3375},{},[3376],{"type":31,"value":3377},"Service Worker + mode hors ligne :",{"type":31,"value":3379}," utiliser Workbox pour mettre en cache les ressources critiques, fallback network-first",{"type":26,"tag":417,"props":3381,"children":3382},{},[3383,3388],{"type":26,"tag":34,"props":3384,"children":3385},{},[3386],{"type":31,"value":3387},"Fractionnement du bundle :",{"type":31,"value":3389}," rendre le code splitting de Nuxt 3 agressif, chunking basé sur les routes",{"type":26,"tag":27,"props":3391,"children":3392},{},[3393],{"type":31,"value":3394},"L'optimisation de performance est un jeu sans fin — chaque gain de 100ms produit un lift de 1-2% en conversion. La combinaison Nuxt 3 + Cloudflare Pages offre un équilibre entre rendu edge et ergonomie moderne du framework JavaScript. Lors du choix d'une pile, il faut définir l'objectif LCP comme une exigence métier, puis évaluer les options architecturales dans cette contrainte.",{"type":26,"tag":992,"props":3396,"children":3397},{},[3398],{"type":31,"value":996},{"title":9,"searchDepth":168,"depth":168,"links":3400},[3401,3402,3403,3405,3406,3407,3408,3409],{"id":1963,"depth":158,"text":1966},{"id":2023,"depth":158,"text":2026},{"id":2445,"depth":158,"text":3404},"Hydratation sélective + content-visibility",{"id":2698,"depth":158,"text":2701},{"id":2899,"depth":158,"text":2902},{"id":3109,"depth":158,"text":3112},{"id":3264,"depth":158,"text":3267},{"id":3338,"depth":158,"text":3341},"content:fr:tech:nuxt-3-cloudflare-pages-lcp-optimisation.md","fr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation.md","fr\u002Ftech\u002Fnuxt-3-cloudflare-pages-lcp-optimisation",{"ai":148,"marketing":148,"tech":148,"data":3414,"gaming":3414,"travel":3414,"lifestyle":3414},0,1778164175063]