DTC Skincare Brand's Shopify-to-Headless Migration: 249% ROAS Increase
Je Shopify-productpagina laadt. Acht komma twee seconden tikken voorbij. De hero-afbeelding stottert in beeld. De vinger van je bezoeker drijft naar de terug-knop — en je Meta-pixel registreert nog een bounce voordat checkout zich zelfs maar rendert. In maart 2024 belandde een DTC-huidverzorgingsmerk in onze Slack met deze exacte spiraal: advertentiebudget bloedend uit een thema dat zo traag was dat Google hen effectief in zoekresultaten had gedeprioriteerd. Acht maanden later was hun ROAS met 249% gestegen. LCP daalde van 8,2s naar 1,4s. Elke Core Web Vital werd groen. Dit is de volledige breakdown — architectuurkeuzes, afwegingen die we bijna verkeerd hadden gemaakt, en de drie metrieken die sneller veranderden dan we verwachtten.
Inhoudsopgave
- Het Startpunt: Een Shopify-winkel in Moeilijkheden
- Waarom Headless en Waarom Nu
- De Stack Kiezen: Next.js, Hydrogen, en de Storefront API
- De Migratiearchitectuur
- Core Web Vitals Repareren: Wat Echt Het Verschil Maakte
- Het ROAS-verhaal: Hoe Prestaties Winst Werden
- Timeline, Budget en Werkelijke Kosten
- Geleerde Lessen en Wat We Anders zouden Doen
- Veelgestelde Vragen

Het Startpunt: Een Shopify-winkel in Moeilijkheden
Laten we ze GlowCo noemen (NDA, je kent het wel). Het is een DTC-huidverzorgingsmerk dat ongeveer $3,2M jaarlijks door hun Shopify Plus-winkel doet. Ze hadden 47 SKU's, een abonnementsmodel via Recharge, en ze gaven ongeveer $85K per maand uit aan Meta- en Google-advertenties.
Het probleem was niet hun product of hun marketingteam. Het probleem was hun website.
Hier is wat hun metrieken eruit zagen toen ze contact met ons opnamen:
| Metriek | Waarde (maart 2024) | Status |
|---|---|---|
| Grootste Contentful Paint (LCP) | 8,2s | 🔴 Slecht |
| First Input Delay (FID) | 340ms | 🔴 Slecht |
| Cumulatieve Layoutverschuiving (CLS) | 0,42 | 🔴 Slecht |
| Interactie naar Volgende Paint (INP) | 510ms | 🔴 Slecht |
| Mobile PageSpeed-score | 18/100 | 🔴 |
| Desktop PageSpeed-score | 42/100 | 🟡 |
| Bouncepercentage (Mobile) | 71% | — |
| Conversiesnelheid | 1,2% | — |
| Meta Ads ROAS | 1,8x | — |
| Google Ads ROAS | 2,1x | — |
Een PageSpeed-score van 18 op mobiel. Ik heb slechte Shopify-winkels gezien, maar deze droeg een thema met 2,4MB niet-geoptimaliseerde JavaScript, 14 renderblokkerende third-party scripts (Klaviyo, Yotpo, een loyaliteitsapp, twee verschillende popuptools, en een handvol analyticscripts), en hero-afbeeldingen van 3MB PNG's die zonder responsive sizing werden geleverd.
Hun Shopify-thema was een zwaar aangepaste versie van een populair premium-thema, drie jaar lang gewijzigd door minstens vier verschillende freelancers. De Liquid-templatecode was een geneste chaos van voorwaardelijke logica die niemand volledig begreep.
Maar hier is wat mijn aandacht echt trok: hun marketingteam toonde ons dat hun Meta Ads-kwaliteitsscores maanden lang waren gedaald. Meta's algoritme straft landingspagina's af die traag laden. Google Shopping was dezelfde verhaal — hun advertenties kregen minder indrukken tegen hogere CPC's omdat de landingspaginaervaring-score tankte.
Ze verloren niet alleen organisch verkeer. Ze betaalden letterlijk meer voor elke klik omdat hun site traag was.
Waarom Headless en Waarom Nu
GlowCo had al de voor de hand liggende opties onderzocht. Ze hadden hun bestaande Shopify-thema geprobeerd te optimaliseren — verwijderde enkele apps, comprimeerde afbeeldingen, schakelde over naar een iets lichter thema. Het hielp, nauwelijks. LCP ging van 8,2s naar ongeveer 6,8s. Nog steeds diep rood.
Het fundamentele probleem is er een die we herhaaldelijk zien bij Shopify's monolithische architectuur: je controleert de renderingpipeline niet. Shopify's servers renderen Liquid-templates, injecteren hun eigen JavaScript (Shopify's core JS alleen is ongeveer 200KB), en je bent onderworpen aan wat het thema en de apps doen.
Headless gaan betekende dat de frontend volledig van Shopify's renderinglaag werd ontkoppeld. Shopify zou nog steeds de commerce-backend afhandelen — producten, inventaris, checkout, betalingen — maar we zouden de hele klantgerichte ervaring helemaal opnieuw bouwen.
De timing maakte om drie redenen zin:
Shopify's Storefront API was aanzienlijk volgroeid. Begin 2024 dekte de Storefront API vrijwel alles wat je nodig zou hebben voor een volledige winkelervaring, inclusief winkelwagenbeheer, klantaccounts en metafield-toegang.
Shopify Checkout Extensibility was nu beschikbaar op Plus. Dit betekende dat we checkout niet opnieuw hoefden op te bouwen (wat, eerlijk gezegd, waar headless vroeger kapot liep).
Het zakelijk geval was duidelijk. Als het verbeteren van sitesnelheid hun CPC met slechts 15-20% kon verminderen terwijl de conversiesnelheden verbeterden, zou het project zich binnen 3-4 maanden terugbetalen.
De Stack Kiezen: Next.js, Hydrogen, en de Storefront API
Dit is waar het interessant wordt, omdat we een echte debat hadden over de stack.
De Kandidaten
Shopify's officiële antwoord voor headless is Hydrogen — hun React-gebaseerde framework gebouwd op Remix. Het is nauw geïntegreerd met Shopify's API's en geïmplementeerd op Oxygen (Shopify's hostingplatform).
Maar we gingen uiteindelijk voor Next.js 14 (App Router) met Shopify's Hydrogen React-bibliotheek — niet het volledige Hydrogen/Remix-framework.
Hier is waarom:
| Factor | Hydrogen (Remix/Oxygen) | Next.js + Hydrogen React | Astro + Storefront API |
|---|---|---|---|
| SSR/SSG-flexibiliteit | Goed (Remix streaming) | Uitstekend (ISR, SSG, SSR, RSC) | Uitstekend (Islands, SSG) |
| React-ecosysteem | Volledig | Volledig | Gedeeltelijk (Islands) |
| Hostingopties | Oxygen alleen (of zelf-host) | Vercel, Netlify, AWS, zelf-host | Elke statische host + SSR |
| Shopify-integratiespecialisatie | Native | Via @shopify/hydrogen-react | Handmatige API-aanroepen |
| Team-bekendheid | Laag | Hoog | Medium |
| Edge-rendering | Oxygen Workers | Vercel Edge, Cloudflare | Cloudflare, Netlify |
| Community/ecosysteem | Groeiend | Massief | Snel groeiend |
We hebben Astro serieus overwogen. Voor een contentrijke site met minder interactiviteit zou Astro's partiële hydratiemodel ideaal zijn geweest. Maar GlowCo's site had zware client-side interactiviteit nodig — een huidverzorgingsvragenlijst, een skincare-routinebouwer, snel-toevoegen winkelwagenlades, real-time abonnementsbeheer. Next.js's React Server Components gaven ons het beste evenwicht tussen server-gerenderde prestaties en client-side rijkheid.
We kozen er ook voor om op Vercel in plaats van Oxygen te implementeren. Vercel's edge-netwerk en ISR-mogelijkheden (Incremental Static Regeneration) gaven ons fijnkorrelige cacheringcontrole die we destijds niet gemakkelijk op Oxygen konden repliceren.
Onze uiteindelijke stack:
- Next.js 14 (App Router met React Server Components)
- @shopify/hydrogen-react voor winkelwagen, Storefront API-hulpprogramma's
- Shopify Storefront API (GraphQL) voor productgegevens
- Shopify Plus Checkout (native, niet custom-gebouwd)
- Sanity CMS voor redactionele content, landingspagina's en blogposts
- Vercel voor hosting en edge-functies
- Recharge via hun headless API voor abonnementen
- Klaviyo geladen asynchrone via een lichtgewicht custom-integratie
Als je een vergelijkbare setup evalueert, ons team bij Social Animal heeft diepgaande ervaring met deze exacte architectuur — we hebben onze benadering gedocumenteerd voor headless CMS-ontwikkeling en Next.js-ontwikkeling als je het grotere plaatje wilt.

De Migratiearchitectuur
Gegevenslaag
We hielden Shopify als de enige bron van waarheid voor alle commercegegevens. Producten, varianten, inventaris, prijzen, klanten, bestellingen — alles blijft in Shopify. Dit was niet-onderhandelbaar. Shopify's commerce-engine is gevechtstested en hun checkout-conversietarieven zijn moeilijk te verslaan.
Voor content richtten we Sanity in als een headless CMS. Productpagina's haalden gestructureerde gegevens van Shopify (prijzen, varianten, inventaris) en redactionele content van Sanity (ingrediëntenverhalen, gebruikshandleidingen, cross-sell-verhalen). Deze scheiding is cruciaal — het betekent dat het marketingteam pagina-inhoud kan bijwerken zonder productgegevens aan te raken, en het opsysteam kan inventaris beheren zonder landingspagina's te breken.
// Vereenvoudigde gegevenopvraag productpagina (Next.js App Router)
async function getProductPageData(handle: string) {
const [shopifyProduct, sanityContent] = await Promise.all([
getShopifyProduct(handle), // Storefront API GraphQL
getSanityProductContent(handle) // Sanity GROQ-query
]);
return {
product: shopifyProduct,
editorial: sanityContent,
// Merge metafields voor gestructureerde gegevens
structuredData: buildProductSchema(shopifyProduct, sanityContent),
};
}
Renderingstrategie
Niet elke pagina heeft dezelfde renderingaanpak nodig. We waren hier doelbewust over:
- Productpagina's: ISR met 60-seconde revalidatie. Producten veranderen niet elke seconde, maar we hadden inventarisnauwkeurigheid nodig binnen een minuut.
- Collectiepagina's: ISR met 5-minuten revalidatie. Deze veranderen nog veel minder vaak.
- Homepage en landingspagina's: ISR met on-demand revalidatie geactiveerd door Sanity webhooks. Wanneer het marketingteam publiceert, raakt een webhook onze revalidatie-eindpunt.
- Winkelwagen/accountpagina's: Volledig client-side met server-gerenderde shells. Dit zijn inherent dynamisch.
- Blog/redactioneel: Statische generatie bij buildtijd met on-demand revalidatie.
De Winkelwagenimplementatie
Dit is waar @shopify/hydrogen-react zijn waarde bewees. De CartProvider en bijbehorende hooks hanteren alles winkelwagentoestandsbeheer, inclusief optimistische UI-updates. De winkelwagen leeft in Shopify's Storefront API (niet lokale toestand), wat betekent dat het persistent is tussen sessies en apparaten.
// Winkelwagenladen met optimistische updates
'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>
);
}
Checkout
We hebben geen custom checkout gebouwd. Dit is belangrijk. Shopify's native checkout (vooral op Plus met Checkout Extensibility) heeft jaren A/B-tests en optimalisatie ingebakken. Shop Pay alleen kan de checkoutconversie voor terugkerende klanten met 50% verhogen. We pasten het aan met Checkout UI Extensions voor merkconformiteit en upsell-widgets, maar de kernstroom blijft Shopify-native.
Core Web Vitals Repareren: Wat Echt Het Verschil Maakte
Hier is het onderdeel dat de meeste casestudies niet noemen. Headless gaan lost uw Core Web Vitals niet magisch op. Je kunt absoluut een trage Next.js-site bouwen. Ik heb het zien gebeuren. Wat ertoe doet is de specifieke optimalisaties die je aanmaakt als je controle hebt over de renderingpipeline.
LCP: Van 8,2s naar 1,4s
De grootste LCP-verbetering kwam van drie dingen:
Renderblokkerende resources elimineren. In het oude Shopify-thema werden 14 third-party scripts synchroon geladen. In onze Next.js-build wordt kritieke CSS inline opgenomen, JavaScript code-split en alleen waar nodig geladen, en third-party scripts laden na de hoofdinhoud met
next/scriptenstrategy="lazyOnload".Afbeeldingsoptimalisatie met
next/image. We serveerden responsieve afbeeldingen in WebP/AVIF-indeling, correct formaat voor elk viewport. Hero-afbeeldingen gingen van 3MB PNG's naar ongeveer 80KB AVIF-bestanden. Het LCP-element (meestal de hero-afbeelding) laadt nu als een prioriteit-geprefetched resource.Edge-caching met stale-while-revalidate. ISR op Vercel betekent dat de eerste bezoeker na een revalidatievenster een gecachede pagina onmiddellijk krijgt terwijl de server op de achtergrond regenereert. De meeste bezoekers wachten nooit op een serverrender.
CLS: Van 0,42 naar 0,02
Layoutverschuiving werd veroorzaakt door afbeeldingen zonder dimensies, lettertypen die laat laden (FOUT), en dynamisch geïnjecteerde app-widgets. Onze fixes:
- Alle afbeeldingen hebben expliciete
widthenheightattributen (of gebruikenaspect-ratioCSS) - Lettertypen vooraf geladen met
font-display: swapen grote aangepaste fallbacks - Geen dynamisch geïnjecteerde third-party widgets boven de vouw
- Skelet-UI-componenten voor asynchrone inhoud
INP: Van 510ms naar 78ms
Interactie naar Volgende Paint was het moeilijkst om te repareren. Het oude thema had event-handlers aan de hele DOM vast, jQuery-waterfalls, en zware client-side JavaScript die de hoofdthread blokkeerden.
React Server Components waren de sleutel hier. Door het grootste deel van de pagina op de server te renderen en alleen interactieve componenten (winkelwagenladen, productkiezers, quizwidget) te hydrateren, verkleinde we dramatisch de hoeveelheid client-side JavaScript. Onze totale clientbundle voor de productpagina daalde van 2,4MB naar 187KB.
De Cijfers Erna
| Metriek | Voor (maart 2024) | Na (november 2024) | Status |
|---|---|---|---|
| LCP | 8,2s | 1,4s | 🟢 Goed |
| FID | 340ms | 12ms | 🟢 Goed |
| CLS | 0,42 | 0,02 | 🟢 Goed |
| INP | 510ms | 78ms | 🟢 Goed |
| Mobile PageSpeed | 18 | 94 | 🟢 |
| Desktop PageSpeed | 42 | 99 | 🟢 |
| Totale JS (Productpagina) | 2,4MB | 187KB | — |
| TTFB (p75) | 1,8s | 0,12s | — |
Het ROAS-verhaal: Hoe Prestaties Winst Werden
Hier raakt rubber de weg. Niemand migreert naar headless voor de lol — de zakelijk geval moet daar zijn.
De nieuwe site werd gefaseerd gelanceerd tussen juli en oktober 2024. Tegen november hadden we schone gegevens om mee te vergelijken. De resultaten waren, eerlijk gezegd, beter dan we projecteerden.
Directe Conversiepact
Mobile bouncepercentage daalde van 71% naar 38%. Dat alleen al is massief — het betekent 46% meer bezoekers bleven rondhangen om zelfs maar het product te zien. Mobile conversiesnelheid ging van 1,2% naar 2,8%.
Desktop conversiesnelheid verbeterde van 2,4% naar 3,9%.
Overall blended conversiesnelheid: 1,2% → 3,1%
Advertentieplatformpact
Dit is het onderdeel dat zelfs ons verraste. Binnen 6 weken van Core Web Vitals groen over de hele linie:
- Google Ads CPC daalde 22% — Google's landingspagina-ervaringscore verbeterde, waardoor de kosten per klik rechtstreeks daalden
- Meta Ads CPM verminderd 18% — Meta's algoritme begon hun advertenties meer te vertonen (betere landingspagina = hoger relevantiescore = lagere kosten)
- Google Shopping indrukshare nam toe 34% — Betere paginaervaring betekende dat Google meer bereid was hun productlijsten weer te geven
Het gecombineerde effect op ROAS:
| Kanaal | ROAS Voor | ROAS Na | Verandering |
|---|---|---|---|
| Meta Ads | 1,8x | 5,2x | +189% |
| Google Search Ads | 2,1x | 7,4x | +252% |
| Google Shopping | 2,4x | 8,8x | +267% |
| Blended | 1,95x | 6,8x | +249% |
De 249% blended ROAS-toename kwam van twee samengestelde factoren: lagere kosten per klik EN hogere conversiesnelheid. Wanneer uw kliks minder kosten en elke klik tegen een hoger tarief converteert, stelt het wiskundig samen.
Organisch Verkeer
Ik zou het niet voorbij mogen gaan zonder het SEO-effect te noemen. Binnen 4 maanden van alle Core Web Vitals groen:
- Organisch verkeer nam toe met 67%
- Gemiddelde positie voor doelwoorden verbeterde met 4,2 posities
- Organische inkomsten namen toe met 89%
Google is duidelijk dat paginaervaring een rankingfactor is. Dit was realworldproof.
Timeline, Budget en Werkelijke Kosten
Ik geloof in transparantie over wat projecten zoals deze werkelijk kosten. Hier is de werkelijke breakdown:
Timeline: 7 maanden van kickoff tot volledige lancering (met gefaseerde rollout beginnend maand 5)
Team: 2 senior frontend-ontwikkelaars, 1 Shopify backend-specialist, 1 ontwerper, 1 projectmanager (deeltijd)
Totale projectkosten: ongeveer $145.000
Maandelijkse hosting/infrastructuur: ongeveer $350/maand (Vercel Pro + Sanity Growth-plan)
Doorlopend Shopify Plus: $2.300/maand (ongewijzigd — ze zaten al op Plus)
Terugbetalingsperiode: Het project betaalde zich binnen 2,8 maanden terug op basis van de verhoogde inkomsten van verbeterde ROAS en conversiesnelheden.
Is dit soort investering geschikt voor elk merk? Nee. Als je minder dan $1M jaarlijks doet, zal de wiskunde waarschijnlijk nog niet werken. Maar voor DTC-merken die $50K+ maandelijks op advertenties besteden met slechte Core Web Vitals, is de ROI bijna altijd daar. Graag praten we specifiek — neem contact met ons op of controleer onze prijsmodellen voor headless commerce-projecten.
Geleerde Lessen en Wat We Anders zouden Doen
Wat Werkte
- Shopify checkout native houden was 100% de juiste oproep. Geen checkoutconversiereggressie.
- ISR met on-demand revalidatie gaf ons het beste van beide werelden: statische prestaties met dynamische content.
- Gefaseerde rollout (blogposts/redactionele pagina's eerst lanceren, dan collecties, dan PDP's, dan homepage) liet ons prestaties in productie valideren voordat we pagina's met veel verkeer migreerden.
Wat We Anders zouden Doen
- Start de Recharge headless-migratie eerder. Hun headless API had enkele eigenaardigheden waar we niet op anticipeerden, en het kostte 3 weken van onze timeline. Als je Recharge gebruikt, begroting extra tijd.
- Stel A/B-testinfrastructuur op dag één in. We voegden het in maand 2 toe en verloren wat vroege vergelijkingsgegevens.
- Gebruik Vercel's Edge Config voor functiemarkeringen in plaats van de omgevingsvariabele-aanpak waarmee we begonnen. Zou de gefaseerde rollout schoner hebben gemaakt.
Een Eerlijke Kanttekening
De headless-aanpak voegt operationele complexiteit toe. GlowCo beheert nu twee systemen in plaats van één. Hun marketingteam kan niet zomaar een Shopify-app installeren en erop verschijnen op de winkel — elke nieuwe third-party-integratie vereist ontwikkelwerk. Voor GlowCo, op hun schaal en advertentieuitgaven, wegen de prestatiewinsten ver op tegen deze wrijving. Maar het is een echte afweging die je aan het begin moet begrijpen.
Veelgestelde Vragen
Hoe lang duurt het om een Shopify-winkel naar headless Next.js te migreren? Voor een typisch DTC-merk met 30-100 SKU's, verwacht 4-8 maanden afhankelijk van complexiteit. GlowCo's project duurde 7 maanden vanwege custom functies zoals hun huidverzorgingsvragenlijst en Recharge-abonnementintegratieduur. Eenvoudiger winkels met minder custom functies kunnen in 4-5 maanden gedaan zijn.
Breekt headless gaan Shopify-apps? Ja, de meeste thema-afhankelijke Shopify-apps werken niet in een headless-setup. Apps die UI in uw winkel injecteren (reviewwidgets, loyaliteitspopups, upsell-tools) moeten worden vervangen door ofwel API-gebaseerde alternatieven ofwel custom-gebouwde componenten. Backend-apps (inventarisbeheer, verzending, enz.) blijven prima werken omdat ze de frontend niet aanraken.
Is Hydrogen of Next.js beter voor headless Shopify? Het hangt af van uw team en vereisten. Hydrogen (gebouwd op Remix) biedt strakkere Shopify-integratie out-of-the-box en is Shopify's officieel ondersteunde pad. Next.js biedt een groter ecosysteem, meer hostingflexibiliteit en React Server Components. We kozen Next.js voor GlowCo omdat van het team's bestaande expertise en Vercel's edge-cachingmogelijkheden. Beide zijn uitstekende keuzes.
Hoeveel kost een headless Shopify-migratie in 2026? Realistische budgetten variëren van $80.000 tot $250.000+ afhankelijk van winkelcomplexiteit, custom functies en agencytarieven. GlowCo's project was $145.000. Wees voorzichtig met agentschappen die onder de $50K citeren voor een volledige headless-build — u krijgt waarschijnlijk een sjabloon met beperkte aanpassing. Maandelijkse infrastructuurkosten bedragen meestal $200-600 voor hosting en CMS.
Beïnvloeden Core Web Vitals echt Google Ads-kosten? Ja. Google Ads gebruiken een "Ervaring van landingspagina"-score als onderdeel van zijn Quality Score-berekening. Betere snelheid en Core Web Vitals-scores leiden tot hogere Quality Scores, die rechtstreeks uw kosten per klik verminderen. GlowCo zag een CPC-verlaging van 22% nadat hun Core Web Vitals verbeterden. Meta gebruikt vergelijkbare signalen voor advertentielevantiescore.
Kunt u Shopify checkout houden als u headless gaat? Absoluut, en we bevelen het sterk aan. Shopify's checkout is zeer geoptimaliseerd en bevat functies zoals Shop Pay (die de checkout-conversie met 50%+ voor terugkerende shoppers kan verhogen). Met Shopify Plus kun je Checkout Extensibility gebruiken om het uiterlijk aan te passen en upsells toe te voegen terwijl je de kerncheckout-stroom intact houdt.
Wat is het verschil tussen headless Shopify en Shopify Hydrogen? Headless Shopify is een breed concept — elke custom frontend die Shopify's Storefront API gebruikt. Hydrogen is Shopify's specifieke framework voor het bouwen van headless storefronts, gebouwd op Remix en geïmplementeerd op Shopify's Oxygen-hosting. Je kunt headless gaan met Next.js, Astro, Nuxt of elk framework. Hydrogen is slechts één optie binnen het headless Shopify-ecosysteem.
Is headless het waard voor kleine Shopify-winkels? Usueel niet. Als je minder dan $1M jaarlijks doet en minder dan $20K maandelijks op advertenties besteedt, zal de kosten van een headless-migratie waarschijnlijk geen betekenisvol ROI produceren. Concentreer je op het optimaliseren van uw bestaande thema eerst — verwijder ongebruikte apps, comprimeer afbeeldingen, schakel over naar een performantiegericht thema zoals Dawn. Overweeg headless wanneer uw advertentieuitgaven hoog genoeg zijn dat zelfs kleine efficiëntiewinsten zich vertalen in aanzienlijke dollarbedragen.