Test i publikacja: 24 października 2026. n8n 2.44.6 na Windows. Wszystkie zgłoszenia w przykładzie są fikcyjne.
Formularz może sam przekazywać zgłoszenia do CRM. Ale samo połączenie dwóch aplikacji nie rozwiązuje jeszcze duplikatów, błędnych danych i przerw w działaniu.
Przygotowałem kompletny przykład do uruchomienia lokalnie: formularz w n8n, sprawdzenie danych i prosty CRM demonstracyjny. Możesz pobrać pliki i przejść ten sam test u siebie, bez płatnego konta CRM.
Co dokładnie tu zbudujemy? Jeden kontakt na adres e-mail, z aktualizacją danych po kolejnym zgłoszeniu. Powiadomienie w CRM powstaje przy nowym kontakcie. To własny demonstrator EXAITY, a nie integracja przetestowana na koncie HubSpot lub Pipedrive. Nie wysyła e-maili ani wiadomości do klientów.
Gotowy pakiet do pobrania
Workflow JSON, prosty CRM w Pythonie, instrukcja i zestaw prób. Bez haseł, tokenów i bazy z kontaktami.
Pobierz workflow i CRM demonstracyjnySpis treści
Co przygotować do automatyzacji formularza i CRM?
- Działające n8n. Jeśli jeszcze go nie masz, zacznij od poradnika instalacji n8n lokalnie.
- Python 3.10 lub nowszy do uruchomienia załączonego CRM. Program korzysta z biblioteki standardowej i nie wymaga instalowania modułów pip.
- Pliki z pakietu oraz fikcyjne dane do prób.
W przykładzie nie ma modelu językowego. Przeniesienie formularza do określonych pól i sprawdzenie duplikatu nie potrzebuje AI.
CRM działa pod adresem http://127.0.0.1:4198. Nasłuchuje wyłącznie na komputerze, na którym go uruchomisz. Służy do odtworzenia procesu i testów, a nie do publicznej obsługi danych klientów.
1. Uruchom CRM demonstracyjny
Rozpakuj ZIP do osobnego folderu. Zostaw obok siebie pliki crm_demo.py i index.html. Otwórz w tym folderze terminal i wpisz:
python --version
python crm_demo.pyW Windows możesz też użyć py -3 crm_demo.py, jeśli tak uruchamiasz Pythona. Gdy polecenie nie jest dostępne, zainstaluj Pythona z oficjalnego źródła wskazanego na końcu artykułu.
Otwórz w przeglądarce http://127.0.0.1:4198. Zobaczysz pustą listę kontaktów, powiadomienia i kontrolę testowej awarii.
Po pierwszym uruchomieniu powstanie plik crm-demo.sqlite3. To lokalna baza demonstratora. Zamknięcie okna przeglądarki jej nie usuwa. Aby zatrzymać serwer, użyj Ctrl+C w terminalu.
Co jest w paczce?
formularz-crm.json: workflow do zaimportowania w n8n.crm_demo.pyiindex.html: serwer i widok prostego CRM.pierwszy-test.json: dodatkowy, ręczny test instalacji n8n.README.html: instrukcja uruchomienia.przypadki-testowe.json: fikcyjne dane i oczekiwane zachowanie.
Pakiet nie zawiera n8n, Pythona, konta administratora ani zapisanych poświadczeń. Instalujesz środowisko samodzielnie.
2. Zaimportuj gotowy workflow do n8n
Utwórz pusty workflow i w menu jego działań wybierz Import from File. Wskaż formularz-crm.json, a potem zapisz proces.

Proces ma siedem węzłów. Nazwy na planszy są po polsku, ale nazwy funkcji w interfejsie n8n mogą pozostać angielskie.
Co robi każdy z siedmiu węzłów?
| Węzeł w przykładzie | Typ w n8n | Zadanie |
|---|---|---|
| Formularz zgłoszenia | n8n Form Trigger | Wyświetla formularz i przyjmuje dane. |
| Uporządkuj i sprawdź dane | Code / JavaScript | Usuwa zbędne spacje, porządkuje e-mail i sprawdza pola. |
| Dane są poprawne? | If | Przepuszcza poprawne zgłoszenie do zapisu. |
| Zapisz lub zaktualizuj kontakt | HTTP Request | Wywołuje API demonstracyjnego CRM. |
| Potwierdzenie zapisu | n8n Form / Form Ending | Pokazuje potwierdzenie po odpowiedzi CRM. |
| CRM chwilowo niedostępny | n8n Form / Form Ending | Pokazuje brak potwierdzenia po nieudanych próbach. |
| Popraw dane | n8n Form / Form Ending | Kończy ścieżkę walidacji z czytelną informacją. |
Na tym etapie nie musisz dodawać żadnych kluczy API. Adres w HTTP Request prowadzi do CRM, który przed chwilą uruchomiłeś na tym samym komputerze.
3. Sprawdź pola formularza i mapowanie
| Pole dla użytkownika | Nazwa w danych | Wymagane |
|---|---|---|
| Imię | name | Tak |
email | Tak | |
| Firma | company | Nie |
| Opis sprawy | message | Tak |
Rozdzielamy etykietę widoczną dla człowieka od technicznej nazwy pola. Dzięki temu zmiana napisu „Opis sprawy” nie musi zmieniać mapowania w kolejnych węzłach.

W HTTP Request ustawione są:
- Method: POST.
- URL:
http://127.0.0.1:4198/api/leads. - Send Body: włączone, treść JSON.
- Timeout: 3000 ms w tym lokalnym teście.
JSON wysyłany do CRM
={{ {name:$json.name,email:$json.email,company:$json.company,message:$json.message} }}To wyrażenie n8n budujące obiekt z danych poprzedniego kroku. Nie wpisuj całej odpowiedzi formularza jako jednego tekstu do pola e-mail.
4. Sprawdź dane przed zapisem
Formularz pilnuje wymaganych pól i podstawowej poprawności adresu. Węzeł Code wykonuje dodatkowe sprawdzenie już w procesie: imię i opis nie mogą być puste, adres musi mieć podstawową strukturę e-maila, a pola mieszczą się w ustalonych długościach.
To dwa różne miejsca kontroli. Sam widoczny na stronie formularz nie powinien być jedyną ochroną danych trafiających do systemu.
W przykładzie e-mail jest przycinany i zamieniany na małe litery. ANNA@EXAMPLE.TEST oraz anna@example.test trafiają do tego samego kontaktu. Nie usuwam kropek ani fragmentów adresu po znaku „+”.
Co sprawdza walidacja, a czego nie?
Sprawdzamy podstawowy format i długości: e-mail do 254 znaków, imię do 100, firma do 200 i opis do 3000. Nie sprawdzamy, czy skrzynka istnieje, czy adres należy do nadawcy albo czy podana firma jest prawdziwa.
Jeżeli proces ma wymagać potwierdzenia tożsamości lub dostarczenia wiadomości, potrzebny jest osobny mechanizm. Zgodny z formatem adres nie jest potwierdzonym adresem.
Jak unikamy duplikatów w CRM?
W tej demonstracji kluczem kontaktu jest uporządkowany e-mail. CRM wykonuje zapis typu upsert: dodaje kontakt, jeśli go nie ma, lub aktualizuje istniejący.
Reguła działa w bazie, która ma ograniczenie UNIQUE(email). Nie polegamy wyłącznie na dwóch oddzielnych krokach „wyszukaj” i „utwórz”. Między nimi mogłyby pojawić się dwa równoczesne zgłoszenia.
Kontakt i pierwsze powiadomienie powstają w jednej transakcji bazy. Powiadomienie ma dodatkowo unikalne przypisanie do kontaktu. Ponowiony zapis nie dodaje go jeszcze raz.
Co dzieje się z kolejnym zgłoszeniem? Pozostaje ten sam kontakt. Imię, firma i opis są zastępowane danymi z nowego poprawnego zgłoszenia, a data utworzenia kontaktu zostaje. Pusta firma także zastępuje wcześniejszą wartość. To świadomie prosta reguła tego przykładu.
W firmowym CRM zwykle warto odróżnić kontakt od sprawy lub szansy sprzedażowej. Ta sama osoba może zamawiać kilka różnych usług. W takim procesie nie blokujemy kolejnego zapytania tylko dlatego, że znamy już jej e-mail. Ustalamy osobny identyfikator sprawy i historię wiadomości.
Co, jeśli CRM nie odpowie?
Węzeł HTTP Request ma włączone Retry On Fail: maksymalnie trzy próby z odstępem jednej sekundy. Po niepowodzeniu korzysta z osobnego wyjścia błędu, zamiast udawać poprawny zapis.
Są dwa istotne przypadki:
- CRM nie zapisał danych. Po trzech nieudanych próbach formularz informuje, że nie może potwierdzić zapisu.
- CRM zapisał kontakt, ale nie dostarczyło się potwierdzenie. n8n ponawia operację. Upsert odnajduje istniejący kontakt, więc nie powstaje drugi rekord ani drugie powiadomienie.

W panelu CRM znajdziesz dwa tryby symulacji: awaria przed zapisem oraz jednorazowy błąd po zapisie. Używaj ich wyłącznie do prób na fikcyjnych danych.
Gdzie sprawdzić błąd i jak ponawiać operację?
W n8n otwórz zakładkę Executions, wybierz wykonanie i sprawdź węzeł HTTP Request oraz przebytą ścieżkę. Dane wejściowe są zachowywane w ustawieniach tego przykładu.
Obsłużony błąd może zakończyć całe wykonanie jako „Success”, ponieważ ścieżka błędu poprawnie wyświetliła komunikat. Sam zielony status wykonania nie dowodzi więc zapisu w CRM. Sprawdź odpowiedź API i końcowy węzeł.
Przed ponowieniem upewnij się, co zostało zapisane. Ta reguła upsert pozwala powtórzyć zapis kontaktu, ale nie gwarantuje poprawnego ponawiania dowolnej akcji, np. pobrania płatności lub wysłania kolejnej wiadomości.
To nie jest trwała kolejka oczekująca do skutku. Przy dłuższej awarii potrzebna jest ustalona procedura odzyskania zgłoszeń, kolejka lub ręczna obsługa. Błędów autoryzacji czy mapowania nie naprawi samo zwiększenie liczby prób.
5. Zapisz, opublikuj i uruchom formularz
- Upewnij się, że lokalny CRM i n8n działają.
- Otwórz węzeł Formularz zgłoszenia.
- Do próby z obserwacją w edytorze użyj Test URL i uruchom nasłuchiwanie przez Execute workflow.
- Do samodzielnego działania zapisz proces, kliknij Publish i wybierz Production URL.
- Otwórz podany adres formularza, wypełnij go fikcyjnymi danymi i sprawdź wynik w CRM.
W gotowym pliku ścieżka formularza to exaity-formularz-crm. Dla lokalnej instalacji na porcie 5678 adres produkcyjny ma postać:
http://localhost:5678/form/exaity-formularz-crm„Production” to nazwa rodzaju adresu w n8n. Nie oznacza, że lokalny demonstrator jest gotowym wdrożeniem firmowym. Jeśli zmienisz port, domenę lub ścieżkę, korzystaj z adresu widocznego w swoim węźle.
Po zgłoszeniu wróć do panelu CRM i kliknij „Odśwież dane”. Nie musisz odświeżać samego ekranu potwierdzenia formularza. Kolejny test zaczynaj od głównego adresu formularza.
Wyniki dziesięciu prób
Po dziesięciu próbach w CRM zostało pięć kontaktów i pięć powiadomień. Sprawdziłem proces w przeglądarce i porównałem wynik z lokalną bazą. Test zacząłem od pustego CRM.
Zobacz przebieg wszystkich dziesięciu prób
| Próba | Oczekiwane zachowanie | Wynik |
|---|---|---|
| 1. Nowy kontakt Anna | Nowy kontakt i powiadomienie. | Zapisane. |
| 2. Ten sam e-mail wielkimi literami | Aktualizacja Anny bez duplikatu. | Ten sam kontakt i jedno powiadomienie. |
| 3. Nowy kontakt Piotr | Kolejny kontakt i powiadomienie. | Zapisane. |
| 4. Brak e-maila | Zatrzymanie zgłoszenia. | Komunikat formularza, brak zapisu. |
| 5. Błędny format e-maila | Zatrzymanie zgłoszenia. | Komunikat formularza, brak zapisu. |
| 6. Nowy kontakt Jan | Kolejny kontakt i powiadomienie. | Zapisane. |
| 7. Awaria CRM przed zapisem | Trzy próby, potem informacja o braku potwierdzenia. | Brak nowego kontaktu. |
| 8. Ponowienie po usunięciu awarii | Zapis kontaktu Ola. | Jeden nowy kontakt i powiadomienie. |
| 9. Zapis kontaktu Marek i utrata odpowiedzi | Ponowienie bez podwójnego zapisu. | Jeden kontakt i jedno powiadomienie. |
| 10. Kolejne zgłoszenie Marka | Aktualizacja danych. | Bez kolejnego kontaktu i powiadomienia. |

Brakujący i błędny e-mail zatrzymał formularz przed zapisem. Kod walidacji przeszedł też dziesięć osobnych testów, m.in. pustych i zbyt długich pól.
Jak podłączyć firmowy CRM lub formularz WordPress?
Schemat pozostaje podobny, ale nie wystarczy zamienić adresu w HTTP Request na domenę swojego CRM.
Podmiana demonstratora na CRM używany w firmie
- Sprawdź w swoim planie dostęp do API i sposób uwierzytelniania.
- Połącz konto przez właściwy mechanizm Credentials w n8n.
- Dopasuj adres operacji, metodę, nazwy pól i oczekiwaną odpowiedź do dokumentacji CRM.
- Ustal, czy API ma operację upsert lub obsługuje klucz idempotencji. Jeżeli nie, zaprojektuj kontrolę równoczesnych zapisów i ponowień.
- Rozdziel tworzenie kontaktu od nowej sprawy, zadania lub szansy sprzedażowej.
- Powtórz test duplikatu, brakujących danych, limitu API i awarii.
Węzeł API demonstratora nie jest gotowym węzłem HubSpot, Pipedrive ani dowolnego innego CRM. Nie testowałem w tym przykładzie tych kont i ich planów.
Zgłoszenie z formularza na WordPressie
Źródłem danych może być formularz WordPress, jeżeli jego wtyczka lub dodatkowa integracja potrafi wysłać zgłoszenie do webhooka. Dostępność tej funkcji zależy od narzędzia i planu.
W n8n taki proces zwykle zaczyna się od Webhook zamiast Form Trigger. Trzeba sprawdzić, gdzie w odebranych danych są pola, i odpowiednio zmienić mapowanie. Zakończenie oparte na n8n Form trzeba wtedy zastąpić właściwą odpowiedzią webhooka lub obsługą po stronie formularza.
Publiczny WordPress nie dotrze do localhost na Twoim komputerze. Potrzebne jest dostępne środowisko, właściwy adres, autoryzacja połączenia i przetestowana odpowiedź. W tym poradniku nie publikuję lokalnego edytora n8n do internetu.
Co przygotować przed wdrożeniem w firmie?
Demonstracja pozwala prześledzić dane i reakcję na błąd. Dla prawdziwego obiegu potrzebne są jeszcze decyzje dotyczące środowiska, danych i utrzymania.
- Dostępność: gdzie działa n8n i co się dzieje po restarcie, awarii lub wygaśnięciu dostępu.
- Zakres danych: które pola są potrzebne, jak długo zapisujesz wykonania i kto może je odczytać.
- Uprawnienia: konta integracyjne, bezpieczne przechowywanie sekretów i sposób ich wymiany.
- Wyjątki: kto dostaje informację o błędzie i gdzie trafia zgłoszenie wymagające człowieka.
- Odtworzenie: kopie, procedura ponowień i test po aktualizacji.
Demonstrator nie ma kont zespołu, rozbudowanej historii spraw ani produkcyjnego mechanizmu kolejkowania. Jego API jest lokalne i nie należy go wystawiać publicznie. Te elementy dobieramy do rzeczywistego systemu.
Najczęstsze pytania
Czy do tego workflow potrzebuję ChatGPT albo płatnego API AI?
Nie. Przykład używa formularza, reguł, JavaScript i lokalnego API CRM. Nie generuje treści i nie wysyła danych do modelu AI.
Czy powiadomienie to e-mail?
Nie. W tej demonstracji jest to wpis w panelu CRM dla zespołu. Nie konfigurujemy poczty ani zewnętrznych komunikatorów. Wdrożenie prawdziwego kanału powiadomień wymaga osobnej konfiguracji i sprawdzenia reguł ponawiania.
Czy ten sam klient może wysłać kolejne zapytanie?
Tak, ale ten prosty demonstrator zastępuje dane kontaktu ostatnim zgłoszeniem. Nie prowadzi historii różnych spraw. Jeśli chcesz zachować każde zapytanie, dodaj osobny rejestr spraw i identyfikator zgłoszenia.
Dlaczego w Dockerze adres 127.0.0.1 nie prowadzi do mojego CRM?
W kontenerze ten adres oznacza sam kontener. Pokazany test uruchamia n8n i CRM bezpośrednio na Windows. W środowisku kontenerowym trzeba zaplanować sieć i osiągalny adres API; nie zakładaj, że lokalny URL z tego pliku zadziała bez zmiany konfiguracji.
Czy mogę zostawić proces działający na laptopie?
Do prób tak, dopóki uruchomione są oba procesy i komputer nie jest uśpiony. Do zbierania rzeczywistych zgłoszeń dobierz środowisko, które odpowiada za ciągłość działania, kopie i obsługę błędów.
Masz podobny proces w swojej firmie? Napisz, skąd przychodzą zgłoszenia, do jakich narzędzi mają trafiać i ile mniej więcej obsługujesz ich w miesiącu. Zobacz usługę automatyzacji dla firm i opisz swój proces.
Źródła i zakres testu
Własny test na Windows, n8n 2.44.6, 24 października 2026. Pliki i wyniki dotyczą demonstratora EXAITY. Dokumentacja: n8n Form Trigger. Python dla Windows pobierzesz z oficjalnej strony Pythona.
