Meta liczy zakupy podwójnie: skąd dubel i jak go znaleźć w 15 minut
Zdublowane zakupy w Meta: cztery źródła dubla (wtyczka, Pixel, GTM, odświeżenie strony), jak je policzyć w Menedżerze zdarzeń i naprawić w trzech krokach.

Spis treści
Fakty w skrócie (stan na 2026-10-29)
- Meta łączy zdarzenia z Pixela i z serwera, gdy mają tę samą nazwę i ten sam identyfikator (
eventID/event_id) i dotrą w ciągu 48 godzin. - Bez wspólnego identyfikatora to samo zamówienie liczy się dwa razy lub więcej.
- Alternatywna metoda (
fbp/external_id) zwykle działa tylko, gdy przeglądarka jest pierwsza. - Basketly wysyła jeden zakup do jednego zbioru danych raz; duble z innych dróg wymagają wspólnego identyfikatora albo wyłączenia jednej drogi.
- Przyjęcie zdarzenia przez Metę nie dowodzi optymalizacji ani przypisania zakupu reklamie.
Sklep ma 22 zamówienia, a Meta pokazuje 60 zakupów. Takie rozbieżności opisują właściciele sklepów: „We’re using the native Shopify integration and the purchase events are massively overblown. Like 3x.” (tłum.: używamy natywnej integracji Shopify i zdarzenia zakupu są mocno zawyżone, jakieś 3 razy; r/FacebookAds, wątek). Albo w skrócie z polskiej agencji: równoczesny Pixel, wtyczka i GTM Server-Side wysyłają to samo zdarzenie bez wspólnego event_id, a efekt to „zdublowane konwersje i raporty, którym nikt nie ufa” (KC Mobile).
Poniżej: skąd się bierze dubel, jak go policzyć i naprawić. Jeśli problem jest odwrotny (Meta pokazuje mniej niż sklep), zacznij od tekstu Dlaczego Meta pokazuje mniej zakupów niż sklep.
Cztery źródła dubla
1. Kilka dróg wysyłających ten sam zakup
Pixel wklejony w kod sklepu, wtyczka platformy sklepowej, menedżer tagów i GTM Server-Side potrafią każdy osobno wysłać Purchase. Meta dostaje trzy zdarzenia o jednym zamówieniu. To najczęstszy przypadek w sklepach, które z czasem „dokładały” kolejne narzędzia.
2. Brak wspólnego identyfikatora
Nawet gdy chcesz mieć dwa kanały (Meta zaleca Pixel obok Conversions API), muszą się zgadzać dwie rzeczy: eventID w Pixelu równe event_id w API oraz ta sama nazwa zdarzenia. Gdy przeglądarka i serwer losują identyfikator osobno, para nie pasuje. Ktoś na Reddicie ujął to tak: „constant problem with event deduplication as capi and browser ID are always different” (wątek).
3. Odświeżenie strony podziękowania
Kod zakupu siedzi na stronie podziękowania. Klient odświeża ją, wraca z zakładki albo otwiera link z maila i zdarzenie odpala się ponownie. Poradniki agencji wymieniają to jako osobną przyczynę „podwójnego Purchase”.
4. Dwa Pixele naraz
Stary i nowy zbiór danych w kodzie sklepu, albo Pixel dodany raz przez wtyczkę i raz ręcznie. Każdy wysyła swoje zdarzenie, a dedupe między dwoma Pixelami o różnych identyfikatorach nie zadziała.
Jak policzyć, czy masz dubel
- Wybierz jeden pełny dzień sprzed co najmniej dwóch dni. Policz opłacone zamówienia w sklepie.
- Otwórz Menedżer zdarzeń, swój zbiór danych, zdarzenie Purchase i sprawdź, ile zdarzeń odebrano tego dnia oraz z jakich źródeł (przeglądarka, serwer).
- Wynik: zdarzeń wyraźnie więcej niż zamówień oznacza dubel. Mniej niż zamówień to inny problem, opisany w tekście o brakujących zakupach.
- Zakładka deduplikacji. W szczegółach zdarzenia Meta pokazuje odsetek zdeduplikowanych zdarzeń. Wyższy jest lepszy, a przy zbyt niskim pojawia się ostrzeżenie. Meta opisuje niski odsetek jako „Low Overlap”: wysyłasz nieunikalne klucze deduplikacji albo klucz tylko z jednego źródła.
- Podejrzyj identyfikatory. Dla jednego zamówienia sprawdź, jaki
event_idmają zdarzenie z przeglądarki i z serwera. Różne albo brak jednego z nich to przyczyna.
Naprawa w trzech krokach
- Wypisz każdą drogę, którą idzie
Purchase: Pixel w kodzie, wtyczka, tagi, GTM Server-Side, własny adapter, narzędzie takie jak Basketly. Dla każdej zapisz, czy wysyła z przeglądarki, czy z serwera. - Zostaw jedną drogę na zdarzenie albo połącz je identyfikatorem. Jeśli potrzebujesz dwóch kanałów, ustaw w obu tę samą nazwę zdarzenia i ten sam identyfikator zbudowany z numeru zamówienia, np.
purchase_ORDER-123. W Pixelu przekazujesz go jakoeventID, na serwerze jakoevent_id. Powtórzenia tego samego zamówienia muszą dostawać ten sam identyfikator. Pełny opis: deduplikacja zdarzeń Pixela i Conversions API. - Sprawdź po kilku dniach. Zakładka deduplikacji i porównanie zdarzeń z zamówieniami. Jeśli sklep ma jednak dwie integracje serwerowe, zostaw jedną.
Nie poprawiaj danych wstecz: duble już policzone zostają w raportach. Ważne jest, żeby od teraz nowe zakupy liczyły się raz.
Jak uniknąć dubla przy następnej zmianie
Duble wracają zwykle po dołożeniu narzędzia. Zanim włączysz kolejną wtyczkę, kolejny tag albo kolejną integrację, która wysyła zakupy, zadaj trzy pytania:
- Czy ono wysyła
Purchase, a jeśli tak, to z przeglądarki, czy z serwera? - Jaki identyfikator zdarzenia ustawia i czy da się go zrobić taki sam jak w pozostałych drogach?
- Czy mogę wyłączyć zakup w którymś z istniejących narzędzi, zamiast dokładać kolejny kanał?
Po każdej takiej zmianie wróć na dwa dni do porównania zdarzeń z zamówieniami. To pięć minut, a oszczędza tygodnie raportów, które trzeba potem tłumaczyć klientowi lub szefowi.
Jak Basketly nie dubluje zakupów
W Basketly jeden zakup to jedna wysyłka do danego zbioru danych. Dwa mechanizmy to pilnują:
- Ten sam zakup przyjmujemy raz. Zdarzenie jest rozpoznawane po źródle, identyfikatorze zamówienia i statusie. Zamówienie odczytane drugi raz (np. przy kolejnym odczycie sklepu) nie tworzy drugiego zakupu.
- Ta sama wysyłka nie powstanie dwa razy. Do kolejki nie trafi drugi raz ta sama kombinacja: zbiór danych, nazwa zdarzenia, identyfikator zdarzenia i tryb (testowy lub produkcyjny), nawet z dwóch połączeń do tego samego zbioru danych. Ponowienia po błędzie sieci używają tego samego identyfikatora, więc Meta może je zdeduplikować.
Zakupy ze sklepu mają stały identyfikator zbudowany z numeru zamówienia (np. shoper-order-<numer>). Widzisz go w System → Zdarzenia → Historia wysyłek (opcjonalna kolumna z identyfikatorem zdarzenia). To ułatwia porównanie z tym, co wysyła Twój Pixel.
Pozostaje jedna rzecz, której Basketly nie zrobi za Ciebie: nie zmieni kodu Pixela ani wtyczki w sklepie. Jeśli Pixel i Basketly wysyłają ten sam zakup, Meta połączy je tylko przy wspólnej nazwie i identyfikatorze. Gdy Twój Pixel nie pozwala ustawić eventID, uczciwsze jest wysyłać Purchase tylko z jednej strony: najczęściej z serwera, a Pixel zostawić dla zdarzeń z przeglądarki (wyświetlenie produktu, dodanie do koszyka).
Pomocne po wdrożeniu: Konwersje → Bilans zakupów pokazuje, ile zakupów Basketly wysłał i przyjął, dzień po dniu, a Autodiagnostyka → Wysyłka do Meta porównuje statystyki Twojego zbioru danych (od Mety) z wysyłkami Basketly. Dwa razy więcej zdarzeń u Mety niż w Basketly to wskazówka, że zakupy płyną jeszcze innym kanałem. Opisujemy to w tekście o bilansie zakupów.
Czego Basketly nie rozwiąże
- Duble z cudzych kanałów. Basketly deduplikuje to, co sam wysyła. Zdarzenia z wtyczki, menedżera tagów i GTM idą obok.
- Dostarczenia „dokładnie raz”. Kolejka działa w modelu „co najmniej raz”, a ostatnie słowo w deduplikacji ma Meta.
- Duble już policzone. Raporty z przeszłości zostają takie, jakie były.
- Przypisania do reklamy. Przyjęcie zakupu przez Metę nie dowodzi optymalizacji ani atrybucji.
Następny krok
Zrób punkty 1 i 2 z listy „Jak policzyć” dla wczorajszego dnia. Jeśli chcesz zobaczyć Historię wysyłek z identyfikatorami zdarzeń, otwórz demo. Aby podłączyć własny sklep, załóż konto; limity planów są w cenniku. Jak działa wysyłka z serwera, opisuje strona Meta Conversions API.
Źródła
- Meta for Developers: Deduplicate Pixel and Server Events (
event_id+event_name, okno 48 godzin, metodafbp/external_id, jej ograniczenia) - Meta for Developers: Verifying Your Setup (zakładka deduplikacji, „Low Overlap”)
- Meta for Developers: Server Event Parameters (
event_idjako zalecany do deduplikacji) - KC Mobile: Ile kosztuje Conversions API na Facebooku (cytat o zdublowanych konwersjach)
- r/FacebookAds: wątek o zawyżonych zakupach (Shopify), wątek o różnych identyfikatorach CAPI i przeglądarki
O autorze
Aleksander
Założyciel Basketly.io, BooksyAudit.pl i SMSPortal.app
Założył Basketly.io, BooksyAudit.pl i SMSPortal.app. W bazie wiedzy opisuje, jak przekazywać do Meta zakupy ze sklepu, jak dbać o katalog produktów i jak liczyć koszt zakupu z reklam.
Wszystkie artykuły autoraNajczęściej zadawane pytania
Jak sprawdzić, czy mam dubel?
Weź jeden pełny dzień, policz opłacone zamówienia w sklepie i zdarzenia Purchase w Menedżerze zdarzeń. Wyraźnie więcej zdarzeń niż zamówień to dubel. Potem otwórz szczegóły zdarzenia Purchase i zakładkę deduplikacji: Meta pokazuje tam odsetek zdeduplikowanych zdarzeń i ostrzega, gdy jest za niski.
Czy mogę mieć Pixel i Conversions API naraz?
Tak, Meta wręcz to zaleca jako konfigurację nadmiarową. Warunek: to samo zdarzenie z obu kanałów ma tę samą nazwę (event_name) i ten sam identyfikator (eventID w Pixelu, event_id w API), a para dociera w ciągu 48 godzin. Bez tego Meta policzy dwa zdarzenia.
Czy dubel psuje tylko raporty, czy też optymalizację?
Raporty na pewno, bo pokazują więcej sprzedaży niż jest. Wpływ na optymalizację zależy od Mety i nie da się go zmierzyć z zewnątrz, więc nie obiecujemy skutku. Zawyżone dane są po prostu złym punktem wyjścia do decyzji o budżecie.
Dlaczego zakup liczy się przy każdym odświeżeniu strony podziękowania?
Bo kod Pixela jest na stronie i odpala się za każdym razem, gdy strona się ładuje. Pomaga stały eventID zbudowany z numeru zamówienia: Meta połączy powtórzone zdarzenia z tym samym identyfikatorem w jedno, o ile dotrą w oknie 48 godzin.
Czy Basketly sam dubluje zakupy?
Nie po swojej stronie. Jeden zakup to jedna wysyłka do danego zbioru danych: Basketly nie wyśle drugi raz tego samego zdarzenia o tym samym identyfikatorze. Duble z innej drogi (Pixel, wtyczka) Meta musi połączyć sama, a to wymaga wspólnego identyfikatora albo wyłączenia zakupu w jednym kanale.
Czy deduplikacja po fbp zastąpi event_id?
Meta opisuje ją jako alternatywę, która zwykle działa tylko, gdy zdarzenie z przeglądarki dotrze przed serwerowym, i nie usuwa duplikatów, gdy używasz tylko jednego źródła. Zalecana jest metoda z event_id i event_name.
