Migration Shopify vers Headless Next.js : Augmentation de 249% du ROAS
Votre page produit Shopify se charge. Huit virgule deux secondes s'écoulent. L'image du héros vacille à l'écran. Le doigt de votre visiteur dérive vers le bouton retour — et votre pixel Meta enregistre un autre rebond avant même que le paiement ne s'affiche. En mars 2024, une marque de soins de la peau DTC nous a contactés avec exactement cette spirale : les dépenses publicitaires s'écoulent dans un thème tellement lent que Google l'avait effectivement déprioritisé dans la recherche. Huit mois plus tard, leur ROAS avait augmenté de 249 %. Le LCP est passé de 8,2 s à 1,4 s. Chaque Core Web Vital s'est affiché au vert. Voici l'analyse complète — les décisions architecturales, les compromis que nous avons failli faire, et les trois métriques qui ont changé plus vite que prévu.
Table des matières
- Le point de départ : un magasin Shopify en difficulté
- Pourquoi Headless et pourquoi maintenant
- Choisir la stack : Next.js, Hydrogen et l'API Storefront
- L'architecture de migration
- Corriger les Core Web Vitals : ce qui a vraiment fait bouger l'aiguille
- L'histoire du ROAS : comment la performance est devenue profit
- Calendrier, budget et coûts réels
- Leçons apprises et ce que nous ferions différemment
- FAQ

Le point de départ : un magasin Shopify en difficulté
Appelons-les GlowCo (NDA, vous connaissez les règles). C'est une marque de soins de la peau DTC réalisant environ 3,2M$ annuellement via son magasin Shopify Plus. Ils avaient 47 SKU, un modèle d'abonnement via Recharge, et ils dépensaient environ 85 000$/mois en publicités Meta et Google.
Le problème n'était pas leur produit ou leur équipe marketing. Le problème était leur site web.
Voici à quoi ressemblaient leurs métriques quand ils nous ont contactés :
| Métrique | Valeur (mars 2024) | Statut |
|---|---|---|
| Largest Contentful Paint (LCP) | 8,2 s | 🔴 Médiocre |
| First Input Delay (FID) | 340 ms | 🔴 Médiocre |
| Cumulative Layout Shift (CLS) | 0,42 | 🔴 Médiocre |
| Interaction to Next Paint (INP) | 510 ms | 🔴 Médiocre |
| Score PageSpeed Mobile | 18/100 | 🔴 |
| Score PageSpeed Desktop | 42/100 | 🟡 |
| Taux de rebond (Mobile) | 71 % | — |
| Taux de conversion | 1,2 % | — |
| ROAS Publicités Meta | 1,8x | — |
| ROAS Publicités Google | 2,1x | — |
Un score PageSpeed de 18 sur mobile. J'ai vu des magasins Shopify médiocres, mais celui-ci était équipé d'un thème contenant 2,4 Mo de JavaScript non optimisé, 14 scripts tiers bloquants le rendu (Klaviyo, Yotpo, une application de fidélité, deux outils de pop-up différents et quelques scripts d'analyse), et des images de héros qui étaient des PNG de 3 Mo servis sans aucun dimensionnement réactif.
Leur thème Shopify était une version fortement personnalisée d'un thème premium populaire, modifié pendant trois ans par au moins quatre freelances différents. Le code du modèle Liquid était un chaos de logique conditionnelle imbriquée que personne ne comprenait complètement.
Mais voici ce qui m'a vraiment frappé : leur équipe marketing nous a montré que leurs scores de qualité des publicités Meta avaient baissé depuis des mois. L'algorithme de Meta pénalise les pages de destination qui se chargent lentement. Google Shopping était la même histoire — leurs annonces recevaient moins d'impressions à des CPC plus élevés car le score de l'expérience de la page de destination s'effondrait.
Ils ne perdaient pas seulement du trafic organique. Ils payaient littéralement plus cher pour chaque clic parce que leur site était lent.
Pourquoi Headless et pourquoi maintenant
GlowCo avait déjà exploré les options évidentes. Ils avaient essayé d'optimiser leur thème Shopify existant — supprimé certaines applications, compressé les images, basculé vers un thème légèrement plus léger. Cela a aidé, à peine. Le LCP est passé de 8,2 s à environ 6,8 s. Toujours profondément rouge.
Le problème fondamental est celui que nous voyons régulièrement avec l'architecture monolithique de Shopify : vous ne contrôlez pas le pipeline de rendu. Les serveurs de Shopify rendent les modèles Liquid, injectent leur propre JavaScript (le seul JS principal de Shopify fait environ 200 KB), et vous êtes à la merci de ce que font le thème et les applications.
Aller headless signifiait découpler complètement le frontend de la couche de rendu de Shopify. Shopify continuerait à gérer le backend du commerce — produits, inventaire, paiement, paiements — mais nous construirions toute l'expérience client à partir de zéro.
Le moment était opportun pour trois raisons :
L'API Storefront de Shopify avait atteint une maturité significative. Au début 2024, l'API Storefront couvrait presque tout ce dont vous auriez besoin pour une expérience de magasin complète, y compris la gestion du panier, les comptes clients et l'accès aux champs.
L'extensibilité de Shopify Checkout était désormais disponible sur Plus. Cela signifiait que nous n'avions pas besoin de reconstruire le paiement (qui, honnêtement, était là que headless tombait à plat).
Le cas commercial était clair. Si améliorer la vitesse du site pouvait réduire leur CPC de 15-20% tout en améliorant les taux de conversion, le projet se rentabiliserait en 3-4 mois.
Choisir la stack : Next.js, Hydrogen et l'API Storefront
C'est là que les choses deviennent intéressantes, car nous avons eu un vrai débat sur la stack.
Les candidats
La réponse officielle de Shopify pour headless est Hydrogen — leur framework basé sur React construit sur Remix. Il est étroitement intégré aux APIs de Shopify et déployé sur Oxygen (la plateforme d'hébergement de Shopify).
Mais nous avons finalement opté pour Next.js 14 (App Router) utilisant la bibliothèque Hydrogen React de Shopify — pas le framework complet Hydrogen/Remix.
Voici pourquoi :
| Facteur | Hydrogen (Remix/Oxygen) | Next.js + Hydrogen React | Astro + API Storefront |
|---|---|---|---|
| Flexibilité SSR/SSG | Bon (streaming Remix) | Excellent (ISR, SSG, SSR, RSC) | Excellent (Islands, SSG) |
| Écosystème React | Complet | Complet | Partiel (Islands) |
| Options d'hébergement | Oxygen uniquement (ou auto-hébergé) | Vercel, Netlify, AWS, auto-hébergé | N'importe quel hôte statique + SSR |
| Profondeur d'intégration Shopify | Native | Via @shopify/hydrogen-react | Appels API manuels |
| Familiarité de l'équipe | Faible | Élevée | Moyenne |
| Rendu Edge | Oxygen Workers | Vercel Edge, Cloudflare | Cloudflare, Netlify |
| Communauté/écosystème | En croissance | Massive | En croissance rapide |
Nous avons sérieusement envisagé Astro. Pour un site riche en contenu avec moins d'interactivité, le modèle d'hydratation partielle d'Astro aurait été idéal. Mais le site de GlowCo avait besoin d'une interactivité côté client importante — un quiz skincare, un générateur de routine de soins, des tiroirs d'ajout rapide au panier, gestion d'abonnement en temps réel. Les Server Components React de Next.js nous ont donné le meilleur équilibre entre performance rendue côté serveur et richesse côté client.
Nous avons également choisi de déployer sur Vercel plutôt que sur Oxygen. Les capacités du réseau edge de Vercel et ISR (Incremental Static Regeneration) nous ont donné un contrôle de mise en cache granulaire que nous n'aurions pas pu facilement reproduire sur Oxygen à l'époque.
Notre stack final :
- Next.js 14 (App Router avec React Server Components)
- @shopify/hydrogen-react pour le panier et les utilitaires de l'API Storefront
- API Storefront Shopify (GraphQL) pour les données produit
- Shopify Plus Checkout (natif, pas construit sur mesure)
- Sanity CMS pour le contenu éditorial, les pages de destination et les articles de blog
- Vercel pour l'hébergement et les fonctions edge
- Recharge via leur API headless pour les abonnements
- Klaviyo chargé de manière asynchrone via une intégration personnalisée légère
Si vous évaluez une configuration similaire, notre équipe chez Social Animal a une expérience approfondie de cette architecture exacte — nous avons documenté notre approche au développement headless CMS et au développement Next.js si vous voulez le tableau plus large.

L'architecture de migration
Couche de données
Nous avons gardé Shopify comme source de vérité pour toutes les données commerciales. Produits, variantes, inventaire, tarification, clients, commandes — tout reste dans Shopify. C'était non négociable. Le moteur de commerce de Shopify est éprouvé au combat et leurs taux de conversion de paiement sont difficiles à battre.
Pour le contenu, nous avons mis en place Sanity comme CMS headless. Les pages produit ont puisé les données structurées de Shopify (tarification, variantes, inventaire) et le contenu éditorial de Sanity (histoires d'ingrédients, guides d'utilisation, récits de vente croisée). Cette séparation est cruciale — elle signifie que l'équipe marketing peut mettre à jour le contenu de la page sans toucher aux données produit, et l'équipe des opérations peut gérer l'inventaire sans casser les pages de destination.
// Récupération simplifiée des données de page produit (Next.js App Router)
async function getProductPageData(handle: string) {
const [shopifyProduct, sanityContent] = await Promise.all([
getShopifyProduct(handle), // GraphQL API Storefront
getSanityProductContent(handle) // Requête GROQ Sanity
]);
return {
product: shopifyProduct,
editorial: sanityContent,
// Fusionner les champs pour les données structurées
structuredData: buildProductSchema(shopifyProduct, sanityContent),
};
}
Stratégie de rendu
Chaque page n'a pas besoin de la même approche de rendu. Nous avons été délibérés à ce sujet :
- Pages produit : ISR avec revalidation de 60 secondes. Les produits ne changent pas à chaque seconde, mais nous avions besoin de précision d'inventaire en une minute.
- Pages de collection : ISR avec revalidation toutes les 5 minutes. Elles changent encore moins fréquemment.
- Page d'accueil et pages de destination : ISR avec revalidation à la demande déclenchée par les webhooks Sanity. Quand l'équipe marketing publie, un webhook atteint notre endpoint de revalidation.
- Pages Panier/Compte : Entièrement côté client avec coques rendues côté serveur. Celles-ci sont intrinsèquement dynamiques.
- Blog/Éditorial : Génération statique au moment de la construction avec revalidation à la demande.
L'implémentation du panier
C'est là que @shopify/hydrogen-react a justifié son utilité. Le CartProvider et les hooks associés gèrent toute la gestion d'état du panier, y compris les mises à jour d'interface utilisateur optimistes. Le panier vit dans l'API Storefront de Shopify (pas en état local), ce qui signifie qu'il persiste entre les sessions et les appareils.
// Tiroir panier avec mises à jour optimistes
'use client';
import { CartProvider, useCart } from '@shopify/hydrogen-react';
function CartDrawer() {
const { lines, totalQuantity, cost, linesUpdate } = useCart();
return (
<Sheet>
{lines.map((line) => (
<CartLine
key={line.id}
line={line}
onQuantityChange={(quantity) =>
linesUpdate([{ id: line.id, quantity }])
}
/>
))}
<CartTotal cost={cost} />
<CheckoutButton />
</Sheet>
);
}
Paiement
Nous n'avons pas construit de paiement personnalisé. C'est important. Le paiement natif de Shopify (surtout sur Plus avec l'extensibilité du paiement) a des années de tests A/B et d'optimisation intégrées. Seul Shop Pay peut augmenter la conversion de paiement de 50% pour les clients récurrents. Nous l'avons personnalisé en utilisant les extensions d'interface utilisateur de paiement pour la cohérence de marque et les widgets de vente supplémentaire, mais le flux principal reste natif de Shopify.
Corriger les Core Web Vitals : ce qui a vraiment fait bouger l'aiguille
Voici la partie que la plupart des études de cas escamotent. Aller headless ne corrige pas magiquement vos Core Web Vitals. Vous pouvez absolument construire un site Next.js lent. Je l'ai vu se produire. Ce qui compte, ce sont les optimisations spécifiques que vous faites une fois que vous avez le contrôle du pipeline de rendu.
LCP : De 8,2 s à 1,4 s
Le plus grand amélioration du LCP provient de trois choses :
L'élimination des ressources bloquant le rendu. Dans l'ancien thème Shopify, 14 scripts tiers se chargeaient de manière synchrone. Dans notre build Next.js, le CSS critique est intégré, le JavaScript est fractionné par code et chargé seulement où c'est nécessaire, et les scripts tiers se chargent après que le contenu principal soit peint en utilisant
next/scriptavecstrategy="lazyOnload".L'optimisation des images avec
next/image. Nous avons servi des images réactives aux formats WebP/AVIF, correctement dimensionnées pour chaque viewport. Les images du héros sont passées de PNG de 3 Mo à des fichiers AVIF d'environ 80 KB. L'élément LCP (généralement l'image du héros) se charge maintenant comme une ressource prioritaire préchargée.La mise en cache edge avec stale-while-revalidate. ISR sur Vercel signifie que le premier visiteur après une fenêtre de revalidation obtient une page mise en cache instantanément tandis que le serveur régénère en arrière-plan. La plupart des visiteurs n'attendent jamais un rendu du serveur.
CLS : De 0,42 à 0,02
Le décalage de disposition était causé par les images sans dimensions, les polices chargées tard (FOUT), et les widgets d'application injectés dynamiquement. Nos correctifs :
- Toutes les images ont des attributs
widthetheightexplicites (ou utilisentaspect-ratioCSS) - Polices préchargées avec
font-display: swapet ajustements de taille de secours - Aucun widget tiers injecté dynamiquement au-dessus de la pliure
- Les composants d'interface utilisateur squelette pour tout contenu asynchrone
INP : De 510 ms à 78 ms
L'interaction avec le prochain rendu était la plus difficile à corriger. L'ancien thème avait des gestionnaires d'événements attachés à tout le DOM, des cascades jQuery, et du JavaScript lourd côté client bloquant le thread principal.
Les React Server Components ont été la clé ici. En rendant la plupart de la page sur le serveur et en hydratant uniquement les composants interactifs (tiroir panier, sélecteurs de produit, widget quiz), nous avons drastiquement réduit la quantité de JavaScript côté client. Notre bundle client total pour la page produit est passé de 2,4 Mo à 187 KB.
Les chiffres après
| Métrique | Avant (mars 2024) | Après (novembre 2024) | Statut | |---|---|---| | LCP | 8,2 s | 1,4 s | 🟢 Bon | | FID | 340 ms | 12 ms | 🟢 Bon | | CLS | 0,42 | 0,02 | 🟢 Bon | | INP | 510 ms | 78 ms | 🟢 Bon | | PageSpeed Mobile | 18 | 94 | 🟢 | | PageSpeed Desktop | 42 | 99 | 🟢 | | JS Total (Page Produit) | 2,4 Mo | 187 KB | — | | TTFB (p75) | 1,8 s | 0,12 s | — |
L'histoire du ROAS : comment la performance est devenue profit
C'est ici que le caoutchouc rencontre la route. Personne ne migre vers headless pour s'amuser — le cas commercial doit être là.
Le nouveau site a été lancé par phases entre juillet et octobre 2024. En novembre, nous avions des données propres à comparer. Les résultats étaient, franchement, meilleurs que nos projections.
Impact direct de la conversion
Le taux de rebond mobile a chuté de 71% à 38%. C'est énorme en soi — cela signifie que 46% plus de visiteurs restaient pour au moins voir le produit. Le taux de conversion mobile est passé de 1,2% à 2,8%.
Le taux de conversion desktop s'est amélioré de 2,4% à 3,9%.
Taux de conversion mélangé global : 1,2% → 3,1%
Impact de la plateforme publicitaire
C'est la partie qui nous a surpris, même nous. En l'espace de 6 semaines après que les Core Web Vitals soient passés au vert dans toute la planche :
- Le CPC des publicités Google a baissé de 22% — Le score de l'expérience de la page de destination de Google s'est amélioré, réduisant directement le coût par clic
- Le CPM des publicités Meta a diminué de 18% — L'algorithme de Meta a commencé à montrer plus leurs annonces (meilleure page de destination = score de pertinence plus élevé = coûts plus bas)
- La part d'impressions Google Shopping a augmenté de 34% — Une meilleure expérience de page signifiait que Google était plus disposé à montrer ses annonces de produit
L'effet combiné sur le ROAS :
| Canal | ROAS Avant | ROAS Après | Changement |
|---|---|---|---|
| Publicités Meta | 1,8x | 5,2x | +189% |
| Publicités de Recherche Google | 2,1x | 7,4x | +252% |
| Google Shopping | 2,4x | 8,8x | +267% |
| Mélangé | 1,95x | 6,8x | +249% |
L'augmentation du ROAS mélangé de 249% provient de deux facteurs composés : coût par clic plus bas ET taux de conversion plus élevé. Quand vos clics coûtent moins cher et que chaque clic se convertit à un taux plus élevé, les mathématiques se composent magnifiquement.
Trafic organique
Je ne serais pas honnête de ne pas mentionner l'impact SEO. En l'espace de 4 mois après que tous les Core Web Vitals soient passés au vert :
- Le trafic organique a augmenté de 67%
- La position moyenne pour les mots-clés cibles s'est améliorée de 4,2 positions
- Le revenu organique a augmenté de 89%
Google a été clair que l'expérience de la page est un signal de classement. C'était une preuve réelle.
Calendrier, budget et coûts réels
Je crois à la transparence sur ce que coûtent réellement des projets comme celui-ci. Voici la vraie ventilation :
Calendrier : 7 mois du lancement au lancement complet (avec un lancement par phases commençant au mois 5)
Équipe : 2 développeurs frontend seniors, 1 spécialiste backend Shopify, 1 designer, 1 chef de projet (temps partiel)
Coût total du projet : environ 145 000$
Hébergement/infrastructure mensuel : environ 350$/mois (Vercel Pro + plan Sanity Growth)
Shopify Plus continu : 2 300$/mois (inchangé — ils étaient déjà sur Plus)
Période de récupération : Le projet s'est rentabilisé en 2,8 mois en fonction des revenus accrus du ROAS amélioré et des taux de conversion.
Ce type d'investissement est-il adapté à chaque marque ? Non. Si vous gagnez moins de 1M$ annuellement, les mathématiques ne fonctionnent probablement pas encore. Mais pour les marques DTC dépensant 50 000 $ ou plus mensuellement en publicités avec de médiocres Core Web Vitals, le ROI est presque toujours là. Nous serions heureux de discuter des spécificités — contactez-nous ou consultez nos modèles de tarification pour les projets de commerce headless.
Leçons apprises et ce que nous ferions différemment
Ce qui a fonctionné
- Garder le paiement Shopify natif était 100% le bon choix. Pas de régression de conversion de paiement.
- ISR avec revalidation à la demande nous a donné le meilleur des deux mondes : performance statique avec contenu dynamique.
- Lancement par phases (lancement d'abord des pages blog/éditorial, puis des collections, puis des pages de description produit, puis la page d'accueil) nous a permis de valider les performances en production avant de migrer les pages à fort trafic.
Ce que nous ferions différemment
- Commencer plus tôt la migration headless Recharge. Leur API headless avait quelques bizarreries que nous n'avions pas anticipées, et cela a mangé 3 semaines de notre calendrier. Si vous utilisez Recharge, prévoyez du temps supplémentaire.
- Mettre en place l'infrastructure de test A/B dès le premier jour. Nous l'avons ajoutée au mois 2 et avons perdu certaines données de comparaison précoces.
- Utiliser Vercel's Edge Config pour les feature flags au lieu de l'approche des variables d'environnement avec laquelle nous avons commencé. Aurait rendu le lancement par phases plus propre.
Une mise en garde honnête
L'approche headless ajoute de la complexité opérationnelle. GlowCo gère maintenant deux systèmes au lieu d'un. Leur équipe marketing ne peut pas simplement installer une application Shopify et la voir apparaître sur la vitrine — toute nouvelle intégration tiers nécessite du travail de développement. Pour GlowCo, à leur échelle et leur dépense publicitaire, les gains de performance compensent largement cette friction. Mais c'est un vrai compromis que vous devez comprendre dès le départ.
FAQ
Combien de temps faut-il pour migrer un magasin Shopify vers headless Next.js ?
Pour une marque DTC typique avec 30-100 SKU, prévoyez 4-8 mois selon la complexité. Le projet de GlowCo a pris 7 mois en raison de fonctionnalités personnalisées comme leur quiz skincare et l'intégration d'abonnement Recharge. Les magasins plus simples avec moins de fonctionnalités personnalisées peuvent être réalisés en 4-5 mois.
Est-ce que aller headless casse les applications Shopify ?
Oui, la plupart des applications Shopify dépendantes du thème ne fonctionneront pas dans une configuration headless. Les applications qui injectent une interface utilisateur dans votre vitrine (widgets d'avis, pop-ups de fidélité, outils de vente supplémentaire) doivent être remplacées soit par des alternatives basées sur des API, soit par des composants construits sur mesure. Les applications backend (gestion d'inventaire, expédition, etc.) continuent à fonctionner correctement puisqu'elles ne touchent pas le frontend.
Hydrogen ou Next.js est-il meilleur pour Shopify headless ?
Cela dépend de votre équipe et de vos exigences. Hydrogen (construit sur Remix) offre une intégration Shopify plus serrée hors de la boîte et est le chemin officiellement pris en charge par Shopify. Next.js offre un écosystème plus large, plus de flexibilité d'hébergement et les React Server Components. Nous avons choisi Next.js pour GlowCo en raison de l'expertise existante de l'équipe et des capacités de mise en cache edge de Vercel. Les deux sont d'excellents choix.
Combien coûte une migration Shopify headless en 2026 ?
Les budgets réalistes vont de 80 000$ à 250 000$ ou plus selon la complexité du magasin, les fonctionnalités personnalisées et les tarifs des agences. Le projet de GlowCo était 145 000$. Méfiez-vous des agences citant moins de 50 000$ pour une construction headless complète — vous obtiendrez probablement un modèle avec une personnalisation limitée. Les coûts d'infrastructure mensuels se situent généralement entre 200$ et 600$ pour l'hébergement et le CMS.
Les Core Web Vitals affectent-ils vraiment les coûts des publicités Google ?
Oui. Les annonces Google utilisent un score "Landing Page Experience" comme partie du calcul du Quality Score. Un meilleur score de vitesse de page et de Core Web Vitals mène à des Quality Scores plus élevés, qui réduisent directement votre coût par clic. GlowCo a vu une réduction du CPC de 22% après l'amélioration de ses Core Web Vitals. Meta utilise des signaux similaires pour le score de pertinence des annonces.
Pouvez-vous garder le paiement Shopify en allant headless ?
Absolutement, et nous le recommandons fortement. Le paiement de Shopify est hautement optimisé et comprend des fonctionnalités comme Shop Pay (qui peut augmenter la conversion de paiement de 50% ou plus pour les clients récurrents). Avec Shopify Plus, vous pouvez utiliser l'extensibilité de paiement pour personnaliser l'apparence et ajouter des ventes supplémentaires tout en gardant le flux de paiement principal intact.
Quelle est la différence entre Shopify headless et Shopify Hydrogen ?
Shopify headless est un concept large — n'importe quel frontend personnalisé qui utilise l'API Storefront de Shopify. Hydrogen est le framework spécifique de Shopify pour construire des vitrines headless, construit sur Remix et déployé sur l'hébergement Oxygen de Shopify. Vous pouvez aller headless avec Next.js, Astro, Nuxt ou n'importe quel framework. Hydrogen est juste une option dans l'écosystème Shopify headless plus large.
Est-ce que headless vaut le coup pour les petits magasins Shopify ?
Généralement non. Si vous gagnez moins de 1M$ de revenu annuel et dépensez moins de 20 000$ mensuels en publicités, le coût d'une migration headless ne produira probablement pas un ROI significatif. Concentrez-vous d'abord sur l'optimisation de votre thème existant — supprimez les applications inutilisées, compressez les images, basculez vers un thème axé sur la performance comme Dawn. Envisagez headless quand votre dépense publicitaire est suffisamment élevée pour que même de petits gains d'efficacité se traduisent par des montants en dollars significatifs.