Lista dozwolonych originów
Collector przy każdej paczce sprawdza origin żądania względem zarejestrowanych domen witryny.
Instalacja i SDK
Asynchroniczny, bez kroku builda, bez kodu inline, przyjazny CSP, serwowany first-party z Twojej własnej subdomeny. Rdzeń trackera waży ≤ 10 KB po gzipie i inicjalizuje się w ≤ 5 ms p95 — Core Web Vitals i nagrywarka ładują się leniwie, tylko gdy pozwala na to polityka.
Snippet
<!-- Observer — cookie-less, self-hosted --> <script async src="https://sa.yourdomain.com/v.js" data-site="obs_XXXX"></script>
Ładowany z Twojej własnej subdomeny — przeżywa ad blockery, trzyma każdy endpoint same-site i nigdy nie odzywa się do zewnętrznej sieci.
Rdzeń trackera ≤ 10 KB po gzipie: cykl życia strony, czas zaangażowania, mapy ciepła, kliknięcia. Oficjalny build web-vitals i nagrywarka rrweb ładują się leniwie, tylko gdy pozwala na to polityka Twojego poziomu.
Kreator dodawania witryny odpytuje, aż pierwsza odsłona dotrze, i przełącza się na zielono z rosnącym licznikiem odsłon — nigdy nie zastanawiasz się, czy to działa.
Kreator dodawania witryny
Nazwa witryny, główny URL i ewentualne dodatkowe domeny — staging, subdomeny, warianty. Rejestracja tej samej domeny w dwóch witrynach jest blokowana (HTTP 409).
T0 ścisły (domyślny, bez banera), T1 pamięć sesyjna, T2 za zgodą (odblokowuje replay) albo T3 wyłącznik awaryjny. Collector wymusza to po stronie serwera.
Wklej, pobądź na stronie, patrz jak kreator weryfikuje pierwszą odsłonę na żywo i przełącza się na zielono z rosnącym licznikiem odsłon.
Content-Security-Policy
script-src 'self' https://sa.yourdomain.com; connect-src 'self' https://sa.yourdomain.com;
Bez unsafe-inline, bez blob:, bez data: — tracker to zwykły asynchroniczny skrypt, który rozmawia wyłącznie z Twoim collectorem. Witryny ze ścisłym CSP adoptują Observera bez osłabiania choćby jednej dyrektywy.
Anty-spoofing
Ten sam kod wklejony na cudzą witrynę zostanie odrzucony przez collectora z HTTP 403. ID Twojej witryny nie jest tokenem dla wszystkich — listę dozwolonych rozszerzasz w każdej chwili o subdomeny, staging albo alternatywne domeny.
Collector przy każdej paczce sprawdza origin żądania względem zarejestrowanych domen witryny.
Konfiguracja per witryna (poziom, polityka, domeny, próbkowanie) jest podpisana Ed25519 — SDK nie jest w stanie podrobić podniesienia poziomu.
Limity zapytań, limity rozmiaru payloadu i deduplikacja event-id chronią collectora przed spamem i replayami.
Scrubbing danych osobowych (PII)
URL-e i tytuły są oczyszczane po stronie serwera, zanim cokolwiek trafi do zapisu: e-maile stają się [email], cyfrowe ciągi o długości numeru karty [num], a ciągi wyglądające jak klucze API [key]. Tytuły stron są haszowane. Zdarzenia błędów niosą wyłącznie klasę błędu — bez stosu, bez treści komunikatu.
Test na żywym HTTP w suitecie puszcza znane dane osobowe przez collectora i asertywnie weryfikuje oczyszczony wynik end-to-end.
Kontrakt DOM dla wydawców
Mały zestaw atrybutów i klas łączy Twój markup z analityką — ranking elementów, analityka formularzy, wykrywanie martwych kliknięć i maskowanie nagrywarki wszystko z niego czytają.
| Atrybut / klasa | Działanie |
|---|---|
| data-obs-id="hero-cta" | Stabilny identyfikator elementu do rankingu elementów map ciepła — przeżywa redesigny lepiej niż haszowane selektory |
| data-obs-form="checkout" | Nadaje formularzowi nazwę dla analityki drop-off formularzy |
| data-obs-interactive | Oznacza interaktywne cele, żeby wykrywanie martwych kliknięć wiedziało, co powinno być klikalne |
| data-obs-ignore | Wyłącza element z map ciepła i analityki formularzy |
| class="obs-mask" | Nagrywarka maskuje tekst tego elementu u źródła |
| class="obs-block" | Nagrywarka wyklucza ten element całkowicie |
| class="obs-ignore" | Nagrywarka ignoruje zdarzenia w tym poddrzewie |
Zdarzenia śledzone automatycznie
Bez żadnej konfiguracji. Każdy wiersz jest oczyszczany, limitowany i deduplikowany w collectorze.
| Zdarzenie | Wyzwalacz | Dane |
|---|---|---|
| page_view | ładowanie strony / zmiana trasy SPA | path (oczyszczony), title (zhaszowany), origin referrera, UTM |
| page_exit | ukrycie karty / pagehide / wyjście ze SPA | engaged_ms (aktywny widok), scroll_max, exit_type |
| heartbeat | co 15 s, gdy strona widoczna | engaged_ms narastająco |
| click | kliknięcie użytkownika | x%·y% strony (znormalizowane do dokumentu), element (zhaszowany), flagi rage / dead |
| scroll | przekroczenie progu głębokości | depth (25 / 50 / 75 / 100) |
| web_vital | callback LCP / INP / CLS / FCP / TTFB | name, value, rating, atrybucja (element / target) |
| error | błąd JS / nieobsłużony rejection | tylko klasa błędu — bez stosu, bez treści komunikatu |
| outbound | kliknięcie linku opuszczającego domenę | origin celu |
| download | kliknięcie linku do pliku | rozszerzenie pliku |
| form | focus / blur pola | form hash, field hash, kind (focus / filled / skipped), ms |
| goal | po stronie serwera (s2s) | goal_id |
| custom | observer('event', name, props) | name + typowane propsy (oczyszczone, ≤ 10, lista dozwolonych per witryna) |
| survey_response | wysłanie widgeta ankiety | survey_id, value, type |
| optout | observer('optOut') | poleca SDK się zatrzymać i wyczyścić stan |
// custom events (typed, scrubbed) observer('event', 'signup_click', { plan: 'pro' }); // consent bridge (T1/T2 sites) observer('consent', 'granted'); // explicit control observer('optIn'); observer('optOut'); // silences + clears // trigger a survey widget observer('survey', { question: 'How was checkout?', type: 'nps' }); // debug logging observer.debug();
window.observer
Zdarzenia własne, zgoda, opt-in/out, ankiety, debug — jedna przestrzeń nazw funkcji, udokumentowane zachowanie, zero beaconów bez uprzedzenia.
observer('optOut') zatrzymuje SDK i czyści każdy stan; nagłówki DNT i GPC robią to samo automatycznie.
Restrykcyjny schemat: maksymalnie 10 właściwości, poddanych scrubbingowi, lista dozwolonych per witryna. Collector odrzuca wszystko inne.
Kreator weryfikuje Twoją instalację na żywo — najpierw pierwsza odsłona, potem rosnący licznik. Zero zgadywania. Nigdy.