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 |
|---|---|---|
| Parametry URL ( | Google Ads — |
| Parametr URL | Meta — |
| Cookies | Meta — |
| Parametr URL | TikTok — |
| Cookie | TikTok — |
|
| GA4, Criteo — |
| Cookies | RTB House — |
| Kontekst strony: adres bieżącej strony, referrer z innej domeny, User-Agent, typ urządzenia ( | Criteo (wymaga), Meta, TikTok, RTB House — |
| Odpowiedź Criteo GUM sync — wymaga wpisania | Criteo — |
| ID zalogowanego klienta — tylko po wpisaniu | Meta, TikTok, Synerise (i GA4 |
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
Przejdź do swojego kontenera GTM.
Kliknij Dodaj nowy tag i nazwij go np.
InPost Pay — identyfikatory do localStorage.Wybierz typ tagu: HTML niestandardowy.
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
Kliknij Wyzwalacze i wybierz All Pages (Wszystkie strony).
Przy
ga4: trueupewnij 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. Callbackgtag('get')wykona się dopiero, gdy GA4 zainicjuje sesję.Zapisz tag.
Krok 3: Przetestuj
Wejdź na stronę z parametrami w URL, np.
?gclid=111&fbclid=222&ttclid=333.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_IDUwagi końcowe
Przy
ga4: truecallbackgtag('get', ...)jest asynchroniczny —client_idisession_idpojawią się w localStorage chwilę po załadowaniu GA4. Na stronie potwierdzenia zamówienia są już dostępne z poprzednich odsłon.session_idzmienia 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,_ttpi__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 —
fbclidi_fbcsą 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.