Przejdź do treści
Automatyzacje i AI

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.

Zespół smsportalOpublikowano: 8 min czytania
Panel smsportal z urządzeniami, kluczami API i limitem

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.

Panel smsportal: urządzenia i klucze API
Panel smsportal: urządzenia i klucze API

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 n8nWartość
MethodPOST
URLhttps://smsportal.app/api/v1/gateway/send-sms
AuthenticationGeneric Credential Type → Header Auth (x-api-key)
Send Headersopcjonalnie Content-Type: application/json
Send Bodywłączone
Body Content TypeJSON
Specify BodyUsing JSON

Ciało żądania używa wyrażeń n8n do wstawienia numeru i treści z poprzedniego węzła:

json
{
  "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.

json
{
  "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.

  1. Google Sheets Trigger → zdarzenie Row added, wybierz arkusz. Kolumny to np. phone, name, message.
  2. HTTP Request → ustawienia z tabeli wyżej, ciało z {{ $json.phone }} i {{ $json.message }}.
  3. (opcjonalnie) Google Sheets → Update row: zapisz w kolumnie status odpowiedź 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.

  1. Webhook → metoda POST, ścieżka np. sms-przychodzace. Skopiuj Production URL.
  2. W panelu smsportal otwórz Webhooki, dodaj adres i zaznacz MESSAGE_RECEIVED.
  3. 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.

  1. Webhook (MESSAGE_RECEIVED) dostarcza sender i message.
  2. AI Agent / Basic LLM Chain: polecenie typu „Odpowiedz krótko, uprzejmie, do 160 znaków, bez polskich znaków. Wiadomość klienta: {{ $json.body.message }}”.
  3. 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ą.

Lista wiadomości w aplikacji z filtrem odebranych i wysłanych

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śćKodowanieLimit jednej części
Dzien dobry, wizyta jutro o 10:00.GSM-7160 znaków
Dzień dobry, wizyta jutro o 10:00.UCS-270 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: pola errorCode i errorMessage, 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.

  1. Wpisz do węzła stały numer testowy (swój, w formacie +48…) i krótki tekst bez polskich liter.
  2. Kliknij Execute step. Odpowiedź API powinna mieć kod 2xx.
  3. Odczekaj chwilę i zobacz, czy status zmienił się na „wysłana”, a potem „dostarczona”.
  4. 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.
  5. 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.

ObjawPrzyczynaCo zrobić
Błąd 401 w węźle HTTP RequestNagłówek Authorization zamiast x-api-key lub zły kluczUstaw 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 dochodziNumer 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 przychodziAdres nie jest publicznym HTTPS lub wklejono adres testowyWklej 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ęściPolskie litery zmieniły kodowanie na UCS-2Usuń 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ń.

Wyślij pierwszego SMS-a jeszcze dziś

Załóż darmowe konto, podłącz telefon i sprawdź, jak klienci reagują na wiadomości z Twojego numeru.