Moduł GA4 dla PrestaShop najczęściej mierzy cztery momenty: widok listy i karty produktu (view_item_list, view_item), dodanie do koszyka (add_to_cart), rozpoczęcie checkoutu (begin_checkout) i złożenie zamówienia (purchase). To nie jest cały lejek. Zdarzenia add_shipping_info i add_payment_info, czyli wybór dostawy i wybór płatności, w większości gotowych modułów nie występują — dlatego w Funnel exploration masz dziurę między begin_checkout a purchase i nie widzisz, na którym kroku odpada klient. Poniżej masz mapę zdarzeń, listę typowych luk i procedurę, która w 15 minut pokaże, co realnie wysyła Twój moduł.
„Moduł GA4” to w praktyce trzy różne rzeczy, które klienci opisują jedną nazwą. Zanim zaczniesz diagnozować braki w danych, ustal, który wariant masz na sklepie — od tego zależy, gdzie szukać kodu.
displayHeader. Najprostszy scenariusz, ale też najbardziej ograniczony.<script> w headerze. Zdarzenia e-commerce buduje się w Data Layerze, nie w module.Typowy moduł siedzi na czterech hookach: displayHeader (biblioteka gtag.js i konfiguracja), displayFooter (skrypty doczepiane na dole strony, np. śledzenie koszyka), hookDisplayOrderConfirmation (purchase liczony na stronie potwierdzenia) oraz hookActionValidateOrder (purchase po stronie serwera, także przez Measurement Protocol). Jeśli Twoje zdarzenia nie łapią się w żadnym z nich, ktoś dopisał kod w motywie — i aktualizacja szablonu go usunie.
Wymagania: PrestaShop 1.7.x to szablony Smarty (.tpl), 8.x to Twig (.twig) — moduł pisany pod 1.7 nie zawsze zadziała w 8.x bez zmian w szablonie. PHP: 1.7.8+ wymaga 7.4, PrestaShop 8 zaleca 8.1.
W konfiguracji wpisujesz Measurement ID (format G-XXXXXXX), nie Stream ID. Stream ID to liczba widoczna w GA4 → Administracja → Strumienie danych — wklejona w pole modułu nie zadziała i pomiar nie ruszy.
Nazewnictwo hooków i strukturę modułów opisuje dokumentacja dla deweloperów PrestaShop.
Poniższa tabela odpowiada wprost na pytanie z tytułu. Trzecia kolumna mówi, gdzie w kodzie szukać zdarzenia — to punkt startowy do weryfikacji w GA4 DebugView.
Trzy zdarzenia wypadają najczęściej: select_item (klik w kafelek produktu z listy), view_promotion (banner czy slider na stronie głównej) i add_payment_info (wybór metody płatności). Gotowe moduły traktują checkout jako jeden krok, więc rozdzielenie dostawy i płatności trzeba dopisać ręcznie.
Zwroty to osobny temat: refund pojawi się tylko wtedy, gdy moduł nasłuchuje hookActionOrderStatusPostUpdate i reaguje na status „Zwrócone”. Domyślnie nikt tego nie robi.
| Zdarzenie GA4 | Etap sprzedaży | Miejsce w PrestaShop / hook |
|---|---|---|
| view_item_list | Przeglądanie oferty | Lista kategorii, wyniki wyszukiwania — displayHeader + JS |
| select_item | Zainteresowanie produktem | Klik w kafelek na liście lub w wynikach wyszukiwania |
| view_item | Karta produktu | product.tpl / product.twig, skrypt w displayFooter |
| add_to_cart | Koszyk | hookActionCartSave, AJAX koszyka, przycisk „Do koszyka” |
| remove_from_cart | Koszyk | Strona /koszyk, akcja usunięcia pozycji |
| view_cart | Koszyk | Strona /koszyk (CartController) |
| begin_checkout | Start checkoutu | Pierwszy krok /zamowienie, displayHeader |
| add_shipping_info | Wybór dostawy | Krok dostawy — InPost, DPD, DHL, wybór kuriera |
| add_payment_info | Wybór płatności | Krok płatności — wybór metody, np. Przelewy24, BLIK |
| purchase | Transakcja | hookActionValidateOrder (serwer) lub hookDisplayOrderConfirmation |
| refund | Zwrot | hookActionOrderStatusPostUpdate przy statusie „Zwrócone” |
Po instalacji oficjalnego modułu dostajesz pięć zdarzeń: view_item_list, view_item (z parametrem item_list), add_to_cart, begin_checkout i purchase z tablicą items[]. To poprawny, ale niekompletny zestaw — obejmuje górę lejka i jego koniec, pomijając środek.
Najważniejszy brak to add_shipping_info i add_payment_info. Moduł nie rozdziela kroków checkoutu, więc w GA4 widzisz jedno begin_checkout i po nim purchase. Skutek jest policzalny: jeśli ze 100 rozpoczętych zamówień kończysz 40, nie wiesz, czy przepadło 30 osób na wyborze kuriera, czy 30 na wyborze płatności. W Funnel exploration masz dziurę i nie załatasz jej żadnym segmentem — brakuje danych źródłowych.
Kolejne luki: remove_from_cart (rzadko implementowane), select_item i view_promotion (praktycznie nigdy). Bez nich nie sprawdzisz, które produkty z listy faktycznie przyciągają kliknięcia, ani czy baner na stronie głównej generuje ruch do karty produktu.
Osobno zwroty. Jeśli moduł nie reaguje na zmianę statusu zamówienia, refund nigdy nie trafi do GA4 — raporty przychodu są zawyżone o wartość zwrotów, co przy sklepie z 5–10% zwrotów realnie zniekształca ROI kampanii.
Pułapka wdrożeniowa: gdy purchase leci jednocześnie z hookDisplayOrderConfirmation i z Measurement Protocol, zamówienie policzy się dwa razy. Wybierz jedno źródło.
Zanim dopiszesz brakujące zdarzenia, sprawdź zakres modułu i jego ograniczenia w PrestaShop oraz pozostałe wdrożenia PrestaShop — część modułów da się rozszerzyć konfiguracją, część wymaga własnego kodu.
| Element pomiaru | Oficjalny moduł | Skutek w raportach |
|---|---|---|
| view_item_list / view_item | Tak, standardowo | Masz dane o przeglądaniu oferty |
| add_to_cart | Tak | Znasz konwersję z karty produktu do koszyka |
| begin_checkout | Tak | Widzisz start checkoutu, ale jako jeden zbiorczy krok |
| purchase z items[] | Tak | Masz sprzedaż i strukturę zamówień |
| add_shipping_info | Zwykle nie | Nie wiesz, ilu klientów odpada na wyborze dostawy |
| add_payment_info | Zwykle nie | Nie wiesz, czy blokuje ich wybór płatności |
| remove_from_cart | Rzadko | Nie widzisz, co klienci wycofują z koszyka |
| select_item | Rzadko | Brak danych o kliknięciach z listy produktów |
| view_promotion | Praktycznie nigdy | Promocje na stronie głównej są niemierzalne |
| refund | Nie bez nasłuchu statusu | Przychód zawyżony o wartość zwrotów |
Zamiast czytać opis na marketplace, uruchom trzy testy. Wszystkie zmieszczą się w 15 minut, jeśli masz dostęp do GA4 i do sklepu — najlepiej na kopii stagingowej. Testy rób w jednej sesji i notuj każdy event, który zobaczysz.
Test 1 — DebugView + GA Debugger. W Chrome włącz rozszerzenie Google Analytics Debugger, otwórz sklep i przejdź ścieżkę: lista produktów → karta produktu → koszyk → checkout. Równolegle trzymaj otwarte w GA4: Administracja → DebugView. Powinieneś zobaczyć kolejno view_item_list, view_item, add_to_cart, begin_checkout. Kliknij nazwę zdarzenia, żeby rozwinąć parametry — interesują Cię items[] oraz item_id, item_name, price, quantity.
Test 2 — Realtime z filtrem po nazwie. GA4 → Raporty → Realtime → „Zdarzenia”. Widok pokazuje tylko ostatnie 30 minut, więc testuj punktowo: dodaj produkt do koszyka i sprawdź, czy licznik add_to_cart właśnie się zwiększył. Jeśli event jest w DebugView, a nie ma go w Realtime, sprawdź stan filtrów danych — nowy filtr domyślnie działa w trybie testowym.
Test 3 — zamówienie testowe. Utwórz produkt „Test produkt” i kod rabatowy TEST-INTERNAL. Złóż zamówienie najtańszą metodą płatności i w DebugView kliknij purchase. Sprawdź transaction_id, value, currency oraz pełną tablicę items[]. Brak currency albo value oznacza puste raporty przychodu mimo poprawnie wysłanego zdarzenia.
Higiena danych. W Administracja → Strumienie danych → Ustawienia tagów zdefiniuj IP biura jako internal traffic, a w Administracja → Filtry danych przełącz filtr ruchu wewnętrznego z „Testowanie” na „Aktywne”. Filtr działa dopiero od momentu włączenia — nie usunie niczego wstecz. Zamówienie testowe anuluj w PrestaShop i opisz w komentarzu, żeby nikt nie policzył go w sprzedaży.
Wynik testu to lista zdarzeń, które faktycznie poleciały — porównaj ją z tabelą z kolejnej sekcji. Więcej o konfiguracji modułów GA4 dla PrestaShop zebraliśmy w jednym miejscu.
| Test | Gdzie patrzeć | Co sprawdzić | Kryterium zaliczenia |
|---|---|---|---|
| DebugView + GA Debugger | GA4 → Administracja → DebugView | Nazwy zdarzeń i parametry | view_item_list, view_item, add_to_cart, begin_checkout |
| Realtime | GA4 → Raporty → Realtime → Zdarzenia | Świeże zdarzenia z 30 min | add_to_cart rośnie po dodaniu do koszyka |
| Zamówienie testowe | DebugView → purchase | transaction_id, value, currency, items[] | Wszystkie pola wypełnione |
| Filtr ruchu wewnętrznego | Administracja → Filtry danych | Stan filtra | „Aktywne” przed startem kampanii |
Moduł może wysyłać zdarzenia poprawnie, a raporty i tak kłamią. Poniżej pięć sytuacji, które najczęściej widzimy przy audytach pomiaru w sklepach na PrestaShop.
1. Duplikacja purchase po odświeżeniu strony „Zamówienie przyjęte”. Wejdź na order-confirmation i odśwież ją dwa razy. W DebugView zobaczysz dwa purchase. Jeśli oba mają ten sam transaction_id, GA4 zwykle je zdeduplikuje w raportach. Jeśli transaction_id nie ma wcale — oba wejdą do przychodu i nie dowiesz się o tym z żadnego ostrzeżenia.
2. Płatności przekierowujące (Przelewy24, PayU, tpay). Klient kończy płatność na obcej domenie. Kiedy zamknie kartę albo nie wróci na stronę potwierdzenia, purchase nie poleci. Obejście: zdarzenie wysyłane z webhooka płatności przez Measurement Protocol, z transaction_id i value, plus wersja awaryjna po powrocie do sklepu. Sprawdź, ile zamówień z opłaconym statusem nie ma odpowiadającego purchase w GA4.
3. Brak currency i value oraz niepełne items[]. Objaw: zdarzenia są, a raporty przychodu i „Ecommerce purchases” świecą pustkami. W DebugView kliknij purchase i zweryfikuj, czy na poziomie zdarzenia jest currency i value, a w items[] — item_id, price i quantity dla każdej pozycji.
4. Consent Mode v2. Od marca 2024 brak wdrożonego trybu zgody obniża skuteczność modelowania konwersji u odbiorców w EEA. Efekt praktyczny: rozjazd między GA4 a statystykami PrestaShop sięgający kilkunastu procent — tyle zjada brak zgody, blokery i niedokończone powroty z płatności. Porównuj liczbę zamówień, nie sesje.
5. Zamówienia poza sklepem. B2B, zapytania ofertowe, zamówienia telefoniczne, przelew z odroczonym terminem — klient nie przechodzi checkoutu, więc w GA4 go nie ma. Rozwiązanie: zdarzenie offline przez Measurement Protocol, wysyłane przy zmianie statusu zamówienia w back office.
| Pułapka | Objaw w raportach | Jak wykryć | Co zrobić |
|---|---|---|---|
| Duplikacja purchase | Przychód wyższy niż w PrestaShop | Odśwież order-confirmation w DebugView | Wysyłka raz + kontrolna flaga w sesji, deduplikacja po transaction_id |
| Płatność z przekierowaniem | Brak purchase przy opłaconych zamówieniach | Porównanie statusów płatności z listą eventów | Webhook + Measurement Protocol |
| Brak currency/value/items[] | Puste raporty e-commerce | Podgląd parametrów purchase w DebugView | Uzupełnić parametry po stronie modułu |
| Consent Mode v2 | Spadek liczby konwersji i rozjazd z PrestaShop | Porównanie liczby zamówień dzień do dnia | Wdrożenie trybu zgody i modelowanie konwersji |
| Sprzedaż poza sklepem | Kampanie wyglądają lepiej niż sprzedaż | Zestawienie zamówień z back office i GA4 | Event offline z back office |
Jeśli test z pierwszej sekcji pokazał braki, masz dwie realne drogi. Wybór sprowadza się do tego, kto będzie robił zmiany i jak często.
Wariant GTM. Wstawiasz warstwę dataLayer w szablonach i hookach, a tagi GA4 Event konfigurujesz w kontenerze. 8–16 godzin pracy. Zmiany robisz bez deployu — marketing sam doda parametr albo nowy event. Minusy: zależność od kontenera, dodatkowy JS na stronie i ryzyko podwójnych tagów, gdy ktoś doda event „na zapas”.
Wariant własnego modułu. Wykorzystujesz hookActionCartSave (dodanie do koszyka), hookDisplayOrderConfirmation (purchase) i hookActionOrderStatusPostUpdate (zmiany statusu, w tym zwroty) plus własną walidację danych przed wysyłką. 12–24 godziny. Zero zależności od zewnętrznych wtyczek i subskrypcji, kod zostaje u Ciebie — ale każda zmiana wymaga wdrożenia. Listę hooków znajdziesz w dokumentacji dla deweloperów PrestaShop, a sposób pracy opiszemy w materiale o generatorze modułów PrestaShop.
add_shipping_info i add_payment_info. Najprościej przez nasłuch AJAX-a na stronie zamówienia: zmiana przewoźnika i zmiana metody płatności. PrestaShop odświeża te sekcje asynchronicznie, więc podpinamy się pod samo zdarzenie zmiany, nie pod wyświetlenie strony.
Refundy. Gdy zamówienie przechodzi w status zwrotu, wyślij event refund z transaction_id i wartością zwrotu. Bez tego przychód w GA4 zostaje zawyżony o każdą reklamację.
Kiedy wystarczy darmowy moduł: do ~30 zamówień miesięcznie, jeden kanał sprzedaży, detal, jedna płatność online. Kiedy warto dopłacić: B2B, kilka kanałów, płatności odroczone, zamówienia obsługiwane poza sklepem.
| Wariant | Czas wdrożenia | Zmiany po wdrożeniu | Kiedy wybrać |
|---|---|---|---|
| GTM + dataLayer | 8–16 h | Bez deployu, w kontenerze | Zespół marketingowy chce samodzielnie dodawać zdarzenia |
| Własny moduł | 12–24 h | Wymagają wdrożenia kodu | Potrzebna pełna kontrola, brak zewnętrznych zależności |
| Uzupełnienie add_shipping_info i add_payment_info | 3–6 h | Nasłuch AJAX na stronie zamówienia | Chcesz widzieć, gdzie klient odpada w checkoutcie |
| Refundy | 2–4 h | Przy zmianie statusu na zwrot | Masz realne zwroty i chcesz prawdziwy przychód |
Funnel exploration to jedyne miejsce w GA4, w którym widzisz ścieżkę, a nie sumy zdarzeń. Kroki: Eksploracje → Funnel exploration → Konfiguracja → Steps. W każdym kroku wybierz „Event name” i wpisz kolejno: view_item, add_to_cart, begin_checkout, purchase. Ustaw Funnel type: Closed — wtedy GA4 policzy tylko tych użytkowników, którzy przeszli całą ścieżkę, a nie sumy niezależnych zdarzeń. Time dimension zostaw na 1 dzień; dłuższy okres rozmywa ścieżkę, bo użytkownik wraca po tygodniu z innego urządzenia. Rozbicie włączasz w sekcji „Breakdown”: dodaj „Device category” (mobile vs desktop) albo „Session source/medium”. Uwaga praktyczna: rozbicie na źródła dzieli ruch na małe próbki — wnioski zaczynają się od kilkuset sesji na segment, wcześniej widzisz szum.
Proporcje między krokami to najszybszy sposób znalezienia dziury w lejku:
| Krok | Wskaźnik | Punkt odniesienia | Co oznacza odchylenie w dół |
|---|---|---|---|
| view_item → add_to_cart | add_to_cart / view_item | 8–15% | Poniżej 5%: problem z kartą produktu, ceną, kosztem dostawy lub dostępnością |
| add_to_cart → begin_checkout | begin_checkout / add_to_cart | 40–60% | Poniżej 30%: koszyk straszy kosztami wysyłki, wymusza konto lub gubi się na mobile |
| begin_checkout → purchase | purchase / begin_checkout | 30–50% | Poniżej 20%: brakuje add_shipping_info i add_payment_info, brak BLIK, wysyłka zbyt droga |
Mylenie modułu GA4 z tagiem gtag.js wstawionym w szablon albo z kontenerem GTM wklejonym do motywu. To trzy różne rzeczy i każda daje inny zestaw zdarzeń.
Jak wykryć: Sprawdź źródło strony (Ctrl+U) — jeśli widzisz tylko gtag.js lub kontener GTM, a w back office nie ma pozycji modułu z konfiguracją pomiaru, to nie masz modułu GA4, tylko ręcznie wklejony kod.
Jak naprawić: Zapisz w notatce, który wariant masz: moduł z PrestaShop Addons, GTM czy własny moduł z hookiem displayHeader. Od tego zależy, gdzie dodasz brakujące zdarzenia.
Założenie, że moduł mierzy cały lejek, w tym wybór dostawy i wybór płatności.
Jak wykryć: W GA4 DebugView przejdź checkout do końca. Jeśli po begin_checkout widzisz od razu purchase, nie ma add_shipping_info ani add_payment_info.
Jak naprawić: Dodaj brakujące zdarzenia przez GTM albo rozszerz moduł o hooki na stronie zamówienia i na akcji zapisu wybranej dostawy i płatności. Sam moduł tego za Ciebie nie zrobi.
Zdarzenie purchase bez parametru items[] albo bez value i currency. Wtedy raport Monetyzacja pokazuje przychód, ale nie pokazuje, co klient kupił.
Jak wykryć: Złóż zamówienie testowe i sprawdź w DebugView parametry purchase. Brak items[] widać też po tym, że w raportach sprzedaży nie rozwijają się nazwy produktów.
Jak naprawić: Popraw konfigurację modułu albo nadpisz zdarzenie purchase w GTM, przekazując tablicę items z item_id, item_name, price i quantity oraz value i currency z zamówienia.
Brak obsługi zwrotów. Moduł, który nie nasłuchuje zmiany statusu zamówienia, nigdy nie wyśle zdarzenia refund.
Jak wykryć: Zmień status zamówienia testowego na „Zwrócone” i sprawdź, czy w DebugView pojawia się refund z parametrem transaction_id.
Jak naprawić: Dodaj nasłuchiwanie hooka hookActionOrderStatusPostUpdate i wysyłaj refund dopiero wtedy, gdy status faktycznie oznacza zwrot. Inaczej zdublujesz przychody i zwroty.
Podanie Stream ID tam, gdzie moduł oczekuje Measurement ID (G-XXXXXXX). Dane nie płyną, a autor wdrożenia szuka błędu w kodzie.
Jak wykryć: Sprawdź pole konfiguracyjne modułu i porównaj wartość z tym, co widzisz w Administracji GA4 → Strumienie danych. Identyfikator strumienia ma inną postać niż G-XXXXXXX.
Jak naprawić: Wpisz dokładnie Measurement ID ze strumienia www. Zapisz zmianę i potwierdź w Realtime, że po odświeżeniu strony pojawia się jakiekolwiek zdarzenie.
Testowanie na produkcyjnym ruchu bez wykluczenia własnego IP i bez oznaczenia zdarzeń testowych jako ruchu wewnętrznego.
Jak wykryć: W Realtime widzisz siebie na liście aktywnych użytkowników, a w raportach zaczynają się pojawiać zamówienia, których nikt nie złożył.
Jak naprawić: Wyklucz swoje IP w filtrach danych GA4 albo oznacz ruch jako internal traffic i używaj go wyłącznie do testów. Zamówienia testowe rób z kodem rabatowym, który łatwo rozpoznasz w raportach.
Moduł GA4 w PrestaShop mierzy zwykle górę lejka i sam zakup, a pomija środek checkoutu oraz zwroty. Bez add_shipping_info i add_payment_info nie ustalisz, czy klienci odpadają na wyborze kuriera, czy na metodzie płatności. Zacznij od 15-minutowego testu w DebugView i porównania wyniku z mapą zdarzeń — dopiero potem zlecaj rozbudowę pomiaru. Zakres prac przy PrestaShop opisujemy na https://dropdigital.pl/prestashop.
Standardowo: przeglądanie produktów (view_item_list, view_item), dodanie do koszyka (add_to_cart), rozpoczęcie checkoutu (begin_checkout) i zakup (purchase). To pokrywa początek i koniec lejka, ale nie środek. Kroki „wybór dostawy” i „wybór płatności” najczęściej nie są mierzone wcale.
Nie. Zakres modułu zależy od jego wersji i konfiguracji, dlatego trzeba to sprawdzić u siebie, a nie wierzyć opisowi ze sklepu z modułami. Typowo brakuje select_item, remove_from_cart, add_shipping_info, add_payment_info i obsługi zwrotów. Jedynym wiarygodnym testem jest DebugView na Twojej instalacji.
Bo moduł nie rozdziela kroków checkoutu na osobne zdarzenia — wysyła tylko begin_checkout, a potem purchase. Aby je dodać, trzeba przechwycić moment wyboru kuriera i metody płatności, np. przez GTM albo własny hook. Bez tego w Funnel exploration masz dziurę i nie wiesz, czy klient odpada na dostawie, czy na płatności.
Złóż zamówienie testowe i sprawdź parametry zdarzenia w DebugView. Jeżeli brakuje items[], w raportach sprzedaży nie zobaczysz, co konkretnie kupiono — zostanie sam przychód. Brak value lub currency psuje również porównania przychodów między kanałami.
Nie. Zdarzenie refund musi być wysłane w momencie zmiany statusu zamówienia, a nie każdy moduł nasłuchuje takich zmian. Jeśli tego nie ma, w GA4 widzisz przychód brutto bez korekty, co zaniża zaufanie do raportów. Sprawdź to jednym zamówieniem testowym i zmianą statusu na „Zwrócone”.
Nie musisz, ale przy brakach w module GTM bywa najszybszą drogą do dodania brakujących zdarzeń i ich parametrów. Warunek jest jeden: musisz zdjąć z modułu te zdarzenia, które przejmuje GTM, żeby nie wysyłać ich podwójnie. Dokumentację hooków znajdziesz w dokumentacji deweloperskiej PrestaShop: https://devdocs.prestashop-project.org/
Wystarczy GA4 DebugView albo rozszerzenie do podglądu zdarzeń w przeglądarce i przejście ścieżki zakupowej. Widzisz wtedy nazwy zdarzeń i ich parametry, bez zaglądania do plików. Jeśli lista jest krótsza niż mapa z tabeli w artykule, masz odpowiedź, czego brakuje.
Jeśli po teście widzisz braki w zdarzeniach albo nie chcesz zgadywać, które hooki dopisać — napisz do nas, przejrzymy konfigurację i powiemy, co dokładnie warto uzupełnić.