TL;DR
Masz tag Google na stronie, a kampania w Google Ads nadal pokazuje „konfiguracja niekompletna”? W 90% przypadków problem nie leży w „braku kodu”, tylko w rozjazie trzech warstw: tag globalny AW-, akcja konwersji w panelu Ads (z etykietą send_to) oraz zdarzenie wysłane dopiero po sukcesie formularza (HTTP 200). Na produkcyjnej stronie Next.js 15 warto rozdzielić GA4 (afterInteractive) od tagów Ads (lazyOnload) — inaczej albo tracisz leady w analityce, albo psujesz LCP. Poniżej: jak to ustawić w panelu, co wysyłać z kodu i jak testować Tag Assistantem.
Dla kogo to jest
- Firm usługowych z kampanią na lead (formularz kontaktowy, chatbot)
- Właścicieli stron na Next.js / React, gdzie marketing dodał już jeden lub więcej kontenerów
AW- - Osób widzących ostrzeżenie w diagnostyce kampanii mimo zielonego tagu w podglądzie strony
- Zespołów łączących GA4 z Google Ads bez importu konwersji z Analytics
Fraza (SEO)
google ads śledzenie konwersji, tag google konwersje, konfiguracja konwersji google ads, gtag send_to AW, conversion_event_submit_lead_form, niekompletna konfiguracja google ads
Dlaczego sam tag AW- nie wystarczy
Google Ads rozróżnia podstawę śledzenia (tag globalny na każdej podstronie) i akcję konwersji (definicja celu biznesowego). Tag gtag/js?id=AW-XXXXXXXX + gtag('config', 'AW-XXXXXXXX') mówi Google: „ten ruch należy do tego konta reklamowego”. To nie oznacza jeszcze, że system wie, które kliknięcia „Wyślij” to wartościowe leady.
| Element | Co robi | Czy wystarczy dla Smart Bidding? |
|---|---|---|
Tag AW-... w layout |
Łączy sesję z kontem Ads | Nie |
| Akcja konwersji w panelu | Definiuje cel i etykietę | Tak — po pierwszych hitach |
gtag('event', ...) po sukcesie formularza |
Wysyła sygnał konwersji | Tak — musi trafić w tę akcję |
Kampanie z maksymalizacją konwersji lub docelowym CPA potrzebują zarejestrowanych konwersji przypiętych do celu kampanii. Dopóki panel pokazuje „Brak danych” lub „Szkic”, algorytm optymalizuje ruch jak przy kliknięciach — stąd wrażenie, że „reklama działa, ale leadów nie ma w raporcie”.
Architektura tagów na stronie Next.js 15 (przykład produkcyjny)
W nowoczesnym projekcie firmowym (np. strona software house) spotkasz wiele identyfikatorów naraz — to normalne przy migracji konta Ads lub wielu kampaniach historycznych.
GA4 — wcześnie, żeby nie gubić zdarzeń formularza
Google Analytics 4 (G-3HT7CZTN7P w tym projekcie) ładuje się ze strategią afterInteractive w layout.tsx. Komentarz w kodzie jest jednoznaczny: przy lazyOnload użytkownik często wysyła formularz zanim gtag będzie gotowy — wtedy generate_lead nie trafia do GA4, mimo że lead trafił do CRM.
<Script
src={`https://www.googletagmanager.com/gtag/js?id=${GA4_MEASUREMENT_ID}`}
strategy="afterInteractive"
/>To świadomy kompromis wydajność vs. jakość danych: kluczowe zdarzenia biznesowe (lead) muszą być niezawodne.
Google Ads — później, dla Core Web Vitals
Trzy kontenery Ads ładują się lazyOnload:
AW-17557280025AW-17769880693AW-18151506857
Każdy ma własny gtag/js i gtag('config', 'AW-...'). Dzięki temu skrypt reklamowy nie blokuje pierwszego renderu (LCP), ale nadal jest dostępny przed typowym czasem wypełnienia formularza — o ile użytkownik nie wysyła leada w pierwszych 2–3 sekundach od wejścia (rzadkie na stronie usługowej).
Nie usuwaj starych tagów AW-, gdy dodajesz nowy kontener. Historyczne konwersje, raporty atrybucji i stare kampanie mogą być na poprzednim ID. Dodaj nowy config, utwórz nową akcję konwersji i przypnij do niej nową kampanię.
Co wysyłać po udanym formularzu
Konwersję licz dopiero po potwierdzeniu serwera (response.ok), nie na onClick przycisku „Wyślij”. Inaczej Ads i GA4 zawyżą wyniki o porzucone wysyłki i błędy walidacji.
W tym projekcie ten sam wzorzec jest w formularzu kontaktowym (page.tsx) i chatbocie (Chatbot.tsx):
1. Zdarzenie GA4 — generate_lead
gtag('event', 'generate_lead', {
send_to: 'G-3HT7CZTN7P', // stała GA4_MEASUREMENT_ID w kodzie
form_type: 'contact_form', // lub 'chatbot_form'
locale: 'pl',
project_type: '...',
});send_to z ID pomiaru GA4 wymusza trafienie do właściwej usługi Analytics (osobny stream ≠ automatyczny import do Ads).
2. Zdarzenie Google Ads — conversion_event_submit_lead_form
gtag('event', 'conversion_event_submit_lead_form', {
event_callback: goThanks, // np. redirect na /dziekujemy
event_timeout: 2000,
form_type: 'contact_form',
project_type: '...',
budget: '...',
});event_callback + event_timeout: 2000 dają Tagowi czas wysłać hit przed nawigacją — bez tego przeglądarka często przerywa request konwersji. W formularzu kontaktowym jest też fallback setTimeout(goThanks, 2200) na wypadek braku callbacku.
3. Klasyczna konwersja z send_to: 'AW-xxx/etykieta'
Jeśli w panelu Ads utworzysz akcję typu „Strona internetowa” z identyfikatorem konwersji, Google poda format:
AW-123456789/AbCdEfGhIjKlMnOpQrWtedy alternatywnie (lub dodatkowo) wyślij:
gtag('event', 'conversion', {
send_to: 'AW-123456789/AbCdEfGhIjKlMnOpQr',
value: 1.0,
currency: 'PLN',
});Nazwa zdarzenia conversion_event_submit_lead_form musi dokładnie odpowiadać konfiguracji w koncie (zdarzenie zdefiniowane w Ads). Rozjazd nazwy = zero konwersji w raporcie kampanii, mimo że Tag Assistant coś „miga”.
Konfiguracja w Google Ads — krok po kroku
Utworzenie akcji konwersji
- Narzędzia i ustawienia → Konwersje → Nowa akcja konwersji.
- Źródło: Strona internetowa (lub import z GA4 — osobna ścieżka).
- Kategoria: Wysłanie formularza kontaktowego lub zdarzenie niestandardowe zgodne z kodem.
- Skopiuj ID konwersji (
AW-.../label) lub instrukcję zdarzenia. - Status: Aktywna (nie „Szkic”).
Powiązanie z kampanią
W ustawieniach kampanii: Cele → Konwersje — zaznacz tę samą akcję, która dostaje hity z www. Jeśli kampania celuje AW-17769880693, a send_to lub domyślny kontener wskazuje AW-17557280025, zobaczysz ruch w jednym koncie, a optymalizacja w drugim — klasyczny powód „niekompletnej konfiguracji”.
Opóźnienie 24–48 godzin
Po pierwszym teście na produkcji status w liście konwersji często zmienia się z „Brak ostatniej aktywności” dopiero po 24–48 h. Nie restartuj kampanii po jednym teście; sprawdź Ostatnia aktywność następnego dnia.
„Konfiguracja niekompletna” — najczęstsze przyczyny
- Tylko tag globalny — brak akcji konwersji lub brak zdarzenia po submit.
- Kampania startowała przed pierwszą konwersją — Google czeka na dane do uczenia algorytmu.
- Cel kampanii ≠ akcja odbierająca zdarzenia — inne
AW-lub inna etykieta. - Test na localhost / preview — Ads oczekuje domeny zgodnej z reklamami (produkcja).
- GA4 widzi
generate_lead, Ads nie — to osobne systemy; bezsend_todoAW-lub importu konwersji dane nie przepłyną. - Adblock / Brave / Firefox ETP — u Ciebie test „nie działa”, u klientów tak; testuj incognito bez rozszerzeń na produkcyjnej domenie.
lazyOnload+ bardzo szybki submit — rzadko, ale możliwe; wtedy rozważafterInteractivedla jednego głównego kontenera kampanii lub opóźnienie redirectu (jakevent_timeout).
Testowanie — 5–15 minut, które oszczędzają tygodnie
Tag Assistant (Chrome)
- Zainstaluj Tag Assistant Companion.
- Wejdź na produkcyjną stronę (ta sama domena co w reklamach).
- Wyślij testowy formularz z unikalnym emailem (
test+ads2026@twojadomena.pl). - W podglądzie sprawdź: GA4 →
generate_lead; Ads →conversionlubconversion_event_submit_lead_form. - W Google Ads → Konwersje — czy pojawił się hit (czasem z opóźnieniem).
Podgląd w czasie rzeczywistym (GA4)
W Raporty → Realtime szukaj zdarzenia generate_lead z parametrem form_type. Jeśli tu jest, a Ads milczy — problem leży w warstwie AW-, nie w formularzu.
Checklist przed uruchomieniem budżetu
- Tag
AW-na wszystkich wersjach językowych (/pl,/en, …) - Jedna kanoniczna ścieżka wysyłki konwersji (form + chatbot → ten sam event Ads)
- Akcja konwersji Aktywna i przypięta do kampanii
- Redirect na thank-you po
event_callbacklub z buforem 2 s - Brak fałszywych konwersji na klik „Wyślij”
Wydajność vs. kompletność danych
Na stronie firmowej typowy układ to:
- GA4
afterInteractive— nie tracisz leadów w raportach marketingu i CRM-attribution. - Ads
lazyOnload— chronisz LCP i Performance score (ważne też dla jakości landing page w Ads).
Jeśli diagnostyka Ads wymaga wcześniejszego załadowania głównego AW-, rozważ afterInteractive tylko dla kontenera powiązanego z aktywną kampanią, pozostawiając pozostałe AW- jako lazy — nie wszystkie trzy muszą konkurować o ten sam slot w <head>.
FAQ
Czy muszę usuwać stary tag AW-, gdy dodam nowy?
Nie, jeśli na starym ID wiszą historyczne konwersje i raporty. Dodaj nowy gtag('config'), utwórz nową akcję konwersji i przypnij nową kampanię do nowego celu. Stare tagi możesz wygasić dopiero po migracji raportów i wygaśnięciu starych kampanii.
Ile tagów AW- na jednej stronie to za dużo?
2–3 bywa akceptowalne przy migracji konta. Każdy ładuje osobny skrypt — pilnuj lazyOnload, jednego miejsca wysyłki konwersji przy formularzu i nie duplikuj tego samego conversion trzy razy (zawyżenie). Lepiej jeden hit na submit niż trzy „na wszelki wypadek”.
Dlaczego GA4 widzi generate_lead, a Google Ads nie?
GA4 i Ads to osobne produkty. Zdarzenie z send_to: G-... trafia do Analytics. Ads wymaga send_to: AW-.../label, zdarzenia zdefiniowanego w koncie lub importu konwersji z GA4 (z opóźnieniem i innymi regułami atrybucji). Sam wspólny gtag w dataLayer nie wystarczy bez poprawnej konfiguracji celu.
Czy conversion_event_submit_lead_form zastępuje klasyczne conversion?
To zależy od tego, jak utworzyłaś/eś akcję w panelu. Jeśli Ads podał zdarzenie niestandardowe — używaj dokładnie tej nazwy. Jeśli podał identyfikator AW-xxx/yyy — używaj gtag('event', 'conversion', { send_to: '...' }). W praktyce często stosuje się oba: GA4 dla analityki, Ads dla optymalizacji kampanii.
Czy test na Vercel Preview URL zadziała?
Zwykle nie dla pełnej diagnostyki Ads, jeśli reklamy kierują na domenę produkcyjną. Preview może mieć inne cookies, inny robots i inny ruch. Testuj finalną domenę z kampanii.
Import konwersji z GA4 — kiedy ma sens
Google Ads pozwala importować zdarzenia z GA4 jako konwersje. To wygodne, gdy marketing „żyje” w Analytics, a developer wysyła tylko generate_lead z send_to: G-.... Wady:
- Opóźnienie i inne reguły atrybucji niż natywny tag
AW- - Trudniejsza diagnostyka „czy hit dotarł” w jednym miejscu
- Ryzyko, że filtr GA4 wykluczy część ruchu (np. cookie consent)
Dla kampanii z twardym CPA i krótkim horyzontem uczenia algorytmu lepiej trzymać bezpośredni hit do Ads (conversion lub zdarzenie z panelu) oraz GA4 równolegle — tak jak w opisanym projekcie. Import z GA4 traktuj jako backup raportowy, nie jako jedyny sygnał optymalizacji.
Consent Mode i RODO — nie psuj danych przypadkiem
Jeśli baner cookies blokuje gtag przed zgodą marketingową, Ads może pokazywać „tag zainstalowany”, ale konwersje modelowane lub zerowe do czasu zgody. Upewnij się, że:
- Tag ładuje się zgodnie z polityką (np. Consent Mode v2),
- Test konwersji robisz po akceptacji kategorii marketingowych w banerze,
- W dokumentacji wewnętrznej jest zapis: „lead w CRM” ≠ „konwersja w Ads” przy odmowie cookies.
Wielojęzyczność (/pl, /en, /de)
Każda wersja językowa musi mieć ten sam zestaw tagów w layoucie wspólnym lub locale layout. Formularz w page.tsx i chatbot wysyłają zdarzenia z parametrem locale — w raportach Ads/GA4 filtruj po nim, żeby nie mieszać kampanii PL z ruchem DE. Jeśli osobne konta Ads per kraj, send_to musi wskazywać właściwy AW- dla tej kampanii.
Podsumowanie
Śledzenie konwersji Google Ads na stronie Next.js to układanka: tag globalny AW-, akcja w panelu, zdarzenie po sukcesie API formularza, spójny send_to i cierpliwość 24–48 h na pierwsze dane. Rozdzielenie GA4 (afterInteractive) i Ads (lazyOnload) to dojrzały kompromis między Core Web Vitals a niezgubionymi leadami. Zanim zwiększysz budżet, potwierdź konwersję Tag Assistantem na produkcji — nie na localhost. Przy wielu kontenerach AW- — nie usuwaj starych bez migracji celów kampanii.
Chcesz wdrożyć śledzenie u siebie?
- Skontaktuj się — dopasujemy tagi do Twojej kampanii i formularzy
- Zobacz realizacje — strony z poprawną analityką i wydajnością
- Strony WWW — Next.js, SEO i konwersje w jednym wdrożeniu