Spis treści
- Jak GA4 deduplikuje transakcje i dlaczego to nie wystarcza
- Skąd biorą się duplikaty transakcji w GA4 – 7 przyczyn
- Jak wykryć duplikaty transakcji w GA4 i BigQuery
- Jak wyeliminować duplikaty transakcji krok po kroku
- Duplikaty w Google Ads i Meta: osobne mechanizmy deduplikacji
- Co zrobić z historycznymi duplikatami
- Najczęściej zadawane pytania
Duplikaty transakcji w GA4 to sytuacja, w której jedno zamówienie zostaje zapisane jako dwa lub więcej zdarzeń purchase, przez co raporty pokazują zawyżoną liczbę transakcji i przychód. Najczęstsze przyczyny to ponowne wyświetlenie strony podziękowania, tag wysyłany jednocześnie przez wtyczkę sklepu i przez GTM oraz podwójne wysyłanie z przeglądarki i serwera. GA4 deduplikuje zakupy o tym samym identyfikatorze transakcji, ale tylko w strumieniach internetowych i tylko w obrębie tego samego użytkownika, więc nie wyłapie wszystkich przypadków. Poniżej pokazujemy, jak wykryć duplikaty, ustalić ich przyczynę i zablokować je u źródła.
Najważniejsze w skrócie
- GA4 usuwa duplikaty zakupów z tym samym
transaction_idtylko w strumieniach internetowych i tylko dla tego samego użytkownika. - Pusty identyfikator transakcji (
transaction_id="") sprawia, że GA4 deduplikuje wszystkie takie zakupy, co zaniża dane zamiast je poprawiać. - Najpewniejszym miejscem wykrywania duplikatów jest eksport do BigQuery z zapytaniem grupującym zakupy według identyfikatora transakcji.
- Najskuteczniejsza blokada działa w sklepie: platforma przekazuje zdarzenie zakupu do warstwy danych tylko raz dla danego zamówienia.
- Ten sam numer zamówienia powinien trafiać do GA4, Google Ads, Meta i CRM, bo każda z tych platform deduplikuje po swoim identyfikatorze.
Jak GA4 deduplikuje transakcje i dlaczego to nie wystarcza
GA4 automatycznie usuwa duplikaty zdarzeń purchase z tym samym identyfikatorem transakcji, ale ochrona ma wyraźne granice. Dokumentacja Google wskazuje, że działa tylko dla danych ze strumieni internetowych i dotyczy transakcji tego samego użytkownika.
Z tego wynikają sytuacje, w których deduplikacja po stronie GA4 nie zadziała:
| Sytuacja | Czy GA4 usunie duplikat | Dlaczego |
|---|---|---|
Ten sam transaction_id, ta sama przeglądarka, odświeżenie strony |
zwykle tak | ten sam użytkownik i identyfikator |
Ten sam zakup z przeglądarki i z serwera z innym client_id |
nie | GA4 widzi dwóch różnych użytkowników |
| To samo zamówienie z dwoma różnymi identyfikatorami (np. numer zamówienia i numer płatności) | nie | identyfikatory się różnią |
| Strumień aplikacji | nie | deduplikacja działa tylko w strumieniach internetowych |
| Brak identyfikatora lub pusty ciąg | deduplikacja zbyt agresywna | puste wartości są traktowane jako jeden identyfikator |
Ostatni wiersz to pułapka odwrotna do duplikatów. Google ostrzega, że przy transaction_id="" GA4 zdeduplikuje wszystkie zakupy z pustym identyfikatorem, więc zaniżysz liczbę transakcji. Identyfikator musi być dynamiczny i unikalny dla każdego zamówienia, nie może zawierać danych osobowych i nie powinien być współdzielony między użytkownikami.
Nawet gdy deduplikacja zadziała w raportach, duplikat jest sygnałem błędu we wdrożeniu, który zwykle dotyka też Google Ads i Meta. Zawyżony przychód oznacza zawyżony ROAS, a jeśli importujesz zakupy z GA4 jako konwersje, strategie stawek uczą się na nieprawdziwych wartościach. Jak to wpływa na wybór strategii, opisujemy w tekście o docelowym ROAS i maksymalizacji wartości konwersji.
Skąd biorą się duplikaty transakcji w GA4 – 7 przyczyn
Duplikaty powstają albo dlatego, że ta sama strona wysyła zdarzenie kilka razy, albo dlatego, że zakup wysyłają dwa różne mechanizmy. Odstęp czasu między zdublowanymi zdarzeniami zwykle zdradza przyczynę.
| Przyczyna | Typowy odstęp między zdarzeniami | Jak rozpoznać |
|---|---|---|
| Odświeżenie lub ponowne otwarcie strony podziękowania | minuty, godziny, dni | ten sam użytkownik, różne sesje lub odsłony |
| Wtyczka sklepu i GTM wysyłają zakup jednocześnie | ułamki sekundy | dwa żądania collect z en=purchase w karcie Network |
| Dwie reguły uruchamiające ten sam tag | ułamki sekundy | tag widoczny dwa razy jako uruchomiony w podglądzie GTM |
| Podwójny wpis do warstwy danych | ułamki sekundy | dwa zdarzenia purchase w karcie Data Layer |
| Powrót z bramki płatności i drugie przekierowanie | sekundy | dwa wejścia na stronę podziękowania w jednej sesji |
| Zakup z przeglądarki i z serwera | sekundy, minuty | różne user_pseudo_id przy tym samym identyfikatorze transakcji |
| Różne identyfikatory dla jednego zamówienia | dowolny | zgodna kwota i czas, różne transaction_id |
W polskich sklepach często pojawia się przypadek bramek płatności. Klient płaci przez PayU, Przelewy24 albo BLIK, wraca na stronę podziękowania, a po chwili sklep przekierowuje go ponownie po potwierdzeniu statusu płatności. Jeśli tag zakupu jest uruchamiany na podstawie adresu strony podziękowania, oba wejścia wysyłają zdarzenie.
Drugi typowy scenariusz to migracja. Ktoś wdraża GA4 przez GTM, ale nie wyłącza oficjalnej integracji platformy sklepowej, która też wysyła zakupy. Na stronie działają wtedy dwa źródła tego samego zdarzenia, często z tym samym identyfikatorem usługi.
Jak wykryć duplikaty transakcji w GA4 i BigQuery
Duplikaty najprościej wykryć, grupując zakupy według identyfikatora transakcji i szukając identyfikatorów, które wystąpiły więcej niż raz. W GA4 zrobisz to w eksploracji, ale pełny obraz da eksport do BigQuery.
W GA4 utwórz eksplorację dowolną z wymiarem identyfikatora transakcji i metryką zakupów e-commerce. Posortuj malejąco według liczby zakupów i przejrzyj wiersze z wartością większą niż 1. Sprawdź też wiersz „(not set)” – oznacza zakupy bez identyfikatora. Raporty pokazują dane już po przetworzeniu, więc część duplikatów może być w nich niewidoczna.
W BigQuery eksport zawiera zdarzenia w postaci zbliżonej do surowej, dlatego to najlepsze miejsce diagnozy. Poniższe zapytanie znajdzie zdublowane identyfikatory z ostatnich dni i pokaże, czy duplikaty pochodzą od jednego, czy od kilku użytkowników:
SELECT
ecommerce.transaction_id,
COUNT(*) AS liczba_zdarzen,
COUNT(DISTINCT user_pseudo_id) AS liczba_uzytkownikow,
MIN(TIMESTAMP_MICROS(event_timestamp)) AS pierwsze_zdarzenie,
MAX(TIMESTAMP_MICROS(event_timestamp)) AS ostatnie_zdarzenie,
TIMESTAMP_DIFF(MAX(TIMESTAMP_MICROS(event_timestamp)),
MIN(TIMESTAMP_MICROS(event_timestamp)), SECOND) AS odstep_s,
SUM(ecommerce.purchase_revenue) AS przychod_lacznie
FROM `twoj-projekt.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20261001' AND '20261026'
AND event_name = 'purchase'
GROUP BY 1
HAVING COUNT(*) > 1
ORDER BY liczba_zdarzen DESC;
Odstęp poniżej sekundy wskazuje na dwa tagi lub podwójny wpis do warstwy danych. Odstęp liczony w minutach lub godzinach to zwykle ponowne wyświetlenie strony podziękowania. Dwóch różnych użytkowników przy jednym identyfikatorze to najczęściej wysyłka z przeglądarki i serwera. Jeśli dopiero zaczynasz pracę z eksportem, przydadzą się pierwsze zapytania do danych GA4 w BigQuery.
Porównanie z systemem sklepu to trzeci test. Zestaw dzienną liczbę zamówień i przychód z panelu sklepu z danymi GA4. Różnica w górę oznacza duplikaty, różnica w dół – braki, np. przez odmowę zgody lub blokery. Typowe przyczyny rozbieżności między narzędziami omawiamy w artykule o różnicach w konwersjach GA4, Google Ads i Meta.
Jak wyeliminować duplikaty transakcji krok po kroku
Duplikaty eliminujesz u źródła, a dopiero potem dokładasz zabezpieczenia w GTM. Kolejność ma znaczenie, bo blokada w przeglądarce nie naprawi problemu dwóch mechanizmów wysyłki.
- Usuń drugie źródło zakupu. Sprawdź w Tag Assistant, ile tagów i identyfikatorów GA4 działa na stronie podziękowania. Jeśli wysyła je wtyczka sklepu i GTM, wyłącz jedno z nich.
- Uruchamiaj tag na zdarzeniu, a nie na adresie. Reguła oparta na zdarzeniu
purchasez warstwy danych jest pewniejsza niż reguła „odsłona strony /dziekujemy/”. - Wysyłaj zdarzenie ze sklepu tylko raz. Najlepsze rozwiązanie to flaga w bazie zamówień: platforma przekazuje zakup do warstwy danych przy pierwszym wyświetleniu strony podziękowania i oznacza zamówienie jako wysłane. Specyfikację takiego wpisu znajdziesz w artykule o warstwie danych dla e-commerce GA4.
- Używaj jednego identyfikatora. Ten sam numer zamówienia trafia do GA4, Google Ads, Meta i CRM. Nie używaj numeru płatności w jednym miejscu i numeru zamówienia w drugim.
- Wybierz jedną ścieżkę przeglądarka–serwer. Jeśli zakup wysyła serwer, przeglądarka nie powinna wysyłać go bezpośrednio do tej samej usługi GA4, chyba że oba zdarzenia mają ten sam identyfikator klienta i transakcji.
- Dodaj blokadę w GTM jako drugą linię obrony, zgodnie z przykładem poniżej.
- Sprawdź efekt w BigQuery po tygodniu tym samym zapytaniem.
Blokada w GTM składa się z dwóch elementów. Pierwszy to zmienna typu JavaScript niestandardowy, która zwraca true, jeśli dany identyfikator już został wysłany:
function() {
try {
var id = {{DLV - ecommerce.transaction_id}};
if (!id) return false;
var sent = JSON.parse(localStorage.getItem('pi_tx_sent') || '[]');
return sent.indexOf(String(id)) > -1;
} catch (e) {
return false;
}
}
Na jej podstawie tworzysz regułę wyjątku dla tagu zakupu (zmienna równa true blokuje tag). Drugi element to tag uruchamiany w sekwencji po tagu zakupu, który zapisuje identyfikator:
<script>
(function () {
try {
var id = {{DLV - ecommerce.transaction_id}};
if (!id) return;
var key = 'pi_tx_sent';
var list = JSON.parse(localStorage.getItem(key) || '[]');
if (list.indexOf(String(id)) === -1) {
list.push(String(id));
localStorage.setItem(key, JSON.stringify(list.slice(-20)));
}
} catch (e) {}
})();
</script>
Ta blokada działa tylko w obrębie jednej przeglądarki i nie pomoże, gdy klient otworzy potwierdzenie na innym urządzeniu. Zapis w pamięci przeglądarki to także przechowywanie informacji na urządzeniu użytkownika, więc uruchamiaj go zgodnie z ustawieniami zgód (np. razem z tagiem analitycznym), a w razie wątpliwości co do wymogów Prawa komunikacji elektronicznej skonsultuj rozwiązanie z prawnikiem.
Duplikaty w Google Ads i Meta: osobne mechanizmy deduplikacji
Google Ads i Meta deduplikują konwersje według własnych zasad, więc poprawka w GA4 nie wystarcza. Każda platforma potrzebuje identyfikatora przekazanego we właściwym polu.
- Google Ads odrzuca konwersje z tym samym identyfikatorem transakcji w obrębie tej samej akcji konwersji. Przekaż numer zamówienia w polu identyfikatora transakcji w tagu konwersji. Jeśli importujesz zakupy z GA4 i jednocześnie masz tag Google Ads, upewnij się, że tylko jedna z tych akcji jest konwersją podstawową, bo inaczej Smart Bidding policzy zakup dwa razy.
- Meta deduplikuje zdarzenia z piksela i Conversions API na podstawie pary
event_nameievent_id. Identyfikator zdarzenia musi być identyczny w obu kanałach; szczegóły opisujemy w artykule o deduplikacji Pixel i Conversions API.
Zawyżone konwersje w platformach reklamowych szczególnie mocno zniekształcają wskaźniki rentowności. Jak liczyć ROAS i POAS na wiarygodnych danych, pokazujemy w tekście o ROAS, POAS i MER.
Co zrobić z historycznymi duplikatami
Danych już przetworzonych w GA4 nie da się poprawić ani usunąć, ale możesz oczyścić je w raportach opartych na BigQuery. Do oceny historycznych okresów używaj danych po deduplikacji, a nie surowych raportów.
Najprostszy sposób to widok, który zostawia tylko pierwsze zdarzenie dla każdego identyfikatora transakcji:
SELECT * EXCEPT(nr)
FROM (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY ecommerce.transaction_id
ORDER BY event_timestamp) AS nr
FROM `twoj-projekt.analytics_123456789.events_*`
WHERE event_name = 'purchase'
)
WHERE nr = 1;
Nie wysyłaj zdarzeń refund dla zdublowanych zamówień. Zwrot z identyfikatorem transakcji odejmuje przychód tego zamówienia, a nie tylko duplikatu, więc pogorszysz dane zamiast je poprawić. Okres z błędem opisz w dokumentacji wdrożenia, żeby osoby porównujące wyniki rok do roku wiedziały, skąd skok.
Duplikaty to częsty punkt kontroli przed okresami szczytowej sprzedaży – sprawdzamy je w audycie tagów przed Black Friday. Nagły wzrost liczby zakupów bez wzrostu zamówień w sklepie może też wywołać automatyczny alert, co opisujemy w tekście o monitoringu tagów. Pozostałe poradniki diagnostyczne, w tym listę problemów z DebugView w GA4, znajdziesz w podtemacie Debugowanie tagów.
Najczęściej zadawane pytania
Czy GA4 sam usuwa duplikaty transakcji?
Częściowo. GA4 deduplikuje zdarzenia purchase z tym samym identyfikatorem transakcji, ale tylko w strumieniach internetowych i w obrębie tego samego użytkownika. Nie wyłapie duplikatu wysłanego z przeglądarki i z serwera z różnymi identyfikatorami klienta ani zamówienia zapisanego pod dwoma różnymi numerami. Dlatego duplikaty trzeba blokować także po stronie sklepu i tagów.
Jak sprawdzić, czy mam duplikaty transakcji w GA4?
Utwórz eksplorację z wymiarem identyfikatora transakcji i metryką zakupów, a następnie poszukaj identyfikatorów z wartością większą niż 1. Pełniejszy obraz da zapytanie w BigQuery grupujące zdarzenia purchase według transaction_id. Porównaj też dzienną liczbę zamówień z panelu sklepu z liczbą transakcji w GA4 – wyższa wartość w GA4 wskazuje na duplikaty.
Dlaczego mam duplikaty, skoro identyfikator transakcji jest wysyłany?
Najczęściej dlatego, że duplikat ma inny identyfikator użytkownika, np. jedno zdarzenie wysyła przeglądarka, a drugie serwer, albo dlatego, że w dwóch miejscach używasz różnych numerów dla tego samego zamówienia. Deduplikacja GA4 działa tylko dla tego samego użytkownika i identycznego identyfikatora. Sprawdź w BigQuery, ilu użytkowników przypada na zdublowany identyfikator.
Czy można usunąć duplikaty transakcji z danych historycznych GA4?
Nie. Danych przetworzonych w GA4 nie da się edytować ani usunąć, a wysłanie zdarzenia zwrotu odejmie przychód całego zamówienia, nie tylko duplikatu. Możesz natomiast oczyścić dane w BigQuery, zostawiając tylko pierwsze zdarzenie dla każdego identyfikatora transakcji, i na tej podstawie budować raporty w Looker Studio.
Czy pusty transaction_id może zaniżyć liczbę transakcji?
Tak. Google ostrzega, że przy pustym identyfikatorze transakcji GA4 zdeduplikuje wszystkie zakupy z pustą wartością, traktując je jak jedną transakcję. To samo dotyczy stałej wartości wysyłanej dla wszystkich zamówień. Identyfikator musi być dynamiczny, unikalny dla zamówienia i nie może zawierać danych osobowych klienta.