[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fYN0aquCfwnODSHbDhAhBwVYup-i5sgjvW4Q2pjJpPv0":3,"$fBm31u8M0_7Sgj3eWXBSdEIa-fvJOmCRA08Hf8HTGukQ":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},"6a09925caa6b273b0cc95107","a-smarter-way-to-track-serp-visibility-in-ai-search-webinar-via-sejournal-lorenbaker",0,"Equipe Seogard","Un e-commerce de 12 000 pages maintient ses positions moyennes à 4.2 dans Search Console. Pourtant, le trafic organique chute de 23 % en six mois. Le coupable : les AI Overviews captent l'attention au-dessus du fold, les Product Packs aspirent les clics transactionnels, et les rich results historiques (FAQ) ont disparu. Le ranking n'a pas bougé. La visibilité réelle, si.\n\n## Le ranking classique est un indicateur cassé\n\nPendant 20 ans, le SEO s'est construit sur une métrique simple : la position dans les résultats organiques. Position 1, 2, 3 — le reste découlait mécaniquement. Ce modèle reposait sur une hypothèse implicite : les 10 liens bleus occupent la quasi-totalité de la viewport visible.\n\nCette hypothèse est fausse depuis 2024, et elle est devenue dangereuse en 2026.\n\n### L'inflation des SERP features\n\nUne requête transactionnelle comme \"chaussures trail Gore-Tex\" génère aujourd'hui, selon le device et la localisation, une combinaison de : AI Overview (souvent déplié sur 400-600px de hauteur), Product Packs avec images et prix, People Also Ask, vidéos YouTube en carousel, et — parfois — des liens organiques classiques. Le premier lien bleu apparaît régulièrement sous le fold sur mobile.\n\nLe problème technique est clair : la \"position 1\" organiqe ne correspond plus à un emplacement physique fixe dans la page. Deux requêtes avec la même position moyenne peuvent avoir des CTR radicalement différents selon les features affichées au-dessus.\n\n### Pourquoi la position moyenne de Search Console ment\n\nGoogle Search Console rapporte la position moyenne du lien organique, pas la position visuelle dans la viewport. Un site en position 3 avec un AI Overview déplié au-dessus se retrouve visuellement en position 8 ou 9 en termes de pixels scrollés. Search Console ne fait aucune distinction.\n\nPour quantifier ce décalage, vous pouvez extraire les données GSC via l'API et les croiser avec la présence de SERP features par requête :\n\n```python\nimport requests\nimport json\n\n# Extraction des données GSC via l'API\ndef get_gsc_data(site_url, access_token, start_date, end_date):\n    endpoint = f\"https://www.googleapis.com/webmasters/v3/sites/{site_url}/searchAnalytics/query\"\n    payload = {\n        \"startDate\": start_date,\n        \"endDate\": end_date,\n        \"dimensions\": [\"query\", \"page\"],\n        \"rowLimit\": 5000,\n        \"dimensionFilterGroups\": [{\n            \"filters\": [{\n                \"dimension\": \"country\",\n                \"expression\": \"fra\"\n            }]\n        }]\n    }\n    headers = {\"Authorization\": f\"Bearer {access_token}\"}\n    response = requests.post(endpoint, headers=headers, json=payload)\n    rows = response.json().get(\"rows\", [])\n    \n    # Identifier les requêtes à fort décalage position/CTR\n    anomalies = []\n    for row in rows:\n        position = row[\"position\"]\n        ctr = row[\"ctr\"]\n        clicks = row[\"clicks\"]\n        impressions = row[\"impressions\"]\n        \n        # CTR attendu pour la position (courbe historique approximative)\n        expected_ctr = estimate_expected_ctr(position)\n        \n        if ctr \u003C expected_ctr * 0.5 and impressions > 100:\n            anomalies.append({\n                \"query\": row[\"keys\"][0],\n                \"page\": row[\"keys\"][1],\n                \"position\": round(position, 1),\n                \"ctr\": round(ctr * 100, 2),\n                \"expected_ctr\": round(expected_ctr * 100, 2),\n                \"ctr_deficit\": round((1 - ctr / expected_ctr) * 100, 1),\n                \"lost_clicks\": round(impressions * (expected_ctr - ctr))\n            })\n    \n    return sorted(anomalies, key=lambda x: x[\"lost_clicks\"], reverse=True)\n\ndef estimate_expected_ctr(position):\n    # Courbe CTR/position pré-AI Overviews (données internes)\n    ctr_curve = {1: 0.28, 2: 0.15, 3: 0.11, 4: 0.08, 5: 0.06,\n                 6: 0.045, 7: 0.035, 8: 0.03, 9: 0.025, 10: 0.02}\n    pos_rounded = min(max(round(position), 1), 10)\n    return ctr_curve.get(pos_rounded, 0.015)\n```\n\nCe script identifie les requêtes où votre CTR réel est inférieur de 50 % ou plus au CTR attendu pour la position. Le champ `lost_clicks` quantifie le manque à gagner. Sur un site de 12 000 pages avec 800 000 impressions mensuelles, ce type d'analyse révèle généralement entre 15 000 et 40 000 clics \"fantômes\" — des clics que votre position devrait théoriquement générer mais qui sont captés par les SERP features au-dessus.\n\n## Cartographier les AI Overviews : scraping et détection\n\nPour tracker votre visibilité dans les AI Overviews, la première étape est de détecter quelles requêtes déclenchent une AI Overview et si votre domaine y est cité. Google ne fournit aucune donnée native sur ce sujet dans Search Console (à la date de publication).\n\n### Détection automatisée des AI Overviews\n\nLes outils de rank tracking premium (Semrush, Ahrefs, Advanced Web Ranking) ont ajouté le tracking des AI Overviews dans leurs interfaces. Mais pour un contrôle granulaire sur vos propres requêtes prioritaires, un scraping ciblé reste nécessaire.\n\nL'AI Overview injecte du contenu dans un conteneur identifiable dans le DOM. La structure varie, mais le pattern suivant permet une détection fiable :\n\n```javascript\n// Script Puppeteer pour détecter les AI Overviews et extraire les sources citées\nconst puppeteer = require('puppeteer');\n\nasync function detectAIOvierviewForQuery(query, gl = 'fr', hl = 'fr') {\n  const browser = await puppeteer.launch({\n    headless: 'new',\n    args: ['--no-sandbox', '--disable-setuid-sandbox']\n  });\n  \n  const page = await browser.newPage();\n  \n  // User-agent mobile (les AI Overviews apparaissent plus souvent sur mobile)\n  await page.setUserAgent(\n    'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 ' +\n    '(KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36'\n  );\n  \n  const searchUrl = `https://www.google.com/search?q=${encodeURIComponent(query)}&gl=${gl}&hl=${hl}`;\n  await page.goto(searchUrl, { waitUntil: 'networkidle2', timeout: 30000 });\n  \n  // Attendre le rendu complet (les AI Overviews chargent de manière asynchrone)\n  await page.waitForTimeout(3000);\n  \n  // Détection de l'AI Overview via les sélecteurs connus\n  const aiOverviewData = await page.evaluate(() => {\n    // Sélecteurs multiples : Google modifie régulièrement le DOM\n    const selectors = [\n      '[data-sgrd=\"true\"]',        // AI Overview container (2025+)\n      '#m-x-content',              // Ancien conteneur SGE\n      '[jsname=\"N760b\"]',          // Variante récente\n      'div[data-attrid=\"wa:/description\"]' // Fallback\n    ];\n    \n    let container = null;\n    for (const sel of selectors) {\n      container = document.querySelector(sel);\n      if (container) break;\n    }\n    \n    if (!container) return { hasAIOverview: false };\n    \n    // Extraire les liens sources cités dans l'AI Overview\n    const sourceLinks = Array.from(container.querySelectorAll('a[href]'))\n      .map(a => ({\n        url: a.href,\n        domain: new URL(a.href).hostname,\n        anchorText: a.textContent.trim()\n      }))\n      .filter(l => !l.url.includes('google.com'));\n    \n    // Mesurer la hauteur du bloc AI Overview\n    const rect = container.getBoundingClientRect();\n    \n    return {\n      hasAIOverview: true,\n      height: Math.round(rect.height),\n      sourceCount: sourceLinks.length,\n      sources: sourceLinks,\n      textLength: container.textContent.length\n    };\n  });\n  \n  await browser.close();\n  return { query, ...aiOverviewData };\n}\n\n// Exécution sur un batch de requêtes prioritaires\nasync function batchDetect(queries) {\n  const results = [];\n  for (const q of queries) {\n    const result = await detectAIOvierviewForQuery(q);\n    results.push(result);\n    // Rate limiting pour éviter les CAPTCHAs\n    await new Promise(r => setTimeout(r, 5000 + Math.random() * 5000));\n  }\n  return results;\n}\n```\n\n**Attention** : ce type de scraping viole les ToS de Google. En production, utilisez les APIs des outils de rank tracking ou les données de SERPs fournies par des providers comme DataForSEO ou ValueSERPs. Le script ci-dessus illustre la mécanique de détection pour comprendre ce que ces outils font sous le capot.\n\n### Construire un score de SERP visibility composite\n\nLa position organique seule est insuffisante. Un score de visibilité SERP composite doit intégrer :\n\n- **Position organique pondérée** par le CTR réel (pas le CTR théorique)\n- **Présence dans l'AI Overview** : cité comme source, oui/non, et rang parmi les sources\n- **Présence dans les SERP features** : Product Packs, featured snippets, People Also Ask\n- **Pixel position** : la position en pixels du premier élément visible lié à votre domaine\n\nLa disparition des FAQ rich results — [un changement que Google a officialisé](/blog/google-to-no-longer-support-faq-rich-results) — illustre parfaitement pourquoi un scoring statique ne fonctionne pas. Un site qui comptait sur les FAQ pour occuper de l'espace visuel dans les SERPs a vu sa \"visibility footprint\" chuter sans aucun changement de ranking.\n\n## Mesurer votre présence dans les réponses IA : au-delà de Google\n\nLa visibilité dans l'AI Search ne se limite pas aux AI Overviews de Google. Bing avec ses réponses Copilot, ChatGPT avec sa navigation web, Perplexity, et les intégrations IA dans les navigateurs — chaque canal a sa propre logique de sélection de sources.\n\n### Le grounding : le nouveau facteur de visibilité\n\nLe concept de \"grounding\" — la manière dont les LLMs ancrent leurs réponses dans des sources web — est fondamental pour comprendre la visibilité IA. Bing a explicitement décrit [comment le grounding diffère de l'indexation traditionnelle](/blog/bing-team-describes-how-grounding-differs-from-search-indexing-via-sejournal-mattgsouthern). Un contenu peut être indexé sans jamais servir de source de grounding, et inversement.\n\nPour tracker votre visibilité dans ces canaux IA, vous devez interroger directement les APIs ou les interfaces :\n\n```bash\n# Script bash pour tracker les mentions de votre domaine dans Perplexity\n# via leur API (nécessite une clé API Pro)\n\nDOMAIN=\"votredomaine.fr\"\nQUERIES_FILE=\"queries_prioritaires.txt\"\nOUTPUT_FILE=\"ai_visibility_$(date +%Y%m%d).json\"\n\necho \"[\" > $OUTPUT_FILE\n\nwhile IFS= read -r query; do\n  # Appel API Perplexity\n  RESPONSE=$(curl -s -X POST \"https://api.perplexity.ai/chat/completions\" \\\n    -H \"Authorization: Bearer $PERPLEXITY_API_KEY\" \\\n    -H \"Content-Type: application/json\" \\\n    -d \"{\n      \\\"model\\\": \\\"llama-3.1-sonar-large-128k-online\\\",\n      \\\"messages\\\": [{\n        \\\"role\\\": \\\"user\\\",\n        \\\"content\\\": \\\"$query\\\"\n      }],\n      \\\"return_citations\\\": true\n    }\")\n  \n  # Extraire les citations et vérifier la présence du domaine\n  CITATIONS=$(echo $RESPONSE | jq -r '.citations // []')\n  DOMAIN_CITED=$(echo $CITATIONS | jq \"[.[] | select(contains(\\\"$DOMAIN\\\"))] | length\")\n  TOTAL_CITATIONS=$(echo $CITATIONS | jq 'length')\n  \n  echo \"{\\\"query\\\": \\\"$query\\\", \\\"domain_citations\\\": $DOMAIN_CITED, \\\"total_citations\\\": $TOTAL_CITATIONS, \\\"cited\\\": $([ $DOMAIN_CITED -gt 0 ] && echo true || echo false)},\" >> $OUTPUT_FILE\n  \n  sleep 2\ndone \u003C \"$QUERIES_FILE\"\n\n# Fermer le JSON\nsed -i '$ s/,$//' $OUTPUT_FILE\necho \"]\" >> $OUTPUT_FILE\n\necho \"Résultats sauvegardés dans $OUTPUT_FILE\"\necho \"Taux de citation: $(jq '[.[] | select(.cited == true)] | length' $OUTPUT_FILE)/$(jq 'length' $OUTPUT_FILE) requêtes\"\n```\n\nCe script génère un rapport quotidien de votre taux de citation dans les réponses Perplexity. En le combinant avec un tracking similaire sur Bing Copilot et les AI Overviews de Google, vous obtenez une vue trilatérale de votre visibilité IA.\n\nLe problème est la multiplicité des couches à surveiller. Comme le souligne [cet article sur les trois couches distinctes de la visibilité IA](/blog/stop-treating-ai-visibility-as-one-problem-it-s-actually-three-on-three-different-layers-via-sejournal-duaneforrester), traiter l'AI visibility comme un problème unique est une erreur structurelle. Il y a la couche d'indexation, la couche de grounding, et la couche de présentation — et vos leviers sont différents à chaque étage.\n\n## Scénario concret : un média de 8 000 pages face à l'érosion invisible\n\nPrenons un cas réaliste. Un média spécialisé dans la tech grand public publie 8 000 articles actifs. En janvier 2026, les métriques GSC montrent :\n\n- **Impressions** : 2.1M/mois (stable)\n- **Position moyenne** : 6.8 (stable, voire en légère amélioration)\n- **Clics** : 145 000/mois (en baisse de 18 % vs. janvier 2025)\n- **CTR moyen** : 6.9 % (en baisse, était à 8.4 %)\n\nLe diagnostic classique dirait : \"les positions sont stables, le CTR baisse probablement à cause de la saisonnalité\". Le diagnostic réel est tout autre.\n\n### Analyse par cluster de requêtes\n\nEn segmentant les requêtes par type d'intent et par présence de SERP features, le tableau change :\n\n**Requêtes informationnelles** (60 % du volume) : AI Overviews présents sur 72 % d'entre elles. Le CTR passe de 9.1 % à 4.8 % en un an. Sur ces requêtes, le média est cité dans l'AI Overview dans seulement 11 % des cas — alors qu'il ranke dans le top 5 sur 45 % d'entre elles. La majorité du contenu est \"consommée\" via l'AI Overview sans clic.\n\n**Requêtes comparatives** (\"meilleur smartphone 2026\", \"X vs Y\") : Google affiche systématiquement un AI Overview avec un tableau comparatif. Le média avait historiquement un featured snippet sur 30 % de ces requêtes — ce snippet est désormais remplacé par l'AI Overview dans la moitié des cas.\n\n**Requêtes de test/review** : les Product Packs apparaissent en haut de SERP. [Google traite désormais ces packs comme un canal de vente primaire](/blog/google-s-product-packs-are-now-a-primary-sales-channel-here-s-what-the-data-shows), repoussant les avis éditoriaux sous le fold.\n\n### Plan d'action mis en oeuvre\n\nL'équipe SEO du média a implémenté une stratégie en trois axes :\n\n**1. Restructuration du contenu pour le grounding IA**\n\nLes articles comparatifs ont été restructurés avec des données tabulaires balisées en `\u003Ctable>` sémantique + schema.org `ItemList`. L'hypothèse : les LLMs extraient plus facilement des données structurées pour alimenter leurs réponses, augmentant la probabilité de citation.\n\n**2. Suivi quotidien de la \"share of AI voice\"**\n\nUn dashboard Looker Studio agrège quotidiennement :\n- Le taux de citation dans les AI Overviews (via un outil tiers de tracking SERP)\n- Le ranking dans la liste des sources de l'AI Overview (source #1, #2, #3)\n- Le delta entre CTR attendu et CTR réel par cluster de requêtes\n\n**3. Optimisation du contenu pour les requêtes où l'AI Overview cite des concurrents**\n\nPour chaque requête prioritaire où un concurrent est cité dans l'AI Overview mais pas le média, une analyse du contenu concurrent est menée. Les patterns identifiés : réponses directes dans les 100 premiers mots, données factuelles récentes (dates, prix, specs), et structure claire en headings imbriqués.\n\nAprès 4 mois, les résultats : le taux de citation dans les AI Overviews passe de 11 % à 24 %. Le CTR global remonte à 7.8 %. Les clics mensuels se stabilisent à 138 000, soit une récupération partielle mais significative.\n\n## Les métriques que Google ne vous donne pas (et comment les construire)\n\nSearch Console ne fournit ni la présence dans les AI Overviews, ni la pixel position, ni la \"share of SERP\" de votre domaine. Vous devez construire ces métriques vous-même ou les obtenir via des outils tiers.\n\n### Pixel position et \"above-the-fold rate\"\n\nLa pixel position — la distance en pixels entre le haut de la SERP et votre premier résultat visible — est la métrique la plus corrélée au CTR réel en 2026. Un résultat en position organique 1 qui apparaît à 800px du haut (sous un AI Overview de 600px + un bandeau ads de 200px) performe comme un résultat en position 4-5 d'une SERP sans features.\n\nConstruire cette métrique en interne exige du scraping de SERPs avec mesure du DOM. Les outils comme Semrush Sensor et Advanced Web Ranking commencent à exposer cette donnée, mais de manière limitée.\n\n### Share of SERP : combien d'espace visuel vous occupez\n\nLa métrique \"share of SERP\" mesure le pourcentage de la viewport SERP occupé par votre domaine, toutes features confondues. Si votre domaine apparaît dans un lien organique en position 3 ET dans la section sources de l'AI Overview ET dans un People Also Ask, votre share of SERP est significativement supérieure à celle d'un concurrent qui n'a qu'un lien en position 2.\n\nLe calcul conceptuel :\n\n```\nShare of SERP = (Pixels occupés par votre domaine / Pixels totaux de la SERP visible) × 100\n```\n\nCette métrique est difficile à automatiser à grande échelle, mais elle peut être approximée en combinant les données de ranking organique, de présence dans les SERP features, et de citation dans les AI Overviews.\n\n### Tracking de la perception de marque dans les réponses IA\n\nUn aspect souvent négligé : les AI Overviews et les réponses Copilot/ChatGPT ne citent pas seulement votre contenu — ils reformulent vos informations, parfois de manière déformée. [Des données montrent que les AI Overviews exposent des avis négatifs sans intent correspondant de l'utilisateur](/blog/data-shows-ai-overviews-exposing-negative-reviews-without-user-intent-what-to-do-next-via-sejournal-erasedotcom). \n\nPour une marque e-commerce, cela signifie qu'un avis négatif isolé peut être extrait et présenté comme la réponse principale à une requête de marque. Tracker cette dimension exige de monitorer non seulement si vous êtes cité, mais comment vous êtes représenté dans les réponses IA.\n\nDe la même manière, [la propagation d'informations négatives depuis Wikipedia vers les réponses IA](/blog/how-negative-information-spreads-from-wikipedia-into-ai-search) démontre que la qualité de vos sources upstream (Wikipedia, forums, sites d'avis) impacte directement votre représentation dans l'AI Search. Le tracking de visibilité SERP doit intégrer cette couche de perception.\n\n## Adapter l'audit technique à la visibilité IA\n\nL'audit technique SEO classique vérifie l'indexabilité, le maillage, la vitesse, les canonicals. [L'audit technique pour l'ère AI Search](/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus) ajoute des dimensions spécifiques : la crawlabilité par les bots IA (GPTBot, Bingbot pour Copilot, PerplexityBot), la structure sémantique du contenu pour le grounding, et la fraîcheur des données structurées.\n\n### Vérifier l'accès des bots IA à votre contenu\n\nUn point technique que beaucoup de sites négligent : bloquer GPTBot dans robots.txt empêche OpenAI de crawler votre contenu, mais cela ne vous rend pas invisible dans ChatGPT — ChatGPT peut s'appuyer sur le cache Bing. En revanche, bloquer les bots IA réduit la probabilité d'être utilisé comme source de grounding pour les réponses récentes.\n\nVérifiez votre configuration robots.txt :\n\n```nginx\n# Vérification dans les logs serveur : quels bots IA crawlent votre site ?\n# Commande pour extraire les bots IA des access logs Nginx\n\ngrep -E \"(GPTBot|ChatGPT-User|PerplexityBot|ClaudeBot|Applebot-Extended|Google-Extended)\" \\\n  /var/log/nginx/access.log \\\n  | awk '{print $1, $14}' \\\n  | sort | uniq -c | sort -rn | head -20\n\n# Résultat typique :\n# 4521 66.249.x.x \"Google-Extended\"\n# 2103 20.15.x.x  \"GPTBot/1.2\"\n# 891  52.0.x.x   \"PerplexityBot/1.0\"\n# 234  18.x.x.x   \"ClaudeBot/1.0\"\n\n# Vérifier votre robots.txt actuel pour les bots IA\ncurl -s https://votredomaine.fr/robots.txt | grep -i -E \"(gptbot|perplexity|claude|google-extended)\"\n```\n\nSi vous ne voyez aucun crawl de ces bots, vérifiez que vous ne les bloquez pas involontairement via un Disallow global ou via Cloudflare/votre WAF.\n\n### JavaScript et visibilité IA\n\nLes sites en SPA (React, Vue, Angular) qui dépendent du rendu client posent un problème spécifique pour la visibilité IA. Les bots IA, contrairement à Googlebot, n'exécutent pas toujours le JavaScript. Un contenu rendu uniquement côté client peut être invisible pour GPTBot et PerplexityBot.\n\nLes [leçons JavaScript SEO tirées des grands sites e-commerce](/blog/5-javascript-seo-lessons-from-top-ecommerce-sites) s'appliquent avec encore plus de force dans le contexte IA. Le SSR n'est plus seulement une bonne pratique pour Google — c'est une condition nécessaire pour exister dans l'écosystème IA au sens large.\n\n## Construire un tableau de bord de SERP visibility actionnable\n\nUn dashboard efficace pour 2026 doit présenter cinq couches de données :\n\n**Couche 1 — Ranking organique classique** : positions GSC par cluster de requêtes, évolution hebdomadaire. C'est la base, mais ce n'est plus suffisant.\n\n**Couche 2 — CTR réel vs attendu** : le script Python présenté plus haut. Chaque requête où le delta dépasse 40 % est un signal d'alerte.\n\n**Couche 3 — Présence AI Overview** : pourcentage de vos requêtes top 100 qui déclenchent une AI Overview, et pourcentage de ces AI Overviews où votre domaine est cité. Données issues de votre outil de rank tracking.\n\n**Couche 4 — Visibilité multi-canal IA** : taux de citation dans Perplexity, Bing Copilot, ChatGPT Search. Données issues d'un tracking hebdomadaire sur vos 50-100 requêtes prioritaires.\n\n**Couche 5 — Perception de marque IA** : monitoring du sentiment et de la précision des informations vous concernant dans les réponses IA. C'est le plus difficile à automatiser mais potentiellement le plus impactant, surtout pour les marques e-commerce exposées aux [avis négatifs amplifiés par les AI Overviews](/blog/data-shows-ai-overviews-exposing-negative-reviews-without-user-intent-what-to-do-next-via-sejournal-erasedotcom).\n\nGoogle publie régulièrement des mises à jour sur les liens dans les AI Overviews. Les [récentes évolutions des liens dans le mode AI](/blog/google-updates-links-within-ai-overviews-ai-mode) montrent une tendance à exposer davantage de sources — une opportunité pour les sites qui optimisent pour le grounding. Suivre ces évolutions et adapter votre tracking en conséquence est un processus continu, pas un projet ponctuel.\n\nLa détection automatique de ces changements — une meta canonical qui disparaît, un SSR qui casse, un bloc de contenu structuré qui ne s'affiche plus — est exactement le type de régression qu'un outil de monitoring comme Seogard détecte en temps réel, avant que l'impact sur votre visibilité SERP ne devienne visible dans vos métriques hebdomadaires.\n\nLe ranking est mort comme métrique unique. La visibilité SERP est un composite multidimensionnel qui exige des outils, des scripts, et surtout une compréhension technique de ce que chaque couche mesure réellement. Les équipes SEO qui construisent cette infrastructure de mesure aujourd'hui auront un avantage structurel sur celles qui continuent à reporter une position moyenne de 4.2 en réunion de direction.","https://seogard.io/blog/a-smarter-way-to-track-serp-visibility-in-ai-search-webinar-via-sejournal-lorenbaker","Actualités SEO","2026-05-17T10:03:08.287Z","2026-05-17","Le ranking classique ne reflète plus la visibilité réelle. Méthodes techniques pour tracker votre présence dans les AI Overviews et SERP features.","\u003Cp>Un e-commerce de 12 000 pages maintient ses positions moyennes à 4.2 dans Search Console. Pourtant, le trafic organique chute de 23 % en six mois. Le coupable : les AI Overviews captent l'attention au-dessus du fold, les Product Packs aspirent les clics transactionnels, et les rich results historiques (FAQ) ont disparu. Le ranking n'a pas bougé. La visibilité réelle, si.\u003C/p>\n\u003Ch2>Le ranking classique est un indicateur cassé\u003C/h2>\n\u003Cp>Pendant 20 ans, le SEO s'est construit sur une métrique simple : la position dans les résultats organiques. Position 1, 2, 3 — le reste découlait mécaniquement. Ce modèle reposait sur une hypothèse implicite : les 10 liens bleus occupent la quasi-totalité de la viewport visible.\u003C/p>\n\u003Cp>Cette hypothèse est fausse depuis 2024, et elle est devenue dangereuse en 2026.\u003C/p>\n\u003Ch3>L'inflation des SERP features\u003C/h3>\n\u003Cp>Une requête transactionnelle comme \"chaussures trail Gore-Tex\" génère aujourd'hui, selon le device et la localisation, une combinaison de : AI Overview (souvent déplié sur 400-600px de hauteur), Product Packs avec images et prix, People Also Ask, vidéos YouTube en carousel, et — parfois — des liens organiques classiques. Le premier lien bleu apparaît régulièrement sous le fold sur mobile.\u003C/p>\n\u003Cp>Le problème technique est clair : la \"position 1\" organiqe ne correspond plus à un emplacement physique fixe dans la page. Deux requêtes avec la même position moyenne peuvent avoir des CTR radicalement différents selon les features affichées au-dessus.\u003C/p>\n\u003Ch3>Pourquoi la position moyenne de Search Console ment\u003C/h3>\n\u003Cp>Google Search Console rapporte la position moyenne du lien organique, pas la position visuelle dans la viewport. Un site en position 3 avec un AI Overview déplié au-dessus se retrouve visuellement en position 8 ou 9 en termes de pixels scrollés. Search Console ne fait aucune distinction.\u003C/p>\n\u003Cp>Pour quantifier ce décalage, vous pouvez extraire les données GSC via l'API et les croiser avec la présence de SERP features par requête :\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\"> requests\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> json\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Extraction des données GSC via l'API\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> get_gsc_data\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(site_url, access_token, start_date, end_date):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    endpoint \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#F97583\"> f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://www.googleapis.com/webmasters/v3/sites/\u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">site_url\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">/searchAnalytics/query\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    payload \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"startDate\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: start_date,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"endDate\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: end_date,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"dimensions\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"query\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"rowLimit\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">5000\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"dimensionFilterGroups\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">            \"filters\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: [{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"dimension\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"country\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"expression\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"fra\"\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\">    }\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    headers \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Authorization\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Bearer \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">access_token\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    response \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> requests.post(endpoint, \u003C/span>\u003Cspan style=\"color:#FFAB70\">headers\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">headers, \u003C/span>\u003Cspan style=\"color:#FFAB70\">json\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">payload)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    rows \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> response.json().get(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"rows\"\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:#6A737D\">    # Identifier les requêtes à fort décalage position/CTR\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    anomalies \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> []\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> rows:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        position \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"position\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ctr \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"ctr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        clicks \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"clicks\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        impressions \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"impressions\"\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:#6A737D\">        # CTR attendu pour la position (courbe historique approximative)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        expected_ctr \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> estimate_expected_ctr(position)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ctr \u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> expected_ctr \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0.5\u003C/span>\u003Cspan style=\"color:#F97583\"> and\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> impressions \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            anomalies.append({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"query\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"keys\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">][\u003C/span>\u003Cspan style=\"color:#79B8FF\">0\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"page\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"keys\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">][\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"position\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(position, \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"ctr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(ctr \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"expected_ctr\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(expected_ctr \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"ctr_deficit\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#F97583\"> -\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ctr \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> expected_ctr) \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                \"lost_clicks\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(impressions \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (expected_ctr \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ctr))\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:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sorted\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(anomalies, \u003C/span>\u003Cspan style=\"color:#FFAB70\">key\u003C/span>\u003Cspan style=\"color:#F97583\">=lambda\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> x: x[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"lost_clicks\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">], \u003C/span>\u003Cspan style=\"color:#FFAB70\">reverse\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">True\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> estimate_expected_ctr\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(position):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Courbe CTR/position pré-AI Overviews (données internes)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ctr_curve \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.28\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.15\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">3\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.11\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">4\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.08\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">5\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.06\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">                 6\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.045\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">7\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.035\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">8\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.03\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">9\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.025\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.02\u003C/span>\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    pos_rounded \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> min\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">max\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(position), \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">), \u003C/span>\u003Cspan style=\"color:#79B8FF\">10\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\"> ctr_curve.get(pos_rounded, \u003C/span>\u003Cspan style=\"color:#79B8FF\">0.015\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce script identifie les requêtes où votre CTR réel est inférieur de 50 % ou plus au CTR attendu pour la position. Le champ \u003Ccode>lost_clicks\u003C/code> quantifie le manque à gagner. Sur un site de 12 000 pages avec 800 000 impressions mensuelles, ce type d'analyse révèle généralement entre 15 000 et 40 000 clics \"fantômes\" — des clics que votre position devrait théoriquement générer mais qui sont captés par les SERP features au-dessus.\u003C/p>\n\u003Ch2>Cartographier les AI Overviews : scraping et détection\u003C/h2>\n\u003Cp>Pour tracker votre visibilité dans les AI Overviews, la première étape est de détecter quelles requêtes déclenchent une AI Overview et si votre domaine y est cité. Google ne fournit aucune donnée native sur ce sujet dans Search Console (à la date de publication).\u003C/p>\n\u003Ch3>Détection automatisée des AI Overviews\u003C/h3>\n\u003Cp>Les outils de rank tracking premium (Semrush, Ahrefs, Advanced Web Ranking) ont ajouté le tracking des AI Overviews dans leurs interfaces. Mais pour un contrôle granulaire sur vos propres requêtes prioritaires, un scraping ciblé reste nécessaire.\u003C/p>\n\u003Cp>L'AI Overview injecte du contenu dans un conteneur identifiable dans le DOM. La structure varie, mais le pattern suivant permet une détection fiable :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Script Puppeteer pour détecter les AI Overviews et extraire les sources citées\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> puppeteer\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#B392F0\"> require\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'puppeteer'\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\"> detectAIOvierviewForQuery\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">query\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">gl\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'fr'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">hl\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'fr'\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\"> browser\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> puppeteer.\u003C/span>\u003Cspan style=\"color:#B392F0\">launch\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    headless: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'new'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    args: [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'--no-sandbox'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'--disable-setuid-sandbox'\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\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> page\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> browser.\u003C/span>\u003Cspan style=\"color:#B392F0\">newPage\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:#6A737D\">  // User-agent mobile (les AI Overviews apparaissent plus souvent sur mobile)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> page.\u003C/span>\u003Cspan style=\"color:#B392F0\">setUserAgent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    'Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 '\u003C/span>\u003Cspan style=\"color:#F97583\"> +\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    '(KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36'\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:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> searchUrl\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> `https://www.google.com/search?q=${\u003C/span>\u003Cspan style=\"color:#B392F0\">encodeURIComponent\u003C/span>\u003Cspan style=\"color:#9ECBFF\">(\u003C/span>\u003Cspan style=\"color:#E1E4E8\">query\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}&#x26;gl=${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">gl\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}&#x26;hl=${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">hl\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}`\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> page.\u003C/span>\u003Cspan style=\"color:#B392F0\">goto\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(searchUrl, { waitUntil: \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'networkidle2'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, timeout: \u003C/span>\u003Cspan style=\"color:#79B8FF\">30000\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:#6A737D\">  // Attendre le rendu complet (les AI Overviews chargent de manière asynchrone)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> page.\u003C/span>\u003Cspan style=\"color:#B392F0\">waitForTimeout\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#79B8FF\">3000\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:#6A737D\">  // Détection de l'AI Overview via les sélecteurs connus\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> aiOverviewData\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> page.\u003C/span>\u003Cspan style=\"color:#B392F0\">evaluate\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:#6A737D\">    // Sélecteurs multiples : Google modifie régulièrement le DOM\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> selectors\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '[data-sgrd=\"true\"]'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,        \u003C/span>\u003Cspan style=\"color:#6A737D\">// AI Overview container (2025+)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '#m-x-content'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,              \u003C/span>\u003Cspan style=\"color:#6A737D\">// Ancien conteneur SGE\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      '[jsname=\"N760b\"]'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,          \u003C/span>\u003Cspan style=\"color:#6A737D\">// Variante récente\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      'div[data-attrid=\"wa:/description\"]'\u003C/span>\u003Cspan style=\"color:#6A737D\"> // Fallback\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:#F97583\">    let\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> container \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:#F97583\">    for\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sel\u003C/span>\u003Cspan style=\"color:#F97583\"> of\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> selectors) {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      container \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> document.\u003C/span>\u003Cspan style=\"color:#B392F0\">querySelector\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(sel);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (container) \u003C/span>\u003Cspan style=\"color:#F97583\">break\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\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> (\u003C/span>\u003Cspan style=\"color:#F97583\">!\u003C/span>\u003Cspan style=\"color:#E1E4E8\">container) \u003C/span>\u003Cspan style=\"color:#F97583\">return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { hasAIOverview: \u003C/span>\u003Cspan style=\"color:#79B8FF\">false\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:#6A737D\">    // Extraire les liens sources cités dans l'AI Overview\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> sourceLinks\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Array.\u003C/span>\u003Cspan style=\"color:#B392F0\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(container.\u003C/span>\u003Cspan style=\"color:#B392F0\">querySelectorAll\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'a[href]'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">))\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\">a\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        url: a.href,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        domain: \u003C/span>\u003Cspan style=\"color:#F97583\">new\u003C/span>\u003Cspan style=\"color:#B392F0\"> URL\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(a.href).hostname,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        anchorText: a.textContent.\u003C/span>\u003Cspan style=\"color:#B392F0\">trim\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>\u003Cspan style=\"color:#B392F0\">filter\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">l\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#F97583\"> !\u003C/span>\u003Cspan style=\"color:#E1E4E8\">l.url.\u003C/span>\u003Cspan style=\"color:#B392F0\">includes\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'google.com'\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:#6A737D\">    // Mesurer la hauteur du bloc AI Overview\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> rect\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> container.\u003C/span>\u003Cspan style=\"color:#B392F0\">getBoundingClientRect\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:#F97583\">    return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      hasAIOverview: \u003C/span>\u003Cspan style=\"color:#79B8FF\">true\u003C/span>\u003Cspan style=\"color:#E1E4E8\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      height: Math.\u003C/span>\u003Cspan style=\"color:#B392F0\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(rect.height),\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      sourceCount: sourceLinks.\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\">      sources: sourceLinks,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      textLength: container.textContent.\u003C/span>\u003Cspan style=\"color:#79B8FF\">length\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\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">  await\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> browser.\u003C/span>\u003Cspan style=\"color:#B392F0\">close\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\"> { query, \u003C/span>\u003Cspan style=\"color:#F97583\">...\u003C/span>\u003Cspan style=\"color:#E1E4E8\">aiOverviewData };\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\">// Exécution sur un batch de requêtes prioritaires\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">async\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> batchDetect\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">queries\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\"> results\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [];\u003C/span>\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\"> q\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:#F97583\">    const\u003C/span>\u003Cspan style=\"color:#79B8FF\"> result\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#F97583\"> await\u003C/span>\u003Cspan style=\"color:#B392F0\"> detectAIOvierviewForQuery\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(q);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    results.\u003C/span>\u003Cspan style=\"color:#B392F0\">push\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(result);\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    // Rate limiting pour éviter les CAPTCHAs\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    await\u003C/span>\u003Cspan style=\"color:#F97583\"> new\u003C/span>\u003Cspan style=\"color:#79B8FF\"> Promise\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#FFAB70\">r\u003C/span>\u003Cspan style=\"color:#F97583\"> =>\u003C/span>\u003Cspan style=\"color:#B392F0\"> setTimeout\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(r, \u003C/span>\u003Cspan style=\"color:#79B8FF\">5000\u003C/span>\u003Cspan style=\"color:#F97583\"> +\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> Math.\u003C/span>\u003Cspan style=\"color:#B392F0\">random\u003C/span>\u003Cspan style=\"color:#E1E4E8\">() \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 5000\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:#F97583\">  return\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> results;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>\u003Cstrong>Attention\u003C/strong> : ce type de scraping viole les ToS de Google. En production, utilisez les APIs des outils de rank tracking ou les données de SERPs fournies par des providers comme DataForSEO ou ValueSERPs. Le script ci-dessus illustre la mécanique de détection pour comprendre ce que ces outils font sous le capot.\u003C/p>\n\u003Ch3>Construire un score de SERP visibility composite\u003C/h3>\n\u003Cp>La position organique seule est insuffisante. Un score de visibilité SERP composite doit intégrer :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Position organique pondérée\u003C/strong> par le CTR réel (pas le CTR théorique)\u003C/li>\n\u003Cli>\u003Cstrong>Présence dans l'AI Overview\u003C/strong> : cité comme source, oui/non, et rang parmi les sources\u003C/li>\n\u003Cli>\u003Cstrong>Présence dans les SERP features\u003C/strong> : Product Packs, featured snippets, People Also Ask\u003C/li>\n\u003Cli>\u003Cstrong>Pixel position\u003C/strong> : la position en pixels du premier élément visible lié à votre domaine\u003C/li>\n\u003C/ul>\n\u003Cp>La disparition des FAQ rich results — \u003Ca href=\"/blog/google-to-no-longer-support-faq-rich-results\">un changement que Google a officialisé\u003C/a> — illustre parfaitement pourquoi un scoring statique ne fonctionne pas. Un site qui comptait sur les FAQ pour occuper de l'espace visuel dans les SERPs a vu sa \"visibility footprint\" chuter sans aucun changement de ranking.\u003C/p>\n\u003Ch2>Mesurer votre présence dans les réponses IA : au-delà de Google\u003C/h2>\n\u003Cp>La visibilité dans l'AI Search ne se limite pas aux AI Overviews de Google. Bing avec ses réponses Copilot, ChatGPT avec sa navigation web, Perplexity, et les intégrations IA dans les navigateurs — chaque canal a sa propre logique de sélection de sources.\u003C/p>\n\u003Ch3>Le grounding : le nouveau facteur de visibilité\u003C/h3>\n\u003Cp>Le concept de \"grounding\" — la manière dont les LLMs ancrent leurs réponses dans des sources web — est fondamental pour comprendre la visibilité IA. Bing a explicitement décrit \u003Ca href=\"/blog/bing-team-describes-how-grounding-differs-from-search-indexing-via-sejournal-mattgsouthern\">comment le grounding diffère de l'indexation traditionnelle\u003C/a>. Un contenu peut être indexé sans jamais servir de source de grounding, et inversement.\u003C/p>\n\u003Cp>Pour tracker votre visibilité dans ces canaux IA, vous devez interroger directement les APIs ou les interfaces :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Script bash pour tracker les mentions de votre domaine dans Perplexity\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># via leur API (nécessite une clé API Pro)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">DOMAIN\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"votredomaine.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">QUERIES_FILE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"queries_prioritaires.txt\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">OUTPUT_FILE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"ai_visibility_$(\u003C/span>\u003Cspan style=\"color:#B392F0\">date\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> +%Y%m%d).json\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"[\"\u003C/span>\u003Cspan style=\"color:#F97583\"> >\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $OUTPUT_FILE\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">while\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> IFS\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\"> read\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -r\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> query\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#F97583\">do\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">  # Appel API Perplexity\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  RESPONSE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#B392F0\">curl\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -s\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -X\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> POST\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"https://api.perplexity.ai/chat/completions\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    -H\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Authorization: Bearer \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$PERPLEXITY_API_KEY\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    -H\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Content-Type: application/json\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    -d\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">model\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">llama-3.1-sonar-large-128k-online\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">messages\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: [{\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">role\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">user\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        \\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">content\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$query\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">      }],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">      \\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">return_citations\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: true\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\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:#6A737D\">  # Extraire les citations et vérifier la présence du domaine\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  CITATIONS\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $RESPONSE \u003C/span>\u003Cspan style=\"color:#F97583\">|\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -r\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '.citations // []'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  DOMAIN_CITED\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $CITATIONS \u003C/span>\u003Cspan style=\"color:#F97583\">|\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"[.[] | select(contains(\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$DOMAIN\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">))] | length\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  TOTAL_CITATIONS\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $CITATIONS \u003C/span>\u003Cspan style=\"color:#F97583\">|\u003C/span>\u003Cspan style=\"color:#B392F0\"> jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '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\">\u003Cspan style=\"color:#79B8FF\">  echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"{\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">query\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$query\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">domain_citations\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$DOMAIN_CITED\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">total_citations\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$TOTAL_CITATIONS\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">cited\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\\"\u003C/span>\u003Cspan style=\"color:#9ECBFF\">: $([ \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$DOMAIN_CITED\u003C/span>\u003Cspan style=\"color:#F97583\"> -gt\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 0\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> ] &#x26;&#x26; \u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#79B8FF\"> true\u003C/span>\u003Cspan style=\"color:#F97583\"> ||\u003C/span>\u003Cspan style=\"color:#79B8FF\"> echo\u003C/span>\u003Cspan style=\"color:#79B8FF\"> false\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)},\"\u003C/span>\u003Cspan style=\"color:#F97583\"> >>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $OUTPUT_FILE\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  \u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">  sleep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 2\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">done\u003C/span>\u003Cspan style=\"color:#F97583\"> &#x3C;\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$QUERIES_FILE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Fermer le JSON\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#B392F0\">sed\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -i\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '$ s/,$//'\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $OUTPUT_FILE\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"]\"\u003C/span>\u003Cspan style=\"color:#F97583\"> >>\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> $OUTPUT_FILE\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Résultats sauvegardés dans \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$OUTPUT_FILE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Taux de citation: $(\u003C/span>\u003Cspan style=\"color:#B392F0\">jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '[.[] | select(.cited == true)] | length' \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$OUTPUT_FILE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)/$(\u003C/span>\u003Cspan style=\"color:#B392F0\">jq\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'length' \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$OUTPUT_FILE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">) requêtes\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Ce script génère un rapport quotidien de votre taux de citation dans les réponses Perplexity. En le combinant avec un tracking similaire sur Bing Copilot et les AI Overviews de Google, vous obtenez une vue trilatérale de votre visibilité IA.\u003C/p>\n\u003Cp>Le problème est la multiplicité des couches à surveiller. Comme le souligne \u003Ca href=\"/blog/stop-treating-ai-visibility-as-one-problem-it-s-actually-three-on-three-different-layers-via-sejournal-duaneforrester\">cet article sur les trois couches distinctes de la visibilité IA\u003C/a>, traiter l'AI visibility comme un problème unique est une erreur structurelle. Il y a la couche d'indexation, la couche de grounding, et la couche de présentation — et vos leviers sont différents à chaque étage.\u003C/p>\n\u003Ch2>Scénario concret : un média de 8 000 pages face à l'érosion invisible\u003C/h2>\n\u003Cp>Prenons un cas réaliste. Un média spécialisé dans la tech grand public publie 8 000 articles actifs. En janvier 2026, les métriques GSC montrent :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Impressions\u003C/strong> : 2.1M/mois (stable)\u003C/li>\n\u003Cli>\u003Cstrong>Position moyenne\u003C/strong> : 6.8 (stable, voire en légère amélioration)\u003C/li>\n\u003Cli>\u003Cstrong>Clics\u003C/strong> : 145 000/mois (en baisse de 18 % vs. janvier 2025)\u003C/li>\n\u003Cli>\u003Cstrong>CTR moyen\u003C/strong> : 6.9 % (en baisse, était à 8.4 %)\u003C/li>\n\u003C/ul>\n\u003Cp>Le diagnostic classique dirait : \"les positions sont stables, le CTR baisse probablement à cause de la saisonnalité\". Le diagnostic réel est tout autre.\u003C/p>\n\u003Ch3>Analyse par cluster de requêtes\u003C/h3>\n\u003Cp>En segmentant les requêtes par type d'intent et par présence de SERP features, le tableau change :\u003C/p>\n\u003Cp>\u003Cstrong>Requêtes informationnelles\u003C/strong> (60 % du volume) : AI Overviews présents sur 72 % d'entre elles. Le CTR passe de 9.1 % à 4.8 % en un an. Sur ces requêtes, le média est cité dans l'AI Overview dans seulement 11 % des cas — alors qu'il ranke dans le top 5 sur 45 % d'entre elles. La majorité du contenu est \"consommée\" via l'AI Overview sans clic.\u003C/p>\n\u003Cp>\u003Cstrong>Requêtes comparatives\u003C/strong> (\"meilleur smartphone 2026\", \"X vs Y\") : Google affiche systématiquement un AI Overview avec un tableau comparatif. Le média avait historiquement un featured snippet sur 30 % de ces requêtes — ce snippet est désormais remplacé par l'AI Overview dans la moitié des cas.\u003C/p>\n\u003Cp>\u003Cstrong>Requêtes de test/review\u003C/strong> : les Product Packs apparaissent en haut de SERP. \u003Ca href=\"/blog/google-s-product-packs-are-now-a-primary-sales-channel-here-s-what-the-data-shows\">Google traite désormais ces packs comme un canal de vente primaire\u003C/a>, repoussant les avis éditoriaux sous le fold.\u003C/p>\n\u003Ch3>Plan d'action mis en oeuvre\u003C/h3>\n\u003Cp>L'équipe SEO du média a implémenté une stratégie en trois axes :\u003C/p>\n\u003Cp>\u003Cstrong>1. Restructuration du contenu pour le grounding IA\u003C/strong>\u003C/p>\n\u003Cp>Les articles comparatifs ont été restructurés avec des données tabulaires balisées en \u003Ccode>&#x3C;table>\u003C/code> sémantique + schema.org \u003Ccode>ItemList\u003C/code>. L'hypothèse : les LLMs extraient plus facilement des données structurées pour alimenter leurs réponses, augmentant la probabilité de citation.\u003C/p>\n\u003Cp>\u003Cstrong>2. Suivi quotidien de la \"share of AI voice\"\u003C/strong>\u003C/p>\n\u003Cp>Un dashboard Looker Studio agrège quotidiennement :\u003C/p>\n\u003Cul>\n\u003Cli>Le taux de citation dans les AI Overviews (via un outil tiers de tracking SERP)\u003C/li>\n\u003Cli>Le ranking dans la liste des sources de l'AI Overview (source #1, #2, #3)\u003C/li>\n\u003Cli>Le delta entre CTR attendu et CTR réel par cluster de requêtes\u003C/li>\n\u003C/ul>\n\u003Cp>\u003Cstrong>3. Optimisation du contenu pour les requêtes où l'AI Overview cite des concurrents\u003C/strong>\u003C/p>\n\u003Cp>Pour chaque requête prioritaire où un concurrent est cité dans l'AI Overview mais pas le média, une analyse du contenu concurrent est menée. Les patterns identifiés : réponses directes dans les 100 premiers mots, données factuelles récentes (dates, prix, specs), et structure claire en headings imbriqués.\u003C/p>\n\u003Cp>Après 4 mois, les résultats : le taux de citation dans les AI Overviews passe de 11 % à 24 %. Le CTR global remonte à 7.8 %. Les clics mensuels se stabilisent à 138 000, soit une récupération partielle mais significative.\u003C/p>\n\u003Ch2>Les métriques que Google ne vous donne pas (et comment les construire)\u003C/h2>\n\u003Cp>Search Console ne fournit ni la présence dans les AI Overviews, ni la pixel position, ni la \"share of SERP\" de votre domaine. Vous devez construire ces métriques vous-même ou les obtenir via des outils tiers.\u003C/p>\n\u003Ch3>Pixel position et \"above-the-fold rate\"\u003C/h3>\n\u003Cp>La pixel position — la distance en pixels entre le haut de la SERP et votre premier résultat visible — est la métrique la plus corrélée au CTR réel en 2026. Un résultat en position organique 1 qui apparaît à 800px du haut (sous un AI Overview de 600px + un bandeau ads de 200px) performe comme un résultat en position 4-5 d'une SERP sans features.\u003C/p>\n\u003Cp>Construire cette métrique en interne exige du scraping de SERPs avec mesure du DOM. Les outils comme Semrush Sensor et Advanced Web Ranking commencent à exposer cette donnée, mais de manière limitée.\u003C/p>\n\u003Ch3>Share of SERP : combien d'espace visuel vous occupez\u003C/h3>\n\u003Cp>La métrique \"share of SERP\" mesure le pourcentage de la viewport SERP occupé par votre domaine, toutes features confondues. Si votre domaine apparaît dans un lien organique en position 3 ET dans la section sources de l'AI Overview ET dans un People Also Ask, votre share of SERP est significativement supérieure à celle d'un concurrent qui n'a qu'un lien en position 2.\u003C/p>\n\u003Cp>Le calcul conceptuel :\u003C/p>\n\u003Cpre>\u003Ccode>Share of SERP = (Pixels occupés par votre domaine / Pixels totaux de la SERP visible) × 100\n\u003C/code>\u003C/pre>\n\u003Cp>Cette métrique est difficile à automatiser à grande échelle, mais elle peut être approximée en combinant les données de ranking organique, de présence dans les SERP features, et de citation dans les AI Overviews.\u003C/p>\n\u003Ch3>Tracking de la perception de marque dans les réponses IA\u003C/h3>\n\u003Cp>Un aspect souvent négligé : les AI Overviews et les réponses Copilot/ChatGPT ne citent pas seulement votre contenu — ils reformulent vos informations, parfois de manière déformée. \u003Ca href=\"/blog/data-shows-ai-overviews-exposing-negative-reviews-without-user-intent-what-to-do-next-via-sejournal-erasedotcom\">Des données montrent que les AI Overviews exposent des avis négatifs sans intent correspondant de l'utilisateur\u003C/a>.\u003C/p>\n\u003Cp>Pour une marque e-commerce, cela signifie qu'un avis négatif isolé peut être extrait et présenté comme la réponse principale à une requête de marque. Tracker cette dimension exige de monitorer non seulement si vous êtes cité, mais comment vous êtes représenté dans les réponses IA.\u003C/p>\n\u003Cp>De la même manière, \u003Ca href=\"/blog/how-negative-information-spreads-from-wikipedia-into-ai-search\">la propagation d'informations négatives depuis Wikipedia vers les réponses IA\u003C/a> démontre que la qualité de vos sources upstream (Wikipedia, forums, sites d'avis) impacte directement votre représentation dans l'AI Search. Le tracking de visibilité SERP doit intégrer cette couche de perception.\u003C/p>\n\u003Ch2>Adapter l'audit technique à la visibilité IA\u003C/h2>\n\u003Cp>L'audit technique SEO classique vérifie l'indexabilité, le maillage, la vitesse, les canonicals. \u003Ca href=\"/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus\">L'audit technique pour l'ère AI Search\u003C/a> ajoute des dimensions spécifiques : la crawlabilité par les bots IA (GPTBot, Bingbot pour Copilot, PerplexityBot), la structure sémantique du contenu pour le grounding, et la fraîcheur des données structurées.\u003C/p>\n\u003Ch3>Vérifier l'accès des bots IA à votre contenu\u003C/h3>\n\u003Cp>Un point technique que beaucoup de sites négligent : bloquer GPTBot dans robots.txt empêche OpenAI de crawler votre contenu, mais cela ne vous rend pas invisible dans ChatGPT — ChatGPT peut s'appuyer sur le cache Bing. En revanche, bloquer les bots IA réduit la probabilité d'être utilisé comme source de grounding pour les réponses récentes.\u003C/p>\n\u003Cp>Vérifiez votre configuration robots.txt :\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érification dans les logs serveur : quels bots IA crawlent votre site ?\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Commande pour extraire les bots IA des access logs Nginx\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">grep\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> -E \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"(GPTBot|ChatGPT-User|PerplexityBot|ClaudeBot|Applebot-Extended|Google-Extended)\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  /\u003C/span>\u003Cspan style=\"color:#79B8FF\">var/log\u003C/span>\u003Cspan style=\"color:#E1E4E8\">/nginx/access.log \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  | awk \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'{print $\u003C/span>\u003Cspan style=\"color:#E1E4E8\">1\u003C/span>\u003Cspan style=\"color:#9ECBFF\">, $\u003C/span>\u003Cspan style=\"color:#E1E4E8\">14\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}'\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  | sort | uniq -c | sort -rn | head -20\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Résultat typique :\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 4521 66.249.x.x \"Google-Extended\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 2103 20.15.x.x  \"GPTBot/1.2\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 891  52.0.x.x   \"PerplexityBot/1.0\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># 234  18.x.x.x   \"ClaudeBot/1.0\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifier votre robots.txt actuel pour les bots IA\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">curl -s https://votredomaine.fr/robots.txt | grep -i -E \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"(gptbot|perplexity|claude|google-extended)\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si vous ne voyez aucun crawl de ces bots, vérifiez que vous ne les bloquez pas involontairement via un Disallow global ou via Cloudflare/votre WAF.\u003C/p>\n\u003Ch3>JavaScript et visibilité IA\u003C/h3>\n\u003Cp>Les sites en SPA (React, Vue, Angular) qui dépendent du rendu client posent un problème spécifique pour la visibilité IA. Les bots IA, contrairement à Googlebot, n'exécutent pas toujours le JavaScript. Un contenu rendu uniquement côté client peut être invisible pour GPTBot et PerplexityBot.\u003C/p>\n\u003Cp>Les \u003Ca href=\"/blog/5-javascript-seo-lessons-from-top-ecommerce-sites\">leçons JavaScript SEO tirées des grands sites e-commerce\u003C/a> s'appliquent avec encore plus de force dans le contexte IA. Le SSR n'est plus seulement une bonne pratique pour Google — c'est une condition nécessaire pour exister dans l'écosystème IA au sens large.\u003C/p>\n\u003Ch2>Construire un tableau de bord de SERP visibility actionnable\u003C/h2>\n\u003Cp>Un dashboard efficace pour 2026 doit présenter cinq couches de données :\u003C/p>\n\u003Cp>\u003Cstrong>Couche 1 — Ranking organique classique\u003C/strong> : positions GSC par cluster de requêtes, évolution hebdomadaire. C'est la base, mais ce n'est plus suffisant.\u003C/p>\n\u003Cp>\u003Cstrong>Couche 2 — CTR réel vs attendu\u003C/strong> : le script Python présenté plus haut. Chaque requête où le delta dépasse 40 % est un signal d'alerte.\u003C/p>\n\u003Cp>\u003Cstrong>Couche 3 — Présence AI Overview\u003C/strong> : pourcentage de vos requêtes top 100 qui déclenchent une AI Overview, et pourcentage de ces AI Overviews où votre domaine est cité. Données issues de votre outil de rank tracking.\u003C/p>\n\u003Cp>\u003Cstrong>Couche 4 — Visibilité multi-canal IA\u003C/strong> : taux de citation dans Perplexity, Bing Copilot, ChatGPT Search. Données issues d'un tracking hebdomadaire sur vos 50-100 requêtes prioritaires.\u003C/p>\n\u003Cp>\u003Cstrong>Couche 5 — Perception de marque IA\u003C/strong> : monitoring du sentiment et de la précision des informations vous concernant dans les réponses IA. C'est le plus difficile à automatiser mais potentiellement le plus impactant, surtout pour les marques e-commerce exposées aux \u003Ca href=\"/blog/data-shows-ai-overviews-exposing-negative-reviews-without-user-intent-what-to-do-next-via-sejournal-erasedotcom\">avis négatifs amplifiés par les AI Overviews\u003C/a>.\u003C/p>\n\u003Cp>Google publie régulièrement des mises à jour sur les liens dans les AI Overviews. Les \u003Ca href=\"/blog/google-updates-links-within-ai-overviews-ai-mode\">récentes évolutions des liens dans le mode AI\u003C/a> montrent une tendance à exposer davantage de sources — une opportunité pour les sites qui optimisent pour le grounding. Suivre ces évolutions et adapter votre tracking en conséquence est un processus continu, pas un projet ponctuel.\u003C/p>\n\u003Cp>La détection automatique de ces changements — une meta canonical qui disparaît, un SSR qui casse, un bloc de contenu structuré qui ne s'affiche plus — est exactement le type de régression qu'un outil de monitoring comme Seogard détecte en temps réel, avant que l'impact sur votre visibilité SERP ne devienne visible dans vos métriques hebdomadaires.\u003C/p>\n\u003Cp>Le ranking est mort comme métrique unique. La visibilité SERP est un composite multidimensionnel qui exige des outils, des scripts, et surtout une compréhension technique de ce que chaque couche mesure réellement. Les équipes SEO qui construisent cette infrastructure de mesure aujourd'hui auront un avantage structurel sur celles qui continuent à reporter une position moyenne de 4.2 en réunion de direction.\u003C/p>",null,12,[18,19,20,21,22],"serp visibility","ai search","tracking","search","ai overviews","SERP visibility en AI Search : mesurer ce qui compte vraiment","Sun May 17 2026 10:03:08 GMT+0000 (Coordinated Universal Time)",[26,41,54],{"_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":39,"updatedAt":40},"6a0d4ea4aa6b273b0cde629a","reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","https://seogard.io/blog/reasoning-lift-what-happens-to-brand-visibility-when-ai-thinks-harder","2026-05-20T06:03:16.188Z","2026-05-20","Analyse technique de 200 réponses GPT-5.2 : le raisonnement élevé cite plus de sources, favorise le haut de funnel et redéfinit la visibilité de marque.",[34,35,36,37,38],"reasoning lift","AI search","brand visibility","GEO","LLM","Reasoning lift : impact du raisonnement IA sur la visibilité des marques","Wed May 20 2026 06:03:16 GMT+0000 (Coordinated Universal Time)",{"_id":42,"slug":43,"__v":6,"author":7,"canonical":44,"category":10,"createdAt":45,"date":31,"description":46,"image":15,"imageAlt":15,"readingTime":16,"tags":47,"title":52,"updatedAt":53},"6a0d86d3aa6b273b0c0cbec7","google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","https://seogard.io/blog/google-brings-ai-content-verification-to-search-via-sejournal-mattgsouthern","2026-05-20T10:02:59.955Z","Google intègre SynthID à Search pour vérifier le contenu IA. Analyse technique des watermarks, impact sur le crawl et stratégies SEO concrètes.",[48,49,50,21,51],"google","synthid","ai content verification","seo technique","SynthID dans Search : impact technique sur le SEO","Wed May 20 2026 10:02:59 GMT+0000 (Coordinated Universal Time)",{"_id":55,"slug":56,"__v":6,"author":7,"canonical":57,"category":10,"createdAt":58,"date":31,"description":59,"image":15,"imageAlt":15,"readingTime":16,"tags":60,"title":66,"updatedAt":67},"6a0df755aa6b273b0c69952f","google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern","https://seogard.io/blog/google-s-llms-txt-guidance-depends-on-which-product-you-ask-via-sejournal-mattgsouthern","2026-05-20T18:03:01.922Z","Google Search ignore llms.txt, mais Lighthouse l'audite pour l'agentic browsing. Analyse technique des contradictions et guide d'implémentation.",[61,62,63,64,65],"llms.txt","agentic browsing","Lighthouse","AI Search","Google","llms.txt : Google Search et Lighthouse se contredisent","Wed May 20 2026 18:03:01 GMT+0000 (Coordinated Universal Time)"]