Migration Magento 2 vers Shopify : 8 400 URLs sans 301, l'autorité dispersée en silence
Jeudi 14h. L'agence envoie un Slack : "Migration live, tout est clean." Le site e-commerce — cosmétiques bio, 8 400 fiches produit, 1,2 million de sessions organiques par an — tourne désormais sur Shopify. Le checkout fonctionne. Le thème est pixel-perfect. Les équipes trinquent.
Trois semaines plus tard, le trafic organique a chuté de 34 %. Personne n'a touché au site. Les backlinks construits depuis quatre ans pointent tous dans le vide.
Lundi T+18 jours — "C'est juste la migration, ça va revenir"
Le Head of Acquisition ouvre Google Analytics le lundi matin. Le dashboard hebdomadaire affiche 22 000 sessions organiques contre 33 500 la semaine précédente. Premier réflexe : la saisonnalité. On est début mars, les ventes de soins d'hiver ralentissent. Il classe l'alerte mentalement et passe à autre chose.
Mercredi, le SEO manager tire les données Search Console sur 28 jours. Les clics sont passés de 9 800/jour à 6 100/jour. Les impressions tiennent — elles ont même légèrement augmenté sur certaines requêtes. Mais le CTR moyen s'est effondré de 3,2 % à 1,9 %. Quelque chose ne colle pas.
Il filtre par page. Et là, le tableau se révèle.
Les URLs les plus performantes — celles qui tiraient 60 % du trafic organique — sont toutes des URLs Magento. Format /skincare/creme-hydratante-aloe-vera.html. Aucune d'entre elles n'existe sur le nouveau site. Shopify a généré ses propres URLs : /products/creme-hydratante-aloe-vera. Pas de .html. Pas de catégorie dans le chemin. Un format totalement différent.
Il tape une ancienne URL dans le navigateur. Réponse : 404. Page blanche Shopify, thème par défaut. Pas de redirection.
Il en teste dix autres. Toutes en 404.
À 16h, il lance un crawl Screaming Frog sur une liste exportée de 500 anciennes URLs Magento. Résultat : 487 renvoient un 404. Les 13 restantes — des pages catégorie — retournent un 301 vers la homepage. Pas vers la bonne catégorie. Vers la homepage.
L'hypothèse initiale — "Shopify gère les redirections automatiquement" — vient de s'écrouler. L'agence n'a posé aucune table de redirections. Aucune. Sur 8 400 fiches produit, pas une seule 301. L'autorité construite sur quatre ans de content marketing, de backlinks DR 40+ obtenus via des guides beauté, de maillage interne soigné — tout ça pointe vers des 404.
Le SEO manager envoie un message à l'agence : "Est-ce qu'on a un fichier de mapping ancien URL → nouveau URL ?" La réponse arrive vingt minutes plus tard : "On pensait que Shopify le faisait automatiquement quand on importe les produits."
Il n'en fait rien.
Le bug : Magento vs Shopify, deux logiques d'URL irréconciliables
Pour comprendre l'ampleur du dégât, il faut regarder comment chaque plateforme construit ses URLs.
La structure Magento 2
Magento 2 permet une personnalisation fine des URL keys via le panneau admin et la table url_rewrite en base de données. Un produit dans la catégorie "Skincare" avec l'URL key creme-hydratante-aloe-vera produit :
https://example.com/skincare/creme-hydratante-aloe-vera.html
Le .html est un suffixe configurable dans Stores > Configuration > Catalog > SEO. La structure hiérarchique /category/product.html est le défaut Magento. Sur le site en question, ce format était actif depuis 2021. Google avait indexé 8 400 URLs dans ce format exact.
La table url_rewrite de Magento contenait également des redirections internes — anciennes URL keys vers nouvelles — accumulées sur quatre ans de modifications produit. Environ 1 200 entrées de type custom avec redirect type 301.
La structure Shopify
Shopify impose un format non négociable pour les produits :
https://example.com/products/creme-hydratante-aloe-vera
Pas de .html. Pas de catégorie dans le chemin. Le préfixe /products/ est obligatoire et ne peut pas être modifié, même sur Shopify Plus. Les collections (équivalent des catégories) vivent sous /collections/, mais le produit lui-même est toujours sous /products/.
Voici ce que Google voyait avant et après la migration :
<!-- Avant (Magento 2) — indexé, avec backlinks -->
<link rel="canonical" href="https://example.com/skincare/creme-hydratante-aloe-vera.html" />
<title>Crème Hydratante Aloe Vera | NomDuSite</title>
<meta name="description" content="Crème hydratante bio à l'aloe vera..." />
<!-- Après (Shopify) — même produit, URL différente -->
<link rel="canonical" href="https://example.com/products/creme-hydratante-aloe-vera" />
<title>Crème Hydratante Aloe Vera | NomDuSite</title>
<meta name="description" content="Crème hydratante bio à l'aloe vera..." />
Le contenu est identique. Les metas sont les mêmes. Mais l'URL a changé. Et sans 301 de l'ancienne vers la nouvelle, Google traite la nouvelle page comme une page inconnue — zero autorité, zero historique. L'ancienne URL, elle, accumule des soft 404 dans l'index.
Pourquoi l'import produit ne crée pas les redirections
L'agence avait utilisé l'app Matrixify (anciennement Excelify) pour importer les produits Magento vers Shopify. L'import crée les produits avec leurs handles — la partie slug de l'URL. Mais il ne crée aucune redirection d'URL. Ce n'est pas un bug de Matrixify. C'est simplement hors périmètre.
Shopify dispose d'un système de redirections natif accessible via Online Store > Navigation > URL Redirects. Ce système accepte des imports CSV. Mais il faut le nourrir manuellement.
L'agence n'avait pas extrait les URL keys Magento avant la migration. Pas de dump de la table url_rewrite. Pas de crawl pré-migration. Pas de fichier de mapping.
L'ampleur dans Search Console
Dix-neuf jours après la mise en production, voici ce que Search Console montrait dans le rapport de couverture :
- Pages indexées : 3 200 (contre 9 100 avant migration)
- Erreurs 404 : 7 840 URLs avec le pattern
/[category]/[product].html - Pages avec redirection : 47 (des pages CMS redirigées manuellement par l'agence)
- Pages explorées non indexées : 2 300 nouvelles URLs
/products/— Google les avait crawlées mais pas encore jugées dignes d'indexation faute de signaux d'autorité
Le rapport de liens externes confirmait le désastre. Un check rapide via Ahrefs montrait 1 840 domaines référents pointant vers des URLs Magento. 94 % de ces backlinks tombaient désormais sur des 404. Le Domain Rating du site avait commencé à baisser — de DR 52 à DR 48 en trois semaines.
La redirection catégorie → homepage : le piège du soft redirect
Les 13 pages catégorie qui retournaient un 301 pointaient toutes vers la homepage. L'agence avait posé des redirections wildcard dans le fichier de redirections Shopify :
/skincare,/
/haircare,/
/body-care,/
Ce type de redirection est un signal négatif pour Google. John Mueller l'a documenté : une 301 vers la homepage quand la page de destination thématique existe est traitée comme un soft 404 par l'algorithme. Le PageRank transmis est quasi nul.
Les catégories Shopify existaient pourtant : /collections/skincare, /collections/haircare, /collections/body-care. Personne n'avait fait le mapping.
Le fix : 8 400 redirections en 48 heures
Étape 1 — Extraction du mapping Magento
Le SEO manager avait encore accès au back-office Magento sur un serveur de staging. Il a extrait la table url_rewrite via une requête SQL directe :
SELECT
request_path AS old_url,
CONCAT('/products/', REPLACE(
SUBSTRING_INDEX(request_path, '/', -1), '.html', ''
)) AS new_url
FROM url_rewrite
WHERE entity_type = 'product'
AND redirect_type = 0
AND store_id = 1
GROUP BY request_path;
Cette requête extrait les 8 400 URLs produit actives (pas les anciennes redirections internes) et reconstruit le nouveau chemin Shopify en retirant le préfixe catégorie et le suffixe .html.
Résultat : un CSV de deux colonnes, old_url et new_url.
Étape 2 — Vérification que les handles Shopify existent
Avant d'injecter 8 400 redirections, il faut s'assurer que chaque handle existe dans Shopify. Sinon, on redirige un 404 vers un autre 404.
Un script Node.js rapide via l'API Shopify Admin :
const Shopify = require('shopify-api-node');
const fs = require('fs');
const csv = require('csv-parse/sync');
const shopify = new Shopify({
shopName: 'example-store',
apiKey: process.env.SHOPIFY_API_KEY,
password: process.env.SHOPIFY_API_PASSWORD,
});
const mappings = csv.parse(fs.readFileSync('mapping.csv'), {
columns: true,
});
(async () => {
const missing = [];
for (const row of mappings) {
const handle = row.new_url.replace('/products/', '');
try {
await shopify.product.list({ handle, limit: 1 });
} catch (e) {
missing.push(row);
}
}
fs.writeFileSync('missing_handles.csv', JSON.stringify(missing, null, 2));
console.log(`${missing.length} handles introuvables sur Shopify`);
})();
Résultat : 312 handles manquants. Des produits supprimés ou renommés pendant la migration. Ces 312 cas ont été redirigés vers la collection parente plutôt que vers la homepage.
Étape 3 — Import massif dans Shopify
Shopify accepte l'import CSV de redirections via l'admin (Online Store > Navigation > URL Redirects > Import). Format attendu :
Redirect from,Redirect to
/skincare/creme-hydratante-aloe-vera.html,/products/creme-hydratante-aloe-vera
/skincare/serum-vitamine-c.html,/products/serum-vitamine-c
/haircare/shampoing-doux-avoine.html,/products/shampoing-doux-avoine
Le fichier final contenait 8 088 redirections produit exactes et 312 redirections vers les collections. Plus 47 redirections catégorie corrigées — /skincare vers /collections/skincare au lieu de /.
L'import a été réalisé en trois lots (Shopify limite à 5 000 lignes par import CSV dans certains plans). Temps total : 25 minutes.
Étape 4 — Vérification post-déploiement
Un crawl Screaming Frog sur la liste complète des anciennes URLs. Configuration : Spider > Advanced > Always follow redirects OFF pour voir les codes de statut intermédiaires.
# Vérification rapide via curl sur un échantillon de 50 URLs
cat sample_old_urls.txt | xargs -I {} curl -o /dev/null -s -w "%{http_code} %{redirect_url} {}\n" -L {}
Résultat : 8 400 URLs retournent un 301 vers la bonne destination. Zéro 404 restant sur les URLs connues.
Étape 5 — Forcer le re-crawl
Pour accélérer la prise en compte par Google :
- Soumission du nouveau sitemap Shopify dans Search Console
- Utilisation de l'API d'indexation pour les 200 pages les plus importantes (celles avec le plus de backlinks)
- Invalidation du rapport de couverture via "Valider la correction" sur les erreurs 404
Chronologie de récupération
- J+2 après le fix : les 404 commencent à disparaître du rapport de couverture
- J+7 : 4 200 des anciennes URLs sont marquées "redirigée" dans Search Console
- J+14 : le trafic organique remonte à 7 800 sessions/jour (contre 6 100 au creux)
- J+28 : retour à 9 200 sessions/jour — 94 % du niveau pré-migration
- J+45 : stabilisation à 9 600 sessions/jour — légère progression grâce à la nouvelle vitesse Shopify (TTFB passé de 1,2s sous Magento à 380ms sous Shopify)
Le Domain Rating a mis plus longtemps. Six semaines pour repasser de DR 48 à DR 51. Le DR 52 d'origine n'a été retrouvé qu'au bout de trois mois — le temps que les crawlers des outils tiers re-découvrent les redirections et réattribuent l'autorité.
Le site n'a jamais récupéré 100 % de ses positions sur certaines requêtes longue traîne. Environ 340 pages produit avaient été désindexées pendant la fenêtre de 404 et n'ont jamais retrouvé leur position exacte. L'estimation de la perte nette sur le trimestre : 180 000 clics organiques.
Leçons opérationnelles
L'équipe a mis en place trois garde-fous pour les futures migrations :
-
Crawl pré-migration obligatoire. Un export Screaming Frog complet de toutes les URLs indexées, croisé avec les données Search Console, constitue le fichier de référence avant toute migration. Comme détaillé dans le récit d'une migration WordPress vers headless Strapi, l'absence de ce fichier est la cause racine de la majorité des pertes de redirections.
-
Validation des redirections en staging. Shopify ne propose pas d'environnement de staging natif, mais les redirections peuvent être testées via l'API Admin avant la bascule DNS.
-
Monitoring post-migration quotidien pendant 30 jours. Pas un check hebdomadaire. Un check quotidien des 404 dans Search Console, du nombre de pages indexées, et du trafic organique par landing page.
Le parallèle avec les migrations de framework front-end est frappant : le pattern est toujours le même. Une équipe concentrée sur le fonctionnel pousse en production. Le rendu visuel est parfait. Les URLs, les metas, les redirections — tout ce que Google voit et que l'utilisateur ne voit pas — passent entre les mailles.
Et quand l'environnement de staging n'est pas stress-testé sous l'angle SEO, ces régressions restent invisibles jusqu'à ce que Search Console les remonte — avec trois semaines de retard.
Ce qu'on en retient
Une migration de plateforme e-commerce n'est pas un projet front-end. C'est un projet d'infrastructure SEO. Chaque URL est un actif. Chaque backlink est un vote d'autorité. Quand 8 400 URLs changent de structure sans table de redirections, ce n'est pas un "détail technique" — c'est une perte de revenus mesurable.
Le fix est trivial. Un export SQL, un CSV, un import Shopify. Trente minutes de travail. Le vrai coût, c'est les trois semaines pendant lesquelles personne ne regarde.
Un monitoring continu type Seogard détecte ce type de 404 massif dès le premier crawl post-déploiement — pas dix-huit jours plus tard quand le trafic a déjà décroché.