LW IT Solutions
« Przegląd bloga /Digital Marketing/Tutorials / Tutorial: Wdrożenie TikTok Events API w sklepach...
Ten artykuł w innych językach:

Tutorial: Wdrożenie TikTok Events API w sklepach internetowych

Tutorial: Wdrożenie TikTok Events API w sklepach internetowych
Spis treści
  1. Krok 1: Wygenerowanie event_id jeden raz
  2. Krok 2: Zdarzenie w przeglądarce
  3. Krok 3: Przechwycenie identyfikatorów, których serwer nie widzi
  4. Krok 4: Żądanie serwerowe
  5. Krok 5: Weryfikacja, czy deduplikacja działa
  6. Pozostając w granicach
  7. Pytania i odpowiedzi
  8. Źródła

Sam piksel TikTok raportuje mniej zakupów, niż sklep faktycznie realizuje. Blokery, ochrona przed śledzeniem w przeglądarce oraz osoby zamykające kartę, zanim strona potwierdzenia skończy się renderować, usuwają zdarzenia, które naprawdę wystąpiły. Wysłanie tych samych zakupów po raz drugi z serwera zamyka tę lukę — i tworzy nowy problem, ponieważ TikTok otrzymuje teraz dwa zgłoszenia jednego zakupu.

Rozwiązuje to wspólne event_id: jedna wartość generowana na zakup i wysyłana bez zmian obiema drogami. Poniższy przewodnik buduje tę architekturę od początku do końca dla sklepu — zdarzenie w przeglądarce, identyfikatory, których serwer sam z siebie nie widzi, żądanie serwerowe oraz weryfikację, czy deduplikacja faktycznie działa.

Dwutorowy przepływ: jedno event_id generowane na zakup, wysyłane przez piksel TikTok w przeglądarce i przez serwerowe Events API, łączone w Events Managerze, gdzie zgodny identyfikator sprawia, że zakup liczy się raz
Piksel dostarcza kontekst przeglądarki, serwer niezawodność – wspólne event_id utrzymuje je jako jedną konwersję.

Krok 1: Wygenerowanie event_id jeden raz

event_id musi powstać w jednym miejscu i zostać użyte ponownie, co wyklucza generowanie go niezależnie po obu stronach — dwie losowe wartości opisują z punktu widzenia TikToka dwie odrębne konwersje. Dla sklepu naturalnym źródłem jest numer zamówienia: istnieje już w momencie zakupu, jest stabilny i dostępny zarówno dla strony potwierdzenia, jak i dla backendu.

Prefiks rozdziela typy zdarzeń, bo jedno zamówienie potrafi wygenerować więcej niż jedno śledzone zdarzenie. event_id w postaci purchase-10432 dla zakupu i checkout-10432 dla rozpoczęcia checkoutu utrzymuje każdą parę przy własnym odpowiedniku. Skutkiem ubocznym jest to, że odświeżenie strony potwierdzenia generuje to samo event_id ponownie i zostaje zdeduplikowane zamiast policzone dwa razy.

Krok 2: Zdarzenie w przeglądarce

W pikselu TikTok identyfikator podróżuje w trzecim argumencie ttq.track, oddzielnie od właściwości zdarzenia:

ttq.track('CompletePayment', {
  contents: [
    { content_id: 'SKU-8891', content_type: 'product', quantity: 1, price: 149.00 }
  ],
  value: 149.00,
  currency: 'PLN'
}, {
  event_id: 'purchase-10432'
});

Nazwa zdarzenia również musi być zgodna po obu stronach. TikTok paruje oba zgłoszenia po kombinacji nazwy zdarzenia i event_id, więc CompletePayment w przeglądarce i Purchase na serwerze to dwa różne zdarzenia, które nigdy się wzajemnie nie zdeduplikują — niezależnie od tego, jak starannie dopasowano identyfikator.

Krok 3: Przechwycenie identyfikatorów, których serwer nie widzi

Dwie wartości istnieją wyłącznie w przeglądarce. ttclid pojawia się jako parametr URL, gdy odwiedzający trafia z reklamy TikTok, a _ttp to ciasteczko pierwszej strony ustawiane przez piksel. Obie poprawiają dopasowanie żądania serwerowego i obie trzeba utrwalić już przy wejściu — strona potwierdzenia znajduje się zwykle kilka przejść dalej, a parametru URL dawno tam nie ma:

// Przy wejsciu: utrwalenie click id na resztę wizyty
const ttclid = new URLSearchParams(window.location.search).get('ttclid');
if (ttclid) {
  document.cookie = 'shop_ttclid=' + encodeURIComponent(ttclid) +
                    ';max-age=2592000;path=/;secure;samesite=Lax';
}

W checkoucie obie wartości są odczytywane z ciasteczek i zapisywane przy rekordzie zamówienia, żeby backend miał je pod ręką przy budowaniu zdarzenia serwerowego. Adres IP i user agent odwiedzającego pochodzą z pierwotnego żądania HTTP i należą do tego samego rekordu — żądanie wysłane później z serwera nie ma ani jednego, ani drugiego z własnych źródeł.

Krok 4: Żądanie serwerowe

Events API przyjmuje POST na endpoint event/track/ w TikTok Business API, uwierzytelniony tokenem dostępu z TikTok Events Managera i zaadresowany do piksela przez event_source_id. Pola identyfikujące są normalizowane, a następnie haszowane SHA-256; nic identyfikującego nie opuszcza serwera jawnie:

{
  "event_source": "web",
  "event_source_id": "PIXEL_CODE",
  "data": [{
    "event": "CompletePayment",
    "event_time": 1789000000,
    "event_id": "purchase-10432",
    "user": {
      "email": "1f3a...",
      "phone": "9c22...",
      "external_id": "7b41...",
      "ttclid": "E.C.P.xxxxx",
      "ttp": "2ABCDe...",
      "ip": "203.0.113.7",
      "user_agent": "Mozilla/5.0 ..."
    },
    "properties": {
      "contents": [
        { "content_id": "SKU-8891", "content_type": "product", "quantity": 1, "price": 149.00 }
      ],
      "currency": "PLN",
      "value": 149.00
    },
    "page": { "url": "https://sklep.example.com/dziekujemy" }
  }]
}

Normalizacja przed haszowaniem rozstrzyga, czy identyfikatory w ogóle coś trafią: e-mail przycięty i zamieniony na małe litery, numer telefonu sprowadzony do cyfr w międzynarodowym formacie E.164. Ta sama wartość zahaszowana raz z Anna@Example.com , a raz z anna@example.com daje dwa niepowiązane skróty, z których tylko jeden może pasować. event_time to znacznik czasu uniksowego w sekundach, a żądanie należy tuż za potwierdzeniem zamówienia, a nie do nocnej paczki. TikTok odrzuca zdarzenia docierające zbyt późno, a zadanie wsadowe dowiaduje się o tym dopiero, gdy okno już się zamknęło.

Krok 5: Weryfikacja, czy deduplikacja działa

Pole test_event_code, pobrane z zakładki zdarzeń testowych w Events Managerze, kieruje żądanie do widoku testowego bez naruszania raportowania — tyle wystarczy, by potwierdzić, że ładunek jest przyjmowany, a pola zahaszowane rozpoznawane.

Sama deduplikacja ujawnia się dopiero na danych produkcyjnych. W Events Managerze zdarzenie zasilane z obu kanałów wykazuje liczby przeglądarkowe i serwerowe osobno, a różnica między ich sumą a zdeduplikowaną wartością całkowitą jest dowodem, że parowanie działa. Wartość całkowita równa dokładnie sumie obu kanałów oznacza, że nic nie jest łączone — zwykle wskutek rozbieżnej nazwy zdarzenia albo event_id generowanego osobno po każdej ze stron. Zestawienie zdeduplikowanej liczby z faktycznymi zamówieniami w backendzie sklepu to sprawdzenie, które ma znaczenie; własne liczby TikToka nie pokażą zakupu, którego nie zgłosił żaden kanał.

Pozostając w granicach

Oba kanały należą za ten sam sygnał zgody reklamowej. Żądanie serwerowe nie jest zwolnione ze zgody dlatego, że pochodzi z backendu: niesie te same dane klienta, a podstawą jego wysłania jest zgoda zebrana w przeglądarce — stan zgody trzeba więc zapisać przy zamówieniu i sprawdzić przed zbudowaniem żądania. Surowe adresy e-mail i numery telefonów istnieją tylko do momentu normalizacji i zahaszowania, a token dostępu należy do magazynu sekretów, a nie do kodu aplikacji, ponieważ uprawnia do zapisywania konwersji na koncie reklamowym.

Pytania i odpowiedzi

Dlaczego zdeduplikowana liczba nawet z Events API nie dorównuje liczbie zamówień w sklepie?

Ponieważ Events API zamyka tylko jedną z dwóch luk. Serwer odzyskuje zakupy, które pikselowi odebrały blokery, ochrona przed śledzeniem albo zamknięta karta. Zakupów bez zgody reklamowej słusznie nie wysyła, bo oba kanały zależą od tego samego sygnału zgody. Tych zamówień w TikToku brakuje trwale i nie jest to błąd pomiaru.

Zestawienie z kroku 5 nabiera więc znaczenia dopiero wtedy, gdy po obu stronach obejmuje tę samą populację: zdeduplikowaną liczbę porównuje się z zamówieniami, przy których zapisany stan zgody wskazuje na udzieloną zgodę. Jeśli luka nadal istnieje, leży we własnym łańcuchu, na przykład w zdarzeniu serwerowym, którego nigdy nie zbudowano, w odrzuconym żądaniu albo w zdarzeniu, które dotarło zbyt późno.

Pomaga zapisywanie odpowiedzi Events API przy zamówieniu. Każde zamówienie da się wtedy przypisać do jednego z czterech stanów: niewysłane z braku zgody, niewysłane mimo zgody, wysłane i odrzucone, wysłane i przyjęte. Tylko ostatni należy do liczby, którą powinien pokazywać TikTok, a każdy z dwóch środkowych to błąd, który da się usunąć.

Czy ciasteczko shop_ttclid w każdej przeglądarce wytrzymuje pełne 30 dni?

Nie. max-age=2592000 odpowiada 30 dniom, ale w Safari ciasteczka ustawiane przez skrypt za pomocą document.cookie wygasają najpóźniej po siedmiu dniach, a w pewnych warunkach już po 24 godzinach, jeśli odwiedzający przyszedł przez link z parametrami, prowadzący z domeny uznanej za śledzącą. Dłuższe zachowanie identyfikatora kliknięcia wymaga, by ciasteczko ustawiał sam serwer sklepu nagłówkiem Set-Cookie; _ttp piksel również ustawia skryptem, więc to ciasteczko podlega temu samemu limitowi.

Czy wartość i koszyk w zdarzeniu przeglądarkowym i serwerowym muszą być zgodne?

Tak. Po deduplikacji liczy się tylko jedno z dwóch zgłoszeń, a jeśli value, currency lub contents się różnią, zgłoszony przychód zależy od tego, które to jest. Najpewniej jest budować oba z tego samego rekordu zamówienia, który dostarcza też event_id: to, czy brutto, czy netto, z wysyłką czy bez, rozstrzyga się raz, a nie osobno dla każdego kanału.

Lukas Wójcik

Lukas Wójcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

Napisanie komentarza

Doświadczenia z praktyki i pytania o wdrożenie są tu mile widziane.

Adres e-mail nie jest publikowany. Pola obowiązkowe oznaczono gwiazdką.

Artykuły i kategorie

CCTV

Śledź tę kategorię przez RSS

Cloud & AI

Wszystkie artykuły w tej kategorii (11) Śledź tę kategorię przez RSS

Data Privacy

Wszystkie artykuły w tej kategorii (18) Śledź tę kategorię przez RSS

Digital Analytics

Wszystkie artykuły w tej kategorii (58) Śledź tę kategorię przez RSS

Digital Marketing

Wszystkie artykuły w tej kategorii (37) Śledź tę kategorię przez RSS

IT & Networks

Wszystkie artykuły w tej kategorii (17) Śledź tę kategorię przez RSS

Music Production

Wszystkie artykuły w tej kategorii (16) Śledź tę kategorię przez RSS

Raspberry Pi

Śledź tę kategorię przez RSS

SaaS & Internet Earning

Artykuły w przygotowaniu

Smart Home

Wszystkie artykuły w tej kategorii (18) Śledź tę kategorię przez RSS

Tworzenie stron internetowych

Wszystkie artykuły w tej kategorii (11) Śledź tę kategorię przez RSS

Wtyczki i triki WordPress

Wszystkie artykuły w tej kategorii (13) Śledź tę kategorię przez RSS