Google Analytics

Pomiar konwersji w ChatGPT Ads — piksel, Conversions API i deduplikacja

Rafał ChojnackiTekst: Rafał Chojnacki14 min

Pomiar konwersji w ChatGPT Ads opiera się na dwóch źródłach: pikselu działającym w przeglądarce i Conversions API wysyłającym zdarzenia z serwera. Dokumentacja OpenAI odpowiada wprost, które jest pewniejsze — Conversions API jest źródłem bardziej wiarygodnym niż sam piksel.

Pomiar konwersji w ChatGPT Ads — piksel, Conversions API i deduplikacja

W tym kanale pomiar nie jest warstwą raportową, którą warto odkładać na później. Kampania optymalizowana pod konwersje wymaga skonfigurowanego źródła i wybranego standardowego zdarzenia. Bez wiarygodnych danych system nie ma podstaw do optymalizacji, a zespół nie potrafi ocenić, czy kliknięcia prowadzą do wartościowych działań.

Ten wpis opisuje pełną konfigurację: 12 standardowych zdarzeń i mechanizm zdarzenia własnego, deduplikację przeglądarki i serwera, identyfikatory atrybucyjne, normalizację danych, przekazywanie kwot oraz obsługę zgody i CSP.

W skrócie

  • Dwa źródła: piksel w przeglądarce i Conversions API z serwera. Dokumentacja wskazuje Conversions API jako źródło bardziej wiarygodne; sensowne jest wdrożenie obu i połączenie ich deduplikacją.
  • Dostępnych jest 12 standardowych nazw zdarzeń oraz typ custom, a app_installed i app_opened przechodzą wyłącznie przez Conversions API. Zdarzenie własne nie może być celem oCPC.
  • Deduplikacja działa na trzech elementach: identyfikatorze piksela, nazwie zdarzenia i identyfikatorze zdarzenia. OpenAI zapisuje pierwsze zdarzenie o danym kluczu i pomija późniejsze duplikaty.
  • Identyfikatory użytkownika idą jako skróty SHA-256, po normalizacji, jako 64-znakowy ciąg szesnastkowy małymi literami. Dane geograficzne przekazuje się jako tekst, bez hashowania.
  • Numer telefonu hashuje się bez plusa i bez zer wiodących — z prefiksem kraju, w postaci 8–15 cyfr.
  • Kwoty przekazuje się jako liczby całkowite w jednostce podrzędnej waluty. Dla złotego 12999 znaczy 129,99 zł, a kwota wymaga podania waluty.
  • Zgoda na pomiar jest domyślnie włączona. Piksel przyjmuje zgodę jako true, dopóki nie zostanie ustawiona na false; zdarzenia zablokowane nie są później odtwarzane.
  • Restrykcyjna polityka Content Security Policy może zablokować część pomiaru. Dokumentacja wymienia cztery źródła, które trzeba połączyć z istniejącą polityką, bez osłabiania jej przez dodanie unsafe-inline.
  • Konwersje po wyświetleniu raportowane są osobno i nie wchodzą do metryki Conversions, która pozostaje sumą konwersji po kliknięciu.
  • Piksel sam przechwytuje oppref, ale Conversions API nie robi tego automatycznie. Przy integracji hybrydowej warto także przekazać niezmieniony obref z własnego pliku cookie, zgodnie z wymaganiami dotyczącymi zgody.

Dwa źródła pomiaru

Piksel to biblioteka działająca w przeglądarce. Skrypt trafia do sekcji <head> każdej strony, na której mają być mierzone konwersje, i to możliwie wysoko — inaczej wczesne konwersje przepadają, gdy reszta strony jeszcze się ładuje. Piksel inicjuje się identyfikatorem, a konwersję zgłasza wywołanie oaiq("measure", ...).

Conversions API przyjmuje zdarzenia wyłącznie z serwera. Identyfikator piksela i klucz interfejsu generuje się w zakładce konwersji panelu. Interfejs przyjmuje paczki do 1 000 zdarzeń, przy czym błąd jednego zdarzenia unieważnia całą paczkę — warto to uwzględnić w obsłudze błędów, zamiast wysyłać maksymalne paczki i zakładać, że przejdą.

Zdarzenia z cyklu życia aplikacji, czyli app_installed i app_opened, przechodzą tylko przez Conversions API, z parametrem action_source ustawionym na mobile_app. Piksel ich nie obsługuje. Natywne biblioteki mobilne nie są na razie wspierane.

Warto zapamiętać jeszcze jedno ograniczenie techniczne: znacznik czasu zdarzenia musi mieścić się w ostatnich 7 dniach i nie może wyprzedzać teraźniejszości o więcej niż 10 minut. Zaległe zdarzenia wysyłane po tygodniu nie zostaną przyjęte.

Dwanaście zdarzeń standardowych i zdarzenie własne

Zdarzenie Kształt danych Do czego służy
page_viewed contents wejście na istotną stronę
contents_viewed contents wyświetlenie produktu, oferty lub treści
items_added contents dodanie pozycji do koszyka lub zestawu
checkout_started contents rozpoczęcie zamawiania
order_created contents zakończony zakup
lead_created customer_action wysłanie formularza albo prośba o kontakt
appointment_scheduled customer_action rezerwacja spotkania, prezentacji lub konsultacji
registration_completed customer_action zakończona rejestracja konta lub zapis
app_installed customer_action instalacja aplikacji (tylko Conversions API)
app_opened customer_action uruchomienie aplikacji (tylko Conversions API)
trial_started plan_enrollment start okresu próbnego
subscription_created plan_enrollment start płatnej subskrypcji
custom custom zdarzenie własne poza taksonomią standardową

Dwa rozróżnienia warto trzymać w głowie. page_viewed dotyczy wczytania strony, a contents_viewed obejrzenia konkretnego produktu albo elementu treści, także wtedy, gdy dzieje się to już po wczytaniu strony. Nazwy zdarzeń własnych mają od 1 do 64 znaków.

Zdarzenie własne ma jedno poważne ograniczenie po stronie kampanii: nie może być celem optymalizacji pod konwersje. Cel oCPC przyjmuje wyłącznie zdarzenie standardowe.

Deduplikacja przeglądarki i serwera

Bez deduplikacji ta sama konwersja policzy się dwa razy — raz z piksela, raz z serwera.

Mechanizm jest prosty i wymaga jednej dyscypliny: ten sam identyfikator zdarzenia po obu stronach. W Conversions API idzie jako pole id, w pikselu jako event_id. Oba zdarzenia muszą trafić na ten sam identyfikator piksela. Przy zdarzeniach własnych po obu stronach musi zgadzać się także nazwa zdarzenia własnego.

Klucz deduplikacji składa się z trzech części:

Deduplikacja łączy zdarzenie z przeglądarki i z serwera po identyfikatorze piksela, nazwie zdarzenia i identyfikatorze zdarzenia — pierwsze jest zapisywane, kolejne pomijane.
  1. identyfikator piksela,
  2. nazwa zdarzenia,
  3. identyfikator zdarzenia.

OpenAI zapisuje pierwsze zdarzenie o danym kluczu i pomija późniejsze duplikaty. Ma to praktyczną konsekwencję: kolejność nie ma znaczenia dla poprawności, ale ma dla kompletności danych. Jeśli zdarzenie z serwera niesie więcej informacji do dopasowania niż zdarzenie z przeglądarki, a przeglądarka zdąży pierwsza, przyjęta zostanie wersja uboższa.

Identyfikator trzeba wygenerować samodzielnie i przekazać do obu ścieżek. Ponownego użycia tego samego identyfikatora dokumentacja dopuszcza tylko przy ponawianiu wysyłki albo przy przesłaniu tej samej konwersji innym kanałem.

oppref i obref: identyfikatory potrzebne do dopasowania

Deduplikacja odpowiada na pytanie „czy to samo zdarzenie dotarło dwa razy”. Atrybucja odpowiada na inne: „czy zdarzenie można połączyć z kontaktem z reklamą”. Do tego służą między innymi dwa nieprzezroczyste identyfikatory OpenAI:

  • oppref jest przekazywany w adresie po kliknięciu reklamy. Piksel odczytuje go automatycznie i zapisuje w pliku cookie __oppref, aby wykorzystać go także na kolejnych stronach. Conversions API nie przechwytuje go samo — integracja serwerowa musi zachować wartość i wysłać ją bez zmian jako pole zdarzenia.
  • obref pochodzi z własnego pliku cookie __obref piksela. W integracji łączącej przeglądarkę i serwer można przekazać go bez hashowania w events[].user.obref. Najpierw trzeba jednak spełnić wymagania serwisu dotyczące zgody na pomiar; po jej cofnięciu identyfikatora nie należy dalej wysyłać.

Dla webowego zdarzenia serwerowego wymagany jest również source_url z prawidłowym schematem i hostem oraz action_source: "web". Próba wywołania Conversions API bezpośrednio z kodu strony ujawniałaby klucz i jest niezgodna z przeznaczeniem interfejsu — wysyłka odbywa się wyłącznie z serwera.

Normalizacja i hashowanie danych

Dane identyfikujące użytkownika przekazuje się wyłącznie jako skróty SHA-256. Surowych adresów e-mail, numerów telefonu, identyfikatorów zewnętrznych, imion i nazwisk wysyłać nie wolno.

Normalizacja przed policzeniem skrótu:

Dane Normalizacja Przykład
adres e-mail usunięcie białych znaków z początku i końca, małe litery Jan@Firma.PL jan@firma.pl
numer telefonu prefiks kraju zostaje; usunięcie spacji, nawiasów, kropek i myślników, potem plusa i zer wiodących; skrót z 8–15 cyfr +48 (601) 234-56748601234567
imię i nazwisko małe litery, usunięcie białych znaków i znaków przestankowych ASCII, polskie znaki diakrytyczne zostają Łukaszłukasz
identyfikator zewnętrzny usunięcie białych znaków z początku i końca, wielkość liter zachowana AB-1024 AB-1024

Wartość znormalizowaną koduje się w UTF-8, liczy z niej SHA-256 i wysyła jako 64-znakowy ciąg szesnastkowy małymi literami.

Normalizacja przed hashowaniem: przycięcie i zamiana na małe litery, kodowanie UTF-8, SHA-256; polskich znaków diakrytycznych nie wolno usuwać ani transliterować.

Dwa błędy są szczególnie łatwe do popełnienia. Pierwszy to usuwanie polskich znaków diakrytycznych albo ich transliteracja — dokumentacja wymaga ich zachowania, więc józef po zamianie na jozef da inny skrót. Drugi to pozostawienie plusa w numerze telefonu.

Wartości geograficzne — miasto, region, kod pocztowy — przekazuje się jako tekst, bez hashowania. Miasto i region do 128 znaków, kod pocztowy do 32 znaków.

Kwoty i waluty

Kwoty przekazuje się jako liczby całkowite w jednostce podrzędnej waluty według ISO 4217. Dla złotego jednostką podrzędną jest grosz, więc 12999 oznacza 129,99 zł. Kiedy zdarzenie zawiera kwotę, musi zawierać także walutę.

Przekazanie 129.99 zamiast 12999 zaniża wartość konwersji o dwa rzędy wielkości. Taki błąd może pozostać niezauważony, ponieważ zdarzenie nadal wygląda jak poprawna liczba, ale raportowana wartość jest sto razy niższa od właściwej.

Zgoda na pomiar

Tu jest pułapka istotna dla każdego serwisu działającego w Europie.

Piksel domyślnie przyjmuje zgodę jako udzieloną. Dokumentacja mówi to wprost: zgoda inicjuje się jako true, chyba że zostanie ustawiona na false albo piksel znajdzie zapisaną odmowę. Domyślne zachowanie to więc pomiar włączony.

Kiedy zgoda jest wymagana, kolejność wygląda tak: najpierw oaiq("consent", false), potem inicjalizacja piksela, a oaiq("consent", true) dopiero po uzyskaniu zgody użytkownika. Wywołanie ustawiające zgodę przed inicjalizacją jest tu istotne — inaczej piksel startuje w trybie mierzącym.

Dwie konsekwencje operacyjne:

  • Zdarzenia zablokowane brakiem zgody nie są później odtwarzane. Udzielenie zgody dopuszcza zdarzenia przyszłe, nie odzyskuje przeszłych.
  • Wdrożenie piksela trzeba wpiąć w istniejący mechanizm zgód, a nie obok niego. Sam skrypt w <head> bez tej integracji mierzy od pierwszego wczytania strony.

Automatyczne dopasowanie zaawansowane

Po włączeniu tej funkcji piksel może rozpoznawać obsługiwane dane klienta na stronie, normalizować je i hashować w przeglądarce algorytmem SHA-256. Według dokumentacji surowe dane wykryte w ten sposób nie są wysyłane do OpenAI. Funkcja może poprawić dopasowanie, gdy brakuje identyfikatora kliknięcia, ale nie znosi obowiązków dotyczących informacji, podstawy prawnej i zgody. Jej użycie trzeba ocenić w kontekście konkretnego serwisu, a nie włączać automatycznie na każdym rynku.

Content Security Policy

Restrykcyjna polityka bezpieczeństwa treści może zablokować pobranie biblioteki, konfiguracji albo wysyłkę zdarzeń. Wymagane źródła:

Dyrektywa Źródło Po co
script-src https://bzrcdn.openai.com wczytanie biblioteki piksela
connect-src https://bzr.openai.com wysyłka zdarzeń
connect-src https://bzrcdn.openai.com pobranie konfiguracji piksela
img-src https://bzr.openai.com wysyłka zdarzeń metodą awaryjną przez żądanie obrazu

Brakujący wpis w img-src może zablokować mechanizm awaryjny oparty na żądaniu obrazu. Nie należy jednak dodawać unsafe-inline tylko dla piksela. Przy polityce z nonce trzeba zastosować świeży nonce dla każdej odpowiedzi i dodać go do skryptu instalacyjnego; przy script-src-elem należy uwzględnić także źródło CDN oraz używany nonce lub hash.

Atrybucja i to, co wchodzi do metryki

Zdarzenia webowe obsługują atrybucję po kliknięciu, a na części kont także atrybucję po wyświetleniu. Okno po wyświetleniu jest stałe i wynosi jeden dzień od kwalifikującego się wyświetlenia reklamy. Dostępność raportowania po wyświetleniu nie zależy od skonfigurowanego okna kliknięcia. Kiedy konwersja kwalifikuje się do obu, pierwszeństwo ma kliknięcie.

Najważniejsze rozróżnienie raportowe:

Konwersje po wyświetleniu są raportowane osobno, na poziomie kampanii, i nie wchodzą do metryki Conversions. Ta pozostaje sumą konwersji po kliknięciu. Koszt pozyskania, współczynnik konwersji po kliknięciu, licytacja, rozliczenie i optymalizacja pod konwersje również liczą się z kliknięć. Zdarzenia z cyklu życia aplikacji pozostają oparte na kliknięciu.

Metryka Conversions obejmuje wyłącznie konwersje po kliknięciu; konwersje po wyświetleniu raportowane są osobno i nie wchodzą do tej liczby.

Dodanie obu liczb do siebie zawyża wynik kanału i, co gorsze, zawyża go niesymetrycznie — bo tylko część kont ma raportowanie po wyświetleniu. Porównanie dwóch kont staje się wtedy porównaniem dwóch różnych definicji.

Atrybucja po wyświetleniu nie wymaga zmian we wdrożeniu piksela ani w treści zdarzenia.

Warunki optymalizacji pod konwersje

Kampania oCPC nie ruszy, dopóki nie są spełnione wszystkie warunki:

  1. Konto obsługuje licytację pod konwersje — brak tej możliwości daje błąd 403 z komunikatem Conversion bidding is not enabled.
  2. Pomiar jest wdrożony pikselem, przez Conversions API albo jednym i drugim.
  3. Istnieje dokładnie jedno aktywne standardowe zdarzenie jako cel; zdarzenia własne nie mogą być celem.
  4. Ustawienie zdarzenia należy do tego konta i łączy się z jednym aktywnym źródłem konwersji.
  5. Cel i zdarzenie są wybrane przed utworzeniem kampanii, bo później nie podlegają zmianie.

Trzy z pięciu punktów dotyczą pomiaru. To ta lista tłumaczy, dlaczego w tym kanale pomiar jest pracą przed kampanią, a nie po niej.

Image Tag i wiele pikseli

Image Tag pozwala wysłać zdarzenie z HTML bez JavaScriptu — przydaje się w szablonach wiadomości i w systemach, w których nie da się uruchomić skryptu. Przyjmuje własny identyfikator zdarzenia, więc wchodzi do tej samej deduplikacji: identyfikator z tagu obrazu podaje się potem jako id zdarzenia w Conversions API.

Obsługa wielu pikseli działa wtedy, gdy jedna strona ma mierzyć konwersje dla kilku identyfikatorów — na przykład przy wspólnym serwisie obsługującym dwie marki. Zdarzenie można skierować do wszystkich pikseli albo do jednego wskazanego.

Jak podchodzimy do tego w Space Ads

Pomiar projektujemy od zdarzenia biznesowego, nie od dostępnej listy tagów. Najpierw ustalamy, które działanie oznacza zakup, kwalifikowany lead, rejestrację albo umówione spotkanie. Następnie nadajemy mu standardową nazwę OpenAI, ustalamy jeden identyfikator dla przeglądarki i serwera oraz zachowujemy oppref i — po spełnieniu wymagań dotyczących zgody — obref. Kwoty, waluty i znormalizowane skróty walidujemy przed wysyłką. Conversions API najpierw uruchamiamy z validate_only: true, a piksel z trybem debugowania. Potem wykonujemy jedną kontrolowaną konwersję i porównujemy payloady obu ścieżek. Kampania oCPC powstaje dopiero wtedy, gdy zdarzenie ma właściwą semantykę, deduplikacja działa, a wynik trafia do raportu tylko raz.

Najczęstsze błędy

  • Wdrożenie samego piksela i pominięcie Conversions API, choć dokumentacja wskazuje je jako źródło pewniejsze.
  • Brak wspólnego identyfikatora zdarzenia po obu stronach i podwójne liczenie konwersji.
  • Przekazanie kwoty jako 129.99 zamiast 12999 i zaniżenie przychodu sto razy.
  • Pominięcie waluty przy zdarzeniu zawierającym kwotę.
  • Usuwanie polskich znaków diakrytycznych przed hashowaniem imienia albo nazwiska.
  • Pozostawienie plusa albo zer wiodących w numerze telefonu przed policzeniem skrótu.
  • Wysyłka surowych danych zamiast skrótów SHA-256.
  • Poleganie na domyślnym ustawieniu zgody, które jest włączone, i pomiar bez podstawy.
  • Brak wymaganych źródeł w Content Security Policy i zablokowane żądania piksela.
  • Pominięcie oppref w zdarzeniu serwerowym albo obref w integracji hybrydowej mimo dostępnej i prawidłowo pozyskanej wartości.
  • Wywołanie Conversions API bezpośrednio z przeglądarki i ujawnienie klucza dostępowego.
  • Dodanie konwersji po wyświetleniu do konwersji po kliknięciu w jednej liczbie.
  • Wybór zdarzenia własnego jako celu kampanii optymalizowanej pod konwersje.
  • Wysyłka zaległych zdarzeń starszych niż 7 dni.

Najczęstsze pytania

Piksel czy Conversions API — co wybrać?

Dokumentacja OpenAI wskazuje Conversions API jako źródło bardziej wiarygodne niż sam piksel. W praktyce warto wdrożyć oba i połączyć je deduplikacją: piksel łapie zdarzenia przeglądarkowe, serwer dostarcza komplet danych do dopasowania.

Jak działa deduplikacja zdarzeń?

Klucz deduplikacji to identyfikator piksela, nazwa zdarzenia i identyfikator zdarzenia. Ten sam identyfikator trzeba podać jako id w Conversions API i jako event_id w pikselu. OpenAI zapisuje pierwsze zdarzenie o danym kluczu i pomija późniejsze duplikaty.

Jak przekazać wartość zamówienia w złotówkach?

Jako liczbę całkowitą w groszach, razem z kodem waluty. Kwota 129,99 zł to 12999 z walutą PLN. Kwota bez podanej waluty nie zostanie przyjęta.

Czy piksel wymaga zgody użytkownika?

Piksel domyślnie startuje ze zgodą ustawioną na udzieloną. Jeśli zgoda jest wymagana, trzeba ustawić ją na false przed inicjalizacją i przełączyć na true po jej uzyskaniu. Zdarzenia zablokowane brakiem zgody nie są później odtwarzane.

Dlaczego konwersje nie pojawiają się w panelu, choć piksel jest wdrożony?

W pikselu warto tymczasowo włączyć debug: true i sprawdzić konsolę przeglądarki oraz żądania sieciowe. Dla Conversions API można najpierw wysłać payload z validate_only: true. Trzeba także skontrolować CSP, zgodę, identyfikator piksela, source_url, znacznik czasu i odpowiedź całej paczki — błąd jednego zdarzenia odrzuca wszystkie zdarzenia w danym żądaniu.

Czy konwersje po wyświetleniu wchodzą do metryki konwersji?

Nie. Raportowane są osobno, na poziomie kampanii, i nie wchodzą do metryki Conversions, która pozostaje sumą konwersji po kliknięciu. Koszt pozyskania, licytacja i optymalizacja również liczą się z kliknięć.

Najważniejsze

W ChatGPT Ads pomiar jest warunkiem odpowiedzialnego testu, a dla oCPC także elementem wymaganym technicznie. Nawet gdy część funkcji targetowania nie nadaje się do danego setupu, wynik nadal zależy od celu, stawki, kontekstu, reklamy i strony docelowej. Pomiar pozwala ocenić te decyzje na podstawie działań po kliknięciu.

Od pierwszego dnia trzeba zadbać o wspólny identyfikator zdarzenia, prawidłowe kwoty i waluty, identyfikatory atrybucyjne oraz zgodną z prawem obsługę danych i zgody. Dopiero na tej podstawie można łączyć piksel z Conversions API bez podwójnego liczenia i oceniać oCPC na zdarzeniu, które naprawdę opisuje wynik biznesowy.

Mechanikę całego kanału opisuje wpis o ChatGPT Ads, a pomiar jako usługę strona analityki.

Źródła i dalsza lektura

Czytaj również

ChatGPT Ads — jak je kupić, ile kosztują i kto je widzi
Strategia

ChatGPT Ads — jak je kupić, ile kosztują i kto je widzi

ChatGPT Ads to reklamy wyświetlane pod odpowiedzią i dobierane do kontekstu rozmowy, bez klasycznych słów kluczowych. Wpis wyjaśnia format, modele CPM, CPC i oCPC, pomiar konwersji, feedy produktowe, wymagania strony docelowej oraz to, kiedy kanał ma sens biznesowy.

18 min czytania
ChatGPT Ads — formaty reklam i limity znaków według dokumentacji OpenAI
Strategia

ChatGPT Ads — formaty reklam i limity znaków według dokumentacji OpenAI

Reklama w ChatGPT pojawia się pod odpowiedzią i ma sześć elementów, a limity są konkretne: tytuł 3–50 znaków, opis do 100. Obiegowe liczby „24 / 48 znaków" nie zgadzają się z dokumentacją, więc wpis podaje pełną tabelę limitów, pokazuje, jak zmieścić komunikat po polsku, i opisuje wymogi wobec obrazu, reklam produktowych oraz strony docelowej.

13 min czytania
OpenAI Ads Manager — jak wygląda panel i jak uruchomić pierwszą kampanię
Strategia

OpenAI Ads Manager — jak wygląda panel i jak uruchomić pierwszą kampanię

OpenAI Ads Manager ma trzy poziomy struktury — kampanię, grupę reklam i reklamę — lecz start wymaga także weryfikacji firmy, konfiguracji płatności i świadomego wyboru nieodwracalnych ustawień. Wpis prowadzi przez aktualny proces i wyjaśnia podpowiedzi kontekstowe, budżety, oCPC, kierowanie oraz różnice między panelem, Ads API i operacjami hurtowymi.

12 min czytania

Success Stories

Ten sam standard działania, różne modele wzrostu