GA4 mierzy zachowanie użytkownika: zdarzenia, sesje, ścieżki zakupowe. Nie zna faktur, korekt, zwrotów, chargebacków ani statusu płatności. Dlatego różnica między raportem purchase revenue a przychodem w panelu sklepu jest normalna, a nie objawem awarii. Ten artykuł pokazuje, gdzie leży granica między analityką a księgowością i jak w ciągu godziny sprawdzić, czy Twoje rozbieżności mieszczą się w normie.
W GA4 nie ma „sprzedaży”. Jest zdarzenie purchase z parametrami value, currency, transaction_id i items. Wszystko inne to pochodne: sesje, użytkownicy, źródła ruchu, ścieżki zakupowe. Kwota, którą widzisz w raporcie Monetization → E-commerce purchases, to liczba przesłana przez frontend sklepu. GA4 jej z niczym nie uzgadnia i nie zweryfikuje — nie ma dostępu do bazy zamówień ani do bramki płatności. To nie usterka, to definicja narzędzia behawioralnego.
Czego GA4 nie zna: faktur i korekt, zwrotów i reklamacji, chargebacków, stawek VAT, kosztu dostawy jako odrębnej pozycji, statusu płatności ani tego, czy zamówienie zostało anulowane trzy dni po złożeniu. Zdarzenie purchase wysłane raz zostaje w raporcie na zawsze.
Przykład. Produkt kosztuje 100 zł netto (123 zł brutto), klient użył rabatu 10% na cały koszyk, dostawa 15 zł. Typowa implementacja wysyła do GA4 value = 110,70 + 15 = 125,70 zł (brutto, z dostawą). W panelu sklepu i w ERP zobaczysz 90 zł netto ze sprzedaży towarów, a dostawę zaksięgowaną odrębnie. Różnica sięga 35% i nie świadczy o błędzie — to dwa różne pojęcia przychodu.
Dlatego ustal, która warstwa jest źródłem prawdy dla konkretnego pytania:
| Warstwa | Co zawiera | Źródło prawdy dla |
|---|---|---|
| Analityka (GA4 + GTM) | Zdarzenia, sesje, źródła ruchu, ścieżki zakupowe | Zachowania użytkownika i atrybucji marketingowej |
| Panel sklepu / baza (PrestaShop, WooCommerce) | Status zamówienia, wartość netto i brutto, waluta, stan magazynowy | Operacji handlowych i obsługi zamówień |
| Bramka płatności / ERP / księgowość | Faktyczne wpłaty, faktury, korekty, zwroty | Pieniędzy i rozliczeń podatkowych |
Zanim zaczniesz szukać błędu w GA4, sprawdź te osiem miejsc. W praktyce wdrożeń odpowiadają za znakomitą większość rozjazdów między raportem a panelem sklepu.
analytics_storage zdarzenia e-commerce zwykle nie są wysyłane, a GA4 nie zapisuje cookie _ga. Consent Mode modeluje część konwersji, ale nie odtworzy danych z order-confirmation. Test: w GTM Preview sprawdź, czy po akceptacji banera event purchase ma consent granted.currency jest błąd, GA4 przeliczy kwotę po swojemu lub potraktuje ją jak walutę property.transaction_id — duplikat wejdzie do raportu.date_default_timezone_get()) i bramka płatności mogą siedzieć w trzech różnych strefach. Zamówienie o 23:40 czasu polskiego wpadnie do GA4 z datą następnego dnia.W PrestaShopie purchase można wysłać na dwa sposoby: modułem analitycznym dystrybuowanym ze sklepem albo własnym dataLayer w GTM. Różnica nie jest kosmetyczna — dotyczy momentu wysyłki i kompletności danych. Punkt wyjścia do własnej implementacji znajdziesz w dokumentacji deweloperskiej PrestaShop.
dataLayer daje kontrolę nad tym, kiedy event leci i co zawiera — ale trzeba go utrzymywać przy aktualizacjach sklepu i motywu.OrderConfirmationController) wyświetla się po złożeniu zamówienia, także gdy płatność jest jeszcze „oczekująca” — przelew tradycyjny, nieudana transakcja Przelewy24, porzucony PayU. Efekt: 30 zamówień w GA4, 24 w panelu po odfiltrowaniu nieopłaconych. Rozwiązanie: wysyłka server-side przez Measurement Protocol z hooka actionOrderStatusPostUpdate, po statusie „Płatność zaakceptowana”.session_id i źródłem kampanii. W raportach atrybucji taka sprzedaż ląduje w (direct) — winą za słabe wyniki kampanii obciążasz reklamę, a nie przekierowanie.transaction_id. Częsty błąd: branie cart_id zamiast referencji zamówienia. Numer koszyka bywa zmieniany, a powtórne wejście na potwierdzenie generuje kolejny purchase z tym samym lub pustym identyfikatorem. GA4 tego nie zdeduplikuje.currency, GA4 przypisze kwotę do waluty property — 100 EUR policzy jako 100 PLN. Przy multistore z jednym measurement ID dane kilku sklepów się zlewają, a wersje językowe (/pl/, /en/) warto rozdzielić parametrem, jeśli raportujesz je osobno.W PrestaShop pomiar siada zwykle na modułach i kontrolerach. W WooCommerce najczęściej na tym, że dwie wtyczki robią to samo albo żadna nie robi tego, czego potrzebujesz. Zanim zaczniesz porównywać liczby, ustal, kto u Ciebie wysyła zdarzenia.
Wtyczka czy GTM. Oficjalna wtyczka Google Analytics for WooCommerce (dawniej WooCommerce Google Analytics Integration) po wpisaniu Measurement ID sama wysyła view_item, add_to_cart, begin_checkout i purchase. GTM nie wysyła nic sam — to kontener, do którego trafia dataLayer, a tag GA4 zamienia go na event. Wtyczka to szybsze wdrożenie i mniej wiedzy; GTM to kontrola nad parametrami i możliwość wykluczenia np. zamówień B2B. Nie uruchamiaj obu równolegle: podwójny purchase to najczęstszy duplikat w audytach. Dokumentacja WooCommerce opisuje, co robi wtyczka i jak ją skonfigurować.
Czego nie robi żadna z nich: nie zna statusu płatności, nie wycofuje zdarzenia po failed, nie wysyła refundów, nie widzi zamówień dodanych ręcznie z panelu, nie koryguje korekt i chargebacków.
Kiedy ma polecieć purchase. Domyślnie przy wejściu na stronę potwierdzenia. Jeśli bramka przekierowuje poza sklep i klient nie wróci (zamknięta karta, timeout), eventu nie będzie. Przy przelewie tradycyjnym ze statusem pending event poleci, choć pieniędzy jeszcze nie ma, a przy failed też mógł już polecieć. Poprawna konfiguracja: wysyłka przez Measurement Protocol po zmianie statusu na processing lub completed, z pominięciem failed i cancelled.
HPOS. Zamówienia trzymane w tabelach wc_orders i wc_orders_meta, nie w postmeta. Integracje czytające _order_total przez get_post_meta zwracają null — event leci z wartością 0 albo nie leci wcale. Przed włączeniem HPOS sprawdź deklarację zgodności każdej wtyczki pomiarowej.
Testy, kupony, waluty. Zamówienia testowe właściciela i zakupy na 100% rabacie zawyżają raport — filtruj je po adresie e-mail albo wykluczaj wewnętrzne IP. Wartość purchase ma być kwotą faktycznie zapłaconą, po rabacie i po zwrotach częściowych; GTM często bierze subtotal z dataLayer i zawyża o wartość kuponu. Przy kilku walutach GA4 sumuje kwoty bez przeliczania — dodaj wymiar Currency, inaczej PLN i EUR zleją się w jedną bezsensowną liczbę.
Procedura jest jedna i zajmuje około godziny. Warunek: porównujesz zamknięty okres, najlepiej pełny miesiąc zakończony minimum trzy dni temu — GA4 dociąga dane z opóźnieniem, a zamówienia zmieniają statusy.
Tolerancja. 3–10% braków w liczbie transakcji w skali miesiąca to norma przy Consent Mode i adblockach. 15–20% i więcej albo różnica systematycznie rosnąca oznacza błąd implementacji. Zgodna liczba transakcji przy innej kwocie to prawie zawsze rabat, wysyłka, podatek lub waluta — nie tracking.
| Objaw | Prawdopodobna przyczyna | Co sprawdzić |
|---|---|---|
| Brakuje 5–10% transakcji, różnica stabilna | Consent Mode, adblocki, ITP | wskaźnik zgody w CMP; czy event leci z Measurement Protocol |
| Zgodna liczba, inna kwota | rabat, wysyłka, podatek, waluta | czy value = kwota po rabacie; wymiar Currency |
| Duplikaty transakcji | odświeżenie strony potwierdzenia, wtyczka + GTM | dwa źródła purchase jednocześnie |
| Ponad 20% braków, różnica rośnie | bramka bez powrotu do sklepu, niekompatybilność z HPOS | logi Measurement Protocol, zgodność wtyczek |
Od 10 listopada 2024 w Polsce obowiązuje Prawo komunikacji elektronicznej, które zastąpiło art. 173 Prawa telekomunikacyjnego. Zgoda na cookies analityczne i marketingowe nie jest dobrą wolą właściciela sklepu, a Consent Mode v2 to mechanizm, który przekazuje tę zgodę do Google.
Co dzieje się z eventem bez zgody. Gdy analytics_storage = denied, tag GA4 nie zapisuje cookie _ga i nie wysyła identyfikatora użytkownika. Wysyła tzw. cookieless ping: zdarzenie dociera do Google, ale nie pojawia się w standardowych raportach i nie da się go przypisać do użytkownika ani sesji. purchase z takiego pingu nie wejdzie do raportu sprzedaży. Przy ad_storage = denied i ad_user_data = denied Google Ads nie dostaje sygnałów konwersji, a przy ad_personalization = denied nie zbuduje remarketingu.
Modelowanie konwersji. GA4 potrafi oszacować konwersje użytkowników, którzy odmówili — pod warunkiem wystarczającego wolumenu danych i włączonego modelowania w ustawieniach usługi. Odtwarza liczbę konwersji na poziomie zagregowanym. Nie odtwarza ścieżek użytkownika, lejka na poziomie produktu, zdarzeń niestandardowych, retencji, danych demograficznych ani przypisania do konkretnego transaction_id. Nie odzyskasz z niego listy brakujących zamówień.
Skala ucieczki danych. Typowo 20–40% odmów w banerze (silnie zależy od CMP i sposobu prezentacji) plus 5–15% adblocków, więcej w publice technicznej. Efekt: GA4 pokazuje 55–80% transakcji. To nie awaria, to definicja narzędzia.
Dlaczego trend zostaje użyteczny. Jeśli baner i CMP się nie zmieniają, wskaźnik zgody jest w miarę stały, więc porównania tydzień do tygodnia i miesiąc do miesiąca w procentach mają sens. Uwaga: podmiana CMP albo dodanie „akceptuj wszystko” na pierwszym planie podnosi wskaźnik zgody o kilkanaście punktów procentowych i łamie serię — oznacz to w raporcie jako zmianę metodyki.
Praktyka raportowania. W raporcie wewnętrznym podawaj udział kanałów w konwersjach w procentach, konwersję jako konwersje do zakończonych sesji oraz AOV i przychód z panelu sklepu. Z GA4 bierz wyłącznie wskaźniki względne i kierunek trendu. Kwoty w złotych zawsze z systemu, który wystawia dokumenty.
Zamiast pytać „czy GA4 pokazuje prawdę”, zapytaj „na jakie pytanie odpowiada”. Odpowiada na siedem, a każda odpowiedź przekłada się na konkretną decyzję w sklepie.
Gdzie jest granica: każda z tych metryk jest względna i pomiarowa. GA4 nie zna faktur, korekt, zwrotów i chargebacków. W momencie pytania „ile faktycznie zarobiłem na kampanii X” wychodzisz z GA4 i sięgasz do panelu sklepu lub ERP — tam jest prawda finansowa, tu jest prawda behawioralna.
| Metryka | Co realnie mówi | Kiedy idziesz do ERP / panelu sklepu |
|---|---|---|
| view_item → add_to_cart | Atrakcyjność karty produktu i ceny | Gdy chcesz znać marżę na produkcie |
| add_to_cart → begin_checkout | Tarcie w koszyku (koszt dostawy, próg darmowej wysyłki) | Gdy weryfikujesz realny koszt wysyłki |
| begin_checkout → purchase | Niezawodność płatności i dostaw | Gdy porównujesz statusy zamówień i płatności |
| Konwersja wg źródła | Jakość ruchu, nie rentowność | Gdy liczysz realny zwrot z kampanii |
| Przybliżony ROAS | Kierunek, nie wynik | Zawsze przy rozliczeniu budżetu |
Zanim ktoś zleci przepisanie implementacji od zera, warto sprawdzić cztery rzeczy w ustalonej kolejności. Całość zajmuje około 30 minut.
Test zakupu od początku: wejście z UTM, dodanie do koszyka, przejście przez płatność, powrót na stronę sklepu. purchase powinien pojawić się w DebugView w kilkadziesiąt sekund (raporty standardowe mają 24–48 h opóźnienia). Sprawdź, czy transaction_id jest unikalny i niepusty — wartość „undefined” albo identyfikator sesji to klasyka. Ustal też, czy value zawiera VAT i dostawę, i czy dokładnie ta sama kwota leci do Google Ads.
Wina sklepu: redirect po płatności na domenę bramki, gdzie nie ma GTM; strona potwierdzenia renderowana po POST; purchase odpalany przy statusie „oczekujące na płatność”. Warto przejrzeć, jak zmieniają się statusy zamówień w dokumentacji WooCommerce — purchase powinien odpowiadać statusowi opłacenia, nie złożenia.
Wina kontenera: brak „Once per event”, dwa tagi purchase, trigger na wszystkich stronach, nieuzupełnione mapowanie pól dataLayer.
| Objaw | Pierwsze sprawdzenie | Typowa przyczyna |
|---|---|---|
| Zero danych w GA4 | Realtime w oknie incognito | Brak tagu bazowego, blokada consent |
| page_view jest, purchase nie | DebugView po teście zakupu | Trigger na złym URL (koszyk zamiast potwierdzenia) |
| purchase jest, value = 0 | Parametry zdarzenia w DebugView | Brak mapowania value i currency w GTM |
| purchase zdublowany | BigQuery: count vs count distinct transaction_id | Brak „Once per event”, odświeżenie strony potwierdzenia |
| purchase tylko z jednej metody płatności | Test każdej bramki po kolei | Redirect poza stronę z kontenerem GTM |
Traktowanie wartości „purchase revenue” z GA4 jako przychodu księgowego i rozliczanie na tej podstawie podatku lub prowizji.
Jak wykryć: Porównaj jedną fakturę z odpowiadającym jej zdarzeniem purchase w GA4 — zobaczysz różnicę w VAT, koszcie dostawy i rabacie na koszyk.
Jak naprawić: Ustal jedną definicję przychodu w GA4 (najczęściej netto, bez dostawy) i zapisz ją w dokumentacji pomiaru. Do rozliczeń używaj panelu sklepu, bazy danych lub ERP — nigdy GA4.
Tag purchase odpalany na stronie potwierdzenia zamówienia, zanim płatność zostanie potwierdzona.
Jak wykryć: Złóż zamówienie z metodą płatności, którą następnie porzucisz (np. przelew tradycyjny, Przelewy24 bez dokończenia). Sprawdź, czy purchase poleciał.
Jak naprawić: Przenieś wysyłkę eventu na moment zmiany statusu na opłacone — przez webhook bramki, status w bazie lub server-side tagging. Zamówienia porzucone przy płatności nie są sprzedażą.
Brak unikalnego transaction_id lub jego nadpisywanie przy każdym wejściu na stronę potwierdzenia.
Jak wykryć: W GA4 w raporcie Ecommerce → Transactions sprawdź liczbę zdarzeń purchase w stosunku do liczby unikalnych identyfikatorów transakcji.
Jak naprawić: Wymuś unikalny identyfikator z bazy sklepu (np. numer zamówienia z prefiksem) i zablokuj ponowną wysyłkę dla tego samego ID. Odświeżenie strony nie może generować drugiego purchase.
Porównywanie liczb z otwartego, bieżącego okresu, w którym dane jeszcze spływają, a zwroty nie zostały zaksięgowane.
Jak wykryć: Zestaw ten sam dzień w GA4 i w panelu sklepu dzień po dniu — rozbieżność rośnie przy najmłodszych datach.
Jak naprawić: Analizuj wyłącznie zamknięte okresy, najlepiej z co najmniej 7-dniowym opóźnieniem na zwroty i korekty. Do bieżącego monitoringu używaj trendów, nie kwot.
Ignorowanie Consent Mode i odrzuconych zgód analitycznych przy porównaniu 1:1 z backendem.
Jak wykryć: Zestaw liczbę sesji z GA4 z liczbą sesji z serwera WWW lub z logów — różnica to w dużej mierze użytkownicy bez zgody i z adblockami.
Jak naprawić: Zmierz udział ruchu bez zgody, a następnie ustal tolerancję dla raportów (często 10–25% w polskim e-commerce). Do decyzji o zgodności szukaj proporcji, nie równości co do złotówki.
Pomiar na własnych, testowych zamówieniach i na ruchu wewnętrznym bez wykluczeń.
Jak wykryć: Sprawdź, czy w ostatnich 30 dniach w GA4 występują zdarzenia purchase z adresów IP lub kont oznaczonych jako firmowe.
Jak naprawić: Dodaj filtr wewnętrznego IP w GA4 i w tagu GTM, oznacz zamówienia testowe w sklepie i wyklucz je z eksportu. Inaczej porównujesz dwie różne populacje.
GA4 odpowiada na pytanie, jak klient doszedł do zakupu — nie ile firma zarobiła. Rozbieżności z panelem sklepu są wpisane w naturę tego narzędzia: wynikają ze zgód, zwrotów, duplikatów i różnic w definicji przychodu. Zamiast szukać „błędu w GA4”, ustal definicję przychodu, porównuj wyłącznie zamknięte okresy i zestawiaj transakcje po identyfikatorze. Wtedy w ciągu godziny dostaniesz jasną odpowiedź, czy różnica jest w normie, czy wymaga naprawy.
W praktyce nie. GA4 nie zna zwrotów, korekt, chargebacków, VAT-u ani statusu płatności, a część użytkowników nie wyraża zgody na analitykę. Możesz zbliżyć liczby do siebie, ale równość co do złotówki nie jest realnym celem.
W polskim e-commerce typowy przedział to kilkanaście procent na korzyść backendu, głównie z powodu braku zgód, adblocków i ograniczeń pomiaru w przeglądarkach. Wszystko powyżej 20–25% wymaga diagnozy, bo może oznaczać błąd w tagu lub duplikaty.
Najczęstsze powody to tag purchase odpalany przed potwierdzeniem płatności, duplikaty przy odświeżeniu strony potwierdzenia oraz zamówienia testowe. Sprawdź, czy każdy purchase ma unikalny transaction_id i czy event leci dopiero po zmianie statusu na opłacone.
Nie powinieneś. GA4 to narzędzie behawioralne — pokazuje, jak użytkownik doszedł do zakupu, a nie ile faktycznie wpłynęło na konto. Do rozliczeń używaj panelu sklepu, bazy danych lub systemu ERP.
Zestaw transakcje z GA4 i z backendu po transaction_id za ten sam zamknięty okres. Jeśli identyfikatorów ubywa po stronie sklepu, problem jest w konfiguracji tagu. Jeśli backend ma transakcje bez pary w GA4, przyczyną jest najczęściej brak zgody lub odcięty pomiar.
Consent Mode poprawia modelowanie, ale nie odtwarza danych ze wszystkich odrzuconych zgód. Różnica się zmniejszy, jednak nadal będzie widoczna. To narzędzie do oszacowania skali, nie do wyrównania raportów 1:1.
Jeśli chcesz mieć pewność, że pomiar w Twoim sklepie jest skonfigurowany poprawnie — od tagu purchase po obsługę zgód i wielowalutowości — odezwij się do DropDigital. Zrobimy audyt konfiguracji i pokażemy, gdzie tracisz dane.