Webhook to najprostsza forma integracji – „wyślij mi dane na ten URL, a ja je przetworzę". W n8n webhook otwiera Twój workflow na świat zewnętrzny. Formularz na stronie, Stripe, GitHub, dowolny system – jeśli potrafi wysłać HTTP request, możesz go podłączyć do n8n.
TL;DR
- Webhook Trigger = Twój workflow reaguje na przychodzące HTTP requesty
- Dwa URL – testowy (działa przy Test workflow) i produkcyjny (działa gdy Active)
- Metody: POST (najczęściej), GET, PUT, DELETE
- Bezpieczeństwo: Basic Auth, Header Auth, IP whitelist
- Respond: natychmiast (200 OK) lub po przetworzeniu (z danymi)
Nie masz n8n? Zainstaluj w 15 minut. Szukasz kontekstu? Kompletny poradnik n8n.
Webhook Trigger – podstawy
Jak działa
- Dodajesz node Webhook do workflow
- n8n generuje unikalny URL
- Zewnętrzny system wysyła HTTP request na ten URL
- Workflow się uruchamia z danymi z requestu
Konfiguracja
HTTP Method: Najczęściej POST (dane w body). GET dla prostych triggersów (link w emailu, redirect).
Path: Domyślny lub własny. Własny path daje czytelniejszy URL:
- Domyślny:
https://n8n.twoja.pl/webhook/a1b2c3d4-e5f6 - Własny:
https://n8n.twoja.pl/webhook/formularz-kontaktowy
Response:
- Immediately – natychmiast zwraca 200 OK (szybkie, nie blokuje nadawcy)
- When Last Node Finishes – czeka na przetworzenie, zwraca wynik
- Using 'Respond to Webhook' Node – pełna kontrola nad odpowiedzią
Test vs Production URL
To najczęstszy błąd początkujących. Webhook ma dwa adresy:
| Typ | Kiedy działa | URL |
|---|---|---|
| Test | Tylko przy kliknięciu „Test workflow" | .../webhook-test/... |
| Production | Tylko gdy workflow jest Active | .../webhook/... |
Podłączając webhook do formularza, Stripe'a czy innego systemu – użyj Production URL. Test URL przestaje działać po zamknięciu edytora workflow.
Praktyczny tutorial: formularz → n8n → Slack
Klasyczny use case – formularz kontaktowy na stronie wysyła dane do n8n, a n8n powiadamia na Slacku.
Krok 1: Webhook Trigger
- Dodaj node Webhook
- Method:
POST - Path:
formularz-kontaktowy - Response:
Immediately(nie blokuj strony) - Skopiuj Production URL
Krok 2: Edit Fields (walidacja)
- Wyciągnij pola:
name,email,message - Dodaj
received_at:{{ $now.format('dd.MM.yyyy HH:mm') }}
Krok 3: IF (walidacja email)
- Warunek:
{{ $json.email }}is not empty - True → Slack
- False → Respond to Webhook z błędem
Krok 4: Slack
- Channel:
#leads - Message:
Nowy lead!
Imię: {{ $json.name }}
Email: {{ $json.email }}
Wiadomość: {{ $json.message }}
Krok 5: Testuj
curl -X POST https://n8n.twoja.pl/webhook-test/formularz-kontaktowy \
-H "Content-Type: application/json" \
-d '{"name":"Jan","email":"jan@example.com","message":"Cześć!"}'
Krok 6: Podłącz do strony
W formularzu HTML/React:
fetch('https://n8n.twoja.pl/webhook/formularz-kontaktowy', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name, email, message })
});
Aktywuj workflow (Active ON) – od teraz formularz wysyła dane do n8n.
Bezpieczeństwo webhooków
Publiczny URL = każdy może wysłać dane. Bez zabezpieczeń to zaproszenie do spamu.
Metoda 1: Header Authentication
W Webhook node → Authentication → Header Auth:
- Header name:
X-Webhook-Secret - Header value:
twoj-tajny-klucz-123
Nadawca musi dodać nagłówek:
curl -X POST https://n8n.twoja.pl/webhook/... \
-H "X-Webhook-Secret: twoj-tajny-klucz-123" \
-H "Content-Type: application/json" \
-d '{"data":"..."}'
Bez nagłówka – n8n zwraca 401.
Metoda 2: Basic Auth
Webhook node → Authentication → Basic Auth:
- Username + Password
Metoda 3: Walidacja payloadu
Wiele serwisów (Stripe, GitHub, Slack) podpisuje payload hashem HMAC. Weryfikujesz podpis w n8n:
Webhook → Code node (weryfikacja HMAC-SHA256) → IF (valid?) → dalsze przetwarzanie
Metoda 4: IP Whitelist
Na poziomie reverse proxy (Caddy/Nginx) – wpuszczaj requesty tylko z IP nadawcy.
Minimum bezpieczeństwa: Header Auth. Zajmuje 30 sekund do konfiguracji, blokuje 99% niechcianych requestów. Nie ma wymówki żeby tego nie zrobić.
Respond to Webhook – odpowiedzi z danymi
Domyślnie webhook odpowiada 200 OK z pustym body. Ale czasami chcesz zwrócić dane – np. potwierdzenie, ID utworzonego rekordu, wynik obliczeń.
Node Respond to Webhook
Dodaj node Respond to Webhook gdziekolwiek w workflow:
- Response Code: 200, 201, 400, etc.
- Response Body: JSON z danymi
- Response Headers: custom headers
Przykład: API endpoint
Webhook (POST /calculate) → Code node (obliczenia)
→ Respond to Webhook (JSON z wynikiem)
Twój n8n staje się mini-API.
Wiele odpowiedzi (routing)
Webhook → IF (valid data?)
→ True: Process → Respond to Webhook (200, {"status": "ok"})
→ False: Respond to Webhook (400, {"error": "Invalid data"})
Popularne integracje webhook
Stripe → n8n
Stripe wysyła webhooki po płatnościach, subskrypcjach, zwrotach.
- W Stripe Dashboard → Developers → Webhooks → Add endpoint
- URL: Production URL z n8n
- Eventy:
checkout.session.completed,invoice.paid - n8n przetwarza event → aktualizuje CRM, wysyła email
GitHub → n8n
Push, PR, issue – GitHub wysyła webhook po każdym evencie.
- W repo → Settings → Webhooks → Add webhook
- URL: Production URL
- Content type:
application/json - Secret: klucz do weryfikacji HMAC
WooCommerce → n8n
Nowe zamówienie, zmiana statusu, nowy klient.
- WooCommerce → Settings → Advanced → Webhooks
- Topic: Order created
- Delivery URL: Production URL
Typeform / Tally → n8n
Formularz wypełniony → webhook z odpowiedziami.
Webhook vs Polling – kiedy co
| Aspekt | Webhook | Polling (Schedule + HTTP) |
|---|---|---|
| Szybkość | Natychmiast | Co X minut |
| Niezawodność | Zależy od nadawcy | Niezawodny |
| Zasoby | Reaguje na event | Ciągłe requestowanie |
| Konfiguracja | URL w zewnętrznym systemie | Tylko w n8n |
| Kiedy | Real-time, event-driven | API bez webhooków |
Zasada: Jeśli serwis obsługuje webhooki – używaj webhooków. Jeśli nie (np. stary system, scraping) – polling.
Debugging webhooków
Problem: Webhook nie odpowiada
- Sprawdź czy workflow jest Active (nie testowy)
- Sprawdź URL – test vs production
- Sprawdź method (POST vs GET)
- Sprawdź content-type header (
application/json)
Problem: Dane nie przychodzą
- W Executions sprawdź co przyszło w Input node'a Webhook
- Użyj
{{ JSON.stringify($json) }}do podglądu surowych danych - Sprawdź mapowanie pól – może API zmienił nazwy
Problem: Timeout
- Domyślny timeout odpowiedzi webhook: 30 sekund
- Jeśli przetwarzanie trwa dłużej – ustaw Response na
Immediately - Ciężkie operacje rób asynchronicznie (po odpowiedzi)
Narzędzia do testowania
- curl – szybki test z terminala
- Postman – GUI do budowania requestów
- webhook.site – podglądaj co przychodzi na URL
- ngrok – tunnel do localhost (gdy n8n działa lokalnie)
FAQ
Czy webhook działa gdy n8n jest wyłączony?
Nie – requesty zostaną odrzucone (connection refused). Dlatego n8n na produkcji musi działać 24/7. Rozważ Docker z restart: always.
Ile webhooków mogę mieć?
Bez limitu na self-hosted. Na Cloud – zależy od limitu aktywnych workflow. Każdy webhook to osobny workflow.
Czy mogę mieć kilka webhooków w jednym workflow?
Nie – jeden workflow = jeden trigger. Ale możesz użyć jednego webhhooka z routingiem (Switch node na podstawie pola w payload).
Webhook vs n8n API – jaka różnica?
Webhook to Twój custom endpoint. n8n API to wbudowane API n8n do zarządzania workflow, executions, credentials. Webhook – do integracji z zewnętrznymi systemami. API – do programowania n8n.
