Zanim zaczniesz
- n8n Cloud: płatne plany od 20 € miesięcznie przy płatności rocznej, z okresem próbnym. Według n8n dane w Cloud są przechowywane we Frankfurcie.
- Własny serwer: Community Edition jest darmowa. Formgong wysyła tylko na HTTPS, port 443 i publiczną domenę. Adresu
http://localhost:5678ani IP z sieci lokalnej nie przyjmie. Postaw n8n za reverse proxy z certyfikatem TLS i ustaw ten publiczny adres w zmiennejWEBHOOK_URL. - Formgong: na Free jeden webhook na formularz, na Pro i Business pięć. Zamiana adresu testowego na produkcyjny zajmuje to samo miejsce.
Interfejs n8n jest po angielsku, dlatego nazwy pól podajemy po angielsku.
Krok po kroku
- Utwórz workflow i dodaj wyzwalacz Webhook.
- HTTP Method ustaw na POST. Nadaj czytelny Path, np.
formgong-kontakt. - Authentication zostaw na None: Formgong nie wysyła danych Basic, nagłówków ani JWT. Zamiast tego sprawdzaj podpis (niżej). Lista dozwolonych IP też odpada: Formgong wysyła z sieci Cloudflare, nie ze stałych adresów.
- Respond ustaw na Immediately. Formgong czeka na odpowiedź tylko 10 sekund.
- Skopiuj Test URL. W Formgong otwórz Ustawienia formularza → Webhook, wklej adres i kliknij „Dodaj webhook”.
- W n8n kliknij Listen for test event i wyślij prawdziwe zgłoszenie ze strony.
- Dodaj kolejne węzły i zmapuj pola. Gdy wszystko działa, usuń adres testowy w Formgong i dodaj Production URL.
- Opublikuj workflow. Uruchomienia produkcyjne widać w zakładce Executions, a nie na kanwie.
Co zwraca Webhook node
Węzeł zwraca headers, params, query i body. JSON z Formgong jest w body.
{
"event": "submission.created",
"form": {
"id": "6f1c2a9e-4b7d-4e0a-9c3f-2d8b5e7a1f40",
"name": "Kontakt"
},
"submission": {
"id": "b3e04c51-8a2f-4d6e-9f17-0c5a3b8d2e96",
"created_at": "2026-10-03T09:15:00.000Z",
"page_url": "https://example.com/contact",
"fields": {
"name": "Anna Nowak",
"email": "anna@example.com",
"phone": "+48501234567",
"message": "Proszę o wycenę 20 sztuk",
"utm_source": "google"
},
"is_spam": false
}
}Nazwy nagłówków przychodzą małymi literami, np. $json.headers["x-signature"] i $json.headers["x-formgong-event"].
Mapowanie pól
| Czego potrzebujesz | Wyrażenie n8n |
|---|---|
| Dowolne pole formularza | {{ $json.body.submission.fields.email }} |
| Nazwa formularza | {{ $json.body.form.name }} |
| Adres strony | {{ $json.body.submission.page_url }} |
| Typ zdarzenia | {{ $json.body.event }} |
| Unikalny ID | {{ $json.body.submission.id }} |
Aby pomijać doręczenia testowe, w opcjach Webhook node użyj Only Run If: {{ $json.body.event === 'submission.created' }}. Niepasujące żądania i tak dostają 200, więc Formgong ich nie ponawia.
Opcjonalnie: weryfikacja podpisu
Podpis to HMAC-SHA256 surowej treści z kluczem „Sekret podpisu” z zakładki Webhook w Formgong. n8n sprawdzi go bez kodu:
- W opcjach Webhook node włącz Raw Body. Treść przyjdzie jako dane binarne.
- Dodaj węzeł Crypto: akcja Hmac, Binary File włączone, właściwość binarna z Webhook node, typ SHA256, kodowanie HEX. Sekret podpisu wpisz w Hmac Secret w danych uwierzytelniających Crypto.
- Dodaj węzeł If:
sha256=plus wynik Crypto musi równać się{{ $('Webhook').item.json.headers['x-signature'] }}. - Na gałęzi true węzeł Extract from File (Extract From JSON) zamieni surową treść z powrotem na pola.
Podpisane żądanie z terminala
SECRET='<your signing secret>'
URL='<your webhook URL>'
BODY='{"event":"webhook.test","form":{"id":"x","name":"Test"},"submission":{"id":"test","created_at":"2026-10-03T09:15:00.000Z","page_url":null,"fields":{"message":"Formgong test"},"is_spam":false}}'
SIG=$(printf '%s' "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | sed 's/^.* //')
curl -sS -X POST "$URL" \
-H 'content-type: application/json' \
-H 'x-formgong-event: webhook.test' \
-H "x-signature: sha256=$SIG" \
--data "$BODY"Gdy coś nie działa
- 404 w „Ostatnich doręczeniach”: Test URL działa tylko raz i tylko wtedy, gdy n8n nasłuchuje. Production URL działa tylko w opublikowanym workflow.
- Formgong odrzuca adres: musi zaczynać się od
https://, używać portu 443 i prowadzić do publicznej domeny. - Przekroczony czas i duplikaty: przy Respond = When Last Node Finishes wolny workflow może przekroczyć 10 sekund. Formgong wtedy ponawia żądanie i workflow startuje znowu. Odpowiadaj od razu i sprawdzaj
submission.idprzed tworzeniem rekordów. - Status 3xx: proxy, które przekierowuje (http na https albo brak ukośnika), to błąd. Wklej adres dokładnie taki, jaki pokazuje n8n.
- Grupa checkboxów w jednym polu: zaznaczone pola o tej samej nazwie przychodzą jako jeden tekst, np.
Email, Telefon. Aby dostać tablicę, użyj{{ $json.body.submission.fields.contact.split(', ') }}.
Pytania i odpowiedzi
Czy każde zgłoszenie to jedno uruchomienie (execution) w n8n?
W n8n Cloud tak: jedno uruchomienie produkcyjne na zgłoszenie, niezależnie od liczby węzłów. Community Edition na własnym serwerze nie ma limitu uruchomień.
Cloud czy własny serwer – co lepsze pod RODO?
Oba mogą działać. Według n8n dane Cloud są we Frankfurcie. Własny serwer trzyma je u Ciebie. Sam Formgong przechowuje zgłoszenia w UE.
Czy mogę włączyć uwierzytelnianie nagłówkiem w Webhook node?
Nie, Formgong nie dodaje własnych nagłówków. Sprawdzaj X-Signature: dowodzi, że żądanie przyszło z Twojego formularza.
Jak wysłać zgłoszenie z n8n do KeyCRM?
Dodaj węzeł HTTP Request, który wysyła POST do API KeyCRM z Twoim kluczem. Pełna treść jest w poradniku KeyCRM.
Źródła
Sprawdzone 03.10.2026 w oficjalnej pomocy i na publicznych stronach: Dokumentacja n8n: Webhook node, Dokumentacja n8n: Crypto node, Dokumentacja n8n: HTTP Request node, Cennik n8n, Dokumentacja webhooków Formgong.