[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fBf9f-BHslnrZvX-1Y19yABalpTYowK2rFffIMBxAfMU":3,"$fWlUZtsfobe7V9agLSkhlzW-avnGvqKXpsxvaHB01LGI":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},"6a0f48cbaa6b273b0c80073c","google-begins-rolling-out-may-2026-core-update-via-sejournal-mattgsouthern",0,"Equipe Seogard","Google a confirmé le 20 mai 2026 le déploiement de la May 2026 Core Update, deuxième broad core update de l'année après celle de mars. Le rollout est estimé à deux semaines. Deux core updates en trois mois, c'est un rythme inhabituellement serré — et c'est exactement le genre de séquence qui transforme un site stable en victime collatérale si personne ne surveille les métriques au bon moment.\n\n## Ce que l'on sait (et ce que l'on ne sait pas) sur cette update\n\nGoogle a publié l'annonce via son compte [Google Search Central sur X](https://developers.google.com/search/updates/ranking) et la page de suivi des updates. Le message est le même que d'habitude : pas de recommandations spécifiques à suivre, renvoi vers les [guidelines de contenu utile](https://developers.google.com/search/docs/fundamentals/creating-helpful-content), et patience pendant le rollout.\n\n### Le contexte de la séquence mars-mai\n\nLa March 2026 Core Update avait déjà provoqué des mouvements significatifs, en particulier sur les requêtes informationnelles à forte concurrence. L'enchaînement rapide suggère deux hypothèses non exclusives :\n\n1. Google corrige des effets secondaires indésirables de la mise à jour de mars (c'est arrivé avec la séquence August-October 2023).\n2. Google accélère son cycle d'itération sur les signaux de qualité, possiblement lié à l'intégration croissante des AI Overviews dans les SERPs.\n\nCe qui est certain : les sites qui avaient perdu des positions en mars ne doivent surtout pas interpréter un éventuel regain comme une \"récompense\" définitive. Inversement, un site stable en mars peut très bien être touché en mai. Les core updates réévaluent la pertinence relative de toutes les pages — votre contenu n'a pas besoin d'avoir changé pour que votre ranking change.\n\n### Les signaux à surveiller en priorité\n\nOubliez les outils de \"volatilité SERP\" qui mesurent le bruit ambiant. Ce qui compte, c'est l'impact sur **votre** site. Trois métriques à extraire de la Search Console dès maintenant :\n\n- **Clicks par template de page** (pas le total agrégé — segmentez par `/product/`, `/blog/`, `/category/`).\n- **Position moyenne pondérée par impressions** sur vos 50 requêtes à plus fort trafic.\n- **Taux de couverture indexée** — une core update peut modifier le comportement d'indexation indirectement, surtout si Google réévalue la qualité d'un cluster de pages.\n\n## Monitorer l'impact en temps réel : scripts et méthode\n\nLa Search Console a 48-72h de latence. C'est trop lent pendant un rollout. Voici comment construire un pipeline de monitoring serré.\n\n### Extraire les données Search Console via l'API\n\nCe script Python interroge l'API Search Console pour récupérer les clicks et positions par page, et comparer automatiquement la période de rollout à la baseline pré-update.\n\n```python\n# core_update_monitor.py\n# Requires: google-auth, google-api-python-client\n# Usage: python core_update_monitor.py --property \"sc-domain:votresite.fr\"\n\nfrom googleapiclient.discovery import build\nfrom google.oauth2 import service_account\nimport argparse\nimport json\nfrom datetime import datetime, timedelta\n\nSCOPES = ['https://www.googleapis.com/auth/webmasters.readonly']\nKEY_FILE = 'service-account.json'\n\nROLLOUT_START = '2026-05-20'\nBASELINE_START = '2026-05-06'  # 14 jours avant le rollout\nBASELINE_END = '2026-05-19'\n\ndef get_service():\n    credentials = service_account.Credentials.from_service_account_file(\n        KEY_FILE, scopes=SCOPES\n    )\n    return build('searchconsole', 'v1', credentials=credentials)\n\ndef query_performance(service, property_url, start_date, end_date):\n    request = {\n        'startDate': start_date,\n        'endDate': end_date,\n        'dimensions': ['page'],\n        'rowLimit': 5000,\n        'dimensionFilterGroups': [],\n    }\n    response = service.searchanalytics().query(\n        siteUrl=property_url, body=request\n    ).execute()\n    return {\n        row['keys'][0]: {\n            'clicks': row['clicks'],\n            'impressions': row['impressions'],\n            'position': round(row['position'], 1)\n        }\n        for row in response.get('rows', [])\n    }\n\ndef compare_periods(baseline, current):\n    \"\"\"Identifie les pages avec une chute de clicks > 30%\"\"\"\n    alerts = []\n    for page, current_data in current.items():\n        if page in baseline:\n            base_clicks = baseline[page]['clicks']\n            if base_clicks > 10:  # Ignorer le bruit des pages à faible trafic\n                drop_pct = ((current_data['clicks'] - base_clicks) / base_clicks) * 100\n                pos_delta = current_data['position'] - baseline[page]['position']\n                if drop_pct \u003C -30:\n                    alerts.append({\n                        'page': page,\n                        'clicks_baseline': base_clicks,\n                        'clicks_current': current_data['clicks'],\n                        'drop_pct': round(drop_pct, 1),\n                        'position_delta': round(pos_delta, 1)\n                    })\n    return sorted(alerts, key=lambda x: x['drop_pct'])\n\nif __name__ == '__main__':\n    parser = argparse.ArgumentParser()\n    parser.add_argument('--property', required=True)\n    args = parser.parse_args()\n\n    service = get_service()\n    today = datetime.now().strftime('%Y-%m-%d')\n\n    baseline = query_performance(service, args.property, BASELINE_START, BASELINE_END)\n    current = query_performance(service, args.property, ROLLOUT_START, today)\n\n    alerts = compare_periods(baseline, current)\n\n    print(f\"\\n{'='*60}\")\n    print(f\"Core Update Impact Report - {args.property}\")\n    print(f\"Baseline: {BASELINE_START} → {BASELINE_END}\")\n    print(f\"Rollout:  {ROLLOUT_START} → {today}\")\n    print(f\"{'='*60}\")\n    print(f\"\\nPages avec chute > 30% ({len(alerts)} détectées):\\n\")\n    for a in alerts[:20]:\n        print(f\"  {a['drop_pct']:+.1f}%  |  pos {a['position_delta']:+.1f}  |  {a['page']}\")\n```\n\nLe seuil de -30% est volontairement conservateur. Pendant un rollout de deux semaines, les données fluctuent quotidiennement. Un drop de 15% sur 3 jours peut être du bruit. Un drop de 40% sur une semaine est un signal.\n\n### Surveiller les changements de rendu côté serveur\n\nUn piège classique pendant les core updates : le problème n'est pas le contenu, c'est le rendu. Si votre SSR se dégrade (erreur silencieuse, timeout, fallback client-side), Googlebot voit soudain une page pauvre en contenu au moment précis où l'algorithme réévalue la qualité.\n\nVérifiez que vos pages critiques renvoient bien du HTML complet côté serveur :\n\n```bash\n#!/bin/bash\n# check_ssr_integrity.sh\n# Vérifie que les pages critiques retournent du contenu SSR complet\n# Usage: ./check_ssr_integrity.sh urls.txt\n\nURLS_FILE=$1\nISSUES=0\n\nwhile IFS= read -r url; do\n    # Simuler le user-agent Googlebot\n    RESPONSE=$(curl -s -A \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\" \\\n        -w \"\\n%{http_code}\\n%{time_total}\" \\\n        --max-time 10 \\\n        \"$url\")\n\n    HTTP_CODE=$(echo \"$RESPONSE\" | tail -2 | head -1)\n    LOAD_TIME=$(echo \"$RESPONSE\" | tail -1)\n    HTML_BODY=$(echo \"$RESPONSE\" | head -n -2)\n\n    # Vérifier le status code\n    if [ \"$HTTP_CODE\" != \"200\" ]; then\n        echo \"❌ [$HTTP_CODE] $url\"\n        ISSUES=$((ISSUES + 1))\n        continue\n    fi\n\n    # Vérifier la présence de contenu substantiel dans le HTML initial\n    TITLE=$(echo \"$HTML_BODY\" | grep -oP '\u003Ctitle>\\K[^\u003C]+' | head -1)\n    H1=$(echo \"$HTML_BODY\" | grep -oP '\u003Ch1[^>]*>\\K[^\u003C]+' | head -1)\n    WORD_COUNT=$(echo \"$HTML_BODY\" | sed 's/\u003C[^>]*>//g' | wc -w)\n\n    if [ -z \"$TITLE\" ] || [ -z \"$H1\" ] || [ \"$WORD_COUNT\" -lt 100 ]; then\n        echo \"⚠️  SSR incomplet: $url (title: '${TITLE:-VIDE}', h1: '${H1:-VIDE}', mots: $WORD_COUNT)\"\n        ISSUES=$((ISSUES + 1))\n    else\n        echo \"✅ [$LOAD_TIME s] $url ($WORD_COUNT mots)\"\n    fi\n\ndone \u003C \"$URLS_FILE\"\n\necho \"\"\necho \"Résultat: $ISSUES problèmes détectés\"\n```\n\nSi ce script remonte des pages avec un word count anormalement bas, vous avez probablement un problème de SSR qui s'est glissé lors d'un déploiement récent. Ce genre de régression, quand elle coïncide avec une core update, produit des baisses de trafic spectaculaires que les équipes attribuent à tort à l'algorithme. Un outil de monitoring comme Seogard détecte automatiquement ce type de régression SSR en continu, sans attendre qu'un humain lance un script manuellement.\n\n## Scénario concret : e-commerce de 22 000 pages pendant le rollout\n\nPrenons un cas réaliste. **MaisonDeco.fr**, un e-commerce fictif mais représentatif, avec :\n\n- 22 000 pages indexées (800 catégories, 18 000 fiches produit, 3 200 articles de blog)\n- Stack Next.js 14 avec ISR (Incremental Static Regeneration)\n- Trafic organique pré-update : 145 000 sessions/mois\n- Revenus SEO : ~320 000 €/mois\n\n### Jour J+3 : premiers signaux\n\nL'équipe SEO observe dans la Search Console (avec le délai habituel) :\n\n- Les pages catégories `/meubles/salon/canapes` perdent en moyenne 4 positions\n- Les fiches produit restent stables\n- Les articles de blog type \"guide d'achat\" gagnent légèrement (+1.2 positions en moyenne)\n\nLe réflexe classique serait de paniquer sur les catégories. Mais avant de toucher quoi que ce soit, il faut comprendre **pourquoi** ce template spécifique est touché.\n\n### Diagnostic technique des pages catégories\n\nEn inspectant le HTML retourné par le serveur pour les pages catégories, l'équipe découvre que la section \"guide d'achat\" intégrée en bas de chaque catégorie (200-400 mots de contenu éditorial) n'est plus rendue côté serveur depuis un déploiement du 12 mai. Un développeur a refactoré le composant en lazy-loading client-side pour améliorer le LCP.\n\nRésultat : Googlebot voit des pages catégories avec uniquement une grille de produits et zéro contenu textuel contextuel. L'ISR servait une version \"appauvrie\" de la page.\n\nLe correctif :\n\n```typescript\n// components/CategoryGuide.tsx\n// AVANT (lazy-loaded client-side — invisible pour Googlebot)\n// const CategoryGuide = dynamic(() => import('./CategoryGuideContent'), {\n//   ssr: false,  // ← Le problème était ici\n//   loading: () => \u003CSkeleton height={200} />\n// });\n\n// APRÈS (rendu SSR avec hydratation différée)\nimport { Suspense } from 'react';\nimport CategoryGuideContent from './CategoryGuideContent';\n\ninterface CategoryGuideProps {\n  categorySlug: string;\n  guideContent: {\n    title: string;\n    body: string;\n    faqItems: Array\u003C{ question: string; answer: string }>;\n  };\n}\n\nexport default function CategoryGuide({ categorySlug, guideContent }: CategoryGuideProps) {\n  return (\n    \u003Csection\n      className=\"category-guide\"\n      // Le contenu est dans le HTML initial — Googlebot le voit\n    >\n      \u003Ch2>{guideContent.title}\u003C/h2>\n      \u003Cdiv\n        dangerouslySetInnerHTML={{ __html: guideContent.body }}\n        // Note: sanitize côté API, pas ici\n      />\n      {guideContent.faqItems.length > 0 && (\n        \u003Cdiv className=\"faq-section\" itemScope itemType=\"https://schema.org/FAQPage\">\n          {guideContent.faqItems.map((item, i) => (\n            \u003Cdetails\n              key={i}\n              itemScope\n              itemProp=\"mainEntity\"\n              itemType=\"https://schema.org/Question\"\n            >\n              \u003Csummary itemProp=\"name\">{item.question}\u003C/summary>\n              \u003Cdiv itemScope itemProp=\"acceptedAnswer\" itemType=\"https://schema.org/Answer\">\n                \u003Cp itemProp=\"text\">{item.answer}\u003C/p>\n              \u003C/div>\n            \u003C/details>\n          ))}\n        \u003C/div>\n      )}\n    \u003C/section>\n  );\n}\n\n// Dans getStaticProps / generateStaticParams :\n// guideContent est récupéré côté serveur et injecté dans le HTML initial\n```\n\nNote sur le FAQ schema : bien que Google ait restreint l'affichage des FAQ rich results dans les SERPs classiques (voir [notre analyse sur ce sujet](/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern)), le balisage structuré FAQ reste pertinent pour les AI Overviews et pour la compréhension sémantique de la page par les crawlers.\n\n### Jour J+8 : résultat du correctif\n\nAprès le redéploiement du fix SSR et un passage dans l'outil d'inspection d'URL de la Search Console pour forcer le re-crawl des 50 catégories les plus importantes, les positions commencent à se stabiliser. Le trafic catégories remonte de 60% du drop initial en 5 jours.\n\nLa leçon : cette perte de trafic n'avait rien à voir avec la \"qualité du contenu\" au sens éditorial. C'était une régression technique invisible qui a coïncidé avec le moment où Google réévaluait la pertinence relative des pages.\n\n## Méthodologie d'audit post-update en 5 étapes\n\nVoici le workflow que les équipes SEO techniques devraient systématiser à chaque core update. Pas un checklist cosmétique — un protocole d'investigation.\n\n### Étape 1 : Segmenter l'impact par template\n\nNe regardez jamais les métriques agrégées. Un site peut être globalement stable tout en ayant un template qui s'effondre et un autre qui compense. Utilisez la Search Console avec un filtre regex par pattern d'URL, ou exportez via l'API (script ci-dessus) et segmentez dans un tableur.\n\nLes templates à segmenter en priorité :\n- Pages produit vs pages catégorie vs pages éditoriales\n- Pages avec et sans contenu UGC (avis, commentaires)\n- Pages récentes (\u003C6 mois) vs pages anciennes\n- Pages à contenu fin (\u003C300 mots de texte unique) vs pages à contenu riche\n\n### Étape 2 : Vérifier l'intégrité technique des pages touchées\n\nAvant de remettre en question votre stratégie de contenu, éliminez les causes techniques. Pour chaque template touché :\n\n1. **Inspection URL** dans la Search Console : le HTML rendu correspond-il à ce que vous attendez ?\n2. **Crawl Screaming Frog** en mode \"JavaScript rendering\" vs mode \"HTML only\" : si les deux versions diffèrent significativement (title différent, H1 manquant, contenu absent), vous avez un problème de rendu.\n3. **Vérification des canonicals** : une migration récente a-t-elle pu introduire des canonicals en boucle ou vers des pages 404 ?\n4. **Temps de réponse serveur** (TTFB) : un TTFB > 800ms sur les pages touchées peut indiquer un problème d'infra qui dégrade le crawl.\n\n### Étape 3 : Analyser les pages gagnantes des concurrents\n\nSi vos pages catégories perdent des positions, qui les gagne ? Identifiez 5-10 requêtes clés où vous avez perdu 5+ positions. Analysez les pages qui occupent désormais les positions que vous aviez :\n\n- Quel est leur ratio contenu éditorial / contenu transactionnel ?\n- Ont-elles des signaux E-E-A-T visibles (auteur identifié, sources citées, date de mise à jour) ?\n- Leur structure de maillage interne est-elle plus dense que la vôtre sur ce cluster thématique ?\n\n### Étape 4 : Vérifier la couverture d'indexation\n\nLes core updates peuvent modifier indirectement le budget de crawl alloué à votre site. Si Google réévalue la qualité de certaines sections à la baisse, il peut réduire la fréquence de crawl sur ces sections. Vérifiez dans la Search Console > Indexation > Pages :\n\n- Le nombre de pages \"Découverte, actuellement non indexée\" a-t-il augmenté ?\n- Le nombre de pages \"Explorée, actuellement non indexée\" a-t-il changé ?\n- Y a-t-il de nouvelles [soft 404 détectées](/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse) ?\n\n### Étape 5 : Documenter et attendre\n\nC'est le conseil le moins sexy mais le plus important : **ne faites pas de changements majeurs pendant le rollout**. Documentez tout, préparez vos hypothèses, mais attendez que la mise à jour soit complètement déployée avant de tirer des conclusions ou de lancer des modifications structurelles.\n\nLes données de la première semaine de rollout sont instables par nature. Google teste différentes configurations de ranking pendant le déploiement. Une page qui perd 15 positions le jour 3 peut en regagner 10 le jour 8.\n\n## L'intersection core update et AI Overviews\n\nCette core update de mai 2026 intervient dans un contexte où les AI Overviews occupent une part croissante des SERPs. Le lien entre les deux n'est pas explicitement documenté par Google, mais il existe des interactions logiques.\n\nQuand une core update réévalue la qualité d'une page, cela affecte potentiellement :\n\n- Sa position dans les résultats classiques (blue links)\n- Son éligibilité comme source pour les AI Overviews\n- La confiance que le système de ranking accorde à son contenu pour alimenter les réponses IA\n\nSi votre trafic depuis les résultats classiques baisse mais que vos impressions dans les AI Overviews augmentent (ou inversement), vous êtes face à un phénomène de transfert qu'il faut analyser distinctement. Google a récemment [commencé à fournir plus de liens dans les résultats AI](/blog/google-adds-more-ai-search-links-still-no-click-data-for-seos-via-sejournal-mattgsouthern), mais le manque de données de clicks sur ces résultats rend le diagnostic complexe.\n\nPour les sites qui investissent dans [l'optimisation pour l'IA générative](/blog/google-publishes-guide-on-optimizing-for-generative-ai-features), cette core update est un rappel que la fondation reste le ranking classique. Un site qui perd ses positions organiques classiques a peu de chances d'être sélectionné comme source de confiance pour les AI Overviews.\n\nL'approche la plus robuste est de s'assurer que [l'audit technique couvre les deux dimensions](/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus) : ranking classique et visibilité IA.\n\n## Les erreurs à ne pas commettre pendant le rollout\n\nChaque core update déclenche les mêmes erreurs. Voici les trois plus destructrices.\n\n### Ne pas supprimer massivement du contenu \"thin\"\n\nC'est le réflexe n°1 des équipes qui paniquent : \"Google ne nous aime plus, supprimons toutes les pages à faible contenu.\" Problème : vous supprimez aussi des pages qui captent du trafic long-tail, qui servent de maillage interne, ou qui apportent de la couverture thématique. La bonne approche est de **noindexer** les pages réellement problématiques (0 trafic, 0 impressions depuis 6 mois, contenu dupliqué) et de **consolider** le reste.\n\n### Ne pas refaire la structure de maillage interne\n\nModifier massivement le maillage interne pendant un rollout, c'est changer les paramètres de l'expérience pendant que l'expérience est en cours. Si Google re-crawle vos pages avec une nouvelle structure de liens internes au milieu du déploiement de l'update, vous ne saurez jamais si les variations que vous observez viennent de l'algorithme ou de vos propres changements.\n\n### Ne pas ignorer le staging\n\nSi vous devez déployer des changements techniques urgents (comme le fix SSR du scénario MaisonDeco), [testez d'abord en staging](/blog/how-to-stress-test-a-staging-environment-to-surface-risks-pre-launch-ask-an-seo-via-sejournal-helenpollitt1). Un fix mal testé qui introduit une nouvelle régression pendant un rollout de core update peut transformer une baisse de 15% en effondrement de 60%.\n\n## Construire un système d'alerte durable\n\nLes core updates ne sont plus des événements rares. Avec deux broad core updates en trois mois en 2026, plus les updates spécifiques (spam, reviews, helpful content), votre site subit en moyenne 8-10 mises à jour de ranking par an qui peuvent affecter votre trafic.\n\nLa bonne approche n'est pas de réagir à chaque update — c'est de maintenir un monitoring continu qui vous alerte dès qu'une métrique dévie de la normale, quelle qu'en soit la cause.\n\nLes composants essentiels :\n\n- **Monitoring de positions quotidien** sur vos 100-200 requêtes stratégiques, segmenté par template de page\n- **Alertes automatiques sur les chutes de trafic** par section du site (pas sur le total)\n- **Vérification continue du rendu SSR** sur un échantillon de pages critiques\n- **Suivi de l'indexation** : nombre de pages indexées, ratio indexé/soumis, nouvelles erreurs\n- **Monitoring des backlinks** : une core update qui coïncide avec une perte de liens de qualité peut amplifier la baisse\n\nSeogard surveille ces signaux en continu et détecte les régressions techniques (meta disparues, SSR cassé, canonicals altérés) avant qu'elles n'aient le temps de se transformer en perte de trafic organique. C'est particulièrement utile pendant les périodes de rollout, où chaque jour sans détection est un jour de trafic perdu.\n\n## Wrap-up\n\nLa May 2026 Core Update n'a rien de révolutionnaire dans son mécanisme — c'est une réévaluation globale de la pertinence, comme toutes les broad core updates. Ce qui change, c'est le rythme (deux en trois mois) et le contexte (interaction croissante avec les AI Overviews). La seule réponse durable, c'est un monitoring technique systématique qui détecte les régressions en temps réel, que la cause soit algorithmique, technique, ou les deux simultanément.","https://seogard.io/blog/google-begins-rolling-out-may-2026-core-update-via-sejournal-mattgsouthern","Actualités SEO","2026-05-21T18:02:51.223Z","2026-05-21","Google déploie sa core update de mai 2026. Analyse technique, scripts de monitoring, scénarios d'impact et plan d'action pour sites à fort volume de pages.","\u003Cp>Google a confirmé le 20 mai 2026 le déploiement de la May 2026 Core Update, deuxième broad core update de l'année après celle de mars. Le rollout est estimé à deux semaines. Deux core updates en trois mois, c'est un rythme inhabituellement serré — et c'est exactement le genre de séquence qui transforme un site stable en victime collatérale si personne ne surveille les métriques au bon moment.\u003C/p>\n\u003Ch2>Ce que l'on sait (et ce que l'on ne sait pas) sur cette update\u003C/h2>\n\u003Cp>Google a publié l'annonce via son compte \u003Ca href=\"https://developers.google.com/search/updates/ranking\">Google Search Central sur X\u003C/a> et la page de suivi des updates. Le message est le même que d'habitude : pas de recommandations spécifiques à suivre, renvoi vers les \u003Ca href=\"https://developers.google.com/search/docs/fundamentals/creating-helpful-content\">guidelines de contenu utile\u003C/a>, et patience pendant le rollout.\u003C/p>\n\u003Ch3>Le contexte de la séquence mars-mai\u003C/h3>\n\u003Cp>La March 2026 Core Update avait déjà provoqué des mouvements significatifs, en particulier sur les requêtes informationnelles à forte concurrence. L'enchaînement rapide suggère deux hypothèses non exclusives :\u003C/p>\n\u003Col>\n\u003Cli>Google corrige des effets secondaires indésirables de la mise à jour de mars (c'est arrivé avec la séquence August-October 2023).\u003C/li>\n\u003Cli>Google accélère son cycle d'itération sur les signaux de qualité, possiblement lié à l'intégration croissante des AI Overviews dans les SERPs.\u003C/li>\n\u003C/ol>\n\u003Cp>Ce qui est certain : les sites qui avaient perdu des positions en mars ne doivent surtout pas interpréter un éventuel regain comme une \"récompense\" définitive. Inversement, un site stable en mars peut très bien être touché en mai. Les core updates réévaluent la pertinence relative de toutes les pages — votre contenu n'a pas besoin d'avoir changé pour que votre ranking change.\u003C/p>\n\u003Ch3>Les signaux à surveiller en priorité\u003C/h3>\n\u003Cp>Oubliez les outils de \"volatilité SERP\" qui mesurent le bruit ambiant. Ce qui compte, c'est l'impact sur \u003Cstrong>votre\u003C/strong> site. Trois métriques à extraire de la Search Console dès maintenant :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Clicks par template de page\u003C/strong> (pas le total agrégé — segmentez par \u003Ccode>/product/\u003C/code>, \u003Ccode>/blog/\u003C/code>, \u003Ccode>/category/\u003C/code>).\u003C/li>\n\u003Cli>\u003Cstrong>Position moyenne pondérée par impressions\u003C/strong> sur vos 50 requêtes à plus fort trafic.\u003C/li>\n\u003Cli>\u003Cstrong>Taux de couverture indexée\u003C/strong> — une core update peut modifier le comportement d'indexation indirectement, surtout si Google réévalue la qualité d'un cluster de pages.\u003C/li>\n\u003C/ul>\n\u003Ch2>Monitorer l'impact en temps réel : scripts et méthode\u003C/h2>\n\u003Cp>La Search Console a 48-72h de latence. C'est trop lent pendant un rollout. Voici comment construire un pipeline de monitoring serré.\u003C/p>\n\u003Ch3>Extraire les données Search Console via l'API\u003C/h3>\n\u003Cp>Ce script Python interroge l'API Search Console pour récupérer les clicks et positions par page, et comparer automatiquement la période de rollout à la baseline pré-update.\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># core_update_monitor.py\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Requires: google-auth, google-api-python-client\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Usage: python core_update_monitor.py --property \"sc-domain:votresite.fr\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> googleapiclient.discovery \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> build\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> google.oauth2 \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> service_account\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> argparse\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\">\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> datetime \u003C/span>\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> datetime, timedelta\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">SCOPES\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'https://www.googleapis.com/auth/webmasters.readonly'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">KEY_FILE\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'service-account.json'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">ROLLOUT_START\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '2026-05-20'\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">BASELINE_START\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '2026-05-06'\u003C/span>\u003Cspan style=\"color:#6A737D\">  # 14 jours avant le rollout\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">BASELINE_END\u003C/span>\u003Cspan style=\"color:#F97583\"> =\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '2026-05-19'\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\"> get_service\u003C/span>\u003Cspan style=\"color:#E1E4E8\">():\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    credentials \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> service_account.Credentials.from_service_account_file(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        KEY_FILE\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">scopes\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#79B8FF\">SCOPES\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\"> build(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'searchconsole'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#9ECBFF\">'v1'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">credentials\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">credentials)\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\"> query_performance\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(service, property_url, start_date, end_date):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    request \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\">'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:#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\"> service.searchanalytics().query(\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">        siteUrl\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">property_url, \u003C/span>\u003Cspan style=\"color:#FFAB70\">body\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">request\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    ).execute()\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\">        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\">            'clicks'\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:#9ECBFF\">            'impressions'\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:#9ECBFF\">            'position'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(row[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'position'\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:#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\"> response.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\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">def\u003C/span>\u003Cspan style=\"color:#B392F0\"> compare_periods\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(baseline, current):\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">    \"\"\"Identifie les pages avec une chute de clicks > 30%\"\"\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    alerts \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\"> page, current_data \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> current.items():\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> page \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> baseline:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">            base_clicks \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> baseline[page][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'clicks'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> base_clicks \u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 10\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:  \u003C/span>\u003Cspan style=\"color:#6A737D\"># Ignorer le bruit des pages à faible trafic\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                drop_pct \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ((current_data[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'clicks'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> base_clicks) \u003C/span>\u003Cspan style=\"color:#F97583\">/\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> base_clicks) \u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                pos_delta \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> current_data[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'position'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">] \u003C/span>\u003Cspan style=\"color:#F97583\">-\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> baseline[page][\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'position'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">                if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> drop_pct \u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;\u003C/span>\u003Cspan style=\"color:#F97583\"> -\u003C/span>\u003Cspan style=\"color:#79B8FF\">30\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">                    alerts.append({\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        'page'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: page,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        'clicks_baseline'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: base_clicks,\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        'clicks_current'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: current_data[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'clicks'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">],\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">                        'drop_pct'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(drop_pct, \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_delta'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: \u003C/span>\u003Cspan style=\"color:#79B8FF\">round\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(pos_delta, \u003C/span>\u003Cspan style=\"color:#79B8FF\">1\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:#79B8FF\"> sorted\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(alerts, \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\">'drop_pct'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">])\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">if\u003C/span>\u003Cspan style=\"color:#79B8FF\"> __name__\u003C/span>\u003Cspan style=\"color:#F97583\"> ==\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '__main__'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    parser \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> argparse.ArgumentParser()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    parser.add_argument(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'--property'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">required\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\">\u003Cspan style=\"color:#E1E4E8\">    args \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> parser.parse_args()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    service \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> get_service()\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    today \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> datetime.now().strftime(\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'%Y-%m-\u003C/span>\u003Cspan style=\"color:#79B8FF\">%d\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    baseline \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> query_performance(service, args.property, \u003C/span>\u003Cspan style=\"color:#79B8FF\">BASELINE_START\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#79B8FF\">BASELINE_END\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    current \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> query_performance(service, args.property, \u003C/span>\u003Cspan style=\"color:#79B8FF\">ROLLOUT_START\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, today)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    alerts \u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> compare_periods(baseline, current)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n{\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'='\u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\">60}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Core Update Impact Report - \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">args.property\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:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Baseline: \u003C/span>\u003Cspan style=\"color:#79B8FF\">{BASELINE_START}\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> → \u003C/span>\u003Cspan style=\"color:#79B8FF\">{BASELINE_END}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"Rollout:  \u003C/span>\u003Cspan style=\"color:#79B8FF\">{ROLLOUT_START}\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> → \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">today\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:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'='\u003C/span>\u003Cspan style=\"color:#F97583\">*\u003C/span>\u003Cspan style=\"color:#79B8FF\">60}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">    print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">Pages avec chute > 30% (\u003C/span>\u003Cspan style=\"color:#79B8FF\">{len\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(alerts)\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> détectées):\u003C/span>\u003Cspan style=\"color:#79B8FF\">\\n\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\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\"> a \u003C/span>\u003Cspan style=\"color:#F97583\">in\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> alerts[:\u003C/span>\u003Cspan style=\"color:#79B8FF\">20\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]:\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        print\u003C/span>\u003Cspan style=\"color:#E1E4E8\">(\u003C/span>\u003Cspan style=\"color:#F97583\">f\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"  \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">a[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'drop_pct'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003Cspan style=\"color:#F97583\">:+.1f\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">%  |  pos \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">a[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'position_delta'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003Cspan style=\"color:#F97583\">:+.1f\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">  |  \u003C/span>\u003Cspan style=\"color:#79B8FF\">{\u003C/span>\u003Cspan style=\"color:#E1E4E8\">a[\u003C/span>\u003Cspan style=\"color:#9ECBFF\">'page'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">]\u003C/span>\u003Cspan style=\"color:#79B8FF\">}\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Le seuil de -30% est volontairement conservateur. Pendant un rollout de deux semaines, les données fluctuent quotidiennement. Un drop de 15% sur 3 jours peut être du bruit. Un drop de 40% sur une semaine est un signal.\u003C/p>\n\u003Ch3>Surveiller les changements de rendu côté serveur\u003C/h3>\n\u003Cp>Un piège classique pendant les core updates : le problème n'est pas le contenu, c'est le rendu. Si votre SSR se dégrade (erreur silencieuse, timeout, fallback client-side), Googlebot voit soudain une page pauvre en contenu au moment précis où l'algorithme réévalue la qualité.\u003C/p>\n\u003Cp>Vérifiez que vos pages critiques renvoient bien du HTML complet côté serveur :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">#!/bin/bash\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># check_ssr_integrity.sh\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Vérifie que les pages critiques retournent du contenu SSR complet\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\"># Usage: ./check_ssr_integrity.sh urls.txt\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">URLS_FILE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#FFAB70\">$1\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">ISSUES\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">0\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\"> url\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\">    # Simuler le user-agent Googlebot\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\"> -A\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        -w\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\\n%{http_code}\\n%{time_total}\"\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        --max-time\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 10\u003C/span>\u003Cspan style=\"color:#79B8FF\"> \\\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#9ECBFF\">        \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    HTTP_CODE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$RESPONSE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> tail\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -2\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    LOAD_TIME\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$RESPONSE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> tail\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    HTML_BODY\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$RESPONSE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -n\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Vérifier le status code\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$HTTP_CODE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> !=\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"200\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"❌ [\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$HTTP_CODE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">] \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ISSUES\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$((\u003C/span>\u003Cspan style=\"color:#B392F0\">ISSUES\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> +\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">))\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">        continue\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    fi\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">    # Vérifier la présence de contenu substantiel dans le HTML initial\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    TITLE\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$HTML_BODY\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -oP\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;title>\\K[^&#x3C;]+'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    H1\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$HTML_BODY\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> grep\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -oP\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> '&#x3C;h1[^>]*>\\K[^&#x3C;]+'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> head\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">    WORD_COUNT\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$(\u003C/span>\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$HTML_BODY\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> sed\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 's/&#x3C;[^>]*>//g'\u003C/span>\u003Cspan style=\"color:#F97583\"> |\u003C/span>\u003Cspan style=\"color:#B392F0\"> wc\u003C/span>\u003Cspan style=\"color:#79B8FF\"> -w\u003C/span>\u003Cspan style=\"color:#E1E4E8\">)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    if\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#F97583\">-z\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$TITLE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ] \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#F97583\">-z\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$H1\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ] \u003C/span>\u003Cspan style=\"color:#F97583\">||\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> [ \u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$WORD_COUNT\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\u003C/span>\u003Cspan style=\"color:#F97583\"> -lt\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 100\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> ]; \u003C/span>\u003Cspan style=\"color:#F97583\">then\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"⚠️  SSR incomplet: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> (title: '${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">TITLE\u003C/span>\u003Cspan style=\"color:#F97583\">:-\u003C/span>\u003Cspan style=\"color:#E1E4E8\">VIDE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}', h1: '${\u003C/span>\u003Cspan style=\"color:#E1E4E8\">H1\u003C/span>\u003Cspan style=\"color:#F97583\">:-\u003C/span>\u003Cspan style=\"color:#E1E4E8\">VIDE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">}', mots: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$WORD_COUNT\u003C/span>\u003Cspan style=\"color:#9ECBFF\">)\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        ISSUES\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$((\u003C/span>\u003Cspan style=\"color:#B392F0\">ISSUES\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> +\u003C/span>\u003Cspan style=\"color:#79B8FF\"> 1\u003C/span>\u003Cspan style=\"color:#E1E4E8\">))\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    else\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">        echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"✅ [\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$LOAD_TIME\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> s] \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$url\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> (\u003C/span>\u003Cspan style=\"color:#E1E4E8\">$WORD_COUNT\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> mots)\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    fi\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\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\">$URLS_FILE\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"\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>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#79B8FF\">echo\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> \"Résultat: \u003C/span>\u003Cspan style=\"color:#E1E4E8\">$ISSUES\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> problèmes détectés\"\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Si ce script remonte des pages avec un word count anormalement bas, vous avez probablement un problème de SSR qui s'est glissé lors d'un déploiement récent. Ce genre de régression, quand elle coïncide avec une core update, produit des baisses de trafic spectaculaires que les équipes attribuent à tort à l'algorithme. Un outil de monitoring comme Seogard détecte automatiquement ce type de régression SSR en continu, sans attendre qu'un humain lance un script manuellement.\u003C/p>\n\u003Ch2>Scénario concret : e-commerce de 22 000 pages pendant le rollout\u003C/h2>\n\u003Cp>Prenons un cas réaliste. \u003Cstrong>MaisonDeco.fr\u003C/strong>, un e-commerce fictif mais représentatif, avec :\u003C/p>\n\u003Cul>\n\u003Cli>22 000 pages indexées (800 catégories, 18 000 fiches produit, 3 200 articles de blog)\u003C/li>\n\u003Cli>Stack Next.js 14 avec ISR (Incremental Static Regeneration)\u003C/li>\n\u003Cli>Trafic organique pré-update : 145 000 sessions/mois\u003C/li>\n\u003Cli>Revenus SEO : ~320 000 €/mois\u003C/li>\n\u003C/ul>\n\u003Ch3>Jour J+3 : premiers signaux\u003C/h3>\n\u003Cp>L'équipe SEO observe dans la Search Console (avec le délai habituel) :\u003C/p>\n\u003Cul>\n\u003Cli>Les pages catégories \u003Ccode>/meubles/salon/canapes\u003C/code> perdent en moyenne 4 positions\u003C/li>\n\u003Cli>Les fiches produit restent stables\u003C/li>\n\u003Cli>Les articles de blog type \"guide d'achat\" gagnent légèrement (+1.2 positions en moyenne)\u003C/li>\n\u003C/ul>\n\u003Cp>Le réflexe classique serait de paniquer sur les catégories. Mais avant de toucher quoi que ce soit, il faut comprendre \u003Cstrong>pourquoi\u003C/strong> ce template spécifique est touché.\u003C/p>\n\u003Ch3>Diagnostic technique des pages catégories\u003C/h3>\n\u003Cp>En inspectant le HTML retourné par le serveur pour les pages catégories, l'équipe découvre que la section \"guide d'achat\" intégrée en bas de chaque catégorie (200-400 mots de contenu éditorial) n'est plus rendue côté serveur depuis un déploiement du 12 mai. Un développeur a refactoré le composant en lazy-loading client-side pour améliorer le LCP.\u003C/p>\n\u003Cp>Résultat : Googlebot voit des pages catégories avec uniquement une grille de produits et zéro contenu textuel contextuel. L'ISR servait une version \"appauvrie\" de la page.\u003C/p>\n\u003Cp>Le correctif :\u003C/p>\n\u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// components/CategoryGuide.tsx\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// AVANT (lazy-loaded client-side — invisible pour Googlebot)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// const CategoryGuide = dynamic(() => import('./CategoryGuideContent'), {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">//   ssr: false,  // ← Le problème était ici\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">//   loading: () => &#x3C;Skeleton height={200} />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// });\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// APRÈS (rendu SSR avec hydratation différée)\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> { Suspense } \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> 'react'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">import\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> CategoryGuideContent \u003C/span>\u003Cspan style=\"color:#F97583\">from\u003C/span>\u003Cspan style=\"color:#9ECBFF\"> './CategoryGuideContent'\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">interface\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryGuideProps\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  categorySlug\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">  guideContent\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> {\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    title\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    body\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">    faqItems\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> Array\u003C/span>\u003Cspan style=\"color:#E1E4E8\">&#x3C;{ \u003C/span>\u003Cspan style=\"color:#FFAB70\">question\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\">; \u003C/span>\u003Cspan style=\"color:#FFAB70\">answer\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#79B8FF\"> string\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }>;\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  };\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">export\u003C/span>\u003Cspan style=\"color:#F97583\"> default\u003C/span>\u003Cspan style=\"color:#F97583\"> function\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryGuide\u003C/span>\u003Cspan style=\"color:#E1E4E8\">({ \u003C/span>\u003Cspan style=\"color:#FFAB70\">categorySlug\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">guideContent\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> }\u003C/span>\u003Cspan style=\"color:#F97583\">:\u003C/span>\u003Cspan style=\"color:#B392F0\"> CategoryGuideProps\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\"> (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    &#x3C;\u003C/span>\u003Cspan style=\"color:#FFAB70\">section\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      className\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"category-guide\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">      // Le contenu est dans le HTML initial — Googlebot le voit\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">    >\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#B392F0\">h2\u003C/span>\u003Cspan style=\"color:#E1E4E8\">>{guideContent.title}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">h2\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      &#x3C;\u003C/span>\u003Cspan style=\"color:#FFAB70\">div\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        dangerouslySetInnerHTML\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{{ \u003C/span>\u003Cspan style=\"color:#B392F0\">__html\u003C/span>\u003Cspan style=\"color:#E1E4E8\">: guideContent.body }}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">        // Note: sanitize côté API, pas ici\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">      />\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">      {\u003C/span>\u003Cspan style=\"color:#FFAB70\">guideContent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">faqItems\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">length\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> > 0 &#x26;&#x26; (\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;\u003C/span>\u003Cspan style=\"color:#FFAB70\">div\u003C/span>\u003Cspan style=\"color:#FFAB70\"> className\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"faq-section\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> itemScope itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/FAQPage\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          {\u003C/span>\u003Cspan style=\"color:#FFAB70\">guideContent\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">faqItems\u003C/span>\u003Cspan style=\"color:#E1E4E8\">.\u003C/span>\u003Cspan style=\"color:#FFAB70\">map\u003C/span>\u003Cspan style=\"color:#E1E4E8\">((\u003C/span>\u003Cspan style=\"color:#FFAB70\">item\u003C/span>\u003Cspan style=\"color:#E1E4E8\">, \u003C/span>\u003Cspan style=\"color:#FFAB70\">i\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:#F97583\">            &#x3C;\u003C/span>\u003Cspan style=\"color:#FFAB70\">details\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              key\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{i}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFAB70\">              itemScope\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"mainEntity\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">              itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Question\"\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            >\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">              &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">summary itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"name\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{item.question}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">summary\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">              &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">div itemScope itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"acceptedAnswer\"\u003C/span>\u003Cspan style=\"color:#E1E4E8\"> itemType\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"https://schema.org/Answer\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">                &#x3C;\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p itemProp\u003C/span>\u003Cspan style=\"color:#F97583\">=\u003C/span>\u003Cspan style=\"color:#9ECBFF\">\"text\"\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003Cspan style=\"color:#E1E4E8\">{item.answer}\u003C/span>\u003Cspan style=\"color:#F97583\">&#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">p\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">              &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">div\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#F97583\">            &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">details\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">          ))}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">        &#x3C;/\u003C/span>\u003Cspan style=\"color:#FFAB70\">div\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\">    &#x3C;/\u003C/span>\u003Cspan style=\"color:#E1E4E8\">section\u003C/span>\u003Cspan style=\"color:#F97583\">>\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">  );\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#E1E4E8\">}\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// Dans getStaticProps / generateStaticParams :\u003C/span>\u003C/span>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:#6A737D\">// guideContent est récupéré côté serveur et injecté dans le HTML initial\u003C/span>\u003C/span>\u003C/code>\u003C/pre>\n\u003Cp>Note sur le FAQ schema : bien que Google ait restreint l'affichage des FAQ rich results dans les SERPs classiques (voir \u003Ca href=\"/blog/google-drops-faq-rich-results-from-search-via-sejournal-mattgsouthern\">notre analyse sur ce sujet\u003C/a>), le balisage structuré FAQ reste pertinent pour les AI Overviews et pour la compréhension sémantique de la page par les crawlers.\u003C/p>\n\u003Ch3>Jour J+8 : résultat du correctif\u003C/h3>\n\u003Cp>Après le redéploiement du fix SSR et un passage dans l'outil d'inspection d'URL de la Search Console pour forcer le re-crawl des 50 catégories les plus importantes, les positions commencent à se stabiliser. Le trafic catégories remonte de 60% du drop initial en 5 jours.\u003C/p>\n\u003Cp>La leçon : cette perte de trafic n'avait rien à voir avec la \"qualité du contenu\" au sens éditorial. C'était une régression technique invisible qui a coïncidé avec le moment où Google réévaluait la pertinence relative des pages.\u003C/p>\n\u003Ch2>Méthodologie d'audit post-update en 5 étapes\u003C/h2>\n\u003Cp>Voici le workflow que les équipes SEO techniques devraient systématiser à chaque core update. Pas un checklist cosmétique — un protocole d'investigation.\u003C/p>\n\u003Ch3>Étape 1 : Segmenter l'impact par template\u003C/h3>\n\u003Cp>Ne regardez jamais les métriques agrégées. Un site peut être globalement stable tout en ayant un template qui s'effondre et un autre qui compense. Utilisez la Search Console avec un filtre regex par pattern d'URL, ou exportez via l'API (script ci-dessus) et segmentez dans un tableur.\u003C/p>\n\u003Cp>Les templates à segmenter en priorité :\u003C/p>\n\u003Cul>\n\u003Cli>Pages produit vs pages catégorie vs pages éditoriales\u003C/li>\n\u003Cli>Pages avec et sans contenu UGC (avis, commentaires)\u003C/li>\n\u003Cli>Pages récentes (&#x3C;6 mois) vs pages anciennes\u003C/li>\n\u003Cli>Pages à contenu fin (&#x3C;300 mots de texte unique) vs pages à contenu riche\u003C/li>\n\u003C/ul>\n\u003Ch3>Étape 2 : Vérifier l'intégrité technique des pages touchées\u003C/h3>\n\u003Cp>Avant de remettre en question votre stratégie de contenu, éliminez les causes techniques. Pour chaque template touché :\u003C/p>\n\u003Col>\n\u003Cli>\u003Cstrong>Inspection URL\u003C/strong> dans la Search Console : le HTML rendu correspond-il à ce que vous attendez ?\u003C/li>\n\u003Cli>\u003Cstrong>Crawl Screaming Frog\u003C/strong> en mode \"JavaScript rendering\" vs mode \"HTML only\" : si les deux versions diffèrent significativement (title différent, H1 manquant, contenu absent), vous avez un problème de rendu.\u003C/li>\n\u003Cli>\u003Cstrong>Vérification des canonicals\u003C/strong> : une migration récente a-t-elle pu introduire des canonicals en boucle ou vers des pages 404 ?\u003C/li>\n\u003Cli>\u003Cstrong>Temps de réponse serveur\u003C/strong> (TTFB) : un TTFB > 800ms sur les pages touchées peut indiquer un problème d'infra qui dégrade le crawl.\u003C/li>\n\u003C/ol>\n\u003Ch3>Étape 3 : Analyser les pages gagnantes des concurrents\u003C/h3>\n\u003Cp>Si vos pages catégories perdent des positions, qui les gagne ? Identifiez 5-10 requêtes clés où vous avez perdu 5+ positions. Analysez les pages qui occupent désormais les positions que vous aviez :\u003C/p>\n\u003Cul>\n\u003Cli>Quel est leur ratio contenu éditorial / contenu transactionnel ?\u003C/li>\n\u003Cli>Ont-elles des signaux E-E-A-T visibles (auteur identifié, sources citées, date de mise à jour) ?\u003C/li>\n\u003Cli>Leur structure de maillage interne est-elle plus dense que la vôtre sur ce cluster thématique ?\u003C/li>\n\u003C/ul>\n\u003Ch3>Étape 4 : Vérifier la couverture d'indexation\u003C/h3>\n\u003Cp>Les core updates peuvent modifier indirectement le budget de crawl alloué à votre site. Si Google réévalue la qualité de certaines sections à la baisse, il peut réduire la fréquence de crawl sur ces sections. Vérifiez dans la Search Console > Indexation > Pages :\u003C/p>\n\u003Cul>\n\u003Cli>Le nombre de pages \"Découverte, actuellement non indexée\" a-t-il augmenté ?\u003C/li>\n\u003Cli>Le nombre de pages \"Explorée, actuellement non indexée\" a-t-il changé ?\u003C/li>\n\u003Cli>Y a-t-il de nouvelles \u003Ca href=\"/blog/how-soft-404s-and-indexing-issues-caused-a-90-traffic-collapse\">soft 404 détectées\u003C/a> ?\u003C/li>\n\u003C/ul>\n\u003Ch3>Étape 5 : Documenter et attendre\u003C/h3>\n\u003Cp>C'est le conseil le moins sexy mais le plus important : \u003Cstrong>ne faites pas de changements majeurs pendant le rollout\u003C/strong>. Documentez tout, préparez vos hypothèses, mais attendez que la mise à jour soit complètement déployée avant de tirer des conclusions ou de lancer des modifications structurelles.\u003C/p>\n\u003Cp>Les données de la première semaine de rollout sont instables par nature. Google teste différentes configurations de ranking pendant le déploiement. Une page qui perd 15 positions le jour 3 peut en regagner 10 le jour 8.\u003C/p>\n\u003Ch2>L'intersection core update et AI Overviews\u003C/h2>\n\u003Cp>Cette core update de mai 2026 intervient dans un contexte où les AI Overviews occupent une part croissante des SERPs. Le lien entre les deux n'est pas explicitement documenté par Google, mais il existe des interactions logiques.\u003C/p>\n\u003Cp>Quand une core update réévalue la qualité d'une page, cela affecte potentiellement :\u003C/p>\n\u003Cul>\n\u003Cli>Sa position dans les résultats classiques (blue links)\u003C/li>\n\u003Cli>Son éligibilité comme source pour les AI Overviews\u003C/li>\n\u003Cli>La confiance que le système de ranking accorde à son contenu pour alimenter les réponses IA\u003C/li>\n\u003C/ul>\n\u003Cp>Si votre trafic depuis les résultats classiques baisse mais que vos impressions dans les AI Overviews augmentent (ou inversement), vous êtes face à un phénomène de transfert qu'il faut analyser distinctement. Google a récemment \u003Ca href=\"/blog/google-adds-more-ai-search-links-still-no-click-data-for-seos-via-sejournal-mattgsouthern\">commencé à fournir plus de liens dans les résultats AI\u003C/a>, mais le manque de données de clicks sur ces résultats rend le diagnostic complexe.\u003C/p>\n\u003Cp>Pour les sites qui investissent dans \u003Ca href=\"/blog/google-publishes-guide-on-optimizing-for-generative-ai-features\">l'optimisation pour l'IA générative\u003C/a>, cette core update est un rappel que la fondation reste le ranking classique. Un site qui perd ses positions organiques classiques a peu de chances d'être sélectionné comme source de confiance pour les AI Overviews.\u003C/p>\n\u003Cp>L'approche la plus robuste est de s'assurer que \u003Ca href=\"/blog/the-tech-seo-audit-for-the-ai-search-era-how-to-maximize-your-ai-visibility-via-sejournal-jetoctopus\">l'audit technique couvre les deux dimensions\u003C/a> : ranking classique et visibilité IA.\u003C/p>\n\u003Ch2>Les erreurs à ne pas commettre pendant le rollout\u003C/h2>\n\u003Cp>Chaque core update déclenche les mêmes erreurs. Voici les trois plus destructrices.\u003C/p>\n\u003Ch3>Ne pas supprimer massivement du contenu \"thin\"\u003C/h3>\n\u003Cp>C'est le réflexe n°1 des équipes qui paniquent : \"Google ne nous aime plus, supprimons toutes les pages à faible contenu.\" Problème : vous supprimez aussi des pages qui captent du trafic long-tail, qui servent de maillage interne, ou qui apportent de la couverture thématique. La bonne approche est de \u003Cstrong>noindexer\u003C/strong> les pages réellement problématiques (0 trafic, 0 impressions depuis 6 mois, contenu dupliqué) et de \u003Cstrong>consolider\u003C/strong> le reste.\u003C/p>\n\u003Ch3>Ne pas refaire la structure de maillage interne\u003C/h3>\n\u003Cp>Modifier massivement le maillage interne pendant un rollout, c'est changer les paramètres de l'expérience pendant que l'expérience est en cours. Si Google re-crawle vos pages avec une nouvelle structure de liens internes au milieu du déploiement de l'update, vous ne saurez jamais si les variations que vous observez viennent de l'algorithme ou de vos propres changements.\u003C/p>\n\u003Ch3>Ne pas ignorer le staging\u003C/h3>\n\u003Cp>Si vous devez déployer des changements techniques urgents (comme le fix SSR du scénario MaisonDeco), \u003Ca href=\"/blog/how-to-stress-test-a-staging-environment-to-surface-risks-pre-launch-ask-an-seo-via-sejournal-helenpollitt1\">testez d'abord en staging\u003C/a>. Un fix mal testé qui introduit une nouvelle régression pendant un rollout de core update peut transformer une baisse de 15% en effondrement de 60%.\u003C/p>\n\u003Ch2>Construire un système d'alerte durable\u003C/h2>\n\u003Cp>Les core updates ne sont plus des événements rares. Avec deux broad core updates en trois mois en 2026, plus les updates spécifiques (spam, reviews, helpful content), votre site subit en moyenne 8-10 mises à jour de ranking par an qui peuvent affecter votre trafic.\u003C/p>\n\u003Cp>La bonne approche n'est pas de réagir à chaque update — c'est de maintenir un monitoring continu qui vous alerte dès qu'une métrique dévie de la normale, quelle qu'en soit la cause.\u003C/p>\n\u003Cp>Les composants essentiels :\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Monitoring de positions quotidien\u003C/strong> sur vos 100-200 requêtes stratégiques, segmenté par template de page\u003C/li>\n\u003Cli>\u003Cstrong>Alertes automatiques sur les chutes de trafic\u003C/strong> par section du site (pas sur le total)\u003C/li>\n\u003Cli>\u003Cstrong>Vérification continue du rendu SSR\u003C/strong> sur un échantillon de pages critiques\u003C/li>\n\u003Cli>\u003Cstrong>Suivi de l'indexation\u003C/strong> : nombre de pages indexées, ratio indexé/soumis, nouvelles erreurs\u003C/li>\n\u003Cli>\u003Cstrong>Monitoring des backlinks\u003C/strong> : une core update qui coïncide avec une perte de liens de qualité peut amplifier la baisse\u003C/li>\n\u003C/ul>\n\u003Cp>Seogard surveille ces signaux en continu et détecte les régressions techniques (meta disparues, SSR cassé, canonicals altérés) avant qu'elles n'aient le temps de se transformer en perte de trafic organique. C'est particulièrement utile pendant les périodes de rollout, où chaque jour sans détection est un jour de trafic perdu.\u003C/p>\n\u003Ch2>Wrap-up\u003C/h2>\n\u003Cp>La May 2026 Core Update n'a rien de révolutionnaire dans son mécanisme — c'est une réévaluation globale de la pertinence, comme toutes les broad core updates. Ce qui change, c'est le rythme (deux en trois mois) et le contexte (interaction croissante avec les AI Overviews). La seule réponse durable, c'est un monitoring technique systématique qui détecte les régressions en temps réel, que la cause soit algorithmique, technique, ou les deux simultanément.\u003C/p>",null,12,[18,19,20,21,22],"google core update","mai 2026","SEO technique","monitoring","search console","May 2026 Core Update : analyse technique et plan d'action","Thu May 21 2026 18:02:51 GMT+0000 (Coordinated Universal Time)",[26,39,53],{"_id":27,"slug":28,"__v":6,"author":7,"canonical":29,"category":10,"createdAt":30,"date":12,"description":31,"image":15,"imageAlt":15,"readingTime":16,"tags":32,"title":37,"updatedAt":38},"6a0ea00daa6b273b0cf4cc1a","wordpress-7-0-launches-with-native-ai-integration-via-sejournal-martinibuster","https://seogard.io/blog/wordpress-7-0-launches-with-native-ai-integration-via-sejournal-martinibuster","2026-05-21T06:02:53.501Z","Analyse technique de l'intégration AI native dans WordPress 7.0 : impacts sur le rendu HTML, le crawl budget, le SSR et les stratégies SEO à adapter.",[33,34,20,35,36],"wordpress","AI","SSR","crawl budget","WordPress 7.0 et AI native : impacts SEO techniques","Thu May 21 2026 06:02:53 GMT+0000 (Coordinated Universal Time)",{"_id":40,"slug":41,"__v":6,"author":7,"canonical":42,"category":10,"createdAt":43,"date":12,"description":44,"image":15,"imageAlt":15,"readingTime":45,"tags":46,"title":51,"updatedAt":52},"6a0f1eb5aa6b273b0c5d4dff","how-to-stress-test-a-staging-environment-to-surface-risks-pre-launch-ask-an-seo-via-sejournal-helenpollitt1","https://seogard.io/blog/how-to-stress-test-a-staging-environment-to-surface-risks-pre-launch-ask-an-seo-via-sejournal-helenpollitt1","2026-05-21T15:03:17.960Z","Méthodologie complète pour stress-tester un environnement staging avant migration ou refonte. Scripts, configs et scénarios concrets pour détecter les régressions SEO.",14,[47,48,49,50,20],"stress-test","staging","migration SEO","pre-launch","Stress-test staging SEO : checklist technique pré-launch","Thu May 21 2026 15:03:17 GMT+0000 (Coordinated Universal Time)",{"_id":54,"slug":55,"__v":6,"author":7,"canonical":56,"category":10,"createdAt":57,"date":58,"description":59,"image":15,"imageAlt":15,"readingTime":16,"tags":60,"title":66,"updatedAt":67},"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.",[61,62,63,64,65],"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)"]