Un audit Screaming Frog remonte 4 200 erreurs sur un e-commerce de 22 000 pages. L'équipe dev a deux sprints disponibles avant le gel du code pré-soldes. Corriger les 4 200 problèmes est impossible. Corriger les mauvais en premier revient à gaspiller ces deux sprints. Le vrai skill SEO technique, ce n'est pas de trouver les problèmes — c'est de décider lesquels méritent du temps dev.
L'article publié par Search Engine Land sur la priorisation du SEO technique pose le bon cadre : quand vous ne pouvez pas tout faire, concentrez-vous sur l'architecture, l'indexation et la performance. Mais il reste en surface. Creusons chaque axe avec des méthodes, du code et des scénarios chiffrés.
La matrice de priorisation : impact × effort dev
Avant de toucher au code, vous avez besoin d'un cadre de décision. Tous les problèmes SEO technique ne se valent pas, et leur gravité perçue ne corrèle pas toujours avec leur impact réel sur le trafic organique.
Classer les problèmes en quatre quadrants
L'approche la plus efficace reste une matrice 2×2 simple :
- Impact fort / Effort faible : à faire immédiatement (redirections cassées sur des pages à fort trafic, canonical manquants sur des catégories).
- Impact fort / Effort élevé : à planifier dans le prochain sprint (migration SSR, refonte du maillage interne).
- Impact faible / Effort faible : à batcher en fin de sprint si le temps le permet (alt text manquants, meta descriptions dupliquées sur des pages à zéro impression).
- Impact faible / Effort élevé : à ignorer pour l'instant (refonte des URLs sur des pages sans trafic ni potentiel).
Le piège classique : traiter les erreurs par volume. Screaming Frog remonte 800 images sans attribut alt et 12 pages orphelines à fort PageRank interne. Le réflexe est d'attaquer les 800 images parce que ça "fait propre" dans le rapport. Mais les 12 pages orphelines vont probablement générer plus d'impact avec moins d'effort.
Mesurer l'impact réel avec Search Console
Pour alimenter la colonne "impact", croisez deux sources :
- Search Console > Pages : identifiez les pages indexées qui génèrent des impressions mais un CTR anormalement bas (problème de title/description ou de rich snippet manquant).
- Search Console > Indexation : les pages que Google refuse d'indexer avec la raison "Discovered – currently not indexed" sont souvent le signal d'un problème d'architecture ou de qualité perçue.
Exportez les données et croisez-les dans un tableur ou un script :
import pandas as pd
# Export Search Console (pages indexées avec impressions)
sc_data = pd.read_csv('search_console_pages.csv')
# Export Screaming Frog (toutes les erreurs)
sf_errors = pd.read_csv('screaming_frog_issues.csv')
# Merge sur l'URL pour identifier les erreurs sur les pages à fort potentiel
merged = sf_errors.merge(
sc_data[['URL', 'Impressions', 'Clicks', 'Position']],
left_on='Address',
right_on='URL',
how='left'
)
# Prioriser : erreurs sur pages à plus de 100 impressions/mois
high_impact = merged[merged['Impressions'] > 100].sort_values(
'Impressions', ascending=False
)
high_impact.to_csv('priority_fixes.csv', index=False)
Ce script basique vous donne en 30 secondes la liste des erreurs techniques qui touchent des pages avec du trafic réel. C'est votre point de départ.
Architecture et maillage interne : le levier le plus sous-estimé
L'architecture du site détermine comment Googlebot distribue son crawl budget et comment le PageRank interne circule entre vos pages. Sur un site de 10 000+ pages, un problème d'architecture a un effet multiplicateur qu'aucune optimisation on-page ne peut compenser.
Profondeur de crawl et pages orphelines
Une règle empirique : toute page importante devrait être accessible en 3 clics maximum depuis la homepage. Au-delà de 4 niveaux de profondeur, la fréquence de crawl chute de façon significative.
Sur un e-commerce avec 15 000 produits répartis en 200 catégories et 40 sous-catégories, le problème typique est celui des produits enfouis. La pagination par défaut (20 produits par page) crée des pages de listing /categorie?page=47 où les produits sont à 5+ clics de la homepage.
La solution n'est pas toujours de "réduire la profondeur" — c'est de créer des chemins alternatifs. Un maillage interne par filtres intelligents (marques, gammes de prix, nouveautés) crée des raccourcis vers les produits profonds.
Pour diagnostiquer la profondeur réelle, Screaming Frog en mode "Spider" affiche la colonne "Crawl Depth". Exportez-la et analysez la distribution :
# Après un crawl Screaming Frog, export CSV
# Comptez les pages par niveau de profondeur
awk -F',' 'NR>1 {depth[$CRAWL_DEPTH_COL]++} END {for(d in depth) print d, depth[d]}' \
screaming_frog_internal.csv | sort -n
# Résultat typique d'un site mal architecturé :
# 0 1 (homepage)
# 1 42 (catégories principales)
# 2 380 (sous-catégories)
# 3 2100 (produits accessibles)
# 4 5800 (produits enterrés)
# 5 4200 (produits quasi-orphelins)
# 6+ 2478 (pages fantômes)
Si plus de 30% de vos pages cibles sont à profondeur 4+, l'architecture est votre priorité numéro un.
Le sitemap XML ne remplace pas le maillage
Un malentendu fréquent : "les pages sont dans le sitemap, donc Google les trouvera". Le sitemap XML est un signal de découverte, pas un signal d'importance. Google accorde du poids au maillage interne pour évaluer la pertinence relative des pages.
Une page présente dans le sitemap mais sans aucun lien interne (page orpheline) recevra un crawl sporadique et un signal d'autorité quasi nul. Si vous avez des centaines de pages dans ce cas, la correction du maillage interne aura plus d'effet que n'importe quelle optimisation de balises.
Pour identifier ces pages, croisez le sitemap avec le crawl interne :
import xml.etree.ElementTree as ET
# Parser le sitemap
tree = ET.parse('sitemap.xml')
ns = {'sm': 'http://www.sitemaps.org/schemas/sitemap/0.9'}
sitemap_urls = {url.find('sm:loc', ns).text for url in tree.findall('.//sm:url', ns)}
# URLs trouvées par le crawl interne (Screaming Frog)
crawled_urls = set(pd.read_csv('internal_all.csv')['Address'])
# Pages dans le sitemap mais jamais liées en interne
orphans = sitemap_urls - crawled_urls
print(f"{len(orphans)} pages orphelines dans le sitemap")
Chaque page orpheline identifiée est une opportunité directe : soit vous la reliez à une page parente logique, soit vous la retirez du sitemap si elle n'a pas de valeur.
Pour aller plus loin sur les mécanismes de crawl et d'indexation qui conditionnent ces choix, le détail est dans cet article sur les infrastructure gates du crawl et du render.
Indexation : réparer ce que Google ignore
L'indexation est le goulot d'étranglement le plus critique. Une page non indexée a un trafic organique strictement égal à zéro, quelles que soient ses optimisations on-page. C'est pourquoi, à ressources limitées, les problèmes d'indexation passent avant les problèmes de ranking.
Décoder les statuts d'indexation de Search Console
Le rapport "Indexation des pages" dans Search Console donne des raisons de non-indexation. Toutes ne méritent pas la même attention :
- "Crawled – currently not indexed" : Google a vu la page, l'a analysée, et a décidé de ne pas l'indexer. Signal de qualité ou de duplication perçue. Priorité haute si ces pages ont du potentiel commercial.
- "Discovered – currently not indexed" : Google connaît l'URL mais ne l'a même pas crawlée. Problème de crawl budget ou de priorité. Souvent un symptôme d'architecture.
- "Duplicate without user-selected canonical" : Google considère la page comme un doublon et a choisi une autre URL comme canonical. Vérifiez si c'est intentionnel.
- "Blocked by robots.txt" : erreur de config fréquente lors des migrations. Corrigeable en 2 minutes, impact immédiat.
Le cas des faceted navigation en e-commerce
Scénario concret : un site e-commerce mode avec 8 000 produits, 120 catégories et des filtres par taille, couleur, matière et prix. La navigation à facettes génère des combinaisons d'URLs :
/chaussures/femme?couleur=rouge
/chaussures/femme?couleur=rouge&taille=38
/chaussures/femme?couleur=rouge&taille=38&matiere=cuir
/chaussures/femme?taille=38&couleur=rouge (ordre inversé = URL différente)
Sans contrôle, ces combinaisons peuvent produire 500 000+ URLs, dont 95% sont du contenu dupliqué ou quasi-vide. Le résultat : Googlebot passe son crawl budget sur ces pages parasites au lieu de crawler les fiches produits et les nouvelles catégories.
La solution canonique (sans jeu de mots) combine trois mécanismes :
<!-- 1. Canonical vers la page catégorie principale -->
<link rel="canonical" href="https://mode-example.fr/chaussures/femme" />
<!-- 2. Meta robots pour les combinaisons à faible valeur -->
<meta name="robots" content="noindex, follow" />
# 3. Dans la config Nginx : normaliser l'ordre des paramètres
# et bloquer les combinaisons excessives (plus de 2 filtres)
location /chaussures/ {
# Réécrire les paramètres dans un ordre canonique
set $canonical_args "";
if ($arg_couleur) {
set $canonical_args "${canonical_args}&couleur=$arg_couleur";
}
if ($arg_taille) {
set $canonical_args "${canonical_args}&taille=$arg_taille";
}
# Bloquer les combinaisons de 3+ filtres pour les bots
if ($args ~* "couleur=.*&taille=.*&matiere=") {
set $block_bot "1";
}
if ($http_user_agent ~* "Googlebot|bingbot") {
set $block_bot "${block_bot}1";
}
if ($block_bot = "11") {
add_header X-Robots-Tag "noindex, nofollow";
}
}
Cette approche a un trade-off : les pages à 2 filtres (couleur + taille) peuvent avoir une valeur SEO réelle si elles correspondent à des requêtes long tail ("chaussures femme rouge taille 38"). La décision de les indexer ou non dépend du volume de recherche et du nombre de produits dans la combinaison. Une page avec 1 seul résultat n'a pas de valeur pour Google.
Pour comprendre comment les chaînes de redirections viennent aggraver ce type de problème d'indexation, le diagnostic est souvent interconnecté.
Le piège du JavaScript et de l'indexation
Si votre site repose sur un framework JS (React, Vue, Angular) avec du client-side rendering, une partie de votre contenu peut être invisible pour Googlebot lors du premier pass de crawl. Google utilise un processus en deux phases : le crawl HTML d'abord, puis le rendering JavaScript dans une file d'attente séparée — avec un délai qui peut aller de quelques heures à plusieurs semaines.
Le test le plus rapide : dans Chrome DevTools, désactivez JavaScript (F12 > Settings > Debugger > Disable JavaScript) et rechargez vos pages clés. Si le contenu principal disparaît, vous avez un problème de rendering qui impacte directement l'indexation.
La migration vers du SSR (Server-Side Rendering) ou du SSG (Static Site Generation) est souvent le fix le plus impactant mais aussi le plus coûteux en effort dev. Si vous ne pouvez pas migrer tout le site, priorisez le SSR sur les templates à fort trafic : pages catégories, pages produits, articles de blog. Les pages légales, CGV, mentions légales peuvent rester en CSR sans conséquence.
Les spécificités de chaque framework et leurs pièges SEO sont détaillés dans les guides dédiés : React et SEO, Vue.js avec Nuxt, et le guide complet SPA et SEO. Pour les cas plus avancés impliquant le Shadow DOM, l'article sur les Web Components couvre les edge cases.
Performance web : ne pas tout optimiser, optimiser ce qui compte
Les Core Web Vitals sont un signal de ranking confirmé par Google, mais leur poids relatif reste modeste comparé à la pertinence du contenu et au profil de liens. Cela dit, sur des marchés concurrentiels où les signaux on-page sont proches entre concurrents, la performance peut faire la différence.
L'erreur classique : passer trois semaines à réduire le LCP de 200ms sur des pages qui ne rankent pas. La performance ne sauvera pas une page avec un contenu médiocre ou sans autorité.
Prioriser le LCP sur les templates critiques
Le LCP (Largest Contentful Paint) est le metric le plus impactant des trois Core Web Vitals. Le CLS (Cumulative Layout Shift) cause surtout des problèmes d'UX. L'INP (Interaction to Next Paint) est rarement un facteur bloquant pour le SEO.
Concentrez votre effort performance sur le LCP des templates qui génèrent 80% de votre trafic. Sur un e-commerce, c'est typiquement :
- Les pages catégories (listing produits)
- Les fiches produits
- La homepage
Pour mesurer le LCP réel (pas en lab, en field data), utilisez le rapport Core Web Vitals de Search Console ou l'API CrUX directement :
# Requête API CrUX pour obtenir les données field d'une URL spécifique
curl -s "https://chromeuxreport.googleapis.com/v1/records:queryRecord?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://mode-example.fr/chaussures/femme",
"metrics": ["largest_contentful_paint", "interaction_to_next_paint", "cumulative_layout_shift"]
}' | python3 -m json.tool
Si le p75 du LCP est au-dessus de 2.5s sur vos pages catégories, voici les quick wins par ordre d'impact :
1. Précharger l'image LCP : dans 70% des cas, le LCP est une image hero ou la première image produit. Ajoutez un preload dans le <head> :
<head>
<!-- Précharger l'image LCP pour qu'elle commence à se télécharger
avant que le parser ne la découvre dans le DOM -->
<link rel="preload" as="image" href="/images/category-hero-chaussures.webp"
fetchpriority="high" type="image/webp" />
<!-- Sur les fiches produits, précharger la première image produit -->
<link rel="preload" as="image"
href="/images/products/{{ product.main_image }}.webp"
fetchpriority="high" type="image/webp" />
</head>
2. Éliminer les ressources render-blocking : les CSS et JS synchrones dans le <head> bloquent le rendering. Inlinez le CSS critique et différez le reste :
<head>
<!-- CSS critique inliné (au-dessus de la ligne de flottaison uniquement) -->
<style>
/* 5-15 KB de CSS critique extrait par Critical / Critters */
.header { /* ... */ }
.category-grid { /* ... */ }
.product-card { /* ... */ }
</style>
<!-- Le reste du CSS chargé de manière non-bloquante -->
<link rel="preload" href="/css/full.css" as="style"
onload="this.onload=null;this.rel='stylesheet'" />
<noscript><link rel="stylesheet" href="/css/full.css" /></noscript>
</head>
3. Servir les images en WebP/AVIF avec des dimensions explicites pour éviter à la fois un LCP lent et du CLS :
<picture>
<source srcset="/images/product-123.avif" type="image/avif" />
<source srcset="/images/product-123.webp" type="image/webp" />
<img src="/images/product-123.jpg"
alt="Chaussure running femme Nike Air Zoom"
width="600" height="400"
loading="eager"
fetchpriority="high" />
</picture>
L'attribut loading="eager" et fetchpriority="high" sont réservés à l'image LCP. Toutes les autres images de la page doivent utiliser loading="lazy".
Le protocole HTTP/2 et HTTP/3 joue également un rôle non négligeable dans la performance de chargement, notamment via le multiplexing des requêtes.
Données structurées : un levier à ROI rapide mais souvent mal priorisé
L'ajout de données structurées ne corrige pas un problème technique — il amplifie une page déjà indexée et bien positionnée en augmentant son CTR dans les SERPs via les rich snippets. C'est un levier d'optimisation, pas un levier de fondation.
Conséquence directe pour la priorisation : n'implémentez des données structurées qu'après avoir stabilisé l'architecture, l'indexation et la performance. Une fiche produit avec un schema Product parfait mais non indexée génère exactement zéro clic.
Prioriser par type de schema
Tous les schemas n'ont pas le même impact CTR :
- Product (avec prix, disponibilité, avis) : impact CTR fort sur les pages e-commerce. Les étoiles dans les SERPs sont un différenciateur visuel majeur. Détails dans le guide Product schema.
- BreadcrumbList : impact modéré mais effort d'implémentation minimal. Améliore la lisibilité du résultat et le taux de clic sur les résultats profonds. Guide dédié : BreadcrumbList pour la navigation SERP.
- FAQ : impact variable selon les SERPs, et Google a réduit l'affichage des FAQ rich results depuis fin 2023. À implémenter seulement si vos pages FAQ ont un trafic significatif. Voir le guide FAQ schema.
- Article : pertinent pour les blogs et médias, impact surtout sur Google Discover. Détails dans le guide Article schema.
Pour une vue d'ensemble sur l'implémentation JSON-LD, le guide pratique données structurées couvre les fondamentaux.
Scénario complet : e-commerce de 18 000 pages, 1 sprint dev disponible
Mettons tout ensemble avec un cas réaliste.
Le contexte
- Site e-commerce outdoor : 18 000 pages (12 000 produits, 350 catégories, 400 articles blog, le reste en pages CMS).
- Framework : Next.js avec un mix SSR/CSR — les pages catégories sont SSR, les fiches produits sont CSR (historique technique).
- Trafic organique : 85 000 sessions/mois, en déclin de 15% sur 6 mois.
- Équipe dev : 2 développeurs disponibles pour 1 sprint de 2 semaines.
- Audit Screaming Frog : 3 800 erreurs toutes catégories confondues.
L'audit priorisé
Semaine 1 — Fondations (architecture + indexation) :
-
Fiches produits CSR → SSR (effort : 4 jours dev). 12 000 pages produits sont en client-side rendering. Search Console montre que 4 200 d'entre elles sont en statut "Discovered – currently not indexed". En migrant le template produit vers
getServerSideProps(Next.js), le HTML est servi directement à Googlebot. Impact estimé : 3 000+ pages nouvellement indexées dans les 4-6 semaines suivantes. Sur la base d'un CTR moyen de 2% et de 30 impressions/mois/page, cela représente environ 1 800 clics mensuels supplémentaires. -
Correction des canonical sur les URLs filtrées (effort : 1 jour dev). 280 combinaisons de filtres sont indexées avec des canonical auto-référençants au lieu de pointer vers la catégorie mère. Un fix dans le composant
<Head>du template listing suffit. -
Nettoyage des chaînes de redirections (effort : 0.5 jour). 145 chaînes de 3+ redirections identifiées, principalement héritées de deux migrations précédentes. Mise à jour de la map de redirections dans le
next.config.jspour pointer directement vers la destination finale. Ce type de régression est exactement ce qu'un monitoring continu comme Seogard détecte automatiquement, évitant que le problème se reproduise silencieusement après un prochain déploiement.
Semaine 2 — Performance + quick wins :
-
Optimisation LCP sur les templates catégorie et produit (effort : 2 jours). Ajout du
preloadpour les images LCP, inlining du CSS critique, conversion des images en WebP. Objectif : passer le LCP p75 de 3.2s à sous 2.5s. -
Implémentation Product schema sur les fiches produit (effort : 1 jour). Le template SSR facilite l'injection du JSON-LD côté serveur. Impact attendu : apparition des rich snippets (prix, disponibilité, avis) dans les 2-4 semaines.
-
Correction du trailing slash inconsistant (effort : 0.5 jour). Le site sert les mêmes pages avec et sans trailing slash, créant des doublons. Un middleware Next.js de 10 lignes force la redirection 301 vers la version sans slash.
Ce qui n'est PAS fait (et pourquoi)
- Les 800 images sans alt text sur les articles blog : impact marginal, le blog ne représente que 8% du trafic.
- La refonte du breadcrumb : l'existant fonctionne, le schema BreadcrumbList est un nice-to-have pour le sprint suivant.
- L'optimisation INP sur les pages avec des filtres interactifs lourds : le INP field est à 280ms (sous le seuil de 500ms), pas critique.
- La migration des 400 articles blog vers un CMS headless : effort disproportionné pour le gain attendu.
Le suivi post-implémentation : mesurer pour itérer
La priorisation n'a de sens que si vous mesurez les résultats. Après le sprint, mettez en place un suivi hebdomadaire sur trois métriques :
- Couverture d'indexation dans Search Console : le nombre de pages "Valid" doit augmenter dans les 4-6 semaines post-déploiement du SSR.
- LCP p75 field via CrUX ou le rapport Core Web Vitals de Search Console : l'amélioration field apparaît sous 28 jours (cycle de collecte CrUX).
- Impressions organiques par template : segmentez par regex dans Search Console pour isoler l'impact sur les pages produits vs catégories.
Un outil de monitoring comme Seogard complète cette boucle en alertant automatiquement si une méta disparaît, si le SSR casse sur un template, ou si de nouvelles chaînes de redirections apparaissent — exactement les types de régressions qui annulent silencieusement le travail d'un sprint entier.
Prioriser le SEO technique, c'est accepter de ne pas corriger 80% des erreurs d'un audit. Les trois leviers à traiter en premier — architecture/maillage, indexation, performance des templates critiques — concentrent la quasi-totalité de l'impact mesurable. Tout le reste est de l'optimisation marginale qui peut attendre le prochain sprint.