Skip to content
Go To Agency
/Webontwikkeling
Webontwikkeling

Core Web Vitals 2026 voor Nederlandse e-commerce: INP, LCP en Cumulative Layout Shift in de praktijk

Praktijkgids Core Web Vitals 2026 voor Nederlandse webshops: INP fixen, LCP optimaliseren met Next.js Image, CLS voorkomen, edge caching Amsterdam-node en monitoring tools.

Door Robin Monteiro27 mei 202610 min · 2 179 mots
Core Web VitalsPerformanceNext.jsE-commerceNederland
Artikel delen
Core Web Vitals 2026 voor Nederlandse e-commerce: INP, LCP en Cumulative Layout Shift in de praktijk

71% van het Nederlandse e-commerce verkeer komt via mobiel, en sinds Google INP (Interaction to Next Paint) in maart 2024 definitief tot Core Web Vital heeft gepromoveerd, faalt bijna de helft van de Nederlandse webshops op dit ene criterium. De Chrome User Experience Report data over Q1 2026 laat zien dat 47% van de Nederlandse e-commerce origins een p75 INP boven 200 ms heeft — de drempel waarboven Google "needs improvement" rapporteert. Voor webshops die concurreren met Coolblue, Bol en Wehkamp is dit geen academisch detail meer: het is direct verbonden met conversie, ranking en CAC.

Deze gids is geschreven voor Nederlandse developers en e-commerce managers die in 2026 hun stack — meestal Next.js, Shopify Hydrogen of een custom React frontend — willen tunen tot waar Google groene metrics teruggeeft. Geen marketingbeloftes, wel concrete code, real-world cijfers van Mollie checkout pages en Coolblue product detail pages, en de edge caching strategie die voor Amsterdam-traffic het verschil maakt.

1. INP meten en repareren: de stille killer van 2026

Interaction to Next Paint vervangt sinds 12 maart 2024 First Input Delay als Core Web Vital. Het verschil is fundamenteel: FID mat alleen de eerste interactie en alleen de input delay. INP meet alle interacties gedurende de hele sessie en neemt het hele rendering-pad mee: input delay + processing time + presentation delay. Voor een Nederlandse webshop met gemiddeld 14 pageviews per sessie (Thuiswinkel Markt Monitor Q4 2025) betekent dit dat één traag scriptje in je filter-component je hele score sloopt.

Drempelwaarden 2026: goed onder 200 ms, slecht boven 500 ms. De CrUX data over Nederlandse e-commerce origins (>10k pageviews per maand) laat zien dat de p75 mediaan op 248 ms ligt — bijna 50 ms boven de goede drempel. Bij Coolblue ligt p75 INP op 142 ms desktop / 187 ms mobiel (eigen RUM data juli 2025), bij vergelijkbare middelgrote webshops zonder dedicated performance team typisch tussen 280-410 ms.

De drie hoofdoorzaken die we systematisch tegenkomen bij Nederlandse opdrachtgevers:

  • Lange tasks in de main thread — meestal third-party scripts (Hotjar, Klaviyo onsite, GTM met te veel tags) of synchroon JavaScript dat blokkeert
  • Niet-geyielde event handlers — een filter-click die 180 ms aan logica draait voordat de browser kan repainten
  • React 18/19 batched updates die te zwaar zijn — vooral bij grote product lists zonder virtualisatie

Concrete fix met React 19 en de scheduler.yield() API:

// Voor: event handler blokkeert main thread
function handleFilterChange(category) {
  applyExpensiveFilter(category); // 180ms
  updateProductGrid();             // 90ms
  trackAnalyticsEvent(category);  // 40ms
}

// Na: yield naar de browser tussen taken
async function handleFilterChange(category) {
  applyExpensiveFilter(category);
  await scheduler.yield();
  updateProductGrid();
  await scheduler.yield();
  trackAnalyticsEvent(category);
}

Met React Server Components in Next.js 15 verschuift een groot deel van het werk naar de server. Filter-state berekenen kan via searchParams en een RSC die de productlijst rendert — de client krijgt alleen het delta-resultaat. In een recente migratie van een Nederlandse fashion-webshop daalde p75 INP van 387 ms naar 156 ms door alleen al de filter-logic naar een Server Action te verplaatsen.

Voor het meten: de PerformanceObserver API met event entry type, of in productie via web-vitals library v4.x. Belangrijk: meet altijd p75, niet gemiddelde, en filter bots eruit met IP-allowlist of een lightweight bot-detection.

2. LCP optimaliseren met Next.js Image en AVIF/WebP

Largest Contentful Paint blijft de meest zichtbare metric: hij meet wanneer het grootste content-element (meestal de hero image of het eerste productvisual) zichtbaar wordt. Drempel goed: onder 2,5 seconden. CrUX 2026 cijfers voor Nederland: 62% van e-commerce origins haalt p75 LCP onder 2,5s op desktop, slechts 41% op mobiel — daar zit het probleem.

De Nederlandse 4G/5G dekking is uitstekend (KPN en VodafoneZiggo halen samen 99,1% bevolkingsdekking 5G eind 2025), maar het zwakke punt blijft de payload van de hero image. Een onoptimaliseerde JPEG van 380 KB op een Coolblue product detail page haalt geen LCP onder de 2,5s als de gebruiker in een NS-trein zit met variabele signalsterkte.

Next.js 15 <Image> met de Vercel image optimizer doet automatisch AVIF eerst, dan WebP als fallback. AVIF geeft typisch 35-50% kleinere bestanden dan WebP bij vergelijkbare kwaliteit. Voor de hero LCP image:

import Image from "next/image";

export function HeroProduct({ product }) {
  return (
    <Image
      src={product.heroUrl}
      alt={product.alt}
      width={1280}
      height={720}
      priority
      fetchPriority="high"
      sizes="(max-width: 768px) 100vw, 80vw"
      quality={82}
    />
  );
}

Drie details die in Nederlandse projecten vaak verkeerd gaan:

  • Geen priority op LCP element — Next.js geeft anders een lazy-load hint, kost 400-800 ms LCP
  • sizes attribuut ontbreekt of fout — browser kiest dan een te grote variant, verspilt bandwidth en LCP-tijd
  • Custom loader die geen modern format teruggeeft — bij Shopify Hydrogen vergeet men vaak om format=auto in de loader-URL mee te geven

Voor critical CSS: in Next.js 15 wordt de RSC payload streaming geserveerd, maar fonts blijven een LCP-killer. Gebruik next/font/local met display: "swap" en preload alleen de subset die je echt nodig hebt (latin-ext voor Nederlandse karakters zoals diakritische tekens in productnamen).

Voorbeeld optimalisatie: in een case voor een Nederlandse meubelwebshop met een 1920x1080 hero brachten we LCP terug van 3,8s naar 1,7s mobiel door (a) AVIF te forceren via Next Image, (b) fetchPriority="high", (c) Cloudflare cache rule die varianten 30 dagen cachet, (d) preconnect naar Mollie checkout origin zodat de volgende navigatie sneller voelt. Concrete uplift: +12% conversie op product detail naar checkout.

3. CLS voorkomen: font loading en dynamische content

Cumulative Layout Shift wordt onderschat door Nederlandse teams omdat de score (drempel 0.1) makkelijk lijkt te halen. Tot je dynamische content gaat injecteren: cookie banners (verplicht onder Telecommunicatiewet 11.7a, hoge bezoekersfrequentie in NL), trustpilot widgets, "Nog X op voorraad" badges die laat laden.

De vijf bronnen van CLS die we het vaakst zien:

  • Web fonts zonder size-adjust — fallback font heeft andere x-height, layout shiftet bij font swap
  • Images zonder expliciete width/height — browser kent geen aspect ratio, reserveert geen ruimte
  • Cookie banner die top-down injecteert in plaats van overlay
  • Lazy-loaded reviews/voorraadbadges die geen skeleton hebben
  • Late-injectie van advertenties (minder relevant voor pure webshops maar wel voor content-driven sites zoals BCC of MediaMarkt blog secties)

De moderne fix voor font CLS gebruikt @font-face descriptors die in alle Chromium-based browsers (90+ in Nederland eind 2025, dus dekking is goed) ondersteund worden:

@font-face {
  font-family: "Inter";
  src: url("/fonts/inter.woff2") format("woff2");
  font-display: swap;
  size-adjust: 107%;
  ascent-override: 90%;
  descent-override: 22%;
  line-gap-override: 0%;
}

Met next/font in Next.js 15 worden deze descriptors automatisch berekend en geïnjecteerd — een van de redenen waarom we Next/font boven manual @font-face aanraden, ook als je Tailwind v4 gebruikt.

Voor dynamische content: reserveer ruimte met min-height of CSS Grid grid-template-rows: auto 1fr auto. Concreet voor een "Nog X op voorraad" badge die via een client-side fetch komt:

.stock-badge {
  min-height: 24px; /* reserve space pre-fetch */
  display: inline-flex;
  align-items: center;
}

Voor cookie banners: gebruik position: fixed; bottom: 0 in plaats van een DOM-injectie boven de content. Klaro!, Cookiebot en Usercentrics ondersteunen dit allemaal, maar de default config is vaak top-banner. Bij een Nederlandse SaaS opdrachtgever bracht alleen al deze switch CLS terug van 0.18 naar 0.04.

4. Edge caching strategie Nederland: de Amsterdam-node uitnutten

Nederland heeft een uitzonderlijk dichte CDN-infrastructuur. Cloudflare heeft een Tier 1 PoP in AMS-IX (Amsterdam Internet Exchange), Vercel route't via Frankfurt + Amsterdam, Fastly heeft een edge-locatie in Amsterdam Schiphol Rijk. Voor Nederlandse traffic betekent dit gemiddeld 8-14 ms RTT vanaf de edge tot eindgebruiker — onder Frans of Duits gemiddelde.

Drie cache layers die je actief moet inrichten voor een Nederlandse webshop:

  1. Static asset caching — afbeeldingen, fonts, CSS/JS bundles. Immutable headers met content hash, Cache-Control: public, max-age=31536000, immutable. Next.js doet dit automatisch voor /_next/static/*
  2. HTML edge caching — voor product detail pages die niet user-specific zijn. Next.js 15 ISR met revalidate of On-Demand Revalidation via Server Actions
  3. API response caching — voor product catalog endpoints, met cache-tags voor gerichte invalidatie bij stock updates

Concrete Cloudflare cache rule voor een Nederlandse webshop (toegevoegd in Cloudflare Dashboard > Caching > Cache Rules):

// Cache rule: product detail pages
// When: URI Path matches "/producten/*"
// And: Request Method equals "GET"
// Then:
//   - Cache eligibility: Eligible for cache
//   - Edge TTL: 1 hour
//   - Browser TTL: 5 minutes
//   - Cache Key: include "Accept" header (voor AVIF/WebP varianten)

Met Vercel + Next.js 15 gebruik je unstable_cache en revalidateTag:

import { unstable_cache, revalidateTag } from "next/cache";

const getProduct = unstable_cache(
  async (slug) => await db.product.findBySlug(slug),
  ["product"],
  { revalidate: 3600, tags: ["product"] }
);

// In je admin Server Action bij stock-update:
export async function updateStock(productId, qty) {
  await db.product.update({ id: productId, stock: qty });
  revalidateTag("product");
}

Voor checkout en account pages: nooit edge cachen, altijd dynamic rendering met export const dynamic = "force-dynamic". Mollie checkout pages (waar Nederlandse webshops bijna allemaal op draaien — Mollie heeft ~38% marktaandeel in NL e-commerce payments per ACM data 2025) moeten een schone session-context krijgen.

Voor uitgebreidere implementatie van performance-architectuur op een Next.js webshop, zie onze aanpak op site development.

5. Monitoring tools: CrUX, PageSpeed en Real User Monitoring

Lab data (PageSpeed Insights, Lighthouse) en field data (CrUX, RUM) vertellen verschillende verhalen. Google rankt op field data. Drie tools die je in 2026 wilt combineren:

Chrome User Experience Report (CrUX) — gratis, public dataset met p75 metrics per origin. Toegankelijk via BigQuery (chrome-ux-report public dataset), de CrUX API of de CrUX Dashboard in Looker Studio. Voor een Nederlandse webshop draait je query op de NL country filter en de juiste form factor (PHONE vs DESKTOP). Limitatie: alleen origins met genoeg traffic, anonimisatie, 28-daags rolling window.

PageSpeed Insights API — lab + field in één endpoint. Ideal voor je CI/CD pipeline:

// In GitHub Actions of Vercel build step
const response = await fetch(
  `https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=${url}&strategy=mobile&category=performance`
);
const data = await response.json();
const lcp = data.lighthouseResult.audits["largest-contentful-paint"].numericValue;

if (lcp > 2500) {
  process.exit(1); // fail build
}

Real User Monitoring — voor diepgaande analyse. Opties: Vercel Speed Insights (geïntegreerd, $10/maand starter), SpeedCurve RUM (uitgebreid, vanaf $114/maand), of een eigen oplossing met web-vitals library + een lightweight beacon naar je eigen analytics endpoint.

De eigen-route in Next.js 15:

// app/components/WebVitalsReporter.tsx
"use client";
import { useReportWebVitals } from "next/web-vitals";

export function WebVitalsReporter() {
  useReportWebVitals((metric) => {
    const body = JSON.stringify({
      name: metric.name,
      value: metric.value,
      id: metric.id,
      url: window.location.pathname,
    });
    navigator.sendBeacon("/api/vitals", body);
  });
  return null;
}

Belangrijk voor Nederlandse context: filter je RUM data op locale (nl-NL) en connection type (4g/5g/wifi). Een p75 vanuit 4G traffic in Limburg ziet er anders uit dan p75 vanuit glasvezel in Amsterdam Zuidas.

Wat we monitoren in een typische setup voor een Nederlandse e-commerce klant: LCP/INP/CLS p75 per page-template (homepage, PLP, PDP, cart, checkout), gesegmenteerd per device type en per geographic region (Randstad vs noord/oost), weekly alert als p75 INP een sliding 7-day baseline met >15% overschrijdt.

6. Case study Nederland: middelgrote modeshop, score van 38 naar 91

Anoniem voorbeeld van een Nederlandse modeshop met 280k maandelijkse sessies, gehoste op Shopify Plus met een custom Hydrogen frontend. State eind 2025: Lighthouse mobile score 38, CrUX p75 LCP 4,1s, INP 412ms, CLS 0.21. Bounce rate op product detail pages 67%, conversie 1,2%.

Aanpak in 8 weken:

  • Week 1-2: audit — RUM uitrol, segmentatie per template, identificatie top-10 slowest pages
  • Week 3-4: LCP — hero images naar AVIF, priority attribute, preconnect Mollie + analytics origins, Cloudflare cache rules voor /products/*
  • Week 5-6: INP — filter-component met React Server Components herschreven, GTM herstructured (van 47 naar 12 tags), Klaviyo onsite naar partytown moved (web worker)
  • Week 7: CLSnext/font met size-adjust descriptors, cookie banner naar bottom-overlay, voorraad badges met min-height reservation
  • Week 8: monitoring — Vercel Speed Insights live, weekly dashboard naar marketing team, alerting via Slack op p75 regressies

Resultaat na 8 weken in CrUX (28-day rolling): p75 LCP 1,8s, INP 158ms, CLS 0.04. Lighthouse mobile 91. Business impact: bounce rate -19%, conversie van 1,2% naar 1,8% (+50%), gemiddelde sessieduur +27%. Customer Acquisition Cost effectief gedaald met 14% omdat dezelfde paid-traffic budget meer omzet genereerde.

Belangrijke caveats: dit was een team met een dedicated performance budget van 4 weken developer-tijd. Voor kleinere webshops zonder eigen tech-team is de winst even significant maar de eerste stappen (AVIF + Next.js Image + cache rules) leveren al 60-70% van de uplift op met 20% van het werk.

Voor een audit van je eigen Core Web Vitals en een concreet roadmap-voorstel, neem contact op via de offerte-aanvraag of leer meer over onze aanpak.

Conclusie: Core Web Vitals als concurrentievoordeel in 2026

Voor Nederlandse webshops in 2026 is INP de Core Web Vital met de hoogste fix-prioriteit, gevolgd door LCP optimalisatie via Next.js Image en AVIF. CLS is technisch makkelijk op te lossen maar vereist discipline rond fonts en dynamische content. De Amsterdam edge-infrastructuur geeft NL-traffic een natuurlijk voordeel — als je de cache rules correct configureert.

Het gat tussen de top-performers (Coolblue, Bol, Wehkamp p75 LCP onder 2s) en de middenmoot (3-4s) is in 2026 niet langer een technische kwestie alleen: het is een conversie- en CAC-verschil dat direct doorwerkt in je P&L. Het goede nieuws: met React Server Components, Next.js 15 native optimalisaties en moderne CDN-strategieën is de tooling volwassen genoeg om de gap binnen 6-8 weken te dichten.

RM

Over de auteur

Robin Monteiro

Co-fondateur de Go To Agency

Développeur full-stack et co-fondateur de Go To Agency, Robin conçoit des solutions web performantes avec Next.js, React et les dernières technologies.

Maak kennis met het team

Hulp nodig bij uw project?

Laten we uw project gratis bespreken. Audit, advies en persoonlijke aanbevelingen in 15 minuten.

Artikel delen

Questions fréquentes

Wat is een goede INP score voor een Nederlandse webshop in 2026?+

Onder 200ms p75 is goed volgens Google. De mediaan van Nederlandse e-commerce origins ligt op 248ms p75 volgens CrUX Q1 2026, dus alles onder 200ms geeft een meetbaar concurrentievoordeel. Top-performers zoals Coolblue zitten op 142ms desktop en 187ms mobiel.

Moet ik AVIF of WebP gebruiken voor productafbeeldingen?+

Beide, met AVIF eerst en WebP als fallback. Next.js Image en Vercel image optimizer doen dit automatisch via content negotiation. AVIF geeft typisch 35-50% kleinere bestanden dan WebP bij vergelijkbare kwaliteit, browser support is in 2026 boven 95% in Nederland.

Hoe meet ik Core Web Vitals voor alleen Nederlands verkeer?+

Gebruik CrUX BigQuery dataset met country filter NL, of zet Real User Monitoring op met locale/geo segmentatie. Vercel Speed Insights en SpeedCurve ondersteunen dit native. Filter op zowel mobile als desktop en segmenteer per pagina-template voor actionable inzichten.

Welke impact heeft Core Web Vitals op SEO in Nederland?+

Core Web Vitals zijn een directe ranking signal sinds 2021, INP sinds maart 2024. Voor Nederlandse zoekopdrachten met hoge concurrentie (e-commerce keywords zoals 'kleding kopen', 'elektronica online') zien we dat sites met groene CWV consistent 1-3 posities hoger ranken dan vergelijkbare sites met oranje/rode metrics, bij gelijke content quality.

Gerelateerde artikelen

Gratis offerte
Core Web Vitals 2026 Nederlandse E-commerce — INP LCP CLS | Go To Agency