SMS w n8n z własnego numeru: wysyłka i odbiór

Sprawdzone z dokumentacją:

W n8n wysyłasz SMS węzłem HTTP Request: POST https://smsportal.app/api/v1/gateway/send-sms, nagłówek x-api-key i JSON z recipients oraz message. Odpowiedzi klientów odbiera węzeł Webhook, do którego smsportal wysyła zdarzenie MESSAGE_RECEIVED. SMS wychodzi z Twojego telefonu z Androidem, więc klient widzi Twój numer i może odpisać.

Czego potrzebujesz

  • n8n w chmurze albo na własnym serwerze (węzły HTTP Request i Webhook są wbudowane).
  • Konto smsportal z podłączonym telefonem z Androidem i kartą SIM.
  • Klucz API z panelu smsportal (Klucze API → Wygeneruj klucz API).
  • Do odbioru odpowiedzi: n8n dostępne z internetu pod adresem HTTPS.

Jak wysłać SMS z n8n

  1. Zapisz klucz API jako poświadczenie

    W n8n utwórz poświadczenie typu Header Auth: nazwa nagłówka x-api-key, wartość to klucz z panelu smsportal. Dzięki temu klucz nie trafi do eksportowanego JSON workflow.

  2. Wklej gotowy węzeł

    Skopiuj JSON poniżej i wklej go na pustą kanwę n8n skrótem Ctrl+V (Cmd+V na Macu). Powstanie węzeł HTTP Request z adresem, nagłówkiem i ciałem. Zamień nagłówek na swoje poświadczenie Header Auth.

    Węzeł HTTP Request do wklejenia
    {
      "nodes": [
        {
          "parameters": {
            "method": "POST",
            "url": "https://smsportal.app/api/v1/gateway/send-sms",
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [{ "name": "x-api-key", "value": "TWOJ_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": {}
    }
  3. Podepnij dane z poprzedniego węzła

    Węzeł czyta pola phone i message z poprzedniego kroku. Numer podawaj z kierunkowym kraju, np. +48600100200. Opcjonalnie dodaj deviceId (przy kilku telefonach), simSubscriptionId (telefon z dwiema kartami) albo scheduledAt (wysyłka później, czas ISO 8601).

  4. Przetestuj na własnym numerze

    Kliknij Execute step. Odpowiedź 200 oznacza, że wiadomość trafiła do kolejki. Status (wysłana, doręczona) zobaczysz w panelu.

Jak odebrać odpowiedź klienta w n8n

Gdy telefon odbierze SMS, smsportal wysyła POST z JSON-em na Twój adres. Pola, których zwykle potrzebujesz: sender (numer nadawcy), message (treść), receivedAt i webhookEvent. Każde żądanie ma nagłówek X-Signature: HMAC-SHA256 surowego ciała, liczony Twoim sekretem podpisu.

  1. Dodaj węzeł Webhook, metoda POST, ścieżka np. sms-przychodzace. Skopiuj **Production URL**.
  2. W panelu smsportal otwórz Webhooki → Utwórz webhook, wklej adres, wpisz sekret podpisu (co najmniej 20 znaków) i zaznacz zdarzenie MESSAGE_RECEIVED.
  3. Włącz workflow. Dane są w $json.body, np. {{ $json.body.sender }} i {{ $json.body.message }}.
  4. Żeby sprawdzić podpis, włącz w węźle Webhook opcję Raw Body i policz w węźle Crypto (akcja Hmac, SHA256, kodowanie hex) skrót ciała swoim sekretem. Wynik ma być równy nagłówkowi x-signature.
Przykładowe ciało zdarzenia MESSAGE_RECEIVED
{
  "smsId": "6720f0c2a1b2c3d4e5f60718",
  "message": "Potwierdzam wizytę",
  "deviceId": "671f9e10a1b2c3d4e5f60001",
  "webhookSubscriptionId": "671fa001a1b2c3d4e5f60002",
  "webhookEvent": "MESSAGE_RECEIVED",
  "idempotencyKey": "3f1c9a8e-5d2b-4c7a-9e1f-2b6d8c0a4e57",
  "sender": "+48600100200",
  "receivedAt": "2026-10-28T09:41:00.000Z"
}

Gotowe scenariusze

  • Nowy wiersz w Arkuszu Google wysyła SMS

    Google Sheets Trigger (zdarzenie Row added) uruchamia workflow, a HTTP Request wysyła SMS na numer z wiersza. Trigger sprawdza arkusz co pewien czas, więc wiadomość wychodzi po najbliższym sprawdzeniu, nie natychmiast.

  • Odpowiedź klienta trafia na Slacka lub Telegram

    Webhook z MESSAGE_RECEIVED, potem węzeł Slack albo Telegram z treścią SMS od {{ $json.body.sender }}: {{ $json.body.message }}. Zespół widzi odpowiedzi bez otwierania panelu.

  • Alert, gdy SMS się nie wyśle

    Drugi webhook ze zdarzeniem MESSAGE_FAILED dostaje recipient, errorCode i errorMessage. Wyślij je na Slacka albo e-mailem, żeby od razu wiedzieć, która wiadomość nie wyszła.

Błędy i rozwiązania

HTTP Request zwraca 401
Przyczyna: Nagłówek Authorization zamiast x-api-key albo błędny klucz.
Co zrobić: Wysyłaj nagłówek x-api-key. W poświadczeniu Header Auth sprawdź, czy nazwa nagłówka jest dokładnie taka.
API odpowiada 200, ale SMS nie wychodzi
Przyczyna: Telefon jest offline albo Android usypia aplikację.
Co zrobić: Sprawdź zasięg, internet i ekran stanu telefonu w panelu. Wiadomość czeka w kolejce do 72 godzin, potem wygasa.
Webhook nic nie dostaje
Przyczyna: W panelu jest adres testowy (webhook-test) albo workflow jest wyłączony.
Co zrobić: Wklej Production URL i włącz workflow. n8n na localhost nie jest widoczne z internetu: potrzebny publiczny adres HTTPS (zmienna WEBHOOK_URL) albo tunel.
429 przy wysyłce
Przyczyna: Wyczerpany limit SMS-ów w pakiecie.
Co zrobić: Treść odpowiedzi mówi, który limit się skończył. Sprawdź licznik w panelu albo zmień pakiet w Cenniku.
Jeden SMS liczy się jako kilka
Przyczyna: Polskie znaki albo emotka zmieniają kodowanie i limit spada ze 160 do 70 znaków na część.
Co zrobić: Skróć treść albo pisz bez polskich znaków, jeśli zależy Ci na jednej części.

Najczęstsze pytania

Czy smsportal ma własny węzeł w n8n?

Nie ma. Wystarczą dwa wbudowane węzły: HTTP Request do wysyłki i Webhook do odbioru. Konfiguracja zajmuje kilka minut i działa tak samo w każdym workflow.

Ile SMS-ów n8n może wysłać naraz?

n8n wyśle żądania szybko, ale telefon wysyła SMS-y z przerwą między wiadomościami (domyślnie 5 sekund, czyli około 720 na godzinę z jednego telefonu). Duże wysyłki rozłóż w czasie albo dodaj kolejny telefon.

Czy n8n wie, że SMS został doręczony?

Odpowiedź HTTP Request mówi tylko, że wiadomość przyjęto do kolejki. O wysłaniu i doręczeniu informują zdarzenia `MESSAGE_SENT` i `MESSAGE_DELIVERED`, które możesz odebrać osobnym webhookiem.

Czy mogę wysłać jeden SMS do wielu osób?

Tak. Pole `recipients` przyjmuje listę numerów, a każdy dostaje osobną wiadomość z Twojego numeru. Do różnych treści dla różnych osób użyj `send-bulk-sms` albo pętli w n8n.

Czy to działa w n8n na własnym serwerze?

Tak, wysyłka działa z każdej instancji, która ma dostęp do internetu. Do odbioru odpowiedzi instancja musi być osiągalna z internetu pod adresem HTTPS.

Źródła

  1. n8n: HTTP Request node
  2. n8n: Webhook node
  3. n8n: Crypto node
  4. smsportal: dokumentacja API

Więcej w poradnikach

Wyślij pierwszego SMS-a jeszcze dziś

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