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
| Decyzja | Alternatywy | Dlaczego tak |
|---|---|---|
| n8n self-hosted | n8n Cloud, Make, Zapier | Stał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 Hostingerze | Hetzner, Railway, Render | Gotowy 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 Pro | O 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 Account | OAuth pracownika | Bot 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/pytanie | 50 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:
* 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ędzie | Rola | Co przygotować |
|---|---|---|
| n8n (self-hosted) | Silnik workflow | VPS + Docker Compose, HTTPS |
| GA4 Data API | Źródło danych | Service Account + rola Viewer w GA4 + włączona Google Analytics Data API w projekcie GCP |
| LLM provider | Mózg agenta | Klucz API (Anthropic / OpenAI / Google) |
| Slack | Interfejs | Slack 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_URLto 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ętrznylocalhost:5678. Bez tej zmiennej node Slack Trigger wygeneruje webhook URL wskazujący nalocalhost, którego Slack nigdy nie osiągnie.WEBHOOK_URLmó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_HOSTto 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
- 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
- IAM → Service Accounts → utwórz (np.
n8n-ga4-reader) → wygeneruj klucz JSON - 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
model + pamięć
Send Message
- Slack Trigger — nasłuchuje
app_mention, przekazuje tekst,channel_idithread_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 Tool —
propertyId+ 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.