Przejdź do treści

Automatyzacja raportów marketingowych w n8n z modelem językowym: przepływ krok po kroku

Raport tygodniowy da się złożyć bez ręcznego kopiowania liczb. Pokazujemy przepływ w n8n, w którym kod liczy wskaźniki, model językowy tylko je komentuje, a człowiek zatwierdza wynik przed wysyłką do klienta.

Redakcja Pixel Insider9 min czytaniaPoziom: średni

  • n8n
  • BigQuery
  • GA4
  • LLM
Spis treści
  1. Dlaczego n8n do raportów marketingowych
  2. Jak wygląda przepływ raportu krok po kroku
  3. Kod do obliczeń: liczby liczy JavaScript, nie model
  4. Jak napisać prompt, żeby model nie zmyślał liczb
  5. Akceptacja przez człowieka i obsługa błędów
  6. Koszty, bezpieczeństwo i RODO w raportach z AI
  7. Jak rozwinąć przepływ, gdy podstawowa wersja działa
  8. 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
  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Sprawdź wynik automatycznie. Drugi węzeł Code porównuje liczby z komentarza z danymi wejściowymi.
  7. 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.