Landing page dla Google Ads w Next.js, czyli jak budować strony, które konwertują
Poznaj techniczne kulisy landingów w Next.js. Dowiedz się, jak utrzymać atrybucję kampanii, zintegrować consent i podbić wynik jakości w Google Ads.
Maciej Sala
Founder StriveLab
8 min czytaniaOpublikowano 31 grudnia 2025 (Aktualizacja 17 lipca 2026)
Musisz mieć świadomość, że Quality Score w Google Ads to przede wszystkim narzędzie diagnostyczne, a nie KPI sam w sobie. Google wprost mówi, że wynik od 1 do 10 nie jest bezpośrednim czynnikiem aukcji. W aukcji w czasie rzeczywistym oceniane są jednak te same trzy obszary: oczekiwany CTR, trafność reklamy i landing page experience. Optymalizujesz więc nie po to, by podbić wskaźnik, lecz by realnie podnieść jakość strony i reklamy.
Jako deweloper masz bezpośredni wpływ na sporą część tego układu: szybkość ładowania, wygodę na urządzeniach mobilnych, message match, formularz, third-party scripts oraz to, czy przekierowania nie zgubią gclid ani UTM-ów.
Co Google ocenia w Landing Page Experience?
Google nie publikuje dokładnego algorytmu, ale możemy dowiedzieć się sporo z ogólnych wskazówek, które znajdziemy w oficjalnej dokumentacji:
Użyteczność i trafność, czyli treść strony musi faktycznie odpowiadać na to, czego użytkownik spodziewa się po reklamie i słowie kluczowym.
Łatwość nawigacji. Użytkownik powinien móc łatwo znaleźć to, po co przyszedł, dlatego wszystko musi być poukładane i czytelne.
Zgodność z oczekiwaniami. Reklama obiecuje jedno, a landing page powinien tę obietnicę spełnić, i dotyczy to nagłówka, oferty, ceny, CTA i całej narracji.
Przejrzystość i zaufanie. Strony kontakt, polityka prywatności, podstawowe informacje o firmie, jasne warunki i brak podejrzanych wzorców.
Wygoda na mobile i szybkość, ponieważ na urządzeniach mobilnych doświadczenie powinno być szybkie, czytelne i stabilne. Core Web Vitals nie są osobnym komponentem Quality Score, ale są dobrym sposobem kontroli jakości .
Na sam koniec dochodzi techniczna higiena, więc działająca strona, ten sam kontekst domenowy co reklama, brak błędów 4xx/5xx, sensowna obsługa przekierowań i brak „martwych" wariantów LP.
Architektura landing page w Next.js pod Google Ads
Static Generation jako najlepsza opcja dla landing page
Jeśli landing page nie wymaga personalizacji w czasie rzeczywistym, albo będą zwykle najlepszym wyborem - oferują przewidywalny , łatwiejszy caching i mniej ruchomych części niż pełny .
Dlaczego landing page z kampanii może mieć noindex?
noindex ma sens tylko wtedy, gdy landing page jest naprawdę dedykowana kampanii, ma warianty A/B, powiela niemal tę samą treść pod wieloma URL-ami albo nie chcesz, żeby konkurowała z główną ofertą w wynikach organicznych. Przy równoważnych, indeksowalnych wersjach zwykle lepszym rozwiązaniem jest canonical niż automatyczne noindex. Nie stosuj noindex, jeśli LP jest wartościową, pełnoprawną stroną ofertową i ma dobrej jakości unikatową treść. Problemem nie jest sam fakt, że strona jest „reklamowa”, ale czy wnosi coś wartościowego sama w sobie.
SSR nadal bywa uzasadniony, jeśli musisz pokazać dynamiczną cenę, stan magazynowy, lokalizację, język, zgodność prawną per kraj albo personalizację pod segment. Najistotniejsze nie jest to, żeby LP była „statyczna z zasady", tylko żeby była szybka, stabilna i przewidywalna.
Optymalizacja wydajności landing page: lista kontrolna
LCP poniżej 2.5 sekundy
Code
// 1. Hero image jako element LCPimport Image from "next/image";<Image src="/lp/hero-product.webp" alt="Produkt XYZ" width={1200} height={600} preload sizes="100vw" quality={85}/>;// 2. next/font obsługuje preload fontów automatycznieimport { Inter } from "next/font/google";const inter = Inter({ subsets: ["latin", "latin-ext"], display: "swap",});
Traktuj preload jak rozkaz dla przeglądarki, by skupiła wszystkie siły na jednym, kluczowym zasobie. Jeśli dasz ten sam rozkaz pięciu różnym elementom, wprowadzasz chaos i przeglądarka nie wie, który front jest najważniejszy.
CLS poniżej 0.1
Code
// 1. Zawsze podawaj wymiary obrazków<Image width={400} height={300} ... />// 2. Zarezerwuj miejsce dla dynamicznych elementów<div className="min-h-[60px]"> {/* cookie banner space */} <CookieBanner /></div>// 3. Font display swap + size-adjustimport { Inter } from "next/font/google";const font = Inter({ subsets: ["latin"], display: "swap", adjustFontFallback: true, // Next.js automatycznie dopasuje fallback});
INP poniżej 200 ms
Code
// components/lp/DeferredSections.tsx"use client";import { useEffect, useRef, useState } from "react";import dynamic from "next/dynamic";const Testimonials = dynamic(() => import("./Testimonials"), { loading: () => <div className="h-[400px]" />,});const FAQ = dynamic(() => import("./FAQ"), { loading: () => <div className="h-[300px]" />,});// 1. Załaduj sekcje dopiero tuż przed wejściem w obszar widocznyexport function DeferredSections() { const [shouldRender, setShouldRender] = useState(false); const markerRef = useRef<HTMLDivElement>(null); useEffect(() => { const marker = markerRef.current; if (!marker) return; const observer = new IntersectionObserver(([entry]) => { if (entry.isIntersecting) { setShouldRender(true); observer.disconnect(); } }, { rootMargin: "200px" }); observer.observe(marker); return () => observer.disconnect(); }, []); return ( <div ref={markerRef}> {shouldRender && <><Testimonials /><FAQ /></>} </div> );}// 2. Nie wrzucaj ciężkiej pracy do handlera submit// ❌ Źleconst handleSubmit = async () => { const validated = heavyValidation(formData); // blokuje main thread await sendForm(validated);};// ✅ Dobrze — handler jest lekki, cięższa walidacja trafia na serwerconst handleSubmit = async () => { setLoading(true); await fetch("https://api.example.com/leads/validate-and-send", { method: "POST", body: formData, }); setLoading(false);};
Samo async/await nie sprawia magicznie, że kod przestaje blokować główny wątek. Jeśli ciężka walidacja nadal wykonuje się synchronicznie w JS po stronie klienta, i tak na tym ucierpi. Jeśli naprawdę musisz robić ciężką pracę w przeglądarce, rozważ Web Workera.
Third-party scripts bez zabijania wydajności
Code
import Script from "next/script";// Tag pomiarowy, który musi wystartować wcześnie<Script src="https://www.googletagmanager.com/gtag/js?id=AW-XXX" strategy="afterInteractive" />// Widget supportowy, który może poczekać<Script src="https://widget.intercom.io/widget/xxx" strategy="lazyOnload" />
Nie wszystkie third-party możesz opóźniać tak samo stanowczo, ponieważ skrypt odpowiedzialny za pomiar i remarketing zwykle musi pojawić się wcześniej niż widget czatu, heatmapa czy recenzje. Tak więc, kolejność ładowania to część architektury konwersji.
Ten snippet jest dobry jako struktura, ale nie kopiuj ślepo samych "ładnych liczb", a social proof działa tylko wtedy, gdy jest prawdziwy i możliwy do obrony.
Message match jako klucz do Quality Score
Message match to spójność między tekstem reklamy a treścią landing page. Jeśli reklama mówi „Tanie ubezpieczenie OC online”, a LP ma headline „Kompleksowe rozwiązania ubezpieczeniowe”, message match jest generalnie do kitu.
Code
Reklama: "Kurs React dla początkujących – start w 7 dni"
↓
LP headline: "Naucz się React od zera w 7 dni" ← ✅ silny message match
LP headline: "Akademia programowania online" ← ❌ kiepski message match
W praktyce twórz oddzielne landing pages albo przynajmniej oddzielne warianty hero/message match per ad group, jeśli grupy słów kluczowych reprezentują różne intencje.
Trzymaj się zasady, by zbierać tylko te dane, których naprawdę potrzebujesz na tym etapie lejka, ponieważ każde dodatkowe pole zniechęca część osób do wypełnienia formularza. Z drugiej strony zbyt krótki formularz potrafi obniżyć jakość leadów, dlatego optymalny punkt trzeba sprawdzić na własnych danych.
Do tego dochodzą rzeczy, których często brakuje w pierwszej wersji:
walidacja i sanityzacja po stronie serwera,
ochrona antyspamowa (honeypot, rate limit, captcha jeśli trzeba),
jasna informacja o polityce prywatności i zgodzie marketingowej, jeśli jest wymagana,
jeden główny CTA.
Atrybucja na landing page: gclid i UTM
Landing page musi być dobry analitycznie. Klik z reklamy może zawierać parametry gclid, utm_source i utm_campaign. Poprawnie wdrożony tag Google Ads zapisuje dane kliknięcia dla własnego pomiaru konwersji, ale gclid i UTM-y warto zatrzymać też we własnym przepływie, gdy kontekst ma trafić do CRM-a lub systemu offline conversions.
Wystarczą trzy nawyki, które razem łączą się w poprawną atrybucję:
zapisz gclid i kluczowe UTM-y w hidden fields formularza albo w storage pierwszej sesji, jeśli mają trafić do CRM-a lub własnych raportów,
konwersję rejestruj po realnym sukcesie formularza, czyli po potwierdzeniu wysyłki, a nie po samym kliknięciu przycisku,
przy przekierowaniu na thank-you page zachowaj dane sesji dla własnej atrybucji, a przy zmianie domeny skonfiguruj cross-domain linking.
Powyższy komponent AttributionFields działa skutecznie, jeśli formularz znajduje się na tej samej stronie, na którą trafia użytkownik. Jeśli jest wieloetapowy albo użytkownik może nawigować po stronie przed konwersją, poleganie wyłącznie na parametrach z bieżącego adresu URL jest prostą drogą do utraty atrybucji. W statycznie generowanej trasie umieść komponent używający useSearchParams pod granicą Suspense.
A/B testing landing pages w Google Ads
Warianty URL dla testów A/B
Najprostsze podejście to oddzielne strony dla każdego wariantu.
Code
/lp/kurs-react → wariant A (headline: "Naucz się React")
/lp/kurs-react-v2 → wariant B (headline: "Zostań React Developerem")
To działa, ale pamiętaj o dyscyplinie testowej i testuj jedną większą zmianę naraz. Nie mieszaj równocześnie headline'u, formularza, koloru CTA i układu sekcji, ponieważ potem nie wiesz, co naprawdę działa i ma znaczenie, a co nie.
Alternatywy dla Google Optimize
Google Optimize został zamknięty w 2023, aktualne alternatywy: Optimizely, VWO lub własny mechanizm z Next.js Proxy + cookies:
Co jest najważniejsze na landing page pod Google Ads?
Najważniejsze są message match z reklamą, szybkość ładowania, czytelny formularz lub CTA, poprawna atrybucja kliknięcia i brak zbędnych rozpraszaczy.
Czy wynik Quality Score jest najważniejszym KPI?
Nie. Quality Score jest wskaźnikiem diagnostycznym. Ważniejsze są koszt pozyskania, współczynnik konwersji, jakość leadów i to, czy strona pomaga domykać cel kampanii.
Dlaczego Next.js ma sens dla landing page kampanii?
Next.js pomaga kontrolować wydajność, metadata, tracking, server-side rendering i optymalizację obrazów, czyli elementy wpływające na doświadczenie użytkownika i skuteczność kampanii.
Czy landing page pod Google Ads powinna mieć `noindex`?
Nie ma jednej odpowiedzi, bo to zależy od przeznaczenia strony, ale generalnie noindex ma wtedy sens, gdy LP jest tylko związana z kampanią, ma warianty A/B, duplikuje treść z innych URL-i lub nie wnosi wartości poza kontekstem kampanii. Jeśli jednak strona jest pełnoprawną ofertą produktową, może bezproblemowo być zarówno pod reklamy, jak i SEO. Nie traktuj noindex jako domyślnego odruchu dla każdej LP, tutaj wiele zależy od kontekstu.
Dlaczego SSG jest lepsze niż SSR dla landing pages?
Static Generation (SSG) lub ISR dają przewidywalny, niski TTFB, bo strona jest serwowana z CDN bez czasu serwera. Dla landing pages, gdzie priorytetem jest szybkość ładowania i Core Web Vitals, to zwykle najlepszy wybór. SSR ma sens tylko wtedy, gdy strona wymaga personalizacji w czasie rzeczywistym — dynamicznej ceny, stanu magazynowego, lokalizacji użytkownika lub zgodności prawnej per kraj.
Co to jest message match i dlaczego ma znaczenie?
Message match to spójność między tekstem reklamy a nagłówkiem landing page. Jeśli reklama obiecuje „Kurs React dla początkujących — start w 7 dni", a LP ma headline „Akademia programowania online", użytkownik czuje dysonans i często opuszcza stronę. Silny message match oznacza, że kluczowe słowa z reklamy powtarzają się na stronie, co bezpośrednio wpływa na wskaźnik konwersji i ocenę landing page experience przez Google.
Jak nie zgubić `gclid` i UTM-ów przy przekierowaniu na thank-you page?
Przy poprawnie wdrożonym tagu Google Ads lub Conversion Linkerze identyfikator kliknięcia jest zapisywany w cookie pierwszej strony, więc standardowa konwersja na tej samej domenie nie wymaga ręcznego dopisywania gclid do thank-you page. Zapisz gclid i UTM-y w hidden fields, sessionStorage lub własnym cookie, gdy dane mają trafić do CRM, offline conversions albo własnej analityki. Przy przekierowaniach i przejściu na inną domenę zadbaj, by identyfikator kliknięcia nie został utracony.
Kiedy użyć `strategy="lazyOnload"` zamiast `strategy="afterInteractive"` dla skryptów?
afterInteractive ładuje skrypt po hydratacji strony i jest odpowiedni dla tagów pomiarowych i remarketingowych, które muszą być gotowe względnie szybko. lazyOnload ładuje skrypt dopiero po załadowaniu całej strony w tle i sprawdza się przy widgetach czatu, narzędziach heatmap czy recenzji, które nie są krytyczne dla konwersji. Niepotrzebne wczesne ładowanie skryptów niszczy Core Web Vitals.
Jak testować A/B landing pages bez Google Optimize?
Google Optimize został zamknięty w 2023. Alternatywy to Optimizely lub VWO dla gotowych rozwiązań, albo własny mechanizm z Next.js Middleware (losuje wariant przy pierwszym wejściu, ustawia cookie i przepisuje URL na odpowiedni wariant strony). Kluczowe zasady testowania są takie: testuj jedną zmianę naraz, utrzymuj ten sam wariant w całej sesji użytkownika i kończ test dopiero po osiągnięciu statystycznej istotności. Inaczej czeka Cię chaos.
Jak mierzyć jakość ruchu z kampanii, nie tylko liczbę konwersji?
Poza samą liczbą leadów warto śledzić koszt leadu per kampania i ad group, współczynnik konwersji per wariant LP, jakość leadów w CRM (np. procent zakwalifikowanych do sprzedaży) oraz Core Web Vitals mierzone w RUM dla ruchu z kampanii. Kolumna Landing page exp w Google Ads na poziomie słów kluczowych oraz raport Search Terms pomagają ocenić, czy ruch faktycznie odpowiada intencji strony.
O autorze
Maciej Sala
Maciej Sala — Product Manager i Frontend Developer z bogatym doświadczeniem w marketingu internetowym oraz SEO. Na co dzień pracuje z Reactem, Next.js i TypeScriptem, a ostatnio także z Astro i narzędziami do automatyzacji procesów AI. Sprawnie łączy perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat był związany z branżą gier wideo jako project manager i game designer. Absolwent historii na Uniwersytecie Jagiellońskim oraz studiów podyplomowych z marketingu internetowego na AGH w Krakowie. Po godzinach trenuje na siłowni, maluje figurki i rozwijam własne projekty.
Landing page pod PPC ma jedno zadanie, czyli zamienić płatne kliknięcie w mierzalną akcję. I tyle. Każda zbędna sekunda ładowania, każdy niepotrzebny skrypt czy każda rozproszona narracja działają jak opór aerodynamiczny na kadłubie myśliwca — palą paliwo, a Ty płacisz za nie z budżetu mediowego.
Maciej Sala
Founder StriveLab
Kompletny przewodnik po implementacji śledzenia konwersji Google Ads w Next.js. Od podstawowego gtag, przez enhanced conversions, po server-side tracking z Google Ads API.
Maciej Sala
Founder StriveLab
Jak wdrożyć remarketing Google Ads w aplikacji React? Dynamiczny remarketing ecommerce, listy odbiorców na podstawie zachowań użytkowników i integracja z listami odbiorców w GA4.