InPost Pay - Analityka - Woocommerce

InPost Pay - Analityka - Woocommerce

Konfiguracja platform (GA4, Google Ads, Meta, TikTok, Synerise, Criteo, RTB House), wdrożenie Cloud Function, weryfikacja i utrzymanie: InPost Pay - Integracja Konwersji Marketingowych.

Wymagania wstępne — WordPress WooCommerce + Google Tag Manager

Konfiguracja localStorage przez Google Tag Manager

Tag GTM opisany poniżej zapisuje w localStorage przeglądarki identyfikatory obsługiwane przez Cloud Function — pod dokładnie takimi nazwami kluczy, jakich system oczekuje w order_additional_parameters. W sekcji KONFIGURACJA na początku tagu (obiekt COLLECT) wybierasz, dla których kanałów tag ma zbierać identyfikatory — włącz tylko te platformy, z których korzystasz. Wtyczka odczytuje klucze z localStorage i dołącza je do zamówienia.

Klucz w localStorage

Źródło

Platforma — przełącznik COLLECT

Klucz w localStorage

Źródło

Platforma — przełącznik COLLECT

gclid, gbraid, wbraid

Parametry URL (?gclid=…); gbraid/wbraid — kliknięcia z iOS 14+

Google Ads — google_ads

fbclid

Parametr URL ?fbclid=… — surowa wartość, bez zmiany wielkości liter

Meta — meta

fbc, fbp

Cookies _fbc, _fbp (ustawia pixel Meta) — podnoszą Event Match Quality

Meta — meta

ttclid

Parametr URL ?ttclid=…

TikTok — tiktok

ttp

Cookie _ttp (ustawia pixel TikTok)

TikTok — tiktok

client_id, session_id

gtag('get', …) — identyfikator użytkownika i sesji GA4 (session_id — nowość; bez niego purchase traci źródło ruchu)

GA4, Criteo — ga4

rtbh_uid, rtbh_aid, rtbh_sid

Cookies __rtbh.uid / __rtbh.aid / __rtbh.sid (ustawia tag RTB House); tag wyciąga pole id z JSON-a w cookie

RTB House — rtb_house

page_url, page_referrer, user_agent, site_type

Kontekst strony: adres bieżącej strony, referrer z innej domeny, User-Agent, typ urządzenia (d/m/t)

Criteo (wymaga), Meta, TikTok, RTB House — page

gum_id

Odpowiedź Criteo GUM sync — wymaga wpisania CRITEO_S2S_ID (S2S ID od opiekuna Criteo)

Criteo — criteo (domyślnie wyłączony)

user_id

ID zalogowanego klienta — tylko po wpisaniu USER_ID w konfiguracji tagu (np. zmienna GTM z dataLayer)

Meta, TikTok, Synerise (i GA4 user_id)

Wszystkie klucze są opcjonalne — tag zapisuje te, które są dostępne na danej stronie (np. fbc/fbp tylko gdy działa pixel Meta). Jedyny parametr, którego nie da się pobrać w przeglądarce, to client_ip — wtyczka pobiera go z requestu HTTP po stronie serwera.

Krok 1: Utwórz nowy tag w Google Tag Manager

  1. Przejdź do swojego kontenera GTM.

  2. Kliknij Dodaj nowy tag i nazwij go np. InPost Pay — identyfikatory do localStorage.

  3. Wybierz typ tagu: HTML niestandardowy.

  4. Wklej poniższy kod i uzupełnij sekcję KONFIGURACJA na jego początku:

<script> (function () { // ===== KONFIGURACJA ===== // Dla których kanałów tag ma zbierać identyfikatory (true / false): var COLLECT = { google_ads: true, // gclid, gbraid, wbraid (URL) meta: true, // fbclid (URL), fbc + fbp (cookies _fbc / _fbp) tiktok: true, // ttclid (URL), ttp (cookie _ttp) ga4: true, // client_id, session_id przez gtag('get') — wymaga GA4_MEASUREMENT_ID rtb_house: true, // rtbh_uid / rtbh_aid / rtbh_sid (cookies __rtbh.*) criteo: false, // gum_id przez GUM sync — wymaga CRITEO_S2S_ID page: true // page_url, page_referrer, user_agent, site_type (Criteo wymaga; Meta/TikTok/RTB House zalecane) }; var GA4_MEASUREMENT_ID = 'G-XXXXXXXXXX'; // wymagane przy ga4: true (Measurement ID z GA4) var CRITEO_S2S_ID = ''; // wymagane przy criteo: true (S2S ID od opiekuna Criteo) var USER_ID = ''; // opcjonalnie: ID zalogowanego klienta (np. zmienna GTM z dataLayer) // ======================== // Wartości "puste" ignorujemy (ta sama lista co w Cloud Function) var NULL_LIKE = ['', '0', 'unknown', 'undefined', 'null', 'none', 'nan', 'n/a', 'false']; function save(key, value) { try { if (value === null || value === undefined) return; value = String(value).trim(); if (NULL_LIKE.indexOf(value.toLowerCase()) !== -1) return; localStorage.setItem(key, value); // bez zmiany wielkości liter — fbclid/_fbc są case-sensitive } catch (e) {} } function getCookie(name) { var parts = document.cookie.split('; '); for (var i = 0; i < parts.length; i++) { var idx = parts[i].indexOf('='); if (idx > 0 && parts[i].substring(0, idx) === name) return parts[i].substring(idx + 1); } return null; } // Cookie/localStorage __rtbh.uid / .aid / .sid = URL-encoded JSON {"eventType":"uid","id":"…","expiryDate":"…"} function rtbhId(name) { var raw = getCookie(name); if (!raw) { try { raw = localStorage.getItem(name); } catch (e) {} } if (!raw) return null; try { var obj = JSON.parse(decodeURIComponent(raw)); return obj && obj.id ? obj.id : null; } catch (e) { return null; } } function siteType() { var ua = navigator.userAgent || ''; if (/iPad|Tablet|PlayBook|Silk|Android(?!.*Mobile)/i.test(ua)) return 't'; if (/Mobi|Android|iPhone|iPod/i.test(ua)) return 'm'; return 'd'; } function saveTrackingIdsToLocalStorage() { try { var params = new URLSearchParams(window.location.search); // click ID z URL — surowe wartości // Google Ads if (COLLECT.google_ads) { save('gclid', params.get('gclid')); save('gbraid', params.get('gbraid')); save('wbraid', params.get('wbraid')); } // Meta — click ID z URL + cookies pixela if (COLLECT.meta) { save('fbclid', params.get('fbclid')); save('fbc', getCookie('_fbc')); save('fbp', getCookie('_fbp')); } // TikTok — click ID z URL + cookie pixela if (COLLECT.tiktok) { save('ttclid', params.get('ttclid')); save('ttp', getCookie('_ttp')); } // GA4 client_id / session_id — asynchronicznie przez gtag('get'). // Shim: gdy GA4 jest wdrożone przez GTM, globalna funkcja gtag nie istnieje — // definiujemy ją tak, aby komendy trafiały do dataLayer (Google tag je obsłuży). if (COLLECT.ga4) { window.dataLayer = window.dataLayer || []; if (typeof gtag !== 'function') { window.gtag = function () { dataLayer.push(arguments); }; } gtag('get', GA4_MEASUREMENT_ID, 'client_id', function (v) { save('client_id', v); }); gtag('get', GA4_MEASUREMENT_ID, 'session_id', function (v) { save('session_id', v); }); } // RTB House — cookies tagu RTB House if (COLLECT.rtb_house) { save('rtbh_uid', rtbhId('__rtbh.uid')); save('rtbh_aid', rtbhId('__rtbh.aid')); save('rtbh_sid', rtbhId('__rtbh.sid')); } // Criteo GUM ID — wywołanie na każdej stronie, wg docs Criteo if (COLLECT.criteo) { if (!CRITEO_S2S_ID) { console.warn('InPost Pay: criteo: true wymaga CRITEO_S2S_ID'); } else { window._inpostCriteoGum = function (gumId) { save('gum_id', gumId); }; var s = document.createElement('script'); s.async = true; s.src = 'https://gum.criteo.com/sync?c=' + encodeURIComponent(CRITEO_S2S_ID) + '&a=1&r=2&j=_inpostCriteoGum'; document.head.appendChild(s); } } // Kontekst strony (Meta event_source_url, Criteo full_url/site_type, RTB House su/sr, GA4 page_location) if (COLLECT.page) { save('page_url', window.location.href); save('user_agent', navigator.userAgent); save('site_type', siteType()); if (document.referrer) { var ref = document.createElement('a'); ref.href = document.referrer; if (ref.hostname && ref.hostname !== window.location.hostname) save('page_referrer', document.referrer); } } // ID zalogowanego klienta (opcjonalnie) save('user_id', USER_ID); } catch (error) { console.error('InPost Pay: błąd zapisu identyfikatorów do localStorage:', error); } } saveTrackingIdsToLocalStorage(); })(); </script>

Konfiguracja tagu: w obiekcie COLLECT ustaw true przy kanałach, z których korzystasz (google_ads, meta, tiktok, ga4, rtb_house, criteo, page); wyłączone kanały nie są odczytywane ani zapisywane. GA4_MEASUREMENT_ID — Twój Measurement ID z GA4 (np. G-ABC123DEF4; wymagane przy ga4: true). CRITEO_S2S_ID — S2S ID od opiekuna Criteo, wymagane przy criteo: true (włącza wywołanie GUM sync na każdej stronie). USER_ID — ID zalogowanego klienta, np. zmienna GTM typu Data Layer Variable z ID klienta; zostaw puste, jeśli sklep nie udostępnia go w dataLayer.

Krok 2: Ustaw wyzwalacz

  1. Kliknij Wyzwalacze i wybierz All Pages (Wszystkie strony).

  2. Przy ga4: true upewnij się, że tag uruchamia się po tagu Google (GA4) — ustaw Tag Sequencing → Fire a tag before this tag fires → tag GA4 lub użyj wyzwalacza Window Loaded. Callback gtag('get') wykona się dopiero, gdy GA4 zainicjuje sesję.

  3. Zapisz tag.

Krok 3: Przetestuj

  1. Wejdź na stronę z parametrami w URL, np. ?gclid=111&fbclid=222&ttclid=333.

  2. W konsoli DevTools (F12 → Console) wklej jedną linię — wypisze wszystkie klucze zapisane przez tag:

['gclid','gbraid','wbraid','fbclid','fbc','fbp','ttclid','ttp','client_id','session_id','rtbh_uid','rtbh_aid','rtbh_sid','gum_id','page_url','page_referrer','user_agent','site_type','user_id'].forEach(function(k){ console.log(k + ' = ' + localStorage.getItem(k)); });

Przykładowy wynik (wartości zależne od pikseli obecnych na stronie):

gclid = 111 gbraid = null wbraid = null fbclid = 222 fbc = fb.1.1758621600123.222 // tylko gdy na stronie jest pixel Meta fbp = fb.1.1758621600123.1116446470 // j.w. ttclid = 333 ttp = 7f3a… // tylko gdy na stronie jest pixel TikTok client_id = 1234567890.1234567890 // null przy ga4: false session_id = 1758621600 // null przy ga4: false rtbh_uid = … // tylko gdy na stronie jest tag RTB House (inaczej null) rtbh_aid = null rtbh_sid = null gum_id = null // wypełnione tylko przy criteo: true + CRITEO_S2S_ID page_url = https://sklep.pl/?gclid=111&fbclid=222&ttclid=333 page_referrer = null // wypełnione tylko przy wejściu z innej domeny user_agent = Mozilla/5.0 … site_type = d user_id = null // wypełnione tylko po skonfigurowaniu USER_ID

Uwagi końcowe

  • Przy ga4: true callback gtag('get', ...) jest asynchroniczny — client_id i session_id pojawią się w localStorage chwilę po załadowaniu GA4. Na stronie potwierdzenia zamówienia są już dostępne z poprzednich odsłon. session_id zmienia się z każdą nową sesją GA4 (po 30 min nieaktywności) — tag na wszystkich stronach zapewnia aktualną wartość w momencie zakupu.

  • Cookies _fbc/_fbp, _ttp i __rtbh.* istnieją tylko wtedy, gdy na stronie działa odpowiednio pixel Meta, pixel TikTok lub tag RTB House. Bez nich system korzysta z click ID z URL (fbclid, ttclid) i z hashowanego e-maila.

  • Wartości click ID zapisywane są bez zmiany wielkości liter — fbclid i _fbc są case-sensitive. Cloud Function dodatkowo waliduje i naprawia typowe błędy (opis w InPost Pay - Analityka).

  • Jeśli używasz Google Consent Mode, upewnij się, że ten tag uruchamiany jest po zgodzie użytkownika na analitykę/marketing.