Zrozum, jak dane przepływają między węzłami n8n. Opanuj wyrażenia, węzeł Code i filtrowanie — to fundament każdego skutecznego workflow.
Żeby efektywnie pracować z n8n, musisz rozumieć jeden fundamentalny koncept: każdy węzeł przetwarza tablicę elementów (items). Każdy element to obiekt JSON z polem json (dane) i opcjonalnym polem binary (pliki). Gdy webhook odbiera zamówienie, to jeden element. Gdy Google Sheets zwraca listę 50 wierszy, to 50 elementów — każdy z własnymi danymi.
Gdy połączysz dwa węzły, n8n przekazuje wszystkie elementy z wyjścia pierwszego węzła do wejścia drugiego. Węzeł przetwarzający domyślnie operuje na każdym elemencie osobno — jeśli masz 50 elementów i wyślesz email dla każdego, węzeł Email wykona się 50 razy. To tzw. przetwarzanie jeden-do-jednego.
W panelu Output każdego węzła zobaczysz zakładki z numerami elementów (Item 1, Item 2...) i strukturę JSON każdego z nich. Kliknij ikonę oka na węźle po jego wykonaniu — zobaczysz dokładnie, co weszło i co wyszło. To najważniejsze narzędzie do debugowania workflow i zrozumienia, skąd wziąć dane do następnego kroku.
Dane z jednego węzła dostępne są w kolejnym przez zmienną $json (bieżący element) lub przez odwołanie do konkretnego węzła po nazwie: $('Nazwa Węzła').item.json. Każde pole zagnieżdżone dostępne jest przez kropkę: $json.customer.address.city. Pola tablicowe przez indeks: $json.products[0].name (pierwszy produkt). Ta notacja działa w wyrażeniach we wszystkich węzłach n8n.
W każdym polu tekstowym węzłów n8n zobaczysz małą ikonę ze znaczkiem ${}. Kliknij ją — pole przełączy się w tryb wyrażenia i otworzy edytor z podglądem. Po lewej wpisujesz wyrażenie, po prawej widzisz wynik dla bieżącego elementu danych. To pozwala budować wyrażenia iteracyjnie, widząc na bieżąco, czy zwracają właściwe wartości.
Podstawowe wyrażenie: {{ $json.nazwaPola }}. Dla zagnieżdżonych danych: {{ $json.user.email }}. Dla tablic: {{ $json.items[0].price }}. Żeby odwołać się do danych z konkretnego węzła (nie bezpośrednio poprzedniego): {{ $('Webhook').item.json.orderId }}. W edytorze wyrażeń po lewej stronie masz też panel z listą dostępnych zmiennych — kliknij na wybraną, żeby wstawić ją do wyrażenia.
Wyrażenia n8n to pełny JavaScript w podwójnych nawiasach klamrowych. Łącz tekst: {{ $json.firstName + ' ' + $json.lastName }}. Zaokrąglaj liczby: {{ Math.round($json.price * 1.23) }} (cena z VAT 23%). Formatuj daty: {{ new Date($json.createdAt).toLocaleDateString('pl-PL') }}. Konwertuj typ: {{ parseInt($json.quantity) * parseFloat($json.unitPrice) }}. Używaj metod string: {{ $json.email.toLowerCase() }}, {{ $json.name.trim() }}.
N8n dostarcza kilka pomocniczych obiektów. $now zwraca aktualną datę/czas jako obiekt Luxon (np. {{ $now.toISO() }}, {{ $now.minus({days: 7}).toISO() }} — tydzień temu). $vars pozwala odwoływać się do zmiennych globalnych ustawionych w Settings → Variables — idealne dla tokenów API i konfiguracji wielokrotnie używanych w wielu workflow. {{ $vars.API_KEY }} wstawi zmienną bez ujawniania jej w kodzie workflow.
Węzeł Set to Twoje podstawowe narzędzie do manipulowania danymi bez pisania kodu. Pozwala tworzyć nowe pola, nadpisywać istniejące i usuwać niepotrzebne. Dodaj węzeł Set, kliknij Add Field i podaj nazwę nowego pola oraz wartość (statyczną lub wyrażenie). Włącz opcję Keep Only Set Fields, jeśli chcesz wyczyścić wszystkie inne pola i zostawić tylko te, które ustawiasz — to upraszcza dane przed wysłaniem do zewnętrznego API.
Przykład: po odebraniu zamówienia przez webhook chcesz przygotować dane do wysłania e-mailem. Węzeł Set tworzy pola: customerName ({{ $json.billing.first_name + ' ' + $json.billing.last_name }}), orderTotal ({{ $json.total + ' PLN' }}), orderDate ({{ new Date($json.date_created).toLocaleDateString('pl-PL') }}). Następny węzeł Email może użyć tych pól bezpośrednio bez znajomości oryginalnej struktury zamówienia WooCommerce.
Węzeł Code (dawniej Function) to pełny JavaScript. Używaj go, gdy potrzebujesz logiki niemożliwej do wyrażenia w węźle Set: pętle po tablicach, agregacja (sumowanie wartości zamówień), tworzenie nowych elementów na podstawie istniejących, wywołania do n8n helper functions. Dostęp do danych: const items = $input.all() zwraca tablicę wszystkich elementów. $input.first().json to dane pierwszego elementu. Wynik zawsze zwracaj jako tablicę: return [{json: {suma: 1234, liczba: 10}}].
Przykład węzła Code: liczysz przychód z listy zamówień. Wejście: 20 elementów (zamówień) każdy z polem total. Kod JavaScript: const suma = $input.all().reduce((acc, item) => acc + parseFloat(item.json.total), 0); return [{json: {totalRevenue: suma.toFixed(2), orderCount: $input.all().length}}]; Wynik: jeden element z łącznym przychodem i liczbą zamówień.
Węzeł IF to rozgałęzienie warunkowe — kieruje elementy do jednej z dwóch ścieżek (True lub False) zależnie od spełnienia warunku. Dodaj IF po węźle dostarczającym dane, skonfiguruj warunek (wartość1 operator wartość2) i połącz wyjścia True i False z odpowiednimi kolejnymi węzłami.
Przykłady zastosowania IF: przefiltruj zamówienia powyżej 500 PLN (true: wyślij alert VIP, false: normalne przetwarzanie). Sprawdź, czy email jest wypełniony (true: wyślij potwierdzenie, false: zapisz do listy do ręcznego przejrzenia). Zweryfikuj kod rabatowy (true: zastosuj zniżkę, false: zwróć błąd). Możesz łączyć wiele warunków operatorem AND lub OR — wszystkie muszą być spełnione (AND) lub wystarczy jeden (OR).
Węzeł Switch to wielokierunkowe rozgałęzienie — odpowiednik switch/case z programowania. Skonfiguruj jedno pole do sprawdzenia i listę możliwych wartości. Każda wartość tworzy osobne wyjście. Przykład: pole status zamówienia może mieć wartości "nowe" (wyjście 0: wyślij potwierdzenie), "opłacone" (wyjście 1: przygotuj do wysyłki), "wysłane" (wyjście 2: wyślij numer śledzenia), "anulowane" (wyjście 3: zwrot środków). Możesz też dodać wyjście Fallback dla nieznanych wartości.