[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fPUMc0smaJ16HZcyd7NmyfsPbJZsg4tsn1WpLSTdSo8c":3,"$fpl9FsBmzvjLttzd4d6A3PN0mPcZsPU6Ncym28PSXwnw":25},{"_id":4,"slug":5,"__v":6,"author":7,"body":8,"canonical":9,"category":10,"createdAt":11,"date":12,"description":13,"htmlContent":14,"image":15,"imageAlt":15,"readingTime":16,"tags":17,"title":23,"updatedAt":24},"6a02fac0aa6b273b0c58d096","the-consensus-gap-via-sejournal-kevin-indig",0,"Equipe Seogard","Une marque citée dans 80 % des réponses de ChatGPT, mais absente de Gemini et Perplexity sur les mêmes requêtes. Le dashboard agrégé affiche un score de visibilité AI de 72 %. Tout va bien, sauf que deux tiers du trafic potentiel n'existent pas. C'est le **Consensus Gap** — le concept introduit par Kevin Indig dans [Search Engine Journal](https://www.searchenginejournal.com/the-consensus-gap/574534/) — et il change la façon dont il faut mesurer la visibilité en AI Search.\n\n## Ce que le Consensus Gap révèle vraiment\n\nLe Consensus Gap désigne l'écart de citation d'une marque entre différents moteurs de recherche AI pour une même requête. Contrairement à la recherche classique où les résultats de Google dominaient à 90 %+ du marché, l'écosystème AI est fragmenté : ChatGPT (OpenAI), Gemini (Google), Perplexity, Copilot (Microsoft), Claude (Anthropic). Chaque moteur utilise des pipelines de grounding différents, des corpus distincts, et des logiques de citation qui n'ont rien à voir les unes avec les autres.\n\nLe problème est structurel. Quand vous mesurez votre \"AI visibility\" avec un outil qui agrège les résultats de plusieurs LLMs, vous obtenez une moyenne. Et une moyenne masque la distribution. Un score de 70 % peut signifier 100 % sur ChatGPT et 0 % sur Gemini, ou 70 % sur les trois. Ces deux scénarios impliquent des stratégies radicalement différentes.\n\nKevin Indig illustre ce point avec des données concrètes : certaines marques qui semblent dominantes en visibilité AI agrégée sont en réalité absentes de moteurs qui représentent une part croissante des requêtes informationnelles. Le Consensus Gap n'est pas un bug — c'est une propriété émergente d'un écosystème où chaque LLM a son propre index, ses propres biais de source, et sa propre logique de sélection.\n\nPour les équipes SEO qui ont commencé à tracker leur visibilité AI, c'est un signal d'alarme : les métriques agrégées sont trompeuses tant que vous ne décomposez pas par moteur.\n\n## Pourquoi chaque LLM cite différemment : le pipeline technique\n\nPour comprendre le Consensus Gap, il faut comprendre comment chaque moteur construit sa réponse. Le processus de **grounding** — la façon dont un LLM ancre sa réponse dans des sources réelles — varie considérablement.\n\n### Google Gemini : indexation classique + AI Overviews\n\nGemini s'appuie principalement sur l'index Google Search existant. Les sources citées dans les AI Overviews sont sélectionnées parmi les pages déjà indexées et rankées. Si vous êtes invisible dans les SERPs classiques de Google sur une requête, vous avez très peu de chances d'être cité par Gemini sur cette même requête.\n\nLe grounding de Gemini utilise un sous-ensemble de l'index, filtré par des signaux de qualité (E-E-A-T, topical authority, fraîcheur). Les [évolutions récentes des liens dans AI Overviews](/blog/google-updates-links-within-ai-overviews-ai-mode) confirment que Google resserre les critères de sélection des sources.\n\n### ChatGPT : Bing Index + Browse + mémoire contextuelle\n\nChatGPT avec browsing activé s'appuie sur l'index Bing pour ses résultats en temps réel. C'est un point critique que beaucoup d'équipes SEO sous-estiment : si votre site n'est pas correctement indexé par Bing, ChatGPT ne vous citera pas, même si vous dominez Google.\n\nLe [fonctionnement du grounding chez Bing](/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern) est fondamentalement différent de celui de Google. Microsoft a expliqué que le grounding ne repose pas sur le même index que la recherche classique — il utilise un index optimisé pour la récupération de passages, pas de pages.\n\n### Perplexity : crawl propriétaire + index focalisé\n\nPerplexity utilise son propre crawler (PerplexityBot) et construit un index indépendant. Si votre `robots.txt` bloque ce bot — ce qui est fréquent sur les hébergements WordPress managés — vous êtes invisible sur Perplexity par défaut.\n\nC'est exactement le scénario décrit dans [cet article sur les bots AI bloqués par les hébergements managés](/blog/your-managed-wordpress-might-be-blocking-ai-bots-and-you-can-t-see-it). Un `robots.txt` qui semble inoffensif peut créer un Consensus Gap massif.\n\nVoici un exemple de `robots.txt` qui crée un Consensus Gap en bloquant sélectivement certains bots AI :\n\n```nginx\n# robots.txt — configuration typique d'un hébergeur managé\nUser-agent: Googlebot\nAllow: /\n\nUser-agent: Bingbot\nAllow: /\n\nUser-agent: PerplexityBot\nDisallow: /\n\nUser-agent: anthropic-ai\nDisallow: /\n\nUser-agent: CCBot\nDisallow: /\n\n# Résultat : visible sur Gemini et ChatGPT, invisible sur Perplexity et Claude\n```\n\nCe fichier `robots.txt` est fonctionnellement un générateur de Consensus Gap. Votre marque sera citée par les moteurs qui accèdent à votre contenu, et absente des autres. Et vous ne le verrez pas dans un dashboard agrégé.\n\n## Mesurer le Consensus Gap : méthodologie technique\n\nIl n'existe pas encore d'outil mainstream qui mesure nativement le Consensus Gap. La plupart des plateformes de \"GEO\" (Generative Engine Optimization) affichent un score agrégé. Voici une méthode pour le calculer vous-même.\n\n### Étape 1 : Définir un corpus de requêtes\n\nSélectionnez 50 à 100 requêtes informationnelles représentatives de votre domaine. Pas vos requêtes branded — les requêtes génériques où vous voulez être cité comme source experte.\n\n### Étape 2 : Interroger chaque moteur individuellement\n\nPour chaque requête, interrogez ChatGPT, Gemini, et Perplexity (au minimum). Enregistrez si votre marque/domaine est cité, et dans quel contexte (source principale, mention secondaire, absent).\n\nVoici un script TypeScript qui automatise cette collecte via les APIs disponibles :\n\n```typescript\nimport OpenAI from \"openai\";\n\ninterface EngineResult {\n  engine: string;\n  query: string;\n  cited: boolean;\n  citationContext: \"primary\" | \"secondary\" | \"absent\";\n  sourceUrl: string | null;\n  responseSnippet: string;\n}\n\ninterface ConsensusReport {\n  query: string;\n  results: EngineResult[];\n  consensusScore: number; // 0-1, 1 = cité partout\n  gapEngines: string[]; // moteurs où la marque est absente\n}\n\nconst BRAND_DOMAIN = \"votredomaine.com\";\nconst BRAND_VARIANTS = [\"VotreMarque\", \"votremarque.com\", \"Votre Marque\"];\n\nasync function checkCitationInResponse(\n  response: string,\n  domain: string,\n  variants: string[]\n): { cited: boolean; context: \"primary\" | \"secondary\" | \"absent\" } {\n  const lowerResponse = response.toLowerCase();\n  const allPatterns = [domain, ...variants.map((v) => v.toLowerCase())];\n\n  const found = allPatterns.some((p) => lowerResponse.includes(p));\n  if (!found) return { cited: false, context: \"absent\" };\n\n  // Heuristique : si mentionné dans le premier tiers de la réponse = primary\n  const firstThird = lowerResponse.substring(0, lowerResponse.length / 3);\n  const isPrimary = allPatterns.some((p) => firstThird.includes(p));\n\n  return { cited: true, context: isPrimary ? \"primary\" : \"secondary\" };\n}\n\nasync function queryOpenAI(query: string): Promise\u003CEngineResult> {\n  const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n\n  const response = await client.chat.completions.create({\n    model: \"gpt-4o\",\n    messages: [{ role: \"user\", content: query }],\n    temperature: 0.2,\n  });\n\n  const text = response.choices[0]?.message?.content ?? \"\";\n  const citation = await checkCitationInResponse(text, BRAND_DOMAIN, BRAND_VARIANTS);\n\n  return {\n    engine: \"chatgpt\",\n    query,\n    cited: citation.cited,\n    citationContext: citation.context,\n    sourceUrl: null, // Extraire via parsing si browsing activé\n    responseSnippet: text.substring(0, 500),\n  };\n}\n\nfunction calculateConsensusScore(results: EngineResult[]): number {\n  const citedCount = results.filter((r) => r.cited).length;\n  return citedCount / results.length;\n}\n\nasync function analyzeConsensusGap(\n  queries: string[]\n): Promise\u003CConsensusReport[]> {\n  const reports: ConsensusReport[] = [];\n\n  for (const query of queries) {\n    // En production : ajouter Gemini API, Perplexity API\n    const chatgptResult = await queryOpenAI(query);\n\n    const results = [chatgptResult];\n    // Ajouter les autres moteurs ici\n\n    const consensusScore = calculateConsensusScore(results);\n    const gapEngines = results\n      .filter((r) => !r.cited)\n      .map((r) => r.engine);\n\n    reports.push({ query, results, consensusScore, gapEngines });\n  }\n\n  return reports;\n}\n\n// Usage\nconst queries = [\n  \"meilleur outil monitoring SEO technique\",\n  \"comment détecter une régression meta description\",\n  \"audit SEO automatisé pour e-commerce\",\n];\n\nanalyzeConsensusGap(queries).then((reports) => {\n  reports.forEach((r) => {\n    console.log(`Query: ${r.query}`);\n    console.log(`Consensus Score: ${(r.consensusScore * 100).toFixed(0)}%`);\n    console.log(`Gap Engines: ${r.gapEngines.join(\", \") || \"none\"}`);\n    console.log(\"---\");\n  });\n});\n```\n\n### Étape 3 : Calculer le score de consensus\n\nLe **Consensus Score** est simple : pour chaque requête, c'est le ratio de moteurs où vous êtes cité sur le nombre total de moteurs testés. Un score de 1.0 signifie un consensus parfait (cité partout). Un score de 0.33 signifie que vous n'êtes cité que sur un moteur sur trois.\n\nLe **Consensus Gap** est l'inverse : `1 - ConsensusScore`. Plus il est élevé, plus votre visibilité est fragile et dépendante d'un seul moteur.\n\n## Scénario concret : un e-commerce mode de 12 000 pages\n\nPrenons un cas réaliste. **FashionStore.fr**, un e-commerce de prêt-à-porter avec 12 000 pages produits, 800 pages catégories, et un blog de 400 articles. L'équipe SEO a investi dans le contenu éditorial depuis 18 mois et reçoit 35 000 visites organiques mensuelles via Google.\n\nL'équipe commence à tracker sa visibilité AI avec un outil qui agrège ChatGPT, Gemini et Perplexity. Le dashboard affiche : **\"AI Visibility Score : 64 %\"** sur un corpus de 200 requêtes mode (type \"meilleure robe d'été 2026\", \"comment choisir un blazer homme\", etc.).\n\nRésultat satisfaisant. Sauf qu'en décomposant par moteur :\n\n| Moteur | Requêtes citées | Taux de citation |\n|-----------|----------------|------------------|\n| ChatGPT | 158 / 200 | 79 % |\n| Gemini | 112 / 200 | 56 % |\n| Perplexity | 12 / 200 | 6 % |\n\nLe Consensus Gap est massif. Et le score agrégé de 64 % masque un trou noir sur Perplexity.\n\n### Diagnostic\n\nL'équipe lance un audit. Premier réflexe : vérifier l'accès des bots.\n\n```bash\n# Vérifier si PerplexityBot peut accéder au site\ncurl -sI -A \"PerplexityBot\" https://fashionstore.fr/ | head -20\n\n# Résultat :\n# HTTP/2 403\n# server: cloudflare\n# cf-ray: ...\n\n# Le WAF Cloudflare bloque PerplexityBot avec une 403\n# Vérifier les règles de firewall\ncurl -s https://fashionstore.fr/robots.txt | grep -i perplexity\n\n# Rien dans robots.txt — le blocage vient du WAF, pas du robots.txt\n```\n\nLe problème n'est pas dans le `robots.txt` — il est dans la configuration du WAF Cloudflare. Le bot Perplexity est classé comme \"AI Scraper\" et bloqué par une règle par défaut que l'équipe n'a jamais modifiée.\n\nDeuxième problème : l'écart entre ChatGPT (79 %) et Gemini (56 %). L'équipe analyse les 88 requêtes où ChatGPT cite FashionStore.fr mais pas Gemini. Pattern identifié : ce sont principalement des articles de blog récents (\u003C 3 mois). En vérifiant dans la Search Console, ces pages ont un bon ranking Google (positions 5-15), mais en fouillant dans les requêtes AI Overviews via les rapports de search performance filtrés sur \"AI Overviews\", ces pages n'apparaissent pas.\n\nHypothèse : les articles sont indexés et rankés dans la recherche classique, mais ne passent pas le filtre de qualité supplémentaire que Gemini applique pour le grounding AI. Le [seuil de qualité de Google pour le contenu AI](/blog/google-s-quality-threshold-is-quietly-killing-scaled-ai-content-via-sejournal-taylordanrw) s'applique aussi dans l'autre sens : des pages jugées \"suffisamment bonnes\" pour le ranking classique peuvent être exclues du pipeline AI Overviews.\n\n### Plan de correction\n\n1. **Perplexity** : ajout d'une règle Cloudflare WAF explicite pour autoriser PerplexityBot (User-Agent matching). Résultat attendu sous 2-4 semaines après recrawl.\n2. **Gemini** : renforcement des signaux E-E-A-T sur les articles de blog (auteur identifié, sources citées, structured data `Article` avec `author` et `dateModified`). Travail sur la profondeur éditoriale des 88 articles manquants.\n3. **Monitoring** : mise en place d'un suivi mensuel du Consensus Score par requête, pas uniquement agrégé.\n\n## Les signaux techniques qui créent du Consensus Gap\n\nAu-delà du blocage de bots, plusieurs facteurs techniques expliquent pourquoi un moteur AI vous cite et pas un autre.\n\n### Structured data et extraction de passages\n\nChaque LLM a sa propre logique d'extraction de passages (passage retrieval). Google utilise ses propres embeddings, Bing utilise les siens, Perplexity a son propre modèle de retrieval.\n\nDes structured data bien implémentées aident tous les moteurs, mais certains types sont mieux exploités par certains pipelines. Les `FAQPage` schema, par exemple, sont [en voie de disparition chez Google](/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern) mais restent exploités par Perplexity pour structurer ses réponses.\n\nLe balisage `speakable` (schema.org), bien que peu utilisé, est un signal explicite pour les moteurs AI qui cherchent des passages à citer verbatim :\n\n```html\n\u003Cscript type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"Article\",\n  \"headline\": \"Guide complet des blazers homme 2026\",\n  \"author\": {\n    \"@type\": \"Person\",\n    \"name\": \"Marie Dupont\",\n    \"url\": \"https://fashionstore.fr/equipe/marie-dupont\",\n    \"jobTitle\": \"Directrice éditoriale mode\"\n  },\n  \"datePublished\": \"2026-04-15\",\n  \"dateModified\": \"2026-05-10\",\n  \"publisher\": {\n    \"@type\": \"Organization\",\n    \"name\": \"FashionStore\",\n    \"url\": \"https://fashionstore.fr\"\n  },\n  \"speakable\": {\n    \"@type\": \"SpeakableSpecification\",\n    \"cssSelector\": [\n      \".article-summary\",\n      \".key-takeaway\"\n    ]\n  },\n  \"mainEntityOfPage\": {\n    \"@type\": \"WebPage\",\n    \"@id\": \"https://fashionstore.fr/blog/guide-blazers-homme-2026\"\n  }\n}\n\u003C/script>\n```\n\n### Fraîcheur et fréquence de crawl\n\nLe Consensus Gap s'aggrave avec le contenu récent. Google recrawle les sites à forte autorité en quelques heures. Bing peut mettre plusieurs jours. Perplexity, avec un crawler plus modeste, peut avoir un délai de 1 à 3 semaines.\n\nConséquence : un article publié lundi sera potentiellement cité par Gemini dès mardi, par ChatGPT jeudi, et par Perplexity dans deux semaines. Pendant cette fenêtre, votre Consensus Gap est temporairement élevé — et si vous mesurez à ce moment, vous aurez une vision faussée.\n\nLes [métriques GEO à tracker en 2026](/blog/8-geo-metrics-to-track-in-2026) doivent inclure cette dimension temporelle : le Consensus Score n'a de sens que mesuré après stabilisation (minimum 3 semaines post-publication).\n\n### Architecture de contenu et citabilité\n\nUn insight clé que le concept de Consensus Gap met en lumière : votre site n'est pas traité comme une entité unique par les LLMs. Il est traité comme une collection de passages, et chaque moteur sélectionne des passages différents.\n\nUn contenu structuré en silos thématiques clairs, avec des résumés explicites en début de section, maximise la probabilité d'être sélectionné par plusieurs moteurs simultanément. C'est le principe de [votre site comme source, pas comme mégaphone](/blog/your-website-is-a-source-not-a-megaphone-via-sejournal-slobodanmanic) : vous produisez des passages citables, pas des pages monolithiques.\n\nLe [pipeline en 10 étapes pour diagnostiquer les échecs de citation AI](/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails) est un bon framework pour identifier à quelle étape chaque moteur décroche.\n\n## Stratégie multi-moteur : réduire le gap sans optimiser pour un seul LLM\n\nL'erreur serait d'optimiser spécifiquement pour ChatGPT parce que c'est là que vous êtes déjà visible. Le Consensus Gap se réduit par des fondamentaux techniques solides, pas par du tuning spécifique à un moteur.\n\n### Accès universel aux bots\n\nPremière étape, non négociable : vérifier que tous les bots AI majeurs accèdent à votre contenu. Pas seulement dans le `robots.txt` — aussi dans le WAF, les règles de rate limiting, et les configurations CDN.\n\nBots à autoriser explicitement :\n- `Googlebot` (Gemini)\n- `Bingbot` (Copilot/ChatGPT browsing)\n- `PerplexityBot` (Perplexity)\n- `anthropic-ai` (Claude)\n- `Google-Extended` (entraînement Gemini — à autoriser si vous voulez être dans le modèle, pas seulement dans le grounding)\n\nLe [nouveau standard d'autorisation de bots testé par Google](/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster) va potentiellement simplifier cette gestion à terme, mais aujourd'hui c'est encore du cas par cas.\n\n### Contenu structuré pour le passage retrieval\n\nChaque section de votre contenu doit pouvoir être extraite indépendamment et rester compréhensible. Concrètement :\n\n- Un H2 explicite qui pose la question ou le sujet\n- Un paragraphe de réponse directe dans les 2-3 premières phrases\n- Des données factuelles (chiffres, comparaisons) dans le corps de la section\n- Une phrase de synthèse en fin de section\n\nCette structure fonctionne avec tous les pipelines de retrieval car elle correspond au pattern de \"passage utile\" que les modèles d'embedding cherchent à identifier.\n\n### Monitoring continu du Consensus Score\n\nLe Consensus Gap n'est pas statique. Il évolue à chaque mise à jour de modèle, chaque modification de pipeline de grounding, chaque changement dans votre propre contenu. Un outil de monitoring comme Seogard qui détecte les régressions techniques (meta disparues, bots bloqués, structured data cassées) est la couche de base nécessaire — mais le monitoring du Consensus Score lui-même nécessite une couche supplémentaire de suivi par moteur AI.\n\nLe [diagnostic des échecs de visibilité AI](/blog/why-ai-search-skips-your-content-and-how-to-diagnose-where-it-s-failing-via-sejournal-jeffrey-coyle) doit être fait moteur par moteur, pas en agrégé.\n\n## Implications pour la mesure de la visibilité AI\n\nLe Consensus Gap remet en cause les métriques de visibilité AI telles qu'elles sont généralement présentées. Un score unique n'a pas de sens. Voici ce qu'il faut mesurer à la place :\n\n**Par moteur :**\n- Taux de citation (% de requêtes où votre domaine est cité)\n- Position dans la réponse (source principale vs mention secondaire)\n- Type de contenu cité (page produit, article, page catégorie)\n\n**Agrégé, mais avec contexte :**\n- Consensus Score moyen sur le corpus de requêtes\n- Distribution du gap (sur combien de requêtes y a-t-il un écart > 1 moteur ?)\n- Tendance temporelle (le gap se réduit-il ou s'amplifie-t-il ?)\n\nLes [expériences de SEO au niveau des prompts](/blog/how-to-run-prompt-level-seo-experiments-for-ai-search) sont la méthode la plus fiable pour collecter ces données de façon systématique, en testant la même requête formulée de différentes manières sur chaque moteur.\n\nLa visibilité AI n'est pas un score unique. C'est un vecteur multidimensionnel. Le Consensus Gap est la métrique qui capture la variance de ce vecteur — et c'est cette variance qui détermine si votre investissement en contenu est robuste ou fragile face à la fragmentation des moteurs AI.\n\nLe takeaway est clair : décomposez votre visibilité AI par moteur, identifiez les blocages techniques spécifiques à chaque pipeline, et mesurez le Consensus Score comme un KPI de premier ordre. Si vous ne surveillez qu'un score agrégé, vous optimisez à l'aveugle.","https://seogard.io/blog/the-consensus-gap-via-sejournal-kevin-indig","Actualités SEO","2026-05-12T10:02:40.519Z","2026-05-12","Une marque peut dominer dans un dashboard AI agrégé et être absente de deux moteurs sur trois. Analyse technique du Consensus Gap et méthodes pour le détecter.","\u003Cp>Une marque citée dans 80 % des réponses de ChatGPT, mais absente de Gemini et Perplexity sur les mêmes requêtes. Le dashboard agrégé affiche un score de visibilité AI de 72 %. Tout va bien, sauf que deux tiers du trafic potentiel n'existent pas. C'est le \u003Cstrong>Consensus Gap\u003C/strong> — le concept introduit par Kevin Indig dans \u003Ca href=\"https://www.searchenginejournal.com/the-consensus-gap/574534/\">Search Engine Journal\u003C/a> — et il change la façon dont il faut mesurer la visibilité en AI Search.\u003C/p>\n\u003Ch2>Ce que le Consensus Gap révèle vraiment\u003C/h2>\n\u003Cp>Le Consensus Gap désigne l'écart de citation d'une marque entre différents moteurs de recherche AI pour une même requête. Contrairement à la recherche classique où les résultats de Google dominaient à 90 %+ du marché, l'écosystème AI est fragmenté : ChatGPT (OpenAI), Gemini (Google), Perplexity, Copilot (Microsoft), Claude (Anthropic). Chaque moteur utilise des pipelines de grounding différents, des corpus distincts, et des logiques de citation qui n'ont rien à voir les unes avec les autres.\u003C/p>\n\u003Cp>Le problème est structurel. Quand vous mesurez votre \"AI visibility\" avec un outil qui agrège les résultats de plusieurs LLMs, vous obtenez une moyenne. Et une moyenne masque la distribution. Un score de 70 % peut signifier 100 % sur ChatGPT et 0 % sur Gemini, ou 70 % sur les trois. Ces deux scénarios impliquent des stratégies radicalement différentes.\u003C/p>\n\u003Cp>Kevin Indig illustre ce point avec des données concrètes : certaines marques qui semblent dominantes en visibilité AI agrégée sont en réalité absentes de moteurs qui représentent une part croissante des requêtes informationnelles. Le Consensus Gap n'est pas un bug — c'est une propriété émergente d'un écosystème où chaque LLM a son propre index, ses propres biais de source, et sa propre logique de sélection.\u003C/p>\n\u003Cp>Pour les équipes SEO qui ont commencé à tracker leur visibilité AI, c'est un signal d'alarme : les métriques agrégées sont trompeuses tant que vous ne décomposez pas par moteur.\u003C/p>\n\u003Ch2>Pourquoi chaque LLM cite différemment : le pipeline technique\u003C/h2>\n\u003Cp>Pour comprendre le Consensus Gap, il faut comprendre comment chaque moteur construit sa réponse. Le processus de \u003Cstrong>grounding\u003C/strong> — la façon dont un LLM ancre sa réponse dans des sources réelles — varie considérablement.\u003C/p>\n\u003Ch3>Google Gemini : indexation classique + AI Overviews\u003C/h3>\n\u003Cp>Gemini s'appuie principalement sur l'index Google Search existant. Les sources citées dans les AI Overviews sont sélectionnées parmi les pages déjà indexées et rankées. Si vous êtes invisible dans les SERPs classiques de Google sur une requête, vous avez très peu de chances d'être cité par Gemini sur cette même requête.\u003C/p>\n\u003Cp>Le grounding de Gemini utilise un sous-ensemble de l'index, filtré par des signaux de qualité (E-E-A-T, topical authority, fraîcheur). Les \u003Ca href=\"/blog/google-updates-links-within-ai-overviews-ai-mode\">évolutions récentes des liens dans AI Overviews\u003C/a> confirment que Google resserre les critères de sélection des sources.\u003C/p>\n\u003Ch3>ChatGPT : Bing Index + Browse + mémoire contextuelle\u003C/h3>\n\u003Cp>ChatGPT avec browsing activé s'appuie sur l'index Bing pour ses résultats en temps réel. C'est un point critique que beaucoup d'équipes SEO sous-estiment : si votre site n'est pas correctement indexé par Bing, ChatGPT ne vous citera pas, même si vous dominez Google.\u003C/p>\n\u003Cp>Le \u003Ca href=\"/blog/bing-reveals-what-grounding-means-for-ai-search-visibility-via-sejournal-mattgsouthern\">fonctionnement du grounding chez Bing\u003C/a> est fondamentalement différent de celui de Google. Microsoft a expliqué que le grounding ne repose pas sur le même index que la recherche classique — il utilise un index optimisé pour la récupération de passages, pas de pages.\u003C/p>\n\u003Ch3>Perplexity : crawl propriétaire + index focalisé\u003C/h3>\n\u003Cp>Perplexity utilise son propre crawler (PerplexityBot) et construit un index indépendant. Si votre \u003Ccode>robots.txt\u003C/code> bloque ce bot — ce qui est fréquent sur les hébergements WordPress managés — vous êtes invisible sur Perplexity par défaut.\u003C/p>\n\u003Cp>C'est exactement le scénario décrit dans \u003Ca href=\"/blog/your-managed-wordpress-might-be-blocking-ai-bots-and-you-can-t-see-it\">cet article sur les bots AI bloqués par les hébergements managés\u003C/a>. Un \u003Ccode>robots.txt\u003C/code> qui semble inoffensif peut créer un Consensus Gap massif.\u003C/p>\n\u003Cp>Voici un exemple de \u003Ccode>robots.txt\u003C/code> qui crée un Consensus Gap en bloquant sélectivement certains bots AI :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># robots.txt — configuration typique d'un hébergeur managé\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Googlebot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">Bingbot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Allow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">PerplexityBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: anthropic-\u003C/span>\u003Cspan style=\"color:#F97583\">ai\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">User-agent: \u003C/span>\u003Cspan style=\"color:#F97583\">CCBot\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">Disallow: /\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Résultat : visible sur Gemini et ChatGPT, invisible sur Perplexity et Claude\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce fichier \u003Ccode>robots.txt\u003C/code> est fonctionnellement un générateur de Consensus Gap. Votre marque sera citée par les moteurs qui accèdent à votre contenu, et absente des autres. Et vous ne le verrez pas dans un dashboard agrégé.\u003C/p>\n\u003Ch2>Mesurer le Consensus Gap : méthodologie technique\u003C/h2>\n\u003Cp>Il n'existe pas encore d'outil mainstream qui mesure nativement le Consensus Gap. La plupart des plateformes de \"GEO\" (Generative Engine Optimization) affichent un score agrégé. Voici une méthode pour le calculer vous-même.\u003C/p>\n\u003Ch3>Étape 1 : Définir un corpus de requêtes\u003C/h3>\n\u003Cp>Sélectionnez 50 à 100 requêtes informationnelles représentatives de votre domaine. Pas vos requêtes branded — les requêtes génériques où vous voulez être cité comme source experte.\u003C/p>\n\u003Ch3>Étape 2 : Interroger chaque moteur individuellement\u003C/h3>\n\u003Cp>Pour chaque requête, interrogez ChatGPT, Gemini, et Perplexity (au minimum). Enregistrez si votre marque/domaine est cité, et dans quel contexte (source principale, mention secondaire, absent).\u003C/p>\n\u003Cp>Voici un script TypeScript qui automatise cette collecte via les APIs disponibles :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> OpenAI \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"openai\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> EngineResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  engine\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  query\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  cited\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  citationContext\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"primary\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"secondary\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"absent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  sourceUrl\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#79B8FF\"> null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  responseSnippet\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> ConsensusReport\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  query\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  results\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> EngineResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  consensusScore\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#6A737D\">// 0-1, 1 = cité partout\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  gapEngines\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]; \u003C/span>\u003Cspan style=\"color:#6A737D\">// moteurs où la marque est absente\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> BRAND_DOMAIN\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"votredomaine.com\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> BRAND_VARIANTS\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"VotreMarque\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"votremarque.com\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Votre Marque\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> checkCitationInResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  response\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  domain\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  variants\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { \u003C/span>\u003Cspan style=\"color:#FFAB70\">cited\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> boolean\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#FFAB70\">context\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"primary\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"secondary\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"absent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> } {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> lowerResponse\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.\u003C/span>\u003Cspan style=\"color:#B392F0\">toLowerCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">();\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> allPatterns\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [domain, \u003C/span>\u003Cspan style=\"color:#F97583\">...\u003C/span>\u003Cspan style=\"color:#E1E4E8\">variants.\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">v\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> v.\u003C/span>\u003Cspan style=\"color:#B392F0\">toLowerCase\u003C/span>\u003Cspan style=\"color:#E1E4E8\">())];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> found\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> allPatterns.\u003C/span>\u003Cspan style=\"color:#B392F0\">some\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> lowerResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(p));\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">found) \u003C/span>\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { cited: \u003C/span>\u003Cspan style=\"color:#79B8FF\">false\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, context: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"absent\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  // Heuristique : si mentionné dans le premier tiers de la réponse = primary\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> firstThird\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> lowerResponse.\u003C/span>\u003Cspan style=\"color:#B392F0\">substring\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, lowerResponse.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#F97583\"> /\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 3\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> isPrimary\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> allPatterns.\u003C/span>\u003Cspan style=\"color:#B392F0\">some\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">p\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> firstThird.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(p));\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { cited: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, context: isPrimary \u003C/span>\u003Cspan style=\"color:#F97583\">?\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"primary\"\u003C/span>\u003Cspan style=\"color:#F97583\"> :\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"secondary\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> queryOpenAI\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">query\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">EngineResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> client\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#B392F0\"> OpenAI\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ apiKey: process.env.\u003C/span>\u003Cspan style=\"color:#79B8FF\">OPENAI_API_KEY\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> response\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> client.chat.completions.\u003C/span>\u003Cspan style=\"color:#B392F0\">create\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    model: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"gpt-4o\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    messages: [{ role: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"user\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, content: query }],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    temperature: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> text\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.choices[\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]?.message?.content \u003C/span>\u003Cspan style=\"color:#F97583\">??\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> citation\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> checkCitationInResponse\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(text, \u003C/span>\u003Cspan style=\"color:#79B8FF\">BRAND_DOMAIN\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">BRAND_VARIANTS\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    engine: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"chatgpt\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    query,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    cited: citation.cited,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    citationContext: citation.context,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    sourceUrl: \u003C/span>\u003Cspan style=\"color:#79B8FF\">null\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#6A737D\">// Extraire via parsing si browsing activé\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    responseSnippet: text.\u003C/span>\u003Cspan style=\"color:#B392F0\">substring\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">500\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">function\u003C/span>\u003Cspan style=\"color:#B392F0\"> calculateConsensusScore\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">results\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> EngineResult\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[])\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> number\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> citedCount\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results.\u003C/span>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> r.cited).\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> citedCount \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> analyzeConsensusGap\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  queries\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">ConsensusReport\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[]> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> reports\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> ConsensusReport\u003C/span>\u003Cspan style=\"color:#E1E4E8\">[] \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> query\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> queries) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // En production : ajouter Gemini API, Perplexity API\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> chatgptResult\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> queryOpenAI\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(query);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> results\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [chatgptResult];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Ajouter les autres moteurs ici\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> consensusScore\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> calculateConsensusScore\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(results);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> gapEngines\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      .\u003C/span>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r.cited)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      .\u003C/span>\u003Cspan style=\"color:#B392F0\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> r.engine);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    reports.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ query, results, consensusScore, gapEngines });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> reports;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Usage\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> queries\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"meilleur outil monitoring SEO technique\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"comment détecter une régression meta description\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">  \"audit SEO automatisé pour e-commerce\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">];\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">analyzeConsensusGap\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(queries).\u003C/span>\u003Cspan style=\"color:#B392F0\">then\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">reports\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  reports.\u003C/span>\u003Cspan style=\"color:#B392F0\">forEach\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#E1E4E8\">) \u003C/span>\u003Cspan style=\"color:#F97583\">=>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Query: ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">query\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Consensus Score: ${\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">consensusScore\u003C/span>\u003Cspan style=\"color:#F97583\"> *\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#9ECBFF\">).\u003C/span>\u003Cspan style=\"color:#B392F0\">toFixed\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}%`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">`Gap Engines: ${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">r\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#E1E4E8\">gapEngines\u003C/span>\u003Cspan style=\"color:#9ECBFF\">.\u003C/span>\u003Cspan style=\"color:#B392F0\">join\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\", \"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">) \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"none\"}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    console.\u003C/span>\u003Cspan style=\"color:#B392F0\">log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"---\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">});\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3>Étape 3 : Calculer le score de consensus\u003C/h3>\n\u003Cp>Le \u003Cstrong>Consensus Score\u003C/strong> est simple : pour chaque requête, c'est le ratio de moteurs où vous êtes cité sur le nombre total de moteurs testés. Un score de 1.0 signifie un consensus parfait (cité partout). Un score de 0.33 signifie que vous n'êtes cité que sur un moteur sur trois.\u003C/p>\n\u003Cp>Le \u003Cstrong>Consensus Gap\u003C/strong> est l'inverse : \u003Ccode>1 - ConsensusScore\u003C/code>. Plus il est élevé, plus votre visibilité est fragile et dépendante d'un seul moteur.\u003C/p>\n\u003Ch2>Scénario concret : un e-commerce mode de 12 000 pages\u003C/h2>\n\u003Cp>Prenons un cas réaliste. \u003Cstrong>FashionStore.fr\u003C/strong>, un e-commerce de prêt-à-porter avec 12 000 pages produits, 800 pages catégories, et un blog de 400 articles. L'équipe SEO a investi dans le contenu éditorial depuis 18 mois et reçoit 35 000 visites organiques mensuelles via Google.\u003C/p>\n\u003Cp>L'équipe commence à tracker sa visibilité AI avec un outil qui agrège ChatGPT, Gemini et Perplexity. Le dashboard affiche : \u003Cstrong>\"AI Visibility Score : 64 %\"\u003C/strong> sur un corpus de 200 requêtes mode (type \"meilleure robe d'été 2026\", \"comment choisir un blazer homme\", etc.).\u003C/p>\n\u003Cp>Résultat satisfaisant. Sauf qu'en décomposant par moteur :\u003C/p>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Moteur\u003C/th>\n\u003Cth>Requêtes citées\u003C/th>\n\u003Cth>Taux de citation\u003C/th>\n\u003C/tr>\n\u003C/thead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>ChatGPT\u003C/td>\n\u003Ctd>158 / 200\u003C/td>\n\u003Ctd>79 %\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Gemini\u003C/td>\n\u003Ctd>112 / 200\u003C/td>\n\u003Ctd>56 %\u003C/td>\n\u003C/tr>\n\u003Ctr>\n\u003Ctd>Perplexity\u003C/td>\n\u003Ctd>12 / 200\u003C/td>\n\u003Ctd>6 %\u003C/td>\n\u003C/tr>\n\u003C/tbody>\n\u003C/table>\n\u003Cp>Le Consensus Gap est massif. Et le score agrégé de 64 % masque un trou noir sur Perplexity.\u003C/p>\n\u003Ch3>Diagnostic\u003C/h3>\n\u003Cp>L'équipe lance un audit. Premier réflexe : vérifier l'accès des bots.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier si PerplexityBot peut accéder au site\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -sI\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"PerplexityBot\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://fashionstore.fr/\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -20\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Résultat :\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># HTTP/2 403\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># server: cloudflare\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># cf-ray: ...\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Le WAF Cloudflare bloque PerplexityBot avec une 403\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier les règles de firewall\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> https://fashionstore.fr/robots.txt\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -i\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> perplexity\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Rien dans robots.txt — le blocage vient du WAF, pas du robots.txt\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le problème n'est pas dans le \u003Ccode>robots.txt\u003C/code> — il est dans la configuration du WAF Cloudflare. Le bot Perplexity est classé comme \"AI Scraper\" et bloqué par une règle par défaut que l'équipe n'a jamais modifiée.\u003C/p>\n\u003Cp>Deuxième problème : l'écart entre ChatGPT (79 %) et Gemini (56 %). L'équipe analyse les 88 requêtes où ChatGPT cite FashionStore.fr mais pas Gemini. Pattern identifié : ce sont principalement des articles de blog récents (&#x3C; 3 mois). En vérifiant dans la Search Console, ces pages ont un bon ranking Google (positions 5-15), mais en fouillant dans les requêtes AI Overviews via les rapports de search performance filtrés sur \"AI Overviews\", ces pages n'apparaissent pas.\u003C/p>\n\u003Cp>Hypothèse : les articles sont indexés et rankés dans la recherche classique, mais ne passent pas le filtre de qualité supplémentaire que Gemini applique pour le grounding AI. Le \u003Ca href=\"/blog/google-s-quality-threshold-is-quietly-killing-scaled-ai-content-via-sejournal-taylordanrw\">seuil de qualité de Google pour le contenu AI\u003C/a> s'applique aussi dans l'autre sens : des pages jugées \"suffisamment bonnes\" pour le ranking classique peuvent être exclues du pipeline AI Overviews.\u003C/p>\n\u003Ch3>Plan de correction\u003C/h3>\n\u003Col>\n\u003Cli>\u003Cstrong>Perplexity\u003C/strong> : ajout d'une règle Cloudflare WAF explicite pour autoriser PerplexityBot (User-Agent matching). Résultat attendu sous 2-4 semaines après recrawl.\u003C/li>\n\u003Cli>\u003Cstrong>Gemini\u003C/strong> : renforcement des signaux E-E-A-T sur les articles de blog (auteur identifié, sources citées, structured data \u003Ccode>Article\u003C/code> avec \u003Ccode>author\u003C/code> et \u003Ccode>dateModified\u003C/code>). Travail sur la profondeur éditoriale des 88 articles manquants.\u003C/li>\n\u003Cli>\u003Cstrong>Monitoring\u003C/strong> : mise en place d'un suivi mensuel du Consensus Score par requête, pas uniquement agrégé.\u003C/li>\n\u003C/ol>\n\u003Ch2>Les signaux techniques qui créent du Consensus Gap\u003C/h2>\n\u003Cp>Au-delà du blocage de bots, plusieurs facteurs techniques expliquent pourquoi un moteur AI vous cite et pas un autre.\u003C/p>\n\u003Ch3>Structured data et extraction de passages\u003C/h3>\n\u003Cp>Chaque LLM a sa propre logique d'extraction de passages (passage retrieval). Google utilise ses propres embeddings, Bing utilise les siens, Perplexity a son propre modèle de retrieval.\u003C/p>\n\u003Cp>Des structured data bien implémentées aident tous les moteurs, mais certains types sont mieux exploités par certains pipelines. Les \u003Ccode>FAQPage\u003C/code> schema, par exemple, sont \u003Ca href=\"/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern\">en voie de disparition chez Google\u003C/a> mais restent exploités par Perplexity pour structurer ses réponses.\u003C/p>\n\u003Cp>Le balisage \u003Ccode>speakable\u003C/code> (schema.org), bien que peu utilisé, est un signal explicite pour les moteurs AI qui cherchent des passages à citer verbatim :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#B392F0\"> type\u003C/span>\u003Cspan style=\"color:#E1E4E8\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"application/ld+json\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@context\": \"https://schema.org\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"@type\": \"Article\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"headline\": \"Guide complet des blazers homme 2026\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"author\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Person\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"Marie Dupont\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"url\": \"https://fashionstore.fr/equipe/marie-dupont\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"jobTitle\": \"Directrice éditoriale mode\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"datePublished\": \"2026-04-15\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"dateModified\": \"2026-05-10\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"publisher\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"Organization\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"name\": \"FashionStore\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"url\": \"https://fashionstore.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"speakable\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"SpeakableSpecification\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"cssSelector\": [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \".article-summary\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      \".key-takeaway\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  },\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \"mainEntityOfPage\": {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@type\": \"WebPage\",\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    \"@id\": \"https://fashionstore.fr/blog/guide-blazers-homme-2026\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#85E89D\">script\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Ch3>Fraîcheur et fréquence de crawl\u003C/h3>\n\u003Cp>Le Consensus Gap s'aggrave avec le contenu récent. Google recrawle les sites à forte autorité en quelques heures. Bing peut mettre plusieurs jours. Perplexity, avec un crawler plus modeste, peut avoir un délai de 1 à 3 semaines.\u003C/p>\n\u003Cp>Conséquence : un article publié lundi sera potentiellement cité par Gemini dès mardi, par ChatGPT jeudi, et par Perplexity dans deux semaines. Pendant cette fenêtre, votre Consensus Gap est temporairement élevé — et si vous mesurez à ce moment, vous aurez une vision faussée.\u003C/p>\n\u003Cp>Les \u003Ca href=\"/blog/8-geo-metrics-to-track-in-2026\">métriques GEO à tracker en 2026\u003C/a> doivent inclure cette dimension temporelle : le Consensus Score n'a de sens que mesuré après stabilisation (minimum 3 semaines post-publication).\u003C/p>\n\u003Ch3>Architecture de contenu et citabilité\u003C/h3>\n\u003Cp>Un insight clé que le concept de Consensus Gap met en lumière : votre site n'est pas traité comme une entité unique par les LLMs. Il est traité comme une collection de passages, et chaque moteur sélectionne des passages différents.\u003C/p>\n\u003Cp>Un contenu structuré en silos thématiques clairs, avec des résumés explicites en début de section, maximise la probabilité d'être sélectionné par plusieurs moteurs simultanément. C'est le principe de \u003Ca href=\"/blog/your-website-is-a-source-not-a-megaphone-via-sejournal-slobodanmanic\">votre site comme source, pas comme mégaphone\u003C/a> : vous produisez des passages citables, pas des pages monolithiques.\u003C/p>\n\u003Cp>Le \u003Ca href=\"/blog/the-10-gate-ai-search-pipeline-find-where-your-content-fails\">pipeline en 10 étapes pour diagnostiquer les échecs de citation AI\u003C/a> est un bon framework pour identifier à quelle étape chaque moteur décroche.\u003C/p>\n\u003Ch2>Stratégie multi-moteur : réduire le gap sans optimiser pour un seul LLM\u003C/h2>\n\u003Cp>L'erreur serait d'optimiser spécifiquement pour ChatGPT parce que c'est là que vous êtes déjà visible. Le Consensus Gap se réduit par des fondamentaux techniques solides, pas par du tuning spécifique à un moteur.\u003C/p>\n\u003Ch3>Accès universel aux bots\u003C/h3>\n\u003Cp>Première étape, non négociable : vérifier que tous les bots AI majeurs accèdent à votre contenu. Pas seulement dans le \u003Ccode>robots.txt\u003C/code> — aussi dans le WAF, les règles de rate limiting, et les configurations CDN.\u003C/p>\n\u003Cp>Bots à autoriser explicitement :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Ccode>Googlebot\u003C/code> (Gemini)\u003C/li>\n\u003Cli>\u003Ccode>Bingbot\u003C/code> (Copilot/ChatGPT browsing)\u003C/li>\n\u003Cli>\u003Ccode>PerplexityBot\u003C/code> (Perplexity)\u003C/li>\n\u003Cli>\u003Ccode>anthropic-ai\u003C/code> (Claude)\u003C/li>\n\u003Cli>\u003Ccode>Google-Extended\u003C/code> (entraînement Gemini — à autoriser si vous voulez être dans le modèle, pas seulement dans le grounding)\u003C/li>\n\u003C/ul>\n\u003Cp>Le \u003Ca href=\"/blog/google-is-testing-new-bot-authorization-standard-via-sejournal-martinibuster\">nouveau standard d'autorisation de bots testé par Google\u003C/a> va potentiellement simplifier cette gestion à terme, mais aujourd'hui c'est encore du cas par cas.\u003C/p>\n\u003Ch3>Contenu structuré pour le passage retrieval\u003C/h3>\n\u003Cp>Chaque section de votre contenu doit pouvoir être extraite indépendamment et rester compréhensible. Concrètement :\u003C/p>\n\u003Cul>\n\u003Cli>Un H2 explicite qui pose la question ou le sujet\u003C/li>\n\u003Cli>Un paragraphe de réponse directe dans les 2-3 premières phrases\u003C/li>\n\u003Cli>Des données factuelles (chiffres, comparaisons) dans le corps de la section\u003C/li>\n\u003Cli>Une phrase de synthèse en fin de section\u003C/li>\n\u003C/ul>\n\u003Cp>Cette structure fonctionne avec tous les pipelines de retrieval car elle correspond au pattern de \"passage utile\" que les modèles d'embedding cherchent à identifier.\u003C/p>\n\u003Ch3>Monitoring continu du Consensus Score\u003C/h3>\n\u003Cp>Le Consensus Gap n'est pas statique. Il évolue à chaque mise à jour de modèle, chaque modification de pipeline de grounding, chaque changement dans votre propre contenu. Un outil de monitoring comme Seogard qui détecte les régressions techniques (meta disparues, bots bloqués, structured data cassées) est la couche de base nécessaire — mais le monitoring du Consensus Score lui-même nécessite une couche supplémentaire de suivi par moteur AI.\u003C/p>\n\u003Cp>Le \u003Ca href=\"/blog/why-ai-search-skips-your-content-and-how-to-diagnose-where-it-s-failing-via-sejournal-jeffrey-coyle\">diagnostic des échecs de visibilité AI\u003C/a> doit être fait moteur par moteur, pas en agrégé.\u003C/p>\n\u003Ch2>Implications pour la mesure de la visibilité AI\u003C/h2>\n\u003Cp>Le Consensus Gap remet en cause les métriques de visibilité AI telles qu'elles sont généralement présentées. Un score unique n'a pas de sens. Voici ce qu'il faut mesurer à la place :\u003C/p>\n\u003Cp>\u003Cstrong>Par moteur :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Taux de citation (% de requêtes où votre domaine est cité)\u003C/li>\n\u003Cli>Position dans la réponse (source principale vs mention secondaire)\u003C/li>\n\u003Cli>Type de contenu cité (page produit, article, page catégorie)\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>Agrégé, mais avec contexte :\u003C/strong>\u003C/p>\n\u003Cul>\n\u003Cli>Consensus Score moyen sur le corpus de requêtes\u003C/li>\n\u003Cli>Distribution du gap (sur combien de requêtes y a-t-il un écart > 1 moteur ?)\u003C/li>\n\u003Cli>Tendance temporelle (le gap se réduit-il ou s'amplifie-t-il ?)\u003C/li>\n\u003C/ul>\n\u003Cp>Les \u003Ca href=\"/blog/how-to-run-prompt-level-seo-experiments-for-ai-search\">expériences de SEO au niveau des prompts\u003C/a> sont la méthode la plus fiable pour collecter ces données de façon systématique, en testant la même requête formulée de différentes manières sur chaque moteur.\u003C/p>\n\u003Cp>La visibilité AI n'est pas un score unique. C'est un vecteur multidimensionnel. Le Consensus Gap est la métrique qui capture la variance de ce vecteur — et c'est cette variance qui détermine si votre investissement en contenu est robuste ou fragile face à la fragmentation des moteurs AI.\u003C/p>\n\u003Cp>Le takeaway est clair : décomposez votre visibilité AI par moteur, identifiez les blocages techniques spécifiques à chaque pipeline, et mesurez le Consensus Score comme un KPI de premier ordre. Si vous ne surveillez qu'un score agrégé, vous optimisez à l'aveugle.\u003C/p>",null,12,[18,19,20,21,22],"consensus gap","AI search","LLM visibility","GEO","multi-engine","The Consensus Gap : votre marque visible sur un LLM, invisible sur deux autres","Tue May 12 2026 10:02:40 GMT+0000 (Coordinated Universal Time)",[26,40,55],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":31,"description":32,"image":15,"imageAlt":15,"readingTime":16,"tags":33,"title":38,"updatedAt":39},"6a041412aa6b273b0c40f181","how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","https://seogard.io/blog/how-to-build-local-pages-that-win-in-ai-powered-search-via-sejournal-lorenbaker","2026-05-13T06:02:58.743Z","2026-05-13","Guide technique pour construire des pages locales qui performent dans les AI Overviews et AI Mode. Schema, SSR, contenu structuré.",[34,19,35,36,37],"local SEO","pages locales","schema markup","SSR","Pages locales pour l'AI Search : architecture technique","Wed May 13 2026 06:02:58 GMT+0000 (Coordinated Universal Time)",{"_id":41,"slug":42,"__v":6,"author":7,"canonical":43,"category":10,"createdAt":44,"date":12,"description":45,"image":15,"imageAlt":15,"readingTime":46,"tags":47,"title":53,"updatedAt":54},"6a02c291aa6b273b0c2a74f9","the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","https://seogard.io/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus","2026-05-12T06:02:57.339Z","Comment adapter votre audit technique SEO aux exigences des AI Overviews, du crawl par les LLMs et du grounding. Méthodes, code et scénarios concrets.",14,[48,49,50,51,52],"tech seo audit","ai search","ai visibility","crawl budget","structured data","Audit SEO technique pour l'ère AI Search : guide avancé","Tue May 12 2026 06:02:57 GMT+0000 (Coordinated Universal Time)",{"_id":56,"slug":57,"__v":6,"author":7,"canonical":58,"category":10,"createdAt":59,"date":12,"description":60,"image":15,"imageAlt":15,"readingTime":16,"tags":61,"title":67,"updatedAt":68},"6a034125aa6b273b0c92e66e","how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse","https://seogard.io/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse","2026-05-12T15:03:01.689Z","Comment des soft 404s massives après une migration ont provoqué une chute de 90% du trafic organique, et les étapes techniques pour inverser la tendance.",[62,63,64,65,66],"soft 404","indexation","migration","Search Console","SEO technique","Soft 404s et désindexation : autopsie d'un crash de trafic à -90%","Tue May 12 2026 15:03:01 GMT+0000 (Coordinated Universal Time)"]