LW IT Solutions logo LW IT Solutions logo LW IT Solutions
« Przegląd bloga /Digital Marketing/Tutorials / Tutorial: Monitorowanie anomalii e-commerce w czasie rzeczywistym...
Ten artykuł w innych językach:

Tutorial: Monitorowanie anomalii e-commerce w czasie rzeczywistym dla add_to_cart i begin_checkout

Tutorial: Monitorowanie anomalii e-commerce w czasie rzeczywistym dla add_to_cart i begin_checkout
Spis treści
  1. Krok 1: Pobieranie bieżących liczb przez Realtime Reporting API
  2. Krok 2: Wartość bazowa wystarczająco lekka, by odświeżać się co kilka minut
  3. Krok 3: Obliczanie odchylenia i statusu
  4. Krok 4: Uwidocznienie spadków dzięki formatowaniu warunkowemu
  5. Krok 5: Umieszczenie tam, gdzie zespół faktycznie patrzy
  6. Pozostając w granicach
  7. Pytania i odpowiedzi
  8. Źródła

Codzienny audyt statystyczny wykrywa zepsute zdarzenie zakupu w ciągu doby; podczas flash sale’u albo tuż po wdrożeniu doba to zbyt wolno. Wykrycie spadku zdarzeń add_to_cart lub begin_checkout w trakcie, gdy się dzieje, wymaga źródła danych z opóźnieniem liczonym w minutach — eksport GA4 do BigQuery działa jako codzienne zadanie wsadowe i nie jest zbudowany pod dashboard odświeżający się co kilka minut. Realtime Reporting API GA4 owszem: zwraca liczby zdarzeń z mniej więcej ostatnich 30 minut i jest dostępne w każdej właściwości GA4, także w darmowej wersji.

Poniższy przewodnik pokazuje, jak zbudować lekki dashboard operacyjny oparty na tym API: arkusz Google odświeżany co kilka minut przez Apps Script. Porównuje on bieżącą liczbę zdarzeń add_to_cart i begin_checkout z tą samą porą dnia tydzień wcześniej. Formatowanie warunkowe (Conditional Formatting) zabarwia odpowiednią komórkę na czerwono w chwili, gdy spadek przekroczy próg.

Przepływ od GA4 Realtime API pobieranego co pięć minut przez Apps Script, przez porównanie z tą samą porą tydzień wcześniej, aż po kolumnę statusu podświetlaną na czerwono formatowaniem warunkowym po przekroczeniu progu spadku
Minuty opóźnienia zamiast doby, kosztem prostszej wartości bazowej.

Krok 1: Pobieranie bieżących liczb przez Realtime Reporting API

Metoda runRealtimeReport z GA4 Data API przyjmuje eventName jako wymiar i eventCount jako metrykę, filtrowane do danych czasu rzeczywistego właściwości — żaden eksport do BigQuery nie bierze w tym udziału. Wbudowana zaawansowana usługa Analytics Data API w Apps Script może wywołać ją bezpośrednio ze skryptu powiązanego z arkuszem dashboardu:

JavaScript
function pullRealtimeCounts() {
  const propertyId = 'properties/XXXXXXXXX';
  const request = {
    dimensions: [{ name: 'eventName' }],
    metrics: [{ name: 'eventCount' }],
    dimensionFilter: {
      filter: {
        fieldName: 'eventName',
        inListFilter: { values: ['add_to_cart', 'begin_checkout'] }
      }
    }
  };
  const response = AnalyticsData.Properties.runRealtimeReport(request, propertyId);
  return response.rows || [];
}

Wyzwalacz czasowy uruchamia tę funkcję co pięć minut i dopisuje obie liczby wraz ze znacznikiem czasu do zakładki dziennika — to surowy materiał, z którego budowany jest zarówno bieżący status, jak i porównanie z wartością bazową.

Krok 2: Wartość bazowa wystarczająco lekka, by odświeżać się co kilka minut

14-dniowa krocząca wartość bazowa oparta na Z-score to właściwe narzędzie do codziennego audytu statystycznego, ale dla dashboardu na żywo, który ma szybko odpowiedzieć na jedno pytanie — czy bieżący wolumen jest mniej więcej tam, gdzie powinien być teraz — jest to rozwiązanie przewymiarowane. Porównanie do tego samego dnia tygodnia i tej samej pory dnia dokładnie siedem dni wcześniej jest prostsze do policzenia i łatwiejsze do zrozumienia dla kogoś, kto rzuca okiem na ekran. Umożliwia je drugi wyzwalacz, uruchamiany raz dziennie, który zapisuje dzienne liczby godzina po godzinie. Bieżący odczyt zastaje dzięki temu zawsze odpowiadającą mu godzinę z poprzedniego tygodnia.

Krok 3: Obliczanie odchylenia i statusu

Kolumna z formułą zamienia obie liczby w odchylenie procentowe i etykietę statusu:

Tekst
=IF(baseline_count=0, "n/a",
   ROUND((current_count - baseline_count) / baseline_count * 100, 1))

Poniżej mniej więcej dziesięciu zdarzeń w wartości bazowej wynik procentowy traci sens — pojedyncze brakujące zdarzenie w nocy wygląda jak 50-procentowy spadek. Minimalny próg wartości bazowej (na przykład ocenianie statusu dopiero gdy wartość bazowa przekracza 20) chroni dashboard przed niepotrzebnym alarmowaniem w najcichszych godzinach.

Krok 4: Uwidocznienie spadków dzięki formatowaniu warunkowemu

Za samo podświetlanie odpowiada reguła formatowania warunkowego z własną formułą na kolumnie statusu: czerwony poniżej -30, pomarańczowy między -30 a -15, brak wypełnienia powyżej. To ten sam wzorzec wizualny, jaki stosuje dashboard audytu statystycznego, tutaj zastosowany bezpośrednio w Sheets. Widok operacyjny aktualizuje się dzięki temu w chwili, gdy Apps Script dopisuje nowy wiersz – bez dodatkowego źródła danych i bez konektora pomiędzy.

Krok 5: Umieszczenie tam, gdzie zespół faktycznie patrzy

Arkusz działa samodzielnie dla każdego z prawem edycji lub podglądu, ale przypięcie go do wspólnego ekranu podczas okna startowego kampanii albo podłączenie go do Looker Studio jako jednej z kilku kafelków utrzymuje go widocznym bez konieczności trzymania arkusza otwartym przez kogokolwiek. Przy podłączaniu do Looker Studio trzeba obniżyć ustawienie częstotliwości odświeżania danych konektora Sheets względem wartości domyślnej — inaczej pięciominutowe odświeżanie przez Apps Script znajdzie się za znacznie wolniejszym cache’em i sens budowania tego rozwiązania zniknie.

Pozostając w granicach

Ten dashboard to sprawdzenie objawów na żywo, a nie zamiennik audytu statystycznego działającego na zamkniętych danych całego dnia — przeoczy powolny, stopniowy spadek, który w żadnym pojedynczym pięciominutowym oknie nie przekroczy progu, a właśnie do tego służy krocząca wartość bazowa. Czerwona komórka tutaj to sygnał, by sprawdzić sytuację, a nie sama w sobie potwierdzony incydent: flash sale, który legalnie potraja wolumen add_to_cart, albo naprawdę cicha godzina — obie sytuacje mogą wywołać wychylenie poza próg bez niczego zepsutego.

Pytania i odpowiedzi

Skąd pochodzi liczba z poprzedniego tygodnia, skoro Realtime Reporting API sięga wstecz tylko o około 30 minut?

Z tego, co dashboard sam zapisał, albo z raportów standardowych. Realtime Reporting API nie zna niczego poza swoim oknem, więc liczba sprzed siedmiu dni musi albo znajdować się we własnej zakładce dziennika, albo pochodzić z metody runReport w GA4 Data API, z przetworzonych danych dziennych, na przykład w podziale na godziny.

Kluczowe jest to, żeby obie liczby obejmowały to samo okno czasowe. Wartość czasu rzeczywistego obejmuje mniej więcej 30 minut, liczba godzinowa 60. Przy równomiernym ruchu wartość czasu rzeczywistego zawiera więc tylko około połowy zdarzeń z godziny sprzed tygodnia, a formuła pokazuje odchylenie −50%, choć nic nie jest zepsute. Liczbę godzinową należy zatem przed porównaniem podzielić na pół albo porównywać z wpisem dziennika zapisanym dokładnie siedem dni wcześniej o tej samej porze, który obejmuje to samo okno.

Druga droga ma skutek uboczny: potrzebuje pełnego tygodnia dziennika, zanim pierwszy status nabierze sensu.

Dlaczego komórka nie robi się czerwona od razu po całkowitej awarii?

Ponieważ każdy odczyt liczy mniej więcej ostatnie 30 minut, a kolejne odczyty nakładają się na siebie. Jeśli zdarzenie w danej chwili całkowicie przestaje napływać, następny odczyt pięć minut później zawiera jeszcze 25 minut zdrowych danych. Przy równomiernym ruchu rachunek wygląda tak:

  • po 5 minutach około −17%, czyli kolor pomarańczowy,
  • po 10 minutach około −33%, czyli czerwony,
  • po 30 minutach −100%.

Całkowita awaria staje się więc widoczna po mniej więcej dziesięciu minutach, częściowa później albo wcale. Jeśli odpada tylko połowa zdarzeń, odchylenie osiąga −50% dopiero po pełnym oknie, a próg −30 przekracza najwcześniej przy odczycie po 20 minutach; strata poniżej 30% nigdy nie zabarwi komórki na czerwono.

Czy dashboard alarmuje także wtedy, gdy psuje się tylko pomiar, a sklep działa dalej?

Tak, i nie potrafi odróżnić jednego od drugiego. Liczy zdarzenia w GA4, a nie koszyki: tag, który po wdrożeniu przestaje się uruchamiać, albo zmieniony baner zgody, na który zgadza się mniej odwiedzających, daje tę samą czerwoną komórkę co zepsuty checkout. Które z nich zaszło, rozstrzyga wgląd w zamówienia w systemie sklepu.

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.

Kontakt

Masz pytanie lub pomysł na projekt internetowy? Napisz krótko, o co chodzi. Formularz korzysta z reCAPTCHA do ochrony przed spamem.

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ą.