Depuis août 2021 et le déploiement du système de génération de titres de Google, les title tags que vous rédigez ne sont plus qu'une suggestion. Sur un site de 8 000 pages comme Moz.com, cela signifie potentiellement des milliers de titres réécrits dans les SERPs — souvent en pire. L'étude publiée par Moz offre une radiographie rare de ce phénomène à grande échelle, avec des corrections concrètes qui ont fonctionné. Décortiquons les mécanismes techniques sous-jacents et les patterns exploitables.
Pourquoi Google réécrit vos title tags (et à quelle fréquence)
Google a officiellement documenté son système de génération de titres dans la documentation Search Central. Le moteur puise dans plusieurs sources pour construire le titre affiché dans les SERPs :
- Le contenu de la balise
<title> - Le H1 principal de la page
- Le texte d'ancrage des liens internes et externes pointant vers la page
- Le contenu textuel visible (notamment les premiers paragraphes)
- Les données structurées (notamment
namedans un schemaArticleouProduct)
Le taux de réécriture varie considérablement selon les études, mais le chiffre observé sur Moz.com est frappant : sur environ 8 000 URLs indexées, une proportion significative de titres était modifiée. Le cas Moz est instructif parce que le site est maintenu par des professionnels du SEO — ce ne sont pas des erreurs de débutant qui déclenchent les réécritures.
Les déclencheurs techniques les plus fréquents
Trois patterns dominent dans les réécritures observées :
1. Title trop long (troncature + réécriture). Google ne se contente pas de tronquer. Au-delà de ~60 caractères (environ 580px en desktop), il peut décider de reformuler entièrement le titre pour le raccourcir. Le résultat est souvent pire que ce qu'une troncature propre aurait donné.
2. Title trop similaire au H1. Quand le <title> et le <h1> sont identiques ou quasi-identiques, Google considère parfois qu'il dispose d'une meilleure alternative et pioche dans les ancres de liens ou d'autres éléments on-page.
3. Présence du nom de marque en doublon ou mal formatée. Un pattern classique : Mon article | Moz Blog | Moz pousse Google à réécrire pour supprimer la redondance. Mais la chirurgie est parfois brutale et supprime aussi des mots-clés utiles.
Pour identifier rapidement ces patterns sur votre propre site, la première étape est un export Search Console croisé avec un crawl. Voici comment automatiser ce diagnostic.
Diagnostic à l'échelle : détecter les réécritures automatiquement
La Search Console ne vous montre pas directement quels titres sont réécrits. Il faut croiser deux sources de données : le titre tel que vous l'avez écrit (crawl) et le titre tel que Google l'affiche (SERP).
Étape 1 : extraire les title tags réels via Screaming Frog
Lancez un crawl complet et exportez les colonnes Address, Title 1, Title 1 Length, H1-1 :
# Export CSV depuis Screaming Frog en ligne de commande (Windows)
ScreamingFrogSEOSpiderCli.exe \
--crawl https://www.votredomaine.com \
--headless \
--save-crawl \
--export-tabs "Internal:All" \
--output-folder "C:\crawl-export" \
--export-format csv
Sur un site de 8 000 pages, le crawl prend typiquement 15 à 45 minutes selon la vitesse de réponse du serveur et la configuration du rate limiting. Configurez Screaming Frog à 5 URLs/seconde max pour ne pas stresser votre infrastructure.
Étape 2 : récupérer les titres affichés par Google
Deux approches complémentaires :
Via l'API Search Console (méthode programmatique) : l'API ne retourne pas directement le titre affiché. Mais vous pouvez utiliser l'API de scraping SERP (DataForSEO, SerpAPI, ou ValueSERP) pour récupérer les titres affichés pour vos URLs indexées.
Via un script Python qui interroge les SERPs :
import pandas as pd
from serpapi import GoogleSearch
# Charger les URLs depuis l'export Screaming Frog
df = pd.read_csv("internal_all.csv")
urls = df["Address"].tolist()
results = []
for url in urls[:100]: # Commencer par un échantillon
params = {
"engine": "google",
"q": f"site:{url}",
"api_key": "VOTRE_CLE_API",
"num": 1
}
search = GoogleSearch(params)
data = search.get_dict()
if "organic_results" in data and len(data["organic_results"]) > 0:
serp_title = data["organic_results"][0].get("title", "")
results.append({
"url": url,
"serp_title": serp_title
})
serp_df = pd.DataFrame(results)
# Fusion avec les données de crawl
merged = df.merge(serp_df, left_on="Address", right_on="url", how="inner")
merged["rewritten"] = merged["Title 1"] != merged["serp_title"]
merged["rewritten"].value_counts()
Ce script est un point de départ. En production, vous ajouterez un rate limiting, un cache, et une comparaison par similarité (Levenshtein ou difflib) plutôt qu'une égalité stricte — Google modifie parfois un seul mot.
Étape 3 : classifier les types de réécriture
Une fois les réécritures identifiées, classifiez-les. Sur le cas Moz, trois catégories émergent clairement :
| Type de réécriture | Fréquence estimée | Impact CTR |
|---|---|---|
| Troncature + reformulation | ~40% | Négatif modéré |
| Remplacement par le H1 | ~30% | Neutre à négatif |
| Injection de texte d'ancre | ~15% | Souvent négatif |
| Suppression du brand suffix | ~15% | Neutre |
Un outil de monitoring continu comme Seogard détecte ces réécritures automatiquement en comparant les titles crawlés avec les titles affichés, sans que vous ayez à relancer manuellement ce pipeline à chaque mise à jour de contenu.
Case study 1 : titles trop longs sur les pages Learn
Le premier cas concret de l'étude Moz concerne les pages du hub éducatif (Learn). Le pattern est classique : des titres descriptifs mais verbeux, typiquement 70 à 90 caractères, systématiquement réécrits.
Le problème
Un titre comme :
<title>What Is Domain Authority? How DA Is Calculated & How to Improve It | Moz</title>
Fait 74 caractères. Google le réécrit en quelque chose comme : "Domain Authority - Moz" — en perdant tout le contenu informationnel et les mots-clés secondaires.
La correction
La stratégie qui a fonctionné : raccourcir le titre à moins de 60 caractères tout en conservant le mot-clé principal et le brand suffix. Le H1 garde la version longue et descriptive.
<!-- AVANT : 74 caractères, réécrit -->
<title>What Is Domain Authority? How DA Is Calculated & How to Improve It | Moz</title>
<h1>What Is Domain Authority? How DA Is Calculated & How to Improve It</h1>
<!-- APRÈS : 42 caractères, respecté par Google -->
<title>What Is Domain Authority? | Moz</title>
<h1>What Is Domain Authority? How DA Is Calculated & How to Improve It</h1>
Le principe technique sous-jacent : Google a une forte préférence pour les titres qui tiennent dans l'espace d'affichage SERP (~580px desktop, ~480px mobile). Quand le titre dépasse cet espace, le système de génération estime qu'il peut faire mieux — et c'est là que les dégâts commencent.
L'erreur fréquente à éviter
Ne confondez pas "raccourcir" et "supprimer les mots-clés". L'objectif est de concentrer l'intention principale dans le title, et de déléguer les mots-clés secondaires au H1 et au contenu. Pour un guide complet sur les patterns d'optimisation des balises title, consultez les erreurs de title tag qui vous coûtent des clics.
Case study 2 : duplication title/H1 sur les articles de blog
Le deuxième cas est plus subtil. Sur les articles du blog Moz, le <title> et le <h1> étaient souvent identiques. Google interprétait cela comme un signal de "titre unique non différencié" et piochait dans d'autres éléments — souvent le texte d'ancre de liens internes, qui peut être complètement hors sujet.
Le mécanisme technique
Google Search utilise un modèle de consensus. Quand plusieurs signaux concordent (title, H1, ancres), il fait confiance au title tel quel. Quand le title et le H1 sont identiques mais que les ancres ou le contenu environnant racontent une histoire différente, Google considère qu'il y a un "conflit de signaux" et peut choisir une alternative.
Illustration concrète : un article intitulé "Local SEO Guide" avec un H1 identique, mais où les liens internes pointant vers cette page utilisent des ancres comme "our comprehensive guide to local search ranking factors" — Google peut décider d'utiliser cette ancre comme base pour le titre SERP.
La correction
Différencier le title et le H1 de manière intentionnelle :
<!-- AVANT : title = H1, sujet à réécriture -->
<title>The Beginner's Guide to Local SEO | Moz</title>
<h1>The Beginner's Guide to Local SEO</h1>
<!-- APRÈS : title orienté SERP, H1 orienté lecture -->
<title>Local SEO Guide: Rankings, Citations & Maps | Moz</title>
<h1>The Beginner's Guide to Local SEO</h1>
Le title est optimisé pour la SERP (concis, riche en mots-clés, avec un aperçu du contenu). Le H1 est optimisé pour la lecture (plus naturel, plus engageant). Cette dualité n'est pas un hack — c'est exactement ce que la documentation Google recommande implicitement quand elle dit que le title doit être "concise and descriptive".
Template de différenciation à grande échelle
Pour un site avec des milliers de pages, vous ne pouvez pas différencier manuellement chaque title/H1. Un template intelligent dans votre CMS résout le problème :
// Exemple Next.js : génération dynamique du title
// Le title inclut la catégorie et le brand, le H1 reste éditorial
function generateMetaTitle(article) {
const { title, category, primaryKeyword } = article;
// Stratégie : mot-clé principal + catégorie + brand
// Objectif : < 60 caractères
const baseTitle = primaryKeyword || title;
const suffix = "| Moz";
let metaTitle = `${baseTitle} ${suffix}`;
// Si trop long, on supprime la catégorie d'abord
if (metaTitle.length > 60) {
metaTitle = `${baseTitle.substring(0, 50)} ${suffix}`;
}
return metaTitle;
}
// Utilisation dans le composant Head
export default function ArticlePage({ article }) {
return (
<>
<Head>
<title>{generateMetaTitle(article)}</title>
<meta name="description" content={article.metaDescription} />
</Head>
<article>
<h1>{article.editorialTitle}</h1>
{/* Le H1 est le titre éditorial complet */}
</article>
</>
);
}
Ce pattern fonctionne particulièrement bien sur les architectures SSR et SSG. Si votre site utilise du rendering côté client, assurez-vous que Googlebot voit bien le title final — un problème courant documenté dans notre analyse du SSR vs CSR.
Case study 3 : le piège du brand suffix dupliqué
Le troisième cas Moz est le plus insidieux. Le template du site ajoutait automatiquement " | Moz" à chaque title. Mais certaines pages avaient déjà "Moz" dans le titre éditorial : "Moz Pro: SEO Software | Moz". Google détectait la redondance et réécrivait le titre entier — parfois en supprimant "Pro" ou "SEO Software", ruinant le ciblage keyword.
Détection programmatique
Voici comment détecter ce pattern sur un export de crawl :
import pandas as pd
import re
df = pd.read_csv("internal_all.csv")
# Identifier le brand suffix
BRAND = "Moz"
SEPARATOR_PATTERN = r"\s*[\|\-–—]\s*"
def detect_brand_duplication(title, brand):
"""Détecte si le brand apparaît plus d'une fois dans le title."""
if not isinstance(title, str):
return False
# Compter les occurrences du brand (case-insensitive)
count = len(re.findall(re.escape(brand), title, re.IGNORECASE))
return count > 1
def detect_brand_in_body_and_suffix(title, brand):
"""Détecte si le brand est dans le corps du title ET dans le suffix."""
if not isinstance(title, str):
return False
parts = re.split(SEPARATOR_PATTERN, title)
if len(parts) < 2:
return False
body = " ".join(parts[:-1]).lower()
suffix = parts[-1].lower()
return brand.lower() in body and brand.lower() in suffix
df["brand_duplicated"] = df["Title 1"].apply(
lambda t: detect_brand_duplication(t, BRAND)
)
df["brand_body_and_suffix"] = df["Title 1"].apply(
lambda t: detect_brand_in_body_and_suffix(t, BRAND)
)
print(f"Pages avec brand dupliqué : {df['brand_duplicated'].sum()}")
print(f"Pages avec brand dans corps + suffix : {df['brand_body_and_suffix'].sum()}")
# Exporter les pages à corriger
issues = df[df["brand_duplicated"] | df["brand_body_and_suffix"]]
issues[["Address", "Title 1"]].to_csv("brand_duplication_issues.csv", index=False)
La correction systémique
Plutôt que de corriger page par page, la solution est d'implémenter une logique conditionnelle dans le template :
// Middleware de génération de title avec déduplication du brand
function buildTitle(editorialTitle, brand = "Moz") {
const separator = " | ";
const brandSuffix = `${separator}${brand}`;
// Si le brand est déjà dans le titre éditorial, ne pas ajouter le suffix
const brandRegex = new RegExp(`\\b${brand}\\b`, "i");
if (brandRegex.test(editorialTitle)) {
// Vérifier que le titre ne se termine pas déjà par le suffix
if (editorialTitle.trim().endsWith(brand)) {
return editorialTitle; // Déjà correct
}
// Le brand est dans le corps : ne pas ajouter de suffix
return editorialTitle;
}
// Ajouter le brand suffix si absent
const fullTitle = `${editorialTitle}${brandSuffix}`;
// Vérifier la longueur
if (fullTitle.length > 60) {
// Tronquer le titre éditorial, pas le brand
const maxEditorialLength = 60 - brandSuffix.length;
return `${editorialTitle.substring(0, maxEditorialLength).trim()}${brandSuffix}`;
}
return fullTitle;
}
// Tests
console.log(buildTitle("Moz Pro: SEO Software"));
// → "Moz Pro: SEO Software" (pas de suffix ajouté)
console.log(buildTitle("Keyword Research Guide"));
// → "Keyword Research Guide | Moz"
console.log(buildTitle("The Complete Guide to On-Page SEO Ranking Factors in 2026"));
// → "The Complete Guide to On-Page SEO Rankin | Moz" (tronqué)
Ce type de logique devrait vivre dans votre couche de rendering, que ce soit un helper Twig (Symfony), un composant Head (Next.js/Nuxt), ou un plugin WordPress. C'est un investissement de quelques heures qui prévient des milliers de réécritures.
Scénario réel : migration d'un e-commerce de 12 000 pages
Pour illustrer l'ampleur du problème au-delà du cas Moz, voici un scénario que nous avons observé sur un e-commerce français spécialisé (articles de sport, ~12 000 pages produit, ~800 pages catégorie).
Le contexte
Après une refonte sous Nuxt 3, le site a gagné en performance (passage de CSR à SSR avec ISR pour les fiches produit). Mais trois mois après la migration, l'équipe SEO constate une baisse de CTR de 12% sur les pages catégorie — à positions constantes dans la Search Console.
Le diagnostic
Un croisement crawl Screaming Frog / données SERP via DataForSEO révèle que 67% des pages catégorie ont leur title réécrit par Google. Le pattern :
- Template de title :
{Nom catégorie} - Achat en ligne | {Brand} - {Ville} - Title affiché : Google supprimait systématiquement la partie après le pipe, parfois en injectant le H1 (qui était un simple
{Nom catégorie}sans aucun qualificatif commercial)
Le problème venait d'un title template à 75-85 caractères, couplé à un H1 trop court et générique. Google choisissait le H1 comme base de réécriture, perdant les qualificatifs "achat en ligne" et le signal de géolocalisation.
La correction (et les résultats)
Trois changements simultanés :
- Title raccourci à 55 caractères max :
{Nom catégorie} - Achat en ligne | {Brand} - H1 enrichi :
{Nom catégorie} : nos {count} produits en stock(ajout de preuve sociale) - Ancres internes standardisées : remplacement des ancres génériques ("voir la catégorie") par des ancres descriptives alignées avec le title
Résultat après 6 semaines (temps nécessaire pour que Google recrawle et réévalue les 800 pages catégorie) : le taux de réécriture est passé de 67% à 18%, et le CTR moyen des pages catégorie a remonté de 9 points — pas tout à fait au niveau pré-migration, mais la tendance était claire.
Le suivi de cette récupération a été fait via un dashboard croisant les données Search Console avec un monitoring des titles affichés, recrawlés quotidiennement. C'est précisément le type de surveillance continue qu'un outil comme Seogard permet d'automatiser — détecter immédiatement quand Google recommence à réécrire un title que vous pensiez corrigé.
Stratégie de prévention : les règles à encoder dans votre pipeline
Plutôt que de réagir aux réécritures après coup, intégrez des garde-fous dans votre process de publication.
Validation pré-déploiement
Un test automatisé dans votre CI/CD peut vérifier les title tags avant mise en production :
// test/seo/title-tags.test.js
// À intégrer dans votre suite de tests (Jest, Vitest, etc.)
import { describe, it, expect } from "vitest";
import { JSDOM } from "jsdom";
import fs from "fs";
import path from "path";
const BRAND = "MonSite";
const MAX_TITLE_LENGTH = 60;
const MIN_TITLE_LENGTH = 25;
// Charger les pages rendues (output SSG ou SSR snapshot)
const pagesDir = path.resolve("./dist");
const htmlFiles = fs.readdirSync(pagesDir, { recursive: true })
.filter(f => f.endsWith(".html"));
describe("Title tag validation", () => {
htmlFiles.forEach(file => {
it(`${file} : title tag conforme`, () => {
const html = fs.readFileSync(path.join(pagesDir, file), "utf-8");
const dom = new JSDOM(html);
const title = dom.window.document.querySelector("title")?.textContent;
const h1 = dom.window.document.querySelector("h1")?.textContent;
// Title existe
expect(title).toBeTruthy();
// Longueur dans les limites
expect(title.length).toBeGreaterThanOrEqual(MIN_TITLE_LENGTH);
expect(title.length).toBeLessThanOrEqual(MAX_TITLE_LENGTH);
// Pas de brand dupliqué
const brandCount = (title.match(new RegExp(BRAND, "gi")) || []).length;
expect(brandCount).toBeLessThanOrEqual(1);
// Title != H1 (différenciation)
if (h1) {
expect(title.replace(` | ${BRAND}`, "").trim())
.not.toEqual(h1.trim());
}
// Pas de title boilerplate
expect(title).not.toMatch(/^Home\b/i);
expect(title).not.toMatch(/^Untitled/i);
});
});
});
Ce test attrape les problèmes avant qu'ils n'atteignent la production. Sur un site avec des centaines de rédacteurs, c'est la différence entre une détection à J+0 et une détection à J+30 quand Google a déjà réécrit le titre et que le CTR a chuté.
Checklist éditoriale pour les rédacteurs
Pour les équipes contenu, formalisez ces règles dans un document partagé :
- Title : 50-60 caractères, mot-clé principal en début, brand suffix automatique
- H1 : version plus longue et naturelle, peut inclure des mots-clés secondaires
- Cohérence des ancres : quand vous créez un lien interne, utilisez un texte d'ancre aligné avec le title de la page cible (pas "cliquez ici", pas une phrase complète de 15 mots)
Pour aller plus loin sur l'optimisation des meta tags dans leur ensemble, notre guide complet des meta tags SEO couvre les interactions entre title, description et Open Graph.
Les edge cases où la réécriture de Google est meilleure
Soyons honnêtes : Google n'a pas toujours tort. Dans certains cas, la réécriture améliore effectivement le titre. L'étude Moz le reconnaît implicitement — tous les 8 000 rewrites n'étaient pas des problèmes à corriger.
Quand laisser Google réécrire
Pages avec des titles auto-générés par le CMS. Si votre système génère des titles comme "Product - Category - Subcategory - Brand" (pattern fréquent sur Magento/Shopify), la réécriture de Google est souvent meilleure. Investissez votre temps à améliorer le template plutôt qu'à lutter contre les réécritures.
Pages legacy avec des titles obsolètes. Sur un site avec 10 ans d'historique, certaines pages ont des titles datant d'une époque où le SEO se résumait à du keyword stuffing. Google les nettoie, et c'est une bonne chose.
Requêtes ambiguës. Google adapte parfois le titre affiché en fonction de la requête de l'utilisateur. Si quelqu'un cherche "prix domain authority" et que votre title est "What Is Domain Authority? | Moz", Google peut afficher "Domain Authority Pricing & Plans | Moz". Ce n'est pas un bug — c'est de la personnalisation SERP.
Quand lutter contre la réécriture
Concentrez vos efforts de correction sur les cas où :
- Le title réécrit perd votre mot-clé principal
- Le title réécrit introduit des termes incorrects (ancres de backlinks de mauvaise qualité)
- Le title réécrit supprime un différenciateur commercial (gratuit, comparatif, prix, guide)
- Le CTR de la page a chuté significativement après le début de la réécriture
Pour mesurer ce dernier point, croisez la date de première détection de la réécriture avec les données de CTR par page dans la Search Console. Attention cependant aux bugs d'impression récemment documentés qui peuvent fausser l'analyse.
Monitoring continu : la seule stratégie viable à l'échelle
Corriger 8 000 title tags est un projet. Empêcher les réécritures de réapparaître est un processus. La différence entre un site qui maintient ses titles et un site qui subit les réécritures, c'est l'automatisation du monitoring.
Un pipeline robuste combine trois couches :
- Validation pré-déploiement (tests CI/CD comme ci-dessus) — attrape les erreurs avant production
- Crawl régulier (Screaming Frog ou crawler custom, hebdomadaire) — détecte les dérives de template
- Comparaison SERP continue (API SERP ou outil de monitoring dédié) — détecte les réécritures Google en quasi-temps réel
Sans cette troisième couche, vous ne découvrez les réécritures que quand un rédacteur vérifie manuellement une page dans Google, ou quand le CTR a déjà suffisamment chuté pour apparaître dans un rapport mensuel. Sur un site de plusieurs milliers de pages, c'est trop tard.
Les réécritures de title tags ne sont pas un problème qu'on règle une fois. Google met à jour son système de génération de titres régulièrement — parfois lors de core updates, parfois silencieusement. La seule défense est un système qui compare en continu ce que vous publiez avec ce que Google affiche, et qui vous alerte quand l'écart se creuse.