Een DTC-huidverzorgingsmerk migreren naar Headless Next.js: 249% ROAS-stijging

In maart 2024 kwam een DTC-huidverzorgingsmerk naar ons toe met een probleem dat pijnlijk veel voorkomt: hun Shopify-theme was traag, hun advertentiebudget werd verspild, en hun Core Web Vitals waren zo slecht dat Google hen in feite deprioriteerde in zoekresultaten. Acht maanden later was hun return on ad spend met 249% gestegen, hun LCP gedaald van 8,2s naar 1,4s, en elke Core Web Vitals-metriek was glanzend groen. Dit is het volledige verhaal van hoe we daar zijn gekomen — de architectuurbeslissingen, de afwegingen, de fouten, en de werkelijke cijfers.

Inhoudsopgave

DTC-merk migratie Shopify naar Headless Next.js: 249% ROAS-stijging

Het startpunt: Een Shopify-winkel in nood

Laten we ze GlowCo noemen (NDA, je kent het). Ze zijn een DTC-huidverzorgingsmerk met een jaarlijkse omzet van ongeveer $3,2 miljoen via hun Shopify Plus-winkel. Ze hadden 47 SKU's, een abonnementsmodel via Recharge, en gaven ongeveer $85.000 per maand uit aan Meta- en Google Ads.

Het probleem was niet hun product of hun marketingteam. Het probleem was hun website.

Dit zagen hun metreken eruit toen ze contact met ons opnamen:

Metriek Waarde (maart 2024) Status
Largest Contentful Paint (LCP) 8,2s 🔴 Slecht
First Input Delay (FID) 340ms 🔴 Slecht
Cumulative Layout Shift (CLS) 0,42 🔴 Slecht
Interaction to Next Paint (INP) 510ms 🔴 Slecht
Mobile PageSpeed Score 18/100 🔴
Desktop PageSpeed Score 42/100 🟡
Bounce Rate (Mobile) 71%
Conversion Rate 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 had een theme met 2,4MB ongeoptimaliseerde JavaScript, 14 renderblokkerend derde-partij scripts (Klaviyo, Yotpo, een loyaliteitsapp, twee verschillende popup-tools, en een handvol analyticscripts), en hero-afbeeldingen die 3MB PNG's waren zonder responsieve schaling.

Hun Shopify-theme was een zwaar aangepaste versie van een populair premium-theme, gedurende drie jaar aangepast door minstens vier verschillende freelancers. De Liquid-templatecode was een chaotische verzameling voorwaardelijke logica die niemand volledig begreep.

Maar hier is wat echt mijn aandacht trok: hun marketingteam toonde ons dat hun Meta Ads-kwaliteitsscores maanden achtereen waren gedaald. Meta's algoritme bestraft landingspagina's die langzaam laden. Google Shopping was hetzelfde verhaal — hun ads kregen minder indrukken tegen hogere CPC's omdat de landingspagina-ervaringsscore inzakte.

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 geprobeerd hun bestaande Shopify-theme te optimaliseren — sommige apps verwijderd, afbeeldingen gecomprimeerd, overgegaan naar een iets lichter theme. Het hielp, maar nauwelijks. LCP ging van 8,2s naar ongeveer 6,8s. Nog steeds diep rood.

Het fundamentele probleem is iets wat we regelmatig zien met 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 ~200KB), en je bent afhankelijk van wat het theme en apps doen.

Headless gaan betekende het decoupling van de frontend volledig van Shopify's renderinglaag. Shopify zou nog steeds de commerce-backend afhandelen — producten, inventaris, checkout, betalingen — maar we zouden de hele klantenervaring helemaal opnieuw bouwen.

De timing maakte sense om drie redenen:

  1. Shopify's Storefront API was aanzienlijk volwassener geworden. Begin 2024 dekte de Storefront API vrijwel alles af wat je nodig had voor een volledige winkelervaring, inclusief winkelmand, klantenaccounts en metaveld-toegang.

  2. Shopify Checkout Extensibility was nu beschikbaar op Plus. Dit betekende dat we checkout niet hoefden opnieuw te bouwen (wat, eerlijk gezegd, waar headless vroeger strandde).

  3. De business case was duidelijk. Als het verbeteren van de sitesnelheid hun CPC met slechts 15-20% kon verlagen en tegelijkertijd de omzettingspercentages kon verbeteren, zou het project binnen 3-4 maanden terugbetaald zijn.

De stack kiezen: Next.js, Hydrogen, en de Storefront API

Dit is waar het interessant wordt, omdat we een echt debat over de stack hadden.

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 gedeployed op Oxygen (Shopify's hostingplatform).

Maar we kozen uiteindelijk voor Next.js 14 (App Router) met gebruik van 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 hosten) Vercel, Netlify, AWS, zelf hosten Elke statische host + SSR
Shopify-integratiediepte Inheems Via @shopify/hydrogen-react Handmatige API-aanroepen
Teamvertrouwdheid Laag Hoog Gemiddeld
Edge-rendering Oxygen Workers Vercel Edge, Cloudflare Cloudflare, Netlify
Community/ecosysteem Groeiend Massaal Groeit snel

We hebben Astro serieus overwogen. Voor een inhoudsrijke site met minder interactiviteit zou Astro's partial hydration-model ideaal zijn geweest. Maar GlowCo's site had veel client-side interactiviteit nodig — een productquiz, een skincareroutinabuilder, snelle toevoegen aan winkelmandlade, realtimebeheer van abonnementen. React Server Components van Next.js gaven ons de beste balans tussen server-gerendereerde performance en client-side rijkheid.

We kozen er ook voor op Vercel te implementeren in plaats van Oxygen. Vercel's edge-netwerk en ISR-mogelijkheden (Incremental Static Regeneration) gaven ons fijngranulaire cachebeheer dat we op dat moment niet gemakkelijk op Oxygen konden repliceren.

Onze uiteindelijke stack:

  • Next.js 14 (App Router met React Server Components)
  • @shopify/hydrogen-react voor winkelmand, Storefront API-hulpprogramma's
  • Shopify Storefront API (GraphQL) voor productgegevens
  • Shopify Plus Checkout (inheems, niet aangepast gebouwd)
  • Sanity CMS voor redactionele inhoud, landingspagina's en blogposts
  • Vercel voor hosting en edge-functies
  • Recharge via hun headless API voor abonnementen
  • Klaviyo asynchroon geladen via een lichte aangepaste integratie

Als je een vergelijkbare setup evalueert, heeft ons team bij Social Animal diepgaande ervaring met deze exacte architectuur — we hebben onze benadering gedocumenteerd met betrekking tot headless CMS-ontwikkeling en Next.js-ontwikkeling als je het grotere plaatje wilt.

DTC-merk migratie Shopify naar Headless Next.js: 249% ROAS-stijging - architectuur

De migratiearchitectuur

Datalagen

We hielden Shopify als single source of truth voor alle commercegegevens. Producten, varianten, inventaris, prijzen, klanten, bestellingen — alles blijft in Shopify. Dit was niet-onderhandelbaar. Shopify's commerce-engine is beproefd en hun omzettingspercentages van checkout zijn moeilijk te verslaan.

Voor inhoud stelden we Sanity in als een headless CMS. Productpagina's haalden gestructureerde gegevens uit Shopify (prijzen, varianten, inventaris) en redactionele inhoud uit Sanity (ingrediëntverhalen, gebruiksgidsen, cross-sell-verhalen). Deze scheiding is cruciaal — het betekent dat het marketingteam pagina-inhoud kan bijwerken zonder productgegevens aan te raken, en het operationsteam inventaris kan beheren zonder landingspagina's te breken.

// Vereenvoudigde productpaginaopvragen (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,
    // Metavelden samenvoegen voor gestructureerde gegevens
    structuredData: buildProductSchema(shopifyProduct, sanityContent),
  };
}

Renderstrategie

Niet elke pagina heeft dezelfde renderbenadering nodig. We waren hier doelbewust over:

  • Productpagina's: ISR met 60-seconden-revalidatie. Producten veranderen niet elke seconde, maar we hadden inventarisnauwkeurigheid nodig binnen een minuut.
  • Collectiepagina's: ISR met 5-minuten-revalidatie. Deze veranderen nog minder frequent.
  • Homepage en landingspagina's: ISR met revalidatie op aanvraag geactiveerd door Sanity-webhooks. Wanneer het marketingteam publiceert, raakt een webhook onze revalidatie-eindpunt.
  • Winkelmand/accountpagina's: Volledig aan client-zijde met server-gerenderete shells. Deze zijn inherent dynamisch.
  • Blog/redactioneel: Statische generatie bij bouwtime met revalidatie op aanvraag.

De winkelmandobjectimplementatie

Dit is waar @shopify/hydrogen-react zijn waarde bewees. De CartProvider en bijbehorende hooks handelen al het winkelmandstatushoogste beheer af, inclusief optimistische UI-updates. De winkelmand leeft in Shopify's Storefront API (niet lokale staat), wat betekent dat het wordt behouden tussen sessies en apparaten.

// Winkelmandje 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 aangepaste checkout gebouwd. Dit is belangrijk. Shopify's native checkout (vooral op Plus met Checkout Extensibility) heeft jaren A/B-testen en optimalisatie ingebakken. Shop Pay alleen kan het checkout-omzettingspercentage met 50% verhogen voor terugkerende klanten. We pasten het aan met behulp van Checkout UI Extensions voor merkconformiteit en upsell-widgets, maar de kernstroom blijft Shopify-native.

Core Web Vitals repareren: Wat maakte echt het verschil

Dit is het onderdeel dat de meeste casestudies onderschatten. Headless gaan lost je Core Web Vitals niet magisch op. Je kunt absoluut een trage Next.js-site bouwen. Ik heb het gebeuren zien. Wat telt is de specifieke optimalisaties die je doet zodra je controle hebt over de renderingpipeline.

LCP: Van 8,2s naar 1,4s

De single grootste LCP-verbetering kwam uit drie dingen:

  1. Renderblokkeringsresources elimineren. In het oude Shopify-theme laadden 14 derde-partij scripts synchroon. In onze Next.js-build is kritieke CSS inline, JavaScript is gedeeld en wordt alleen waar nodig geladen, en derde-partij scripts laden na het renderen van de hoofd-inhoud met next/script met strategy="lazyOnload".

  2. Afbeeldingsoptimalisatie met next/image. We serveerden responsieve afbeeldingen in WebP/AVIF-formaat, correct geschaald voor elk viewport. Hero-afbeeldingen gingen van 3MB PNG's naar ~80KB AVIF-bestanden. Het LCP-element (meestal de hero-afbeelding) laadt nu als een prioriteit voorgeprefetched bron.

  3. Edge-caching met stale-while-revalidate. ISR op Vercel betekent dat de eerste bezoeker na een revalidatievenster een gecachte pagina onmiddellijk krijgt terwijl de server op de achtergrond opnieuw genereert. 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 width en height attributen (of gebruiken aspect-ratio CSS)
  • Lettertypen voorgeprefetched met font-display: swap en grootte-aangepaste fallbacks
  • Geen dynamisch geïnjecteerde derde-partij widgets boven aan de vouw
  • Skeleton UI-onderdelen voor elke asynchrone inhoud

INP: Van 510ms naar 78ms

Interaction to Next Paint was het moeilijkst op te lossen. Het oude theme had event-handlers aan de hele DOM bevestigd, jQuery-waterfalls, en zware client-side JavaScript die de main thread blokkeerde.

React Server Components waren de sleutel hier. Door de meeste van de pagina op de server te renderen en alleen interactieve componenten (winkelmandje, productkiezers, quizwidget) te hydrateren, reduceerden we dramatisch de hoeveelheid client-side JavaScript. Onze totale client-bundel voor de productpagina daalde van 2,4MB naar 187KB.

De nummers daarna

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 🟢
Totaal JS (Productpagina) 2,4MB 187KB
TTFB (p75) 1,8s 0,12s

Het ROAS-verhaal: Hoe performance winst werd

Dit is waar de theorie in de praktijk wordt getest. Niemand migreert naar headless voor de lol — de business case moet er zijn.

De nieuwe site lanceerde in fasen tussen juli en oktober 2024. Tegen november hadden we schone gegevens om te vergelijken. De resultaten waren, eerlijk gezegd, beter dan we projecteerden.

Directe omzettingsimpact

Bounce rate op mobiel daalde van 71% naar 38%. Dat is alleen al massief — het betekent dat 46% meer bezoekers zelfs het product bleven bekijken. Omzettingspercentage op mobiel steeg van 1,2% naar 2,8%.

Omzettingspercentage op desktop verbeterde van 2,4% naar 3,9%.

Totaal geblend omzettingspercentage: 1,2% → 3,1%

Adplatformimpact

Dit is het onderdeel dat zelfs ons verraste. Binnen 6 weken nadat alle Core Web Vitals groen waren:

  • Google Ads CPC daalde 22% — Google's landingspagina-ervaringsscore verbeterde, wat direct de cost-per-click verlaagde
  • Meta Ads CPM daalde 18% — Meta's algoritme begon hun advertenties meer te tonen (beter landingspagina = hogere relevantiepunten = lagere kosten)
  • Google Shopping indrukshare steeg 34% — Betere pagina-ervaring betekende dat Google meer bereid was hun productaanbiedingen te tonen

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%
Geblend 1,95x 6,8x +249%

De 249% geblende ROAS-stijging kwam uit twee samengestelde factoren: lagere cost-per-click EN hoger omzettingspercentage. Wanneer je kliks minder kosten en elke klik een hoger percentage omzet, compoundeert de wiskunde prachtig.

Organisch verkeer

Ik zou het niet af moeten maken zonder de SEO-impact te vermelden. Binnen 4 maanden nadat alle Core Web Vitals groen waren:

  • Organisch verkeer steeg 67%
  • Gemiddelde positie voor doelsleutelwoorden verbeterde met 4,2 posities
  • Organische opbrengsten stegen 89%

Google is duidelijk geweest dat pagina-ervaring een rankingfactor is. Dit was real-world bewijs.

Tijdlijn, budget en werkelijke kosten

Ik geloof in transparantie over wat projecten als deze werkelijk kosten. Hier is de werkelijke uitsplitsing:

Tijdlijn: 7 maanden van kickoff tot volledige lancering (met een gefaseerde rollout vanaf maand 5)

Team: 2 senior frontend-ontwikkelaars, 1 Shopify backend-specialist, 1 ontwerper, 1 projectmanager (deeltijd)

Totale projectkosten: ~$145.000

Maandelijkse hosting/infrastructuur: ~$350/maand (Vercel Pro + Sanity Growth-plan)

Doorlopende Shopify Plus: $2.300/maand (onveranderd — ze waren al op Plus)

Terugverdientijd: Het project betaalde zichzelf binnen 2,8 maanden terug op basis van verhoogde opbrengsten van verbeterde ROAS en omzettingspercentages.

Is dit soort investering geschikt voor elk merk? Nee. Als je minder dan $1 miljoen per jaar doet, werkt de wiskunde waarschijnlijk nog niet. Maar voor DTC-merken die meer dan $50.000 maandelijks aan advertenties besteden met slechte Core Web Vitals, is de ROI bijna altijd aanwezig. We helpen graag met specifieke details — neem contact met ons op of controleer onze prijsmodellen voor headless commerce-projecten.

Lessen geleerd en wat we anders zouden doen

Wat werkte

  • Shopify checkout native houden was 100% de juiste oproep. Geen regressie in checkout-omzetting.
  • ISR met revalidatie op aanvraag gaf ons het beste van twee werelden: statische performance met dynamische inhoud.
  • Gefaseerde rollout (eerst blog/redactionele pagina's lanceren, dan collecties, dan PDP's, dan homepage) liet ons performance in productie valideren voordat we high-traffic pagina's migreerden.

Wat we anders zouden doen

  • De Recharge headless-migratie eerder starten. Hun headless API had enkele onverwachte onverwachtechten, en het kostte 3 weken van onze tijdlijn. Als je Recharge gebruikt, budget extra tijd.
  • Testinfrastructuur van dag één opzetten. We voegden het in maand 2 toe en verloren wat vroege vergelijkingsgegevens.
  • Vercel's Edge Config gebruiken voor feature flags in plaats van de omgevingsvariabele-benadering waar we mee begonnen. Zou de gefaseerde rollout schoner hebben gemaakt.

Een eerlijke kanttekening

De headless-benadering voegt operationele complexiteit toe. GlowCo beheert nu twee systemen in plaats van één. Hun marketingteam kan niet zomaar een Shopify-app installeren en deze op de winkel zichtbaar maken — elke nieuwe derde-partij integratie vereist ontwikkelingwerk. Voor GlowCo, op hun schaal en advertentiebudget, overweegt de prestatieverbetering deze friction verre. Maar het is een echte afweging die je van het begin af aan 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 u 4-8 maanden afhankelijk van complexiteit. GlowCo's project duurde 7 maanden vanwege aangepaste functies zoals hun skincare-quiz en Recharge-abonnementsintegratie. Eenvoudiger winkels met minder aangepaste functies kunnen in 4-5 maanden worden gedaan.

Breekt headless gaan Shopify-apps? Ja, de meeste theme-afhankelijke Shopify-apps werken niet in een headless setup. Apps die UI in je winkel injecteren (review-widgets, loyaliteitspoppen, upsell-tools) moeten worden vervangen door API-gebaseerde alternatieven of aangepaste 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 je team en eisen. Hydrogen (gebouwd op Remix) biedt out-of-the-box nauwere Shopify-integratie 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 vanwege de bestaande expertise van het team en Vercel's edge-caching mogelijkheden. Beide zijn uitstekende keuzes.

Hoeveel kost een headless Shopify-migratie in 2025? Realistische budgetten variëren van $80.000 tot $250.000+ afhankelijk van winkelcomplexiteit, aangepaste functies en agencyuurtarieven. GlowCo's project was $145.000. Wees voorzichtig met bureaus die onder $50K voor een volledige headless build citeren — je krijgt waarschijnlijk een sjabloon met beperkte aanpassingen. Maandelijkse infrastructuurkosten variëren doorgaans van $200-600 voor hosting en CMS.

Beïnvloeden Core Web Vitals werkelijk Google Ads-kosten? Ja. Google Ads gebruikt een "Landing Page Experience"-score als onderdeel van zijn Quality Score-berekening. Betere pagina-snelheid en Core Web Vitals-scores leiden tot hogere Quality Scores, wat direct uw cost-per-click verlaagt. GlowCo zag een 22% CPC-verlaging nadat hun Core Web Vitals verbeterden. Meta gebruikt vergelijkbare signalen voor advertentierelevantiebepaling.

Kun je Shopify checkout houden bij headless gaan? Absoluut, en we raden het sterk aan. Shopify's checkout is zeer geoptimaliseerd en bevat functies zoals Shop Pay (die checkout-omzetting met 50%+ kan verhogen voor terugkerende shoppers). Met Shopify Plus kunt u Checkout Extensibility gebruiken om de uitstraling aan te passen en upsells toe te voegen terwijl u de kerncheckout-stroom intact houdt.

Wat is het verschil tussen headless Shopify en Shopify Hydrogen? Headless Shopify is een breed concept — elke aangepaste frontend die Shopify's Storefront API gebruikt. Hydrogen is Shopify's specifieke framework voor het bouwen van headless-winkels, gebouwd op Remix en gedeployed 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? Meestal niet. Als je minder dan $1 miljoen jaarlijkse opbrengsten hebt en minder dan $20.000 per maand aan advertenties uitgeeft, zal de kosten van een headless-migratie waarschijnlijk geen zinvolle ROI opleveren. Focus eerst op het optimaliseren van je bestaande theme — verwijder ongebruikte apps, comprimeer afbeeldingen, schakel over naar een performantie-gericht theme zoals Dawn. Overweeg headless wanneer je advertentiebudget hoog genoeg is dat zelfs kleine efficiëntie-verbeteringen in aanzienlijke dollarbedragen worden omgezet.