En août 2021, Google a officialisé un changement majeur dans la génération des titres affichés en SERP : le système ne se contente plus de reprendre la balise <title> — il la réécrit lorsqu'il estime qu'une alternative décrit mieux la page. L'équipe SEO de Moz a récemment publié une analyse de 8 000 title tags réécrits sur leur propre domaine. Leur constat : la majorité des réécritures dégradent le CTR, et la correction systématique est possible — à condition de comprendre la logique de Google.
Cet article décortique les mécanismes techniques derrière ces réécritures, les patterns identifiés sur un site de cette envergure, et les méthodes concrètes pour reprendre le contrôle.
Pourquoi Google réécrit les title tags : la mécanique interne
Google utilise un système baptisé en interne "title generation system" qui s'appuie sur plusieurs signaux pour produire le titre affiché en SERP. La documentation officielle liste les sources candidates :
- Le contenu de la balise
<title> - Le contenu visible principal de la page (H1, headings)
- Le texte d'ancre des liens pointant vers la page
- Le texte dans les balises Open Graph (
og:title) - Le contenu du breadcrumb
Le système évalue chaque source et sélectionne celle qui, selon ses heuristiques, représente le mieux le contenu de la page pour la requête de l'utilisateur. La réécriture n'est pas un bug — c'est un comportement intentionnel et documenté.
Les déclencheurs les plus fréquents
L'analyse de Moz sur 8 000 URLs révèle des patterns récurrents. Trois déclencheurs dominent :
Title trop long. Au-delà de ~60 caractères (ou ~580 pixels en affichage desktop), Google tronque ou reformule. Mais la troncation et la réécriture sont deux phénomènes distincts. Un title de 75 caractères peut être tronqué avec "..." — ou entièrement remplacé par le H1 si Google juge ce dernier plus pertinent.
Title boilerplate / template. Les sites qui utilisent des patterns comme {Nom produit} | {Catégorie} | {Brand} sur des milliers de pages créent des titles semi-dupliqués. Google détecte ce pattern et supprime souvent les éléments de template pour ne garder que la partie unique.
Décalage sémantique entre title et contenu. Si le <title> contient des termes absents du corps de page — typiquement après un A/B test de title qui n'a pas été synchronisé avec le contenu — Google substitue un texte qu'il juge plus cohérent.
Comment détecter les réécritures à grande échelle
La Search Console ne fournit pas directement un rapport "titles réécrits". La méthode consiste à croiser les données de deux sources :
# Script Python pour détecter les title rewrites via l'API GSC + crawl Screaming Frog
import pandas as pd
# Export Screaming Frog : colonnes 'Address', 'Title 1'
crawl_df = pd.read_csv('screaming_frog_export.csv', usecols=['Address', 'Title 1'])
crawl_df.columns = ['url', 'title_crawled']
# Export GSC Performance > Pages (avec impressions)
# ou via l'API : searchanalytics.query avec dimension 'page'
gsc_df = pd.read_csv('gsc_search_appearance.csv', usecols=['page', 'title'])
gsc_df.columns = ['url', 'title_serp']
# Fusion et comparaison
merged = crawl_df.merge(gsc_df, on='url', how='inner')
merged['rewritten'] = merged['title_crawled'].str.strip() != merged['title_serp'].str.strip()
rewrites = merged[merged['rewritten']]
print(f"Titles réécrits : {len(rewrites)} / {len(merged)} ({len(rewrites)/len(merged)*100:.1f}%)")
# Export pour analyse manuelle
rewrites.to_csv('title_rewrites_detected.csv', index=False)
En pratique, l'API Search Console ne renvoie pas directement le titre affiché en SERP. L'approche la plus fiable pour un site de 8 000+ pages : scraper les SERPs pour les requêtes à forte impression via un outil comme DataForSEO ou SerpApi, puis comparer avec le crawl Screaming Frog. Sur un périmètre plus restreint, l'extension Chrome "SEO Meta in 1 Click" permet de vérifier manuellement page par page — mais ça ne scale pas.
Les trois cas concrets de correction analysés par Moz
L'étude de Moz détaille trois scénarios où la réécriture par Google a dégradé les performances, et les corrections appliquées. Reprenons-les avec une analyse technique approfondie.
Cas 1 : le H1 qui cannibalise le title
Contexte. Plusieurs pages du blog Moz avaient un <title> optimisé pour le CTR (incluant un hook ou un qualificatif) et un H1 plus descriptif mais plus fade. Google a choisi le H1.
<!-- Avant correction -->
<title>The Beginner's Guide to SEO Rankings [2026 Update]</title>
<h1>Understanding SEO Rankings</h1>
<!-- Google affichait en SERP : "Understanding SEO Rankings - Moz" -->
Le problème : le H1 "Understanding SEO Rankings" est sémantiquement correct mais perd le hook "[2026 Update]" et le qualificatif "Beginner's Guide" qui différenciaient le résultat en SERP.
Correction. Aligner le H1 et le title pour qu'ils portent le même message, avec une variante légère :
<!-- Après correction -->
<title>The Beginner's Guide to SEO Rankings [2026 Update]</title>
<h1>The Beginner's Guide to SEO Rankings — Updated for 2026</h1>
Quand le H1 et le <title> convergent, Google n'a plus de raison de substituer. La règle empirique : si votre H1 et votre title divergent significativement, Google choisira celui qui lui semble le plus représentatif du contenu. Et son choix ne sera pas forcément le vôtre.
Cas 2 : le brand name injecté ou supprimé
Contexte. Moz utilise le pattern {Title} - Moz sur la plupart de ses pages. Sur certaines pages, Google supprimait "- Moz" ; sur d'autres, il l'ajoutait alors qu'il n'était pas dans le <title>.
Ce comportement est documenté par Google : le système ajoute le nom de site quand il estime que ça aide l'utilisateur à identifier la source, et le retire quand le title devient trop long avec le brand.
Correction. La stratégie de Moz a été de raccourcir les titles pour que - Moz tienne dans la limite de pixels sans troncation :
<!-- Avant : 67 caractères, Google supprime "- Moz" -->
<title>How to Build a Comprehensive Keyword Research Strategy - Moz</title>
<!-- Après : 55 caractères, Google conserve le title intact -->
<title>Keyword Research Strategy: Complete Guide - Moz</title>
Le trade-off ici est clair : vous perdez en richesse descriptive du title pour gagner en contrôle du brand en SERP. Sur un domaine comme Moz où le brand est un signal de confiance fort, c'est un arbitrage rentable. Sur un site moins connu, le calcul peut être différent.
Cas 3 : les anchor texts qui prennent le dessus
Contexte. Plusieurs pages de Moz recevaient des backlinks avec des anchor texts très homogènes mais différents du <title>. Google a utilisé ces anchor texts comme source de title.
C'est le cas le plus complexe à corriger car vous ne contrôlez pas les anchor texts des liens entrants. La solution appliquée : renforcer la cohérence entre le <title>, le H1, le og:title, et le premier paragraphe de contenu, pour créer un signal de title tellement fort que les anchor texts deviennent minoritaires dans l'évaluation.
<!-- Cohérence maximale entre les signaux de title -->
<title>Domain Authority: What It Is & How to Improve It</title>
<meta property="og:title" content="Domain Authority: What It Is & How to Improve It" />
<h1>Domain Authority: What It Is and How to Improve It</h1>
<p>Domain Authority (DA) is a search engine ranking score developed by Moz
that predicts how likely a website is to rank in search engine result pages.</p>
<!-- Le premier paragraphe réutilise les termes clés du title -->
Cette approche "convergence des signaux" a permis à Moz de récupérer le contrôle sur la majorité des pages affectées par ce pattern.
Audit systématique : la méthode pour 8 000 pages
Corriger trois pages manuellement, c'est trivial. Corriger 8 000 titles sur un site de production, ça nécessite un process industrialisé.
Étape 1 : crawl complet + extraction des signaux
Lancez un crawl Screaming Frog avec extraction custom des éléments qui influencent la génération de title :
# Configuration Screaming Frog - Custom Extraction
# Onglet : Configuration > Custom > Extraction
# Extraction 1 : og:title
XPath: //meta[@property='og:title']/@content
Name: og_title
# Extraction 2 : H1
XPath: //h1/text()
Name: h1_text
# Extraction 3 : Breadcrumb texte (si JSON-LD)
Regex: "name"\s*:\s*"([^"]+)"
Name: breadcrumb_items
# Extraction 4 : Premier paragraphe
XPath: //article//p[1]/text()
Name: first_paragraph
Exportez le tout en CSV. Vous avez maintenant pour chaque URL : le <title>, le H1, le og:title, le breadcrumb, et le premier paragraphe. Ce sont les cinq signaux principaux que Google utilise pour générer le titre SERP.
Étape 2 : scoring automatique des risques de réécriture
Plutôt que de vérifier manuellement 8 000 titles en SERP, vous pouvez pré-identifier les pages à risque avec un scoring :
import pandas as pd
from difflib import SequenceMatcher
df = pd.read_csv('crawl_with_custom_extractions.csv')
def similarity(a, b):
if pd.isna(a) or pd.isna(b):
return 0.0
return SequenceMatcher(None, str(a).lower().strip(), str(b).lower().strip()).ratio()
# Score de risque de réécriture
df['title_h1_sim'] = df.apply(lambda r: similarity(r['Title 1'], r['h1_text']), axis=1)
df['title_og_sim'] = df.apply(lambda r: similarity(r['Title 1'], r['og_title']), axis=1)
df['title_length'] = df['Title 1'].str.len()
# Flags de risque
df['risk_long_title'] = df['title_length'] > 60
df['risk_h1_divergence'] = df['title_h1_sim'] < 0.5
df['risk_og_divergence'] = df['title_og_sim'] < 0.5
df['risk_no_og'] = df['og_title'].isna()
df['risk_score'] = (
df['risk_long_title'].astype(int) * 2 +
df['risk_h1_divergence'].astype(int) * 3 +
df['risk_og_divergence'].astype(int) * 1 +
df['risk_no_og'].astype(int) * 1
)
# Pages à forte priorité : haut risque + fortes impressions GSC
high_risk = df[df['risk_score'] >= 4].sort_values('risk_score', ascending=False)
high_risk.to_csv('title_rewrite_risk_audit.csv', index=False)
print(f"Pages à risque élevé : {len(high_risk)}")
Le coefficient le plus élevé est attribué à la divergence H1/title (poids 3) car c'est le déclencheur de réécriture le plus fréquent dans les données publiées par Moz. Le title trop long (poids 2) vient ensuite. L'absence ou la divergence de og:title est un signal secondaire (poids 1).
Étape 3 : priorisation par impact business
8 000 titles réécrits ne méritent pas tous la même attention. Croisez votre scoring de risque avec les données de la Search Console :
- Priorité 1 : pages avec > 1 000 impressions/mois ET risk_score >= 4. Ce sont vos quick wins. Sur un site comme Moz, ça représente typiquement 200-400 pages — le 80/20 classique.
- Priorité 2 : pages entre 100 et 1 000 impressions/mois avec réécriture confirmée en SERP. Vérification par échantillonnage de 10%.
- Priorité 3 : le reste. Correction batch via template si le pattern est identifiable (par exemple, tous les titles de catégorie qui suivent le même format).
Les patterns de template : le piège des CMS et des e-commerces
Sur un e-commerce de 15 000 produits, le title est rarement écrit manuellement. Il est généré par un template :
{# Template Twig / Shopify Liquid / équivalent #}
<title>{{ product.name }} | {{ product.category }} | MonSite.fr</title>
Ce pattern produit des titles comme :
- "Chaussures de running Nike Air Zoom Pegasus 41 | Running | MonSite.fr"
- "Chaussures de trail Nike Air Zoom Terra Kiger 9 | Trail | MonSite.fr"
Google détecte la partie template (| Running | MonSite.fr) et la supprime fréquemment — ou la remplace par autre chose. Sur 15 000 produits, ça peut signifier que 40-60% de vos titles affichés en SERP ne sont plus sous votre contrôle.
La solution : des templates intelligents
Plutôt qu'un template statique, implémentez une logique conditionnelle :
// Génération côté serveur (Next.js / Nuxt / Remix)
function generateTitle(product) {
const baseName = product.name;
const brand = product.brand;
const siteName = 'MonSite';
// Longueur cible : 50-55 caractères pour laisser de la marge
const fullTitle = `${baseName} - ${brand} | ${siteName}`;
if (fullTitle.length <= 58) {
return fullTitle;
}
// Fallback : on retire le brand si le nom est long
const mediumTitle = `${baseName} | ${siteName}`;
if (mediumTitle.length <= 58) {
return mediumTitle;
}
// Dernier recours : nom produit seul, tronqué proprement
return baseName.substring(0, 55);
}
// Assurer la cohérence avec le H1
function generateH1(product) {
// Le H1 doit être très proche du title pour éviter la substitution
return product.name + (product.brand ? ` - ${product.brand}` : '');
}
L'idée est de garantir que chaque title généré respecte la limite de pixels ET converge avec le H1. Sur un e-commerce de 15 000 pages, cette approche a permis dans des cas documentés de réduire le taux de réécriture de ~45% à ~12% en 6-8 semaines (le temps que Google recrawle et réévalue les titles).
Ce type de régression — un changement de template qui dégrade 15 000 titles d'un coup — est exactement le genre de problème qu'un outil de monitoring continu comme Seogard détecte automatiquement dès le prochain crawl, avant que l'impact SEO ne soit visible dans la Search Console.
Les edge cases que personne ne mentionne
Les titles conditionnels selon le JavaScript
Si votre title est généré côté client par du JavaScript, vous êtes exposé à un double risque : Google peut indexer le title pré-rendu (le placeholder) ET le réécrire par-dessus. Le résultat est souvent catastrophique.
<!-- Ce que le serveur envoie -->
<title>Loading...</title>
<!-- Ce que le JS injecte après hydration -->
<script>
document.title = "Mon Super Produit - MonSite";
</script>
Googlebot exécute le JavaScript dans la plupart des cas, mais avec un délai. Et si le rendering échoue (timeout, erreur JS), c'est "Loading..." qui reste indexé. Google va alors réécrire ce title avec n'importe quelle source alternative — H1, anchor text, ou même le contenu du premier heading trouvé.
La solution est évidemment le SSR ou au minimum le SSG. Si vous êtes dans un contexte de SPA et SEO, le title doit impérativement être dans le HTML initial envoyé par le serveur. Pour les frameworks React, consultez notre analyse des pièges à éviter.
Le piège du trailing slash et de la déduplication de titles
Situation rencontrée plus souvent qu'on ne le croit : /produit/chaussures et /produit/chaussures/ sont traités comme deux URLs distinctes. Si les deux sont indexées, Google peut réécrire le title de l'une des deux pour la différencier de la "duplicate".
# Vérification rapide via curl
curl -sI "https://monsite.fr/produit/chaussures" | grep -i "location\|HTTP/"
curl -sI "https://monsite.fr/produit/chaussures/" | grep -i "location\|HTTP/"
# Si les deux renvoient 200 sans redirection, vous avez un problème
# Solution Nginx :
# Redirection systématique vers la version sans trailing slash
rewrite ^/(.*)/$ /$1 permanent;
Ce sujet est détaillé dans notre article sur le trailing slash et son impact SEO. L'important ici : la déduplication non gérée provoque des réécritures de title en cascade que vous ne verrez pas venir.
L'impact des données structurées sur le title
Les données structurées BreadcrumbList et WebPage contiennent des champs name que Google peut utiliser comme source de title. Si votre JSON-LD Breadcrumb indique un name différent du <title>, c'est un signal contradictoire supplémentaire.
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Accueil",
"item": "https://monsite.fr/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Chaussures Running",
"item": "https://monsite.fr/chaussures-running/"
}
]
}
Si votre <title> est "Chaussures de running homme et femme | MonSite" mais que le breadcrumb dit "Chaussures Running", Google peut préférer la version courte du breadcrumb. Assurez-vous que le name du dernier élément de votre breadcrumb JSON-LD est cohérent avec votre title.
Mesurer l'impact : avant/après avec la Search Console
Une fois les corrections déployées, le suivi se fait via le rapport Performance de la Search Console. Mais attention : le CTR est une métrique trompeuse si vous ne contrôlez pas la position.
La bonne méthode : filtrer par plage de positions pour isoler l'effet du title.
# Analyse avant/après correction de titles
# Filtrer positions 1-3 pour isoler l'effet CTR du title
import pandas as pd
before = pd.read_csv('gsc_before_fix.csv') # 30 jours avant
after = pd.read_csv('gsc_after_fix.csv') # 30 jours après
# Filtrer uniquement les requêtes en position 1-3
before_top = before[before['position'] <= 3]
after_top = after[after['position'] <= 3]
# CTR moyen pondéré par impressions
ctr_before = (before_top['clicks'].sum() / before_top['impressions'].sum()) * 100
ctr_after = (after_top['clicks'].sum() / after_top['impressions'].sum()) * 100
print(f"CTR positions 1-3 avant correction : {ctr_before:.2f}%")
print(f"CTR positions 1-3 après correction : {ctr_after:.2f}%")
print(f"Delta : {ctr_after - ctr_before:+.2f} points")
Sur le cas Moz, les corrections sur les pages prioritaires (P1) ont montré une récupération du title original dans les SERPs en 2-4 semaines selon la fréquence de crawl des pages concernées. Les pages avec un crawl fréquent (>1 crawl/jour dans les logs serveur) ont vu les changements reflétés en SERP en moins de 10 jours.
Les limites de l'exercice : quand accepter la réécriture
Toutes les réécritures ne sont pas mauvaises. Google corrige parfois des titles objectivement médiocres :
- Titles dupliqués sur des centaines de pages (oubli de variable dans le template)
- Titles en anglais sur un contenu en français (erreur de localisation)
- Titles contenant des caractères techniques ou du markup cassé
Dans ces cas, la réécriture par Google est un filet de sécurité. Le travail de l'équipe SEO est de distinguer les réécritures bénéfiques (à accepter) des réécritures nocives (à corriger). Le scoring automatisé décrit plus haut, croisé avec les données de CTR, permet de faire ce tri à grande échelle.
Dernière nuance : même après correction optimale, Google réécrit toujours entre 5 et 15% des titles selon les études publiées depuis 2021. C'est un plancher incompressible lié au fait que le système adapte les titles à la requête de l'utilisateur — pas uniquement au contenu de la page. Acceptez ce plancher et concentrez vos efforts sur les 85-95% que vous pouvez contrôler.
L'essentiel à retenir
Les réécritures de titles par Google ne sont pas aléatoires — elles suivent des patterns identifiables et corrigeables. La convergence entre <title>, H1, og:title, breadcrumb JSON-LD et premier paragraphe est le levier technique le plus efficace pour reprendre le contrôle. Sur un périmètre de 8 000+ pages, l'approche doit être industrialisée : crawl, scoring de risque, priorisation par impact business, puis correction batch. Un monitoring continu avec Seogard permet de détecter les nouvelles divergences dès qu'un déploiement modifie un template de title — avant que Google n'ait le temps de réécrire à votre place.