n8n i SMS: jak wysyłać i odbierać SMS w workflow przez własny telefon
Jak wysłać SMS z n8n: węzeł HTTP Request z kluczem API, webhook do odbioru odpowiedzi, gotowy JSON do wklejenia i przepisy z Arkuszami Google, Slackiem i AI.

n8n i SMS łączy jedno żądanie HTTP. smsportal nie ma osobnego węzła w n8n, ale nie jest on potrzebny: wysyłasz przez węzeł HTTP Request, a odpowiedzi odbierasz węzłem Webhook. Efekt to SMS z Twojego zwykłego numeru, na który klient może odpisać, i workflow, który na tę odpowiedź reaguje. Poniżej dokładne ustawienia, gotowy JSON do wklejenia i trzy przepisy.
Co jest potrzebne, żeby wysłać SMS z n8n?
Potrzebujesz działającej instancji n8n (chmura lub własny serwer), konta w smsportal z podłączonym telefonem z Androidem i klucza API. Dwa pierwsze elementy to jednorazowa konfiguracja: telefon podłączasz kodem QR, jak w przewodniku po wysyłce SMS przez API.
- telefon z Androidem i kartą SIM, połączony z kontem (instalacja aplikacji),
- klucz API z panelu (załóż konto, plan bezpłatny wystarczy na start),
- n8n w wersji z węzłami HTTP Request i Webhook.

Wskazówka: zapisz klucz jako dane uwierzytelniające typu Header Auth (nazwa nagłówka
x-api-key). Dzięki temu nie trafia do eksportowanego JSON-a workflow.
Jak ustawić węzeł HTTP Request do wysyłania SMS?
W węźle HTTP Request wybierz metodę POST, wpisz adres https://smsportal.app/api/v1/gateway/send-sms, dodaj nagłówek x-api-key i wyślij ciało JSON z recipients oraz message. Nagłówek to x-api-key, nie Authorization. To najczęstszy powód błędu 401.
| Pole w n8n | Wartość |
|---|---|
| Method | POST |
| URL | https://smsportal.app/api/v1/gateway/send-sms |
| Authentication | Generic Credential Type → Header Auth (x-api-key) |
| Send Headers | opcjonalnie Content-Type: application/json |
| Send Body | włączone |
| Body Content Type | JSON |
| Specify Body | Using JSON |
Ciało żądania używa wyrażeń n8n do wstawienia numeru i treści z poprzedniego węzła:
{
"recipients": ["{{ $json.phone }}"],
"message": "Dzień dobry {{ $json.name }}, Twoja wizyta jest jutro o {{ $json.time }}."
}Jeśli masz kilka telefonów, dodaj "deviceId". Dla telefonu z dwiema kartami SIM podaj "simSubscriptionId". Wiadomość możesz też zaplanować polem "scheduledAt" w formacie ISO 8601.
Gotowy węzeł do wklejenia (JSON)
Skopiuj poniższy JSON, w n8n wciśnij Ctrl+V (lub Cmd+V) na pustym płótnie. Pojawi się węzeł HTTP Request z nagłówkiem i ciałem. Wstaw swój klucz w miejsce TWÓJ_KLUCZ_API albo zamień nagłówek na dane uwierzytelniające Header Auth.
{
"nodes": [
{
"parameters": {
"method": "POST",
"url": "https://smsportal.app/api/v1/gateway/send-sms",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "x-api-key", "value": "TWÓJ_KLUCZ_API" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"recipients\": [\"{{ $json.phone }}\"],\n \"message\": \"{{ $json.message }}\"\n}",
"options": {}
},
"name": "Wyślij SMS (smsportal)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [460, 300]
}
],
"connections": {}
}Węzeł oczekuje, że poprzedni węzeł poda pola phone i message. Numery zapisuj w formacie międzynarodowym, np. +48600100200.
Przepis 1: nowy wiersz w Arkuszu Google wysyła SMS
Węzeł Google Sheets Trigger ze zdarzeniem Row added uruchamia workflow po dodaniu wiersza, a HTTP Request wysyła SMS na numer z kolumny. Trigger sprawdza arkusz cyklicznie, więc SMS nie wychodzi co do sekundy, tylko w ustawionym odstępie.
- Google Sheets Trigger → zdarzenie Row added, wybierz arkusz. Kolumny to np.
phone,name,message. - HTTP Request → ustawienia z tabeli wyżej, ciało z
{{ $json.phone }}i{{ $json.message }}. - (opcjonalnie) Google Sheets → Update row: zapisz w kolumnie
statusodpowiedź API, żeby widzieć, co wyszło.
To dobry sposób na proste powiadomienia dla małej firmy: formularz zapisuje wiersz, klient dostaje potwierdzenie. Dla list kilkuset osób z jedną treścią lepiej użyć wysyłki z pliku CSV.
Przepis 2: odpowiedź klienta trafia na Slacka lub Telegram
Klient odpisuje na Twój numer, smsportal wysyła zdarzenie MESSAGE_RECEIVED na adres węzła Webhook, a dalej n8n publikuje je w komunikatorze. Dzięki temu zespół widzi odpowiedzi bez wchodzenia do panelu.
- Webhook → metoda
POST, ścieżka np.sms-przychodzace. Skopiuj Production URL. - W panelu smsportal otwórz Webhooki, dodaj adres i zaznacz
MESSAGE_RECEIVED. - Slack (Send a message) lub Telegram (Send Message): treść
SMS od {{ $json.body.sender }}: {{ $json.body.message }}.
Węzeł Webhook umieszcza dane żądania w polu body, więc w wyrażeniach pisz $json.body.sender i $json.body.message. Każda dostawa ma też idempotencyKey i nagłówek X-Signature (HMAC-SHA256 ciała). Szczegóły weryfikacji opisuje artykuł o odbieraniu SMS przez webhook.
Uwaga: do panelu smsportal wklej adres produkcyjny (bez
webhook-test) i włącz workflow. Adres testowy działa tylko, gdy edytor nasłuchuje.
Przepis 3: AI przygotowuje odpowiedź na SMS
Po węźle Webhook dodaj węzeł AI, np. AI Agent lub Basic LLM Chain z modelem językowym, który na podstawie treści SMS-a układa odpowiedź, a następnie wyślij ją tym samym węzłem HTTP Request. Pierwsze wersje najlepiej kierować do człowieka do akceptacji.
- Webhook (
MESSAGE_RECEIVED) dostarczasenderimessage. - AI Agent / Basic LLM Chain: polecenie typu „Odpowiedz krótko, uprzejmie, do 160 znaków, bez polskich znaków. Wiadomość klienta: {{ $json.body.message }}”.
- HTTP Request:
recipients={{ $('Webhook').item.json.body.sender }},message= odpowiedź modelu.
Dla pełniejszej obsługi, w której model sam czyta i wysyła SMS-y, zobacz SMS dla agentów AI przez MCP. W n8n zadziała też podejście hybrydowe: AI proponuje odpowiedź, a Ty zatwierdzasz ją na Slacku przed wysyłką.
Ile znaków ma SMS z n8n i co z polskimi literami?
SMS w alfabecie GSM-7 (bez polskich znaków diakrytycznych) ma 160 znaków. Jedna polska litera (ą, ę, ł, ż…) przełącza całą wiadomość na kodowanie UCS-2 i limit spada do 70 znaków na część. Dłuższe SMS-y są sklejane z części po 153 (GSM-7) lub 67 (UCS-2) znaków.
| Treść | Kodowanie | Limit jednej części |
|---|---|---|
Dzien dobry, wizyta jutro o 10:00. | GSM-7 | 160 znaków |
Dzień dobry, wizyta jutro o 10:00. | UCS-2 | 70 znaków |
Sprawdzisz to na ekranie pisania w aplikacji, który pokazuje licznik znaków i części.
Jak śledzić status i błędy w workflow?
Węzeł HTTP Request zwraca odpowiedź przy przyjęciu wiadomości, ale to jeszcze nie jest dostarczenie. Status „wysłana” oznacza, że telefon przekazał SMS operatorowi, a „dostarczona” wynika z raportu operatora. Żeby reagować na nieudane SMS-y, utwórz drugi workflow z Webhookiem na MESSAGE_FAILED.
MESSAGE_SENT: telefon wysłał wiadomość,MESSAGE_DELIVERED: operator potwierdził dostarczenie,MESSAGE_FAILED: polaerrorCodeierrorMessage, dobre do alertu na Slacku.
W n8n włącz też Retry On Fail w węźle HTTP Request, żeby chwilowy błąd sieci nie gubił wiadomości. Pamiętaj, że telefon bez zasięgu trzyma kolejkę do 72 godzin, a potem wiadomości wygasają.
Jak przetestować workflow przed uruchomieniem?
Przetestuj wysyłkę na własny numer, zanim podłączysz prawdziwych klientów. Wykonaj węzeł HTTP Request ręcznie, sprawdź odpowiedź w n8n i status wiadomości w zakładce Wiadomości w panelu. Dopiero potem włącz wyzwalacz i dodaj dane produkcyjne.
- Wpisz do węzła stały numer testowy (swój, w formacie
+48…) i krótki tekst bez polskich liter. - Kliknij Execute step. Odpowiedź API powinna mieć kod 2xx.
- Odczekaj chwilę i zobacz, czy status zmienił się na „wysłana”, a potem „dostarczona”.
- Odpisz na SMS z drugiego telefonu przy włączonym nasłuchiwaniu Listen for test event w węźle Webhook. Zdarzenie powinno pojawić się w edytorze.
- Dopiero teraz aktywuj workflow i wklej w panelu adres produkcyjny.
Wskazówka: na czas prób dodaj węzeł IF, który przepuszcza tylko Twój numer. Pomyłka w arkuszu nie wyśle wtedy SMS-ów do klientów.
Najczęstsze problemy: dlaczego SMS z n8n nie działa?
Większość błędów to jedna z pięciu przyczyn: zły nagłówek, zły format numeru, wyłączony telefon, niedostępny adres webhooka albo polskie litery. Poniżej objawy i naprawa.
| Objaw | Przyczyna | Co zrobić |
|---|---|---|
| Błąd 401 w węźle HTTP Request | Nagłówek Authorization zamiast x-api-key lub zły klucz | Ustaw nagłówek x-api-key z kluczem z panelu. Przy Header Auth sprawdź, czy nazwa nagłówka jest dokładnie taka |
| Błąd 400 lub SMS nie dochodzi | Numer bez prefiksu kraju (np. 600100200) | Używaj formatu E.164: +48600100200. W n8n dopisz prefiks wyrażeniem, gdy brakuje plusa |
| Odpowiedź API jest poprawna, a SMS „w kolejce” | Telefon jest offline lub system wstrzymuje aplikację | Sprawdź zasięg, internet i oszczędzanie baterii (ekran zdrowia urządzenia). Kolejka czeka do 72 godzin |
| Webhook nie przychodzi | Adres nie jest publicznym HTTPS lub wklejono adres testowy | Wklej Production URL i włącz workflow. n8n na localhost jest nieosiągalny z internetu: użyj tunelu lub ustaw publiczny adres w zmiennej WEBHOOK_URL |
| Jeden SMS zajmuje kilka części | Polskie litery zmieniły kodowanie na UCS-2 | Usuń ogonki lub skróć treść do 70 znaków. Licznik w aplikacji pokazuje liczbę części |
Przy braku zdarzeń zajrzyj do zakładki Executions w n8n: widać tam każde wywołanie webhooka i jego dane. Gdy wywołań nie ma, problem leży po stronie adresu, a nie workflow.
Ograniczenia: czego nie robić z n8n i telefonem
Własny telefon jako bramka nadaje się do wiadomości transakcyjnych, rozmów z klientem i alertów. Telefon wysyła SMS-y w odstępach, domyślnie co 5 sekund, więc zalewanie tysiącami wiadomości na godzinę nie ma sensu, a operatorzy mogą blokować masową wysyłkę z kart konsumenckich. Do kampanii marketingowych wybierz hurtowego dostawcę, zob. bramka SMS: co to jest.
Następny krok
Załóż bezpłatne konto smsportal, podłącz telefon, wklej JSON z tego artykułu do n8n i wyślij pierwszy SMS na własny numer. Pełne pola żądania znajdziesz w dokumentacji API, a plany w cenniku.
Najczęściej zadawane pytania
Czy istnieje gotowy węzeł smsportal w n8n?
Nie. Nie ma natywnego węzła smsportal, więc korzystasz z ogólnych węzłów: HTTP Request do wysyłania i Webhook do odbierania. Konfiguracja zajmuje kilka minut, a ten sam schemat działa w każdym workflow.
Jak uwierzytelnić węzeł HTTP Request w n8n?
Dodaj nagłówek x-api-key z kluczem API z panelu smsportal. Najwygodniej zapisać go jako dane uwierzytelniające typu Header Auth, żeby klucz nie leżał w treści workflow i nie wyciekł przy eksporcie.
Jak odebrać odpowiedź klienta na SMS w n8n?
Utwórz workflow z węzłem Webhook (metoda POST), skopiuj jego adres produkcyjny i wklej go w panelu smsportal w sekcji Webhooki, zaznaczając zdarzenie MESSAGE_RECEIVED. Treść odpowiedzi i numer nadawcy trafią do pól message i sender.
Dlaczego webhook działa w teście, a po aktywacji workflow nie?
n8n ma dwa adresy: testowy (aktywny tylko podczas nasłuchiwania w edytorze) i produkcyjny (aktywny po włączeniu workflow). Do panelu smsportal wklej adres produkcyjny, a workflow musi być włączony.
Czy n8n wyśle tysiące SMS-ów naraz?
Węzeł wyśle żądania szybko, ale telefon wysyła SMS-y w odstępach (domyślnie 5 sekund, ok. 720 na godzinę z jednego telefonu). Duże partie rozłóż w czasie lub użyj kilku urządzeń.

