Spis treści
- Dlaczego n8n do raportów marketingowych
- Jak wygląda przepływ raportu krok po kroku
- Kod do obliczeń: liczby liczy JavaScript, nie model
- Jak napisać prompt, żeby model nie zmyślał liczb
- Akceptacja przez człowieka i obsługa błędów
- Koszty, bezpieczeństwo i RODO w raportach z AI
- Jak rozwinąć przepływ, gdy podstawowa wersja działa
- Najczęściej zadawane pytania
Automatyzacja raportów w n8n polega na zbudowaniu przepływu, który według harmonogramu pobiera dane z BigQuery i GA4, liczy wskaźniki w węźle z kodem, przekazuje je modelowi językowemu do opisania, a gotowy raport wysyła na Slacka lub e-mailem po akceptacji człowieka. Model nie liczy niczego sam – dostaje gotowe liczby i pisze komentarz. Dzięki temu raport tygodniowy dla klienta czy zarządu powstaje w kilka minut, a ryzyko zmyślonych wartości jest pod kontrolą. Poniżej pokazujemy cały przepływ, zapytanie SQL, kod do skopiowania i zabezpieczenia.
Najważniejsze w skrócie
- Najbezpieczniejszy podział pracy: SQL i węzeł Code liczą wskaźniki, model językowy wyłącznie je opisuje i nie dostaje surowych danych.
- Dane kosztowe z kilku platform najprościej trzymać w jednej tabeli w BigQuery i pobierać jednym zapytaniem, zamiast łączyć API w samym przepływie.
- Wynik modelu wymuszaj w formacie JSON i sprawdzaj automatycznie, czy liczby w komentarzu występują w danych wejściowych.
- Przed wysyłką do klienta raport powinien trafić do człowieka do akceptacji, np. przez wiadomość na Slacku z oczekiwaniem na odpowiedź.
- Ostatnie 1–3 dni w Google Ads są niepełne, bo konwersje dopisują się z opóźnieniem do daty kliknięcia, więc porównuj pełne, zamknięte okresy.
Dlaczego n8n do raportów marketingowych
n8n to narzędzie do budowania przepływów automatyzacji z gotowych węzłów, które możesz uruchomić we własnej infrastrukturze lub w chmurze producenta. Do raportów marketingowych nadaje się dlatego, że łączy w jednym miejscu harmonogram, zapytania do BigQuery, kod w JavaScripcie lub Pythonie, wywołania modeli językowych i wysyłkę wiadomości.
Wersję społecznościową n8n możesz hostować samodzielnie, co ma znaczenie przy danych klientów: wiesz, gdzie fizycznie działa przepływ i kto ma do niego dostęp. Licencja n8n to tzw. fair-code, więc przed użyciem w produkcie komercyjnym sprawdź jej warunki. Dla porównania warto zestawić n8n z narzędziami, które zespoły marketingu już znają.
| Rozwiązanie | Mocne strony | Ograniczenia | Kiedy wybrać |
|---|---|---|---|
| n8n z modelem językowym | Dowolne źródła, kod, komentarz AI, akceptacja człowieka | Wymaga utrzymania i podstaw programowania | Raport z wnioskami dla wielu klientów |
| Looker Studio z wysyłką e-mail | Wizualizacje, prosty harmonogram | Brak komentarza i logiki warunkowej | Stały dashboard bez interpretacji |
| Skrypty Google Ads | Natywny dostęp do konta, bezpłatne | Tylko Google Ads, limity czasu wykonania | Alerty i raporty z jednego konta |
| Apps Script i Arkusze | Znane środowisko, łatwe udostępnianie | Słabe przy dużych danych i wielu źródłach | Mały zespół, proste zestawienia |
Gotowe rozwiązania oparte na skryptach i Apps Script opisujemy w tekście o automatycznych raportach z Google Ads do Arkuszy i Slacka. n8n przydaje się, gdy chcesz w jednym raporcie połączyć kilka platform i dodać do liczb interpretację.
Jak wygląda przepływ raportu krok po kroku
Przepływ składa się z siedmiu węzłów: harmonogram, zapytanie do BigQuery, dane z GA4, obliczenia w kodzie, model językowy, kontrola wyniku i wysyłka z akceptacją. Każdy węzeł robi jedną rzecz, co ułatwia szukanie błędów.
Schedule Trigger (pon. 7:00)
-> Google BigQuery: Execute Query (koszty i przychody, 14 dni)
-> Google Analytics: Report (sesje i zdarzenia kluczowe wg kanału)
-> Merge
-> Code: KPI i zmiany tydzień do tygodnia
-> Basic LLM Chain + Chat Model + Structured Output Parser
-> Code: kontrola liczb w komentarzu
-> Slack: Send and Wait for Response (akceptacja)
-> Gmail / Slack: wysyłka raportu + Google Sheets: log
- Ustaw harmonogram. W węźle Schedule Trigger wybierz poniedziałek, godzinę 7:00 i strefę czasową Europe/Warsaw. Zła strefa czasowa to częsty powód raportów z przesuniętym zakresem dat.
- Pobierz dane kosztowe z BigQuery. Zakładamy, że masz tabelę z dziennymi kosztami, konwersjami i przychodem z Google Ads, Meta i innych platform, zasilaną transferem danych lub konektorem. Jak taką tabelę zaprojektować, pokazujemy w tekście o łączeniu danych z Google Ads, Meta i GA4.
- Dodaj dane z GA4. Węzeł Google Analytics obsługuje usługi GA4 i pozwala pobrać raport z wybranymi wymiarami i metrykami, np. domyślną grupą kanałów, sesjami i zdarzeniami kluczowymi. Jeśli masz eksport do BigQuery, możesz zamiast tego użyć zapytania, jak w poradniku o odtwarzaniu sesji i źródeł ruchu w SQL.
- Połącz dane i policz wskaźniki. Węzeł Merge łączy strumienie, a węzeł Code liczy koszt, przychód, ROAS, CPA i zmiany procentowe.
- Wygeneruj komentarz. Węzeł Basic LLM Chain z podłączonym modelem (OpenAI, Anthropic lub Gemini) dostaje tylko wynik obliczeń i instrukcję. Structured Output Parser wymusza odpowiedź w ustalonym formacie JSON.
- Sprawdź wynik automatycznie. Drugi węzeł Code porównuje liczby z komentarza z danymi wejściowymi.
- Wyślij do akceptacji, potem do odbiorcy. Slack lub Gmail z operacją wysyłki i oczekiwania na odpowiedź wstrzymuje przepływ, aż osoba odpowiedzialna zatwierdzi raport.
Zapytanie w kroku 2 zwraca dwa pełne okresy po 7 dni, bez dnia bieżącego:
SELECT
IF(data >= DATE_SUB(CURRENT_DATE('Europe/Warsaw'), INTERVAL 7 DAY), 'biezacy', 'poprzedni') AS okres,
platforma,
kampania,
SUM(koszt) AS koszt,
SUM(konwersje) AS konwersje,
SUM(przychod) AS przychod
FROM `twoj-projekt.marketing.koszty_kampanii_dzienne`
WHERE data BETWEEN DATE_SUB(CURRENT_DATE('Europe/Warsaw'), INTERVAL 14 DAY)
AND DATE_SUB(CURRENT_DATE('Europe/Warsaw'), INTERVAL 1 DAY)
GROUP BY okres, platforma, kampania
Kod do obliczeń: liczby liczy JavaScript, nie model
Wszystkie wskaźniki licz w węźle Code, zanim dane trafią do modelu. Model językowy dobrze opisuje zmiany, ale przy dodawaniu kilkudziesięciu wierszy i dzieleniu potrafi się pomylić, a błąd w komentarzu wygląda tak samo wiarygodnie jak poprawna liczba.
Poniższy kod działa w trybie uruchamiania raz dla wszystkich elementów. Zwraca zestawienie dla bieżącego i poprzedniego tygodnia oraz zmiany procentowe. Ten sam wzorzec możesz rozszerzyć o podział na platformy lub kampanie.
const wiersze = $input.all().map(i => i.json);
const suma = (okres, pole) => wiersze
.filter(w => w.okres === okres)
.reduce((s, w) => s + Number(w[pole] || 0), 0);
const kpi = okres => {
const koszt = suma(okres, 'koszt');
const przychod = suma(okres, 'przychod');
const konwersje = suma(okres, 'konwersje');
return {
koszt: Math.round(koszt),
przychod: Math.round(przychod),
konwersje: Math.round(konwersje),
roas: koszt ? +(przychod / koszt).toFixed(2) : null,
cpa: konwersje ? +(koszt / konwersje).toFixed(2) : null,
};
};
const biezacy = kpi('biezacy');
const poprzedni = kpi('poprzedni');
const zmiana_proc = {};
for (const k of Object.keys(biezacy)) {
zmiana_proc[k] = poprzedni[k]
? +(((biezacy[k] - poprzedni[k]) / poprzedni[k]) * 100).toFixed(1)
: null;
}
return [{ json: { biezacy, poprzedni, zmiana_proc } }];
Do modelu przekazuj wynik tego węzła, a nie surowe wiersze. To zmniejsza liczbę tokenów, koszt wywołania i ryzyko, że model zacznie interpretować pojedyncze kampanie, zamiast trzymać się zadanego zakresu.
Jak napisać prompt, żeby model nie zmyślał liczb
Prompt w przepływie raportowym powinien jednoznacznie zakazać szacowania, wymusić użycie wyłącznie danych wejściowych i określić format odpowiedzi. Im węższe zadanie, tym mniej miejsca na dopowiadanie faktów, których w danych nie ma.
Jesteś analitykiem performance. Otrzymujesz JSON z KPI dwóch tygodni.
Zasady:
- Używaj wyłącznie liczb z JSON. Nie szacuj, nie zaokrąglaj inaczej niż w danych.
- Opisz 3 największe zmiany i ich możliwe przyczyny jako hipotezy, nie fakty.
- Jeśli zmiana jest mniejsza niż 5%, nie komentuj jej.
- Nie podawaj rekomendacji budżetowych, tylko pytania do specjalisty.
Dane: {{ JSON.stringify($json) }}
{
"podsumowanie": "2-3 zdania dla zarządu",
"zmiany": [{"wskaznik": "roas", "opis": "...", "hipoteza": "..."}],
"pytania_do_specjalisty": ["..."]
}
Ustaw niską temperaturę modelu, jeśli węzeł na to pozwala, i trzymaj prompt w jednym miejscu, np. w osobnym węźle Set, żeby zmiany były widoczne w historii przepływu. Gotowe sformułowania poleceń analitycznych znajdziesz w zestawie promptów dla specjalisty performance.
Kontrola w kroku 6 może być prosta: wyciągnij z tekstu wszystkie liczby i sprawdź, czy każda występuje w danych wejściowych. Jeśli nie, przepływ oznacza raport flagą do ręcznej weryfikacji, zamiast go wysyłać. To nie wyłapie błędnej interpretacji, ale skutecznie zatrzyma wymyśloną wartość.
Akceptacja przez człowieka i obsługa błędów
Raport wysyłany do klienta zawsze przechodzi przez akceptację człowieka, a przepływ ma osobną ścieżkę błędów, która powiadamia zespół, gdy dane nie dotarły albo wyglądają podejrzanie. Bez tego automatyzacja potrafi tygodniami wysyłać raporty z pustych tabel.
W praktyce najczęściej psują się trzy rzeczy. Po pierwsze, dane nie są gotowe o godzinie uruchomienia: dzienny eksport GA4 do BigQuery bywa opóźniony, a transfery kosztowe działają według własnego harmonogramu. Dodaj na początku przepływu kontrolę, czy tabela zawiera dane z wczoraj, i w razie braku wstrzymaj raport. Po drugie, wygasają poświadczenia OAuth – n8n zgłosi błąd węzła, który warto przechwycić. Po trzecie, nagłe zera w kosztach lub konwersjach wynikają częściej z awarii tagów niż z rynku; tu pomaga osobny mechanizm opisany w tekście o monitoringu tagów i alertach o spadku zdarzeń.
Do obsługi błędów służy osobny przepływ z węzłem Error Trigger, przypisany w ustawieniach głównego przepływu jako przepływ błędów. Najprostsza wersja wysyła na Slacka nazwę węzła, komunikat i link do wykonania. Alerty o anomaliach budżetowych lepiej jednak zostawić narzędziom działającym częściej niż raz w tygodniu, np. skryptom Google Ads wykrywającym anomalie w budżecie.
Każde wykonanie zapisuj w arkuszu lub tabeli: datę, zakres, wynik obliczeń, odpowiedź modelu, wynik kontroli i decyzję akceptującego. Taki log pozwala po miesiącu ocenić, jak często komentarz wymagał poprawek.
Koszty, bezpieczeństwo i RODO w raportach z AI
Przepływ raportowy jest tani i bezpieczny, jeśli przesyła do modelu wyłącznie zagregowane wskaźniki kampanii, a poświadczenia trzyma w menedżerze poświadczeń n8n z minimalnymi uprawnieniami. Dane osobowe nie są do takiego raportu potrzebne.
Załóżmy, że raport dla jednego klienta to ok. 3000 tokenów wejścia i 800 tokenów wyjścia, a agencja obsługuje 20 klientów. Przy cotygodniowych raportach to ok. 80 wywołań miesięcznie i nawet przy droższym modelu koszt zwykle nie przekracza kilkudziesięciu złotych, czyli znacznie poniżej kosztu godziny pracy specjalisty. Większy rachunek może wygenerować źle napisane zapytanie skanujące pełny eksport GA4, dlatego korzystaj z partycji i tabel pośrednich.
Konto usługi dla BigQuery powinno mieć dostęp tylko do zbioru danych raportowych, a konto Google Analytics – tylko do odczytu. Jeśli w przepływie pojawiają się dane klientów, np. z CRM, musisz spełnić wymogi RODO, w tym mieć umowę powierzenia z dostawcą modelu; omawiamy to w artykule o danych klientów w narzędziach AI. Przy samodzielnym hostingu n8n zadbaj o aktualizacje i szyfrowanie klucza poświadczeń.
Jak rozwinąć przepływ, gdy podstawowa wersja działa
Po kilku tygodniach stabilnej pracy możesz dodać kolejne warstwy: podział na klientów, wykresy, interaktywne pytania i połączenie z asystentem AI. Rozbudowuj jednak dopiero wtedy, gdy log pokazuje, że komentarze rzadko wymagają poprawek.
Najprostszy krok to pętla po liście klientów z arkusza konfiguracyjnego: identyfikator projektu, nazwa tabeli, kanał Slacka, adresat raportu i progi alarmowe. Drugi krok to dołączenie linku do dashboardu, który pokazuje te same liczby w formie wykresów – szablon opisujemy w poradniku o dashboardzie e-commerce w Looker Studio. Strukturę samego raportu miesięcznego, z sekcjami i wskaźnikami, znajdziesz w szablonie raportu ROAS dla klienta.
Kolejny poziom to przepływ, w którym model nie tylko komentuje, ale też dopytuje źródła danych, np. przez serwery MCP. To bliżej pełnego agenta i wymaga ostrzejszych zabezpieczeń, które opisujemy w tekście o MCP w marketingu. Kiedy taki krok ma sens, a kiedy wystarczy sztywny przepływ, wyjaśniamy w artykule o agentach AI w marketingu. Pozostałe materiały znajdziesz w podtemacie Agenci AI i automatyzacja.
Najczęściej zadawane pytania
Czy n8n jest darmowy do automatyzacji raportów?
Wersję społecznościową n8n możesz hostować samodzielnie bez opłat licencyjnych, ale płacisz za serwer, jego utrzymanie i wywołania modeli językowych. Wersja chmurowa jest płatna w modelu abonamentowym. Licencja n8n ma charakter fair-code, więc przed wykorzystaniem w produkcie sprzedawanym klientom sprawdź jej warunki.
Czy n8n pobierze dane bezpośrednio z Google Ads?
n8n ma węzeł Google Ads z ograniczonym zakresem operacji, a dostęp do API zależy od konfiguracji projektu Google Cloud. W raportach wielokanałowych wygodniej przenieść dane Google Ads do BigQuery transferem danych i pobierać je jednym zapytaniem. Alternatywą jest węzeł HTTP Request z zapytaniem GAQL, co wymaga jednak samodzielnej obsługi uwierzytelniania.
Który model językowy wybrać do komentarzy w raportach?
Do komentowania gotowych wskaźników wystarczy model średniej klasy od OpenAI, Anthropic lub Google, bo zadanie jest wąskie i dobrze opisane. Ważniejsze od wyboru modelu są: przekazywanie tylko obliczonych wartości, wymuszony format JSON, niska temperatura i automatyczna kontrola liczb. Przy danych klientów wybierz dostawcę oferującego umowę powierzenia i plan firmowy.
Jak często uruchamiać automatyczny raport?
Raport z komentarzem najlepiej uruchamiać raz w tygodniu, w poniedziałek rano, dla dwóch pełnych, zamkniętych tygodni. Częstsze raporty z interpretacją AI łatwo prowadzą do reagowania na szum. Do bieżącej kontroli lepiej sprawdzają się alerty o anomaliach, uruchamiane codziennie lub co godzinę i niezależne od modelu językowego.
Co zrobić, gdy model w raporcie poda błędną liczbę?
Najpierw sprawdź, czy błąd wynika z danych wejściowych, czy z interpretacji modelu. Automatyczna kontrola porównująca liczby z komentarza z wynikiem obliczeń wyłapie większość wymyślonych wartości i zatrzyma wysyłkę. Jeśli błędy się powtarzają, zawęź prompt, przekazuj mniej pól i dodaj przykład poprawnej odpowiedzi.