Najważniejsze na początek jest to, że @next/third-parties to wygodne i stabilne rozwiązanie, natomiast przy bardziej restrykcyjnym consent mode, warunkowym ładowaniu skryptu albo niestandardowej logice związanej z wysyłaniem pageview, ręczny setup nadal daje nam znacznie większą kontrolę.
Zanim zaczniesz konfigurację GA4 w Next.js
Potrzebujesz Measurement ID z panelu GA4. Znajdziesz go w Admin → Data Streams → wybierz stream → Measurement ID. Format to G-XXXXXXXXXX.
Trzymaj to ID w zmiennej środowiskowej:
Prefiks NEXT_PUBLIC_ jest kluczowy — bez niego zmienna nie będzie dostępna w kodzie klienckim.
Podejście 1: manualna konfiguracja GA4 przez gtag.js
To klasyczne podejście, które daje pełną kontrolę nad tym, kiedy i jak ładowany jest skrypt GA4.
GA4 w App Routerze Next.js
Utwórz komponent GoogleAnalytics i osadź go w layout.tsx:
Kilka istotnych detali w tym kodzie. send_page_view: false w konfiguracji gtag wyłącza automatyczne pageviews, zamiast tego wysyłamy je ręcznie w useEffect, reagując na zmiany pathname i searchParams. Bez tego przy client-side navigation (kliknięcie w Link) GA4 nie zarejestruje przejścia między stronami. strategy="afterInteractive" ładuje skrypt po hydratacji strony, co minimalizuje wpływ na . Suspense wokół komponentu jest potrzebny, bo useSearchParams wymaga granicy Suspense w App Router.
Typowanie TypeScript dla gtag
Dodaj typ dla gtag na obiekcie window:
Helper do wysyłania eventów GA4
Stwórz prosty helper, żeby nie powtarzać logiki w każdym komponencie:
Eventy GA4 i key events: co mierzyć?
GA4 opiera pomiar na zdarzeniach. Najpierw korzystaj ze zdarzeń zbieranych automatycznie lub przez Enhanced Measurement, a dla działań biznesowych stosuj rekomendowane nazwy, takie jak generate_lead, sign_up, add_to_cart, begin_checkout i purchase. Dzięki temu raporty są łatwiejsze do interpretacji niż przy własnej nazwie dla każdej odmiany kliknięcia.
Zdarzenie ważne dla wyniku biznesowego oznacz w GA4 jako key event. Przykładowo strona usługowa może oznaczyć generate_lead, a sklep purchase; nie oznaczaj jako key event każdej drobnej interakcji. W panelu Analytics robisz to w Admin -> Events, wskazując istniejące zdarzenie albo definiując nowe z góry.
Podejście 2: GA4 przez @next/third-parties
Pakiet @next/third-parties to oficjalne rozwiązanie od Vercel, które upraszcza integrację z popularnymi skryptami third-party. Warto jednak śledzić aktualną dokumentację przy większych wdrożeniach.
Instalacja @next/third-parties
Podstawowa konfiguracja GA4
To wszystko — komponent automatycznie ładuje skrypt gtag i konfiguruje go z Twoim Measurement ID.
Wysyłanie eventów przez @next/third-parties
Pakiet eksportuje helper sendGAEvent:
Ograniczenia @next/third-parties
@next/third-parties jest wygodny, ale ma swoje ograniczenia. Nie daje takiej kontroli nad momentem inicjalizacji Google tag, jak ręczny setup, co jest problematyczne, jeśli potrzebujesz bardziej rygorystycznego consent mode. Do tego łatwo dojść do momentu, w którym i tak trzeba dopisać własną logikę do warunkowego ładowania, page_view albo dodatkowych integracji.
Consent Mode w GA4: implementacja w Next.js
Dla stron w UE Consent Mode to konieczność. Oto jak go zaimplementować z manualnym podejściem:
Następnie, kiedy użytkownik zaakceptuje cookies w Twoim banerze:
Kluczową rzeczą jest to, że najpierw musisz ustawić domyślne zgody (np. wszystko zablokowane), zanim załaduje się główny kod GA4. Dopiero potem, gdy użytkownik wyrazi zgodę, aktualizujesz te ustawienia. Robiąc to w złej kolejności, GA4 może zacząć zbierać dane, zanim użytkownik się zgodzi, co jest niezgodne z obowiązującym prawem.
Warunki ładowania skryptu GA4
Jeśli wolisz, żeby kod GA4 w ogóle się nie ładował, dopóki użytkownik nie wyrazi zgody, możesz to zrobić tak:
Testowanie i debugowanie GA4 w Next.js
DebugView w Google Analytics 4
Włącz specjalny tryb debug, dodając parametr w konfiguracji:
Albo automatycznie w trybie deweloperskim:
Po włączeniu powyższego trybu, wszystkie zdarzenia, które wysyłasz, pojawią się w czasie rzeczywistym w sekcji "DebugView" w panelu GA4.
Sprawdzanie GA4 w DevTools
Otwórz narzędzia deweloperskie (zazwyczaj F12), przejdź do zakładki "Network" i wpisz "collect" w polu wyszukiwania - zobaczysz tam wszystkie zapytania wysyłane do serwerów Google Analytics. Właśnie w ten sposób, szybko możemy sprawdzić, czy zdarzenia w ogóle są wysyłane.
Tag Assistant dla GA4
Google Tag Assistant (rozszerzenie Chrome albo wersja webowa na tagassistant.google.com) pozwala podejrzeć, jakie eventy są wysyłane i czy konfiguracja jest poprawna.
Typowe błędy konfiguracji GA4 w Next.js
Brak pageviews przy client-side navigation to najczęstszy problem. Dzieje się tak ponieważ Next.js przy nawigacji przez <Link> nie ładuje strony od nowa, więc gtag nie wysyła automatycznie pageview. Rozwiązaniem jest ręczne wysyłanie page_view w useEffect reagującym na zmiany pathname.
Podwójne pageviews — jeśli masz ustawione send_page_view: true (domyślne) i jednocześnie wysyłasz ręcznie pageviews w useEffect, dostajesz duplikaty. By to naprawić, ustaw w konfiguracji send_page_view: false.
Brak danych w development — wtyczki blokujące reklamy i rozszerzenia prywatności blokują requesty do google-analytics.com. W trakcie developmentu testuj w oknie incognito z wyłączonymi rozszerzeniami albo korzystaj z DebugView.
Zmienne środowiskowe undefined — zapomniane NEXT_PUBLIC_ prefiks lub brak .env.local w katalogu projektu. Pamiętaj, że po dodaniu zmiennej musisz zrestartować serwer deweloperski.
Google Tag Manager: kiedy jeden tag przestaje wystarczać
Bezpośredni Google tag albo @next/third-parties wystarczy, dopóki mierzysz samo GA4 i kilka zdarzeń. GTM zaczyna wygrywać, gdy dochodzą konwersje Google Ads, piksele Meta, LinkedIna czy TikToka, testy A/B, narzędzia heatmapowe i potrzeba zmiany tagów bez deployu aplikacji. Kontener staje się wtedy warstwą operacyjną marketingu, a dataLayer zamienia się w API między produktem a analityką, które musi być stabilne, nazwane i udokumentowane. Bez takiego kontraktu marketer zbuduje triggery na klasach CSS i tekstach przycisków, a pierwszy refactor interfejsu po cichu wyłączy pomiar.
Kontener dodasz komponentem GoogleTagManager z @next/third-parties/google w głównym layoucie. Gdy potrzebujesz pełnej kontroli nad kolejnością zgód, środowiskami i warunkami ładowania, lepiej sprawdza się własny komponent na next/script. Niezależnie od sposobu instalacji zdarzenia wysyłaj przez jeden wrapper, a nie bezpośrednio z komponentów, bo po kilku miesiącach nikt nie będzie wiedział, kto wysyła form_submit, a kto lead_sent:
Najwięcej problemów w App Routerze sprawia page view. Nawigacja nie przeładowuje dokumentu, więc wybierz jeden model pomiaru i trzymaj się go konsekwentnie. Możesz zostawić automatyczne odsłony na podstawie historii przeglądarki w Google tagu albo wysyłać własne zdarzenie page_view z komponentu nasłuchującego usePathname() i podpiąć je w GTM pod Custom Event Trigger. Oba mechanizmy naraz dają podwójne odsłony.
Przy zgodach liczy się kolejność. Domyślne stany Consent Mode ustaw, zanim kontener odpali pierwszy tag zależny od zgody, a jeśli zgodami zarządza CMP w GTM, korzystaj z jego szablonu i Consent APIs zamiast własnych tagów Custom HTML z gtag('consent'). Przed publikacją każdej wersji kontenera przejdź scenariusz w trybie Preview i sprawdź, czy zdarzenie trafiło do dataLayer, czy trigger pasuje i czy tag odpalił się przy właściwym stanie zgody. Podwójne zdarzenia widoczne tylko lokalnie to zwykle efekt React Strict Mode, więc zanim zaczniesz szukać błędu, sprawdź build produkcyjny.
gtag.js czy @next/third-parties: które podejście wybrać?
Wybór @next/third-parties ma większy sens, jeśli chcesz szybko dodać GA4 bez szerokiej customizacji, a Twoja strona nie wymaga złożonego warunkowego ładowania skryptu.
Podejście manualne z gtag sprawdzi się lepiej, gdy potrzebujesz pełnej kontroli nad Consent Mode (strony w UE, więc też PL), chcesz warunkowo ładować skrypt na podstawie zgody użytkownika, potrzebujesz niestandardowej logiki śledzenia pageviews lub integrujesz GA4 z innymi narzędziami (np. Google Tag Manager).
Dla większości polskich projektów — gdzie RODO wymaga Consent Mode — manualne podejście daje więcej kontroli i jest bezpieczniejszym wyborem - właśnie to rekomenduje. Kiedy pojawia się potrzeba remarketingu, wielu tagów i niezależności marketingu od deployów, następnym krokiem jest Google Tag Manager wdrożony według zasad z poprzedniej sekcji.


