Core Web Vitals dla sklepu B2B - LCP, INP, CLS 2026
Google używa Core Web Vitals jako jednego z czynników rankingowych. Klient ich nie używa świadomie, ale czuje. Wolny sklep = wyższe bounce rate, niższa konwersja, gorsza retencja. W B2B, gdzie klient wraca cyklicznie do tego samego sklepu, kumulacja drobnych irytacji boli długoterminowo. Core Web Vitals to dobra proksy dla „jak naprawdę szybko jest".
Spis treści (8)
W skrócie
- 1. LCP (Largest Contentful Paint) - czas do wyrenderowania największego elementu widocznego. Cel: < 2.5s.
- 2. INP (Interaction to Next Paint) - czas reakcji na interakcję. Cel: < 200ms. Zastąpił FID w 2024.
- 3. CLS (Cumulative Layout Shift) - suma nieoczekiwanych przesunięć layoutu. Cel: < 0.1.
- 4. Pomiar: Lighthouse (lab) + Chrome User Experience Report (CrUX, field) + Real User Monitoring.
- 5. Wpływ na ranking: umiarkowany - content i intent ważniejsze, ale CWV waży istotnie przy konkurencji o ten sam keyword.
LCP - czas do wyrenderowania głównego elementu
LCP mierzy, kiedy największy element widoczny na pierwszym viewporcie jest wyrenderowany.
Co liczy się jako LCP element:
- Obrazy (
<img>) - Wideo (
<video>poster image) - Background images CSS (z pewnymi ograniczeniami)
- Bloki tekstu (jeśli są największym elementem)
Typowy LCP element w sklepie B2B:
- Strona główna: główny baner / hero image
- PLP: pierwszy thumbnail produktu (jeśli powyżej fold-a) lub baner kategorii
- PDP: główne zdjęcie produktu
- Checkout: nagłówek lub tabela koszyka
Typowe problemy LCP:
- Niezoptymalizowany obraz. JPG 800KB na hero. Pobiera się 2-3s na średnim internecie.
- Brak
fetchpriority="high". Browser nie wie, że ten obraz jest krytyczny. - Lazy loading na LCP element. Klasyczny błąd:
loading="lazy"na pierwszej fotografii. Browser czeka aż user scrolluje. - Render-blocking CSS. CSS pobierane synchronicznie blokuje render LCP.
- Webfonty wymagane do tekstu LCP. Tekst LCP nie wyrenderuje się przed pobraniem fonta.
- Server-side latency. Backend trwa 2s przed wysłaniem HTML.
Optymalizacja LCP:
<!-- Główne zdjęcie produktu - LCP element -->
<img
src="produkt.webp"
alt="..."
width="600"
height="600"
fetchpriority="high"
decoding="sync"
/>
<!-- BEZ loading="lazy"! -->
<!-- Preload obrazu w head dla jeszcze szybszego LCP -->
<link rel="preload" as="image" href="produkt.webp" fetchpriority="high">
Plus: WebP/AVIF format, CDN, image optimization on the fly. LCP strony produktu.
INP - responsywność na interakcje
INP (Interaction to Next Paint) zastąpiło FID (First Input Delay) w 2024 roku. INP mierzy czas reakcji na każdą interakcję (nie tylko pierwszą).
Co liczy się jako interakcja:
- Klik
- Tap (mobile)
- Klawiatura
- Sklik checkbox/radio
INP = najgorszy czas reakcji na wszystkie interakcje w sesji (zaokrąglony przez Google do p98 dla pojedynczej sesji, potem p75 dla wszystkich sesji).
Typowe problemy INP w B2B:
- Kliknięcie „dodaj do koszyka" wykonuje wszystko synchronicznie. Walidacja, wywołanie cache, update UI, wszystko w main thread.
- JavaScript bundle za duży. 1.2 MB JS musi się parse'ować - main thread blokowany.
- Third-party scripts długie taski. Analytics, chat, tracking - co kilka sekund 50-200ms blocking task.
- Re-renders React'a/Vue'a bez memoization. Każde dodanie do koszyka renderuje całe drzewo.
Optymalizacja INP:
- Code splitting - JS ładowany on-demand (route-based, component-based)
- Defer/async dla third-party - analytics, chat po LCP
- Debounce/throttle dla interakcji wysokiej częstotliwości (scroll, resize)
- requestIdleCallback dla zadań niskoprio
- Web Workers dla heavy computations (kalkulacje cen po stronie klienta, walidacje)
CLS - stabilność layoutu
CLS mierzy nieoczekiwane przesunięcia layoutu. Najgorszy scenariusz: klient klika „kup", w międzyczasie ładuje się baner, klient klika baner zamiast „kup".
Typowe problemy CLS w sklepie:
- Obrazy bez
width/heightlubaspect-ratio. Browser nie zna rozmiaru, ładuje, layout się przesuwa. - Webfonty zmieniające font fallback → custom. Tekst rośnie/skraca się po pobraniu fonta. FOUT/FOIT.
- Dynamiczne wstawianie banerów / popupów cookie. Bez zarezerwowania miejsca.
- Lazy loading bez placeholderów. Obraz wjeżdża → layout się przesuwa.
- Liczniki promocji (
Czas do końca:) ładowane po render.
Optymalizacja CLS:
<!-- Zawsze width/height na obrazach -->
<img src="..." width="400" height="300" alt="..." />
<!-- Lub aspect-ratio w CSS -->
<style>
.product-image {
aspect-ratio: 1 / 1;
width: 100%;
height: auto;
}
</style>
<!-- Font swap z size-adjust (CSS Font Loading API) -->
<style>
@font-face {
font-family: 'Inter';
src: url(...) format('woff2');
font-display: swap;
size-adjust: 105%; /* dopasowanie do fallback */
}
</style>
<!-- Placeholder dla lazy-loaded content -->
<div class="placeholder" style="min-height: 400px;">
<!-- Tu wjedzie zawartość -->
</div>
Lab data vs. field data - co Google realnie używa
Lab data (Lighthouse, PageSpeed Insights):
- Test wykonywany w kontrolowanym środowisku
- Mobile lub desktop
- Throttling sieci (Slow 4G zazwyczaj)
- Powtarzalne, ale syntetyczne
Field data (Chrome User Experience Report - CrUX):
- Realni użytkownicy Chrome
- Ich device, sieć, lokalizacja
- 28-dniowe rolling window
- To Google używa do rankingu
Konsekwencja: możesz mieć Lighthouse 95/100, ale CrUX w czerwonym. Powody:
- Twoi klienci na starszych urządzeniach
- Twój region ma wolniejszą sieć
- Twoi klienci wykonują akcje pogarszające INP (długie sesje z wieloma interakcjami)
Sprawdzaj field data:
- Google Search Console → Core Web Vitals report
- PageSpeed Insights pokazuje pole CrUX dla URL
https://crux.run/dashboard?url={URL}- community dashboard
Wpływ na SEO
Google używa Core Web Vitals jako rankingowego sygnału od 2021. Co to znaczy:
Tie-breaker. Przy dwóch stronach o podobnej relevance i autorytecie - szybsza wygrywa.
Domain-level signal. Google patrzy na CrUX dla całej domeny, nie tylko konkretnej strony. Wolne strony w innych częściach domeny szkodzą wszystkim.
Mobile-first. Mobile CWV ważą bardziej niż desktop (mobile-first indexing).
Opóźnienie: zmiany CWV widoczne w rankingu po 2-4 miesiącach (CrUX rolling 28-day, plus Google update queue).
W praktyce: dla większości polskich keywords B2B impact jest umiarkowany. Konkurencja często też ma słabe CWV. Ale dla konkurencyjnych keywordów (np. „integracja Magento Comarch") - solidne CWV daje przewagę.
Najczęstsze błędy w Core Web Vitals w polskich sklepach B2B
1. Tylko Lighthouse. Wynik 90/100, klient skarży się że wolny. Bo CrUX (field) w czerwonym.
2. Optymalizacja tylko homepage. Homepage ma świetne CWV, ale 95% ruchu to PLP/PDP, które są wolne.
3. Brak monitoringu po deploy. Każdy nowy moduł, każdy A/B test może pogorszyć CWV. Bez ciągłego monitorowania regresja niezauważona.
4. Optymalizacja dla niezalogowanych. Klient B2B 90% czasu zalogowany. Optymalizacja stron publicznych nie pomaga zalogowanym.
5. Ignorowanie third-party. „Dodaliśmy tylko jeden mały skrypt analytics" → INP wzrasta o 100ms.
6. Cookie consent killer. Implementacje cookie consent często blokują render aż do interakcji userskiej. LCP zabity.
7. Headless source map nie generated. Optymalizacja JS bez source mapów - niemożliwe znalezienie konkretnego problemu.
Mierzenie CWV - narzędzia w praktyce
Lab / synthetic:
- Lighthouse (DevTools): single page, dobry start
- PageSpeed Insights: Lighthouse + CrUX dla URL
- WebPageTest: szczegółowy waterfall, multi-location, comparison
- Lighthouse CI: integracja z CI/CD, performance budget gates
Field / real user:
- Google Search Console: real CWV dla domeny, segmenty by URL pattern
- Cloudflare Browser Insights: jeśli używasz CF
- Sentry Performance: integracja z aplikacją
- Datadog RUM: korporacyjne
- SpeedCurve: kompleksowe, drogie
- Custom: web-vitals.js: 5KB biblioteka Google, wysyła do twojego API
Co konkretnie monitorować:
- LCP / INP / CLS per page type (home, PLP, PDP, checkout)
- Per user segment (zalogowani vs. nie, desktop vs. mobile)
- Per device, per network
- Trend over time
Performance budget - disciplina
Performance budget to limity, które nie powinny być przekraczane bez świadomej decyzji.
Przykładowy budget dla sklepu B2B:
| Metryka | Page type | Budget |
|---|---|---|
| LCP | Homepage | 1.8s |
| LCP | PLP (niezalogowany) | 2.2s |
| LCP | PDP (niezalogowany) | 2.0s |
| LCP | PDP (zalogowany) | 2.5s |
| INP | Wszystkie | 200ms |
| CLS | Wszystkie | 0.05 |
| JS bundle (initial) | Wszystkie | 200KB gzipped |
| CSS bundle (initial) | Wszystkie | 50KB gzipped |
| Total page weight | PDP | 1.5MB |
Egzekwowanie:
- Lighthouse CI w pipeline (failuje deploy jeśli budget przekroczony)
- Performance reviews co miesiąc
- Komunikacja do zespołu: dodanie funkcji X jeśli pogorszy LCP o > 100ms - wymaga zgody
FAQ
Czy CWV są jedynym sygnałem wydajności dla Google? Nie. Time to First Byte (TTFB), Total Blocking Time (TBT), Speed Index - pomocnicze metryki. Ale Core Web Vitals (LCP, INP, CLS) to to, co Google ujawniło jako rankingowe.
Czy mogę mieć dobry LCP a zły CLS? Tak. Strona szybko ładuje główny element (LCP dobre), ale po wczytaniu obrazy bez wymiarów przesuwają layout (CLS złe). To dwie osobne metryki.
Co z INP dla zalogowanych B2B? Tak samo ważne. Klient B2B kupujący 50 produktów wykonuje 100+ interakcji. INP > 200ms = każda interakcja czuje się laggy.
Czy headless rozwiązuje CWV? Może. Source good headless (Next.js + SSR + CDN + edge) - tak. Bad headless (CSR z lazy fetch wszystkiego) - gorzej niż dobry monolit.
Czy Magento OS może mieć CWV w zielonym? Tak, z odpowiednim stackem (Varnish + Elastic + Redis + CDN + Hyvä Theme). Bez tego - trudne.
Co dalej
- LCP konkretnie na PDP: LCP strony produktu
- Lazy loading bez psucia CLS: Lazy loading obrazów
- Audyt wydajności: Audyt wydajności sklepu
- Pillar wydajności: Wydajność e-commerce
O autorze
Jakub Owsianka
Architekt rozwiązania w WiseB2B - silniku platform B2B. Zaczynał po stronie biznesu (własne sklepy), potem deweloper, dziś projektuje wdrożenia dla sklepów z katalogami w dziesiątkach tysięcy SKU. W ostatnich latach wdrożył AI-development w zespole i funkcjonalności oparte o AI bezpośrednio w silniku sklepu.
Masz pytanie do tego artykułu?
Dodatkowy kontekst, problem z własnym wdrożeniem, druga opinia - napisz wprost. Odpowiadam osobiście w 1-2 dni robocze.