Wróć do bloga
n8n

n8n Webhooks – jak odbierać i wysyłać dane

Webhook to brama między Twoim n8n a resztą świata. Ten tutorial pokazuje jak ją otworzyć, zabezpieczyć i wykorzystać.

8 min czytania
n8n, webhooks, API, integracje, tutorial

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

  1. Dodajesz node Webhook do workflow
  2. n8n generuje unikalny URL
  3. Zewnętrzny system wysyła HTTP request na ten URL
  4. 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:

TypKiedy działaURL
TestTylko przy kliknięciu „Test workflow".../webhook-test/...
ProductionTylko gdy workflow jest Active.../webhook/...
Uwaga

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

bash
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:

javascript
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 → AuthenticationHeader Auth:

  • Header name: X-Webhook-Secret
  • Header value: twoj-tajny-klucz-123

Nadawca musi dodać nagłówek:

bash
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 → AuthenticationBasic 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.

Wskazówka

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.

  1. W Stripe Dashboard → Developers → Webhooks → Add endpoint
  2. URL: Production URL z n8n
  3. Eventy: checkout.session.completed, invoice.paid
  4. n8n przetwarza event → aktualizuje CRM, wysyła email

GitHub → n8n

Push, PR, issue – GitHub wysyła webhook po każdym evencie.

  1. W repo → Settings → Webhooks → Add webhook
  2. URL: Production URL
  3. Content type: application/json
  4. Secret: klucz do weryfikacji HMAC

WooCommerce → n8n

Nowe zamówienie, zmiana statusu, nowy klient.

  1. WooCommerce → Settings → Advanced → Webhooks
  2. Topic: Order created
  3. Delivery URL: Production URL

Typeform / Tally → n8n

Formularz wypełniony → webhook z odpowiedziami.


Webhook vs Polling – kiedy co

AspektWebhookPolling (Schedule + HTTP)
SzybkośćNatychmiastCo X minut
NiezawodnośćZależy od nadawcyNiezawodny
ZasobyReaguje na eventCiągłe requestowanie
KonfiguracjaURL w zewnętrznym systemieTylko w n8n
KiedyReal-time, event-drivenAPI 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

  1. Sprawdź czy workflow jest Active (nie testowy)
  2. Sprawdź URL – test vs production
  3. Sprawdź method (POST vs GET)
  4. Sprawdź content-type header (application/json)

Problem: Dane nie przychodzą

  1. W Executions sprawdź co przyszło w Input node'a Webhook
  2. Użyj {{ JSON.stringify($json) }} do podglądu surowych danych
  3. 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.