Wszystkie wpisy

12 czerwca 2026

Bot Slack z AI odpowiadający na pytania o dane GA4 — n8n krok po kroku

Najczęstsze pytania o dane w e-commerce nie wymagają analityka — wymagają dostępu. „Ile mieliśmy wczoraj sesji z płatnych?”, „jak konwersja tydzień do tygodnia?” — odpowiedź zajmuje 30 sekund, ale tylko temu, kto zna interfejs GA4. Reszta organizacji pisze do analityka i czeka. Analityk przerywa pracę i wyklikuje raport. Obie strony tracą.

Bot Slack z n8n i agentem AI zdejmuje ten problem: pytanie naturalnym językiem w kanale, odpowiedź z danych GA4 w kilka sekund. Wdrożyłem to jako narzędzie wewnętrzne — kontekst biznesowy opisuję w case study Bot Slack + GA4 + LLM, a tutaj przechodzę przez pełny proces techniczny, razem z decyzjami, które w tutorialach zwykle pomija się milczeniem.

Bot Slack z danymi GA4 — jak korzysta z niego zespół

Zero szkoleń, zero nowych narzędzi. Ktoś z marketingu pisze w kanale:

@AnalyticsBot ile sesji z Google Ads mieliśmy w tym tygodniu vs poprzedni?

Bot odpowiada w wątku po kilku sekundach: liczby, zakres dat, krótki komentarz. Dzięki pamięci konwersacji działają dopytania — „a w rozbiciu na urządzenia?” — bez powtarzania kontekstu. Nikt nie loguje się do GA4, nikt nie czeka na analityka.

Decyzje architektoniczne — dlaczego ten stack

DecyzjaAlternatywyDlaczego tak
n8n self-hostedn8n Cloud, Make, ZapierStały koszt niezależny od liczby pytań — Make/Zapier liczą per operacja, a bot pytany kilkadziesiąt razy dziennie robi się drogi. Dane przechodzą przez własną infrastrukturę. Natywny node AI Agent z tool callingiem.
VPS na HostingerzeHetzner, Railway, RenderGotowy szablon n8n — deploy w minuty zamiast ręcznej konfiguracji. Kilkadziesiąt złotych miesięcznie. Hetzner równie dobry, ale bez szablonu.
Claude (Anthropic)GPT-4, Gemini ProO jakości bota decyduje tool calling — poprawne budowanie zapytań do GA4 API. Działa z każdym z trzech; wybierz tego dostawcę, z którym organizacja ma już umowę.
Service AccountOAuth pracownikaBot nie może zależeć od czyjegoś konta — odejście z firmy = martwa integracja. SA z rolą Viewer to least privilege: tylko odczyt.

Ile to kosztuje

Stałe składowe są tanie: VPS to kilkadziesiąt złotych miesięcznie, Slack App jest darmowa. Zmienna i niedoszacowywana pozycja to model LLM, i tu warto policzyć uczciwie, bo „grosze za pytanie” to mit.

Jedno pytanie do agenta to nie jeden request do API. Agent działa w pętli: rozumuje, woła narzędzie GA4, dostaje dane, rozumuje ponownie, odpowiada. Każda iteracja wysyła ponownie cały kontekst — system prompt, definicje narzędzi, historię i dane z GA4. Z włączoną pamięcią i dopytaniami kontekst narasta. Realnie jedno pytanie to ~6 tys. tokenów wejścia i ~800 wyjścia, skumulowanie przez 2–3 iteracje.

Model (cennik input/output za 1M)Koszt/pytanie50 osób × ~200 pytań/dzień150 osób × ~600 pytań/dzień
Claude Haiku 4.5 ($1 / $5)~$0,01~240 zł/mies.~720 zł/mies.
Claude Sonnet 4.6 ($3 / $15)~$0,03~720 zł/mies.~2 100 zł/mies.
Claude Opus 4.8 ($5 / $25)~$0,05~1 200 zł/mies.~3 600 zł/mies.

Ceny modeli Anthropic, stan na czerwiec 2026. Kwoty miesięczne przeliczone po ~4 zł/USD przy ~30 dniach. Cenniki LLM zmieniają się — przed wdrożeniem zweryfikuj aktualne stawki u dostawcy.

Dla jednoosobowego użytku to faktycznie grosze. Dla dużego e-commerce ze 150 osobami pytającymi codziennie — od ~720 do ~3 600 zł miesięcznie zależnie od modelu, czyli wielokrotność kosztu VPS. Dwa zastrzeżenia, o których trzeba wiedzieć:

  • Cennik API się zmienia. Stawki bywają korygowane w górę; nie buduj budżetu na założeniu, że dzisiejsza cena jest stała.
  • Abonament (Claude Pro, ChatGPT Plus) to nie alternatywa dla bota. Płaski abonament obejmuje interfejs czatu dla człowieka, nie dostęp programistyczny. n8n potrzebuje klucza API — automatyzacja zawsze płaci per-token, co jest z natury droższe niż abonament. To nie jest wybór; to ograniczenie architektury.

Prompt caching — dlaczego pętla nie musi kosztować ×3

Dźwignia, która realnie tnie koszt pętli, to prompt caching. Żeby zobaczyć, skąd biorą się oszczędności, trzeba rozłożyć trzy pojęcia:

  • Pętla (agentic loop) — model nie odpowiada jednym strzałem. Na jedno pytanie wykonuje serię kroków: rozumuje → woła narzędzie GA4 → dostaje dane → rozumuje ponownie → odpowiada. Każdy krok to osobne wywołanie API, które wysyła ponownie cały dotychczasowy kontekst. Stąd jedno pytanie to 2–3 wywołania, nie jedno.
  • System prompt — stały blok instrukcji doklejany na początek każdego wywołania: persona agenta, biała lista metryk GA4, definicje narzędzi. Ten fragment jest identyczny w każdej iteracji — nie zmienia się między krokami.
  • cache_control — znacznik mówiący API „zapamiętaj wszystko do tego miejsca”. Przy kolejnym wywołaniu z identycznym prefiksem API nie przelicza go od nowa, tylko odczytuje z cache za ~0,1× ceny wejścia. Cache żyje ~5 minut — a że iteracje jednego pytania dzieją się w sekundach, prefiks jest „ciepły” przez całą pętlę.

Poniżej to, co realnie leci na serwery Anthropic, gdy ktoś zada jedno pytanie:

Slack → @AnalyticsBot ile sesji z Google Ads w tym tygodniu?
↓ agent uruchamia pętlę ↓
ITERACJA 1 — model rozumuje i woła narzędzie GA4
System prompt + definicje narzędzi (~2 000 tokenów) stałe · zapis do cache ×1,25*
Pytanie użytkownika zmienne · pełna stawka
↓ wynik z GA4 wraca do modelu ↓
ITERACJA 2 — model formułuje odpowiedź
Ten sam system prompt + definicje narzędzi odczyt z cache ×0,1*
Pytanie + dane z GA4 zmienne · pełna stawka
Zielony prefiks jest w obu iteracjach identyczny — od iteracji 2 czyta się go z cache za ~0,1× zamiast pełnej stawki. Fioletowy fragment (pytanie, dane z GA4) zmienia się i zawsze idzie pełną stawką. Stąd reguła: stałe na górze, zmienne na dole.

* Liczby przy cache to mnożniki ceny input danego modelu (z tabeli wyżej), nie kwoty absolutne — i są to stawki cennikowe Anthropic, nie wartości wyliczone. Zapis prefiksu do cache kosztuje ×1,25 przy domyślnym 5-minutowym TTL (×2 przy 1-godzinnym), a każdy późniejszy odczyt ×0,1. Mnożniki są identyczne dla wszystkich modeli Claude.

Związek z architekturą pamięci: pamięć konwersacji (w n8n — Simple Memory) sprawia, że kontekst rośnie z każdym dopytaniem, a pętla wysyła go w całości przy każdym kroku — im dłuższa rozmowa, tym więcej zyskujesz na cache’owaniu stałego prefiksu. Warunek konstrukcyjny widać na diagramie: stałe elementy muszą iść na początku, bo cache to dopasowanie prefiksu — dowolna zmiana powyżej zmiennej części unieważnia go w całości.

Zastrzeżenie: zadziała tylko, jeśli używany node w n8n wystawia cache_control — natywne node’y oparte na LangChain nie zawsze to robią. Sprawdź to, zanim wliczysz oszczędność w budżet.

Czego potrzebujesz

NarzędzieRolaCo przygotować
n8n (self-hosted)Silnik workflowVPS + Docker Compose, HTTPS
GA4 Data APIŹródło danychService Account + rola Viewer w GA4 + włączona Google Analytics Data API w projekcie GCP
LLM providerMózg agentaKlucz API (Anthropic / OpenAI / Google)
SlackInterfejsSlack App + Bot token: chat:write, app_mentions:read

n8n bot Slack GA4 — wdrożenie krok po kroku

Krok 1 — n8n na VPS

Najprostsza droga: na Hostingerze wybierz szablon n8n przy tworzeniu VPS. Instalacja z Dockerem, reverse proxy i certyfikatem HTTPS jest gotowa, a kluczowe zmienne środowiskowe są ustawione za Ciebie — dlatego przy tej ścieżce nie dotykasz N8N_HOST ani WEBHOOK_URL. To nie jest pominięcie kroku; szablon po prostu wykrywa publiczny adres i wstawia te wartości sam.

Te zmienne stają się istotne dopiero przy ręcznej konfiguracji (Ubuntu 22.04, własny docker-compose.yml, reverse proxy nginx/Caddy) — i warto rozumieć, po co istnieją:

  • WEBHOOK_URL to najważniejsza z nich. n8n stojące za reverse proxy domyślnie nie wie, pod jakim publicznym adresem jest dostępne — widzi tylko swój wewnętrzny localhost:5678. Bez tej zmiennej node Slack Trigger wygeneruje webhook URL wskazujący na localhost, którego Slack nigdy nie osiągnie. WEBHOOK_URL mówi n8n: „adresy webhooków buduj względem tej publicznej domeny”. Na szablonie Hostingera ten problem nie występuje, bo instalacja zna swój adres od startu.
  • N8N_HOST to hostname, pod którym n8n uznaje, że działa — używany przy generowaniu linków w interfejsie. Mniej krytyczny niż WEBHOOK_URL, ale w setupie za proxy warto ustawić go spójnie.

Niezależnie od ścieżki HTTPS jest obowiązkowy — Slack odrzuca webhooki bez TLS. W szablonie certyfikat jest gotowy; przy ręcznej konfiguracji Caddy załatwia go automatycznie.

Krok 2 — Service Account i GA4

  1. W projekcie GCP włącz Google Analytics Data API (Biblioteka API) — bez tego każde wywołanie skończy się błędem 403 i będziesz szukać winy w złym miejscu
  2. IAM → Service Accounts → utwórz (np. n8n-ga4-reader) → wygeneruj klucz JSON
  3. GA4 Admin → Zarządzanie dostępem → dodaj e-mail SA z rolą Viewer — bot tylko czyta, nigdy nie dawaj więcej

W n8n: credential Google Analytics (Service Account) + wklej JSON.

Krok 3 — Slack App

api.slack.com/apps → Create App. OAuth Scopes: chat:write (odpowiadanie), app_mentions:read (reagowanie na wzmianki), channels:history (kontekst wątku). W n8n dodaj node Slack Trigger na event app_mention — to on wygeneruje webhook URL, który wklejasz w Event Subscriptions po stronie Slacka. Weryfikację url_verification n8n obsługuje sam.

Krok 4 — Workflow

Slack Trigger
AI Agent
model + pamięć
GA4 Tool
Slack
Send Message
Slack Trigger odbiera pytanie, agent z pamięcią i narzędziem GA4 buduje odpowiedź i odsyła ją do kanału.
  • Slack Trigger — nasłuchuje app_mention, przekazuje tekst, channel_id i thread_ts
  • AI Agent — wariant Tools Agent (nie ReAct — starszy wariant nie wspiera poprawnie narzędzi razem z pamięcią); w polu Chat Model podpinasz wybranego providera
  • Simple Memory — jako Session Key ustaw kombinację kanału i wątku (np. {{ channel_id }}-{{ thread_ts }}), inaczej rozmowy różnych osób będą mieszać sobie kontekst
  • GA4 ToolpropertyId + zamknięta lista metryk i wymiarów
  • Slack → Send Message — odpowiedź do wątku z thread_ts

Krok 5 — Prompt systemowy

Prompt mapuje język biznesowy na metryki GA4. Minimalny starter:

Jesteś analitykiem danych. Odpytuj GA4 Data API w odpowiedzi na pytania zespołu.
Dostępne metryki: sessions, activeUsers, screenPageViews, conversions, totalRevenue.
Dostępne wymiary: date, sessionDefaultChannelGroup, deviceCategory, country.
Odpowiadaj zwięźle po polsku. Zawsze podaj zakres dat użyty w zapytaniu.

Zamknięta lista pól to nie wygoda, tylko konieczność: LLM-y chętnie zmyślają nazwy metryk, a każda zmyślona nazwa to błąd 400 z API. Whitelist w prompcie + opisie narzędzia eliminuje większość takich przypadków.

Krok 6 — Format odpowiedzi

Slack używa mrkdwn (podzbiór Markdownu). Dopisz w prompcie, by agent pogrubiał kluczowe liczby i cytował (>) interpretację pytania — czytelnik od razu widzi, czy bot dobrze zrozumiał, o co pytano.

Pułapki, których nie ma w tutorialach

  • Reguła 3 sekund Slacka. Slack wymaga potwierdzenia eventu w 3 s — inaczej wysyła go ponownie i bot odpowiada dwa albo trzy razy na jedno pytanie. Node Slack Trigger potwierdza od razu; jeśli budujesz na generycznym Webhooku, ustaw odpowiedź natychmiastową, nie po zakończeniu workflow.
  • Simple Memory żyje w pamięci procesu. Restart kontenera = czysta historia rozmów. Do jednorazowych pytań o bieżące dane wystarcza; jeśli potrzebujesz ciągłości, podmień na Redis Memory lub Postgres.
  • Halucynacje pól API. Opisane w kroku 5 — whitelist metryk to pierwsza linia obrony i warto ją utrzymywać w jednym miejscu.

Wszystko powyżej dotyczy workflow, który budujesz sam — znasz każdy węzeł, bo sam go wstawiłeś. Cudzy gotowiec z marketplace to odwrotna sytuacja: oszczędza czas, ale przemyca własne miny, prawne i techniczne. Rozbieram je w audycie szablonu n8n.

Powiązane wpisy