Wysyłka SMS w n8n bez kodu. HTTP Request node + webhook DLR
n8n to self-hosted alternatywa dla Zapiera i Make — pozwala automatyzować przepływy między aplikacjami bez kodu. W tym przewodniku pokazujemy, jak zintegrować Przypominamy.com z n8n używając wyłącznie wbudowanego HTTP Request node. Bez instalowania community nodes, bez wychodzenia poza standardowy n8n.
Co znajdziesz: konfiguracja Credentials dla Bearer token, wysyłka SMS przez HTTP Request, obsługa rate-limit, odbiór webhooków DLR i incoming SMS, dwa pełne workflowy (formularz → SMS i Stripe → potwierdzenie SMS).
1. Po co n8n do SMS?
Trzy typowe scenariusze, gdy automatyzacja SMS w n8n ma sens:
- Self-hosted — nie chcesz wysyłać danych klientów do chmury Zapiera/Make. n8n na własnym serwerze (Docker, Kubernetes) trzyma wszystko u Ciebie.
- Złożone scenariusze — IF/SWITCH branche, dataset operations, Function nodes z JavaScript. Tam gdzie Zapier się zatyka, n8n daje radę.
- Open source — fork, customize, audit. Dla zespołów z compliance ISO 27001/SOC 2 to często wymóg.
2. Konfiguracja Credentials
Najpierw zapisz token API jako Credentials w n8n. To pozwala używać go w wielu workflowach bez wpisywania na sztywno:
- W n8n: Settings → Credentials → Create New.
- Wybierz typ: "HTTP Header Auth".
- Nazwa: Przypominamy API.
- Header Name: Authorization.
- Header Value: Bearer pk_live_a1b2c3d4... (Twój token z panelu klienta).
- Save.
n8n szyfruje wartość w bazie i nigdy nie pokazuje jej w JSON-ie workflow ani w logach. Nawet jeśli wyeksportujesz workflow, token tam nie pojedzie.
3. HTTP Request node — pojedynczy SMS
Dodaj nowy workflow i pierwszy node: HTTP Request. Konfiguracja:
| Parametr | Wartość |
|---|---|
| Method | POST |
| URL | https://api.przypominamy.com/v1/sms |
| Authentication | Generic Credential Type → HTTP Header Auth → "Przypominamy API" |
| Send Headers | ON → Content-Type: application/json |
| Send Body | ON → Body Content Type: JSON |
| JSON Body | patrz niżej |
JSON Body:
{
"to": "+48600123456",
"message": "Cześć! Przypomnienie o wizycie jutro o 14:00.",
"from": "FIRMA",
"idx": "n8n-workflow-{{$workflow.id}}-{{$execution.id}}"
}
Zwróć uwagę na idx — n8n udostępnia $workflow.id i $execution.id, więc każdy SMS dostaje unikalny identyfikator. Przyda się w webhookach DLR (sekcja 6).
Kliknij Execute Node — w odpowiedzi zobaczysz {"success": true, "data": {...}} z message_id.
4. Workflow #1: formularz → SMS
Przykład praktyczny: użytkownik wypełnia formularz na stronie (np. Tally, Typeform, n8n Form Trigger) — automatycznie dostaje SMS z potwierdzeniem.
(SMS)
Form Trigger (built-in trigger n8n) — definiujesz pola: imie, telefon, godzina.
Set node — normalizuje numer telefonu (dodaje +48 jeśli brakuje):
// Function w Set node, pole "phone_normalized"
{{ $json.telefon.startsWith('+') ? $json.telefon : '+48' + $json.telefon.replace(/\s/g, '') }}
HTTP Request — wysyłka SMS z dynamicznymi polami:
{
"to": "{{ $node['Set'].json.phone_normalized }}",
"message": "Cześć {{ $node['Form Trigger'].json.imie }}, wizyta {{ $node['Form Trigger'].json.godzina }} potwierdzona. Pozdrawiamy!",
"from": "FIRMA",
"idx": "form-{{ $execution.id }}"
}
Po aktywacji workflow każda osoba wypełniająca formularz automatycznie dostaje SMS — bez Twojej ingerencji.
5. Workflow #2: Stripe → SMS po zakupie
Bardziej zaawansowany przykład: klient płaci w Stripe — Twój sklep wysyła SMS z potwierdzeniem i numerem zamówienia.
(checkout.completed)→IF
(amount > 0)→HTTP Request
(SMS)
Stripe Trigger — wybierz event checkout.session.completed. n8n dostaje pełen webhook payload z numerem klienta, kwotą, ID zamówienia.
IF node — filtruj tylko płatności na żywo (nie testowe):
// Condition
{{ $json.data.object.livemode }} === true
AND
{{ $json.data.object.amount_total }} > 0
HTTP Request — wysyłka SMS z numerem zamówienia:
{
"to": "{{ $json.data.object.customer_details.phone }}",
"message": "Dziękujemy za zamówienie #{{ $json.data.object.id }}. Kwota: {{ ($json.data.object.amount_total / 100).toFixed(2) }} {{ $json.data.object.currency.toUpperCase() }}. Status: opłacone ✓",
"from": "TWOJSKLEP",
"idx": "stripe-{{ $json.data.object.id }}"
}
Pole idx używa pełnego Stripe Session ID — w razie potrzeby łatwo skorelujesz SMS z transakcją w bazie.
6. Webhook DLR — czy SMS dotarł?
Chcesz wiedzieć, czy SMS o zamówieniu faktycznie dotarł do klienta? Webhook DLR rozwiązuje to bezpośrednio w n8n:
- Stwórz nowy workflow z node'em Webhook (built-in trigger).
- Method: POST, Path: /przypominamy-dlr.
- Klik Listen for Test Event — n8n pokaże Production URL, np. https://n8n.twojadomena.pl/webhook/przypominamy-dlr.
- Skopiuj URL i wklej w panelu klienta Przypominamy.com jako webhook_url.
- Aktywuj workflow.
Każda zmiana statusu SMS-a (queued → sent → delivered) wyzwala workflow. Payload jest dostępny jako $json:
{
"event": "delivery_report",
"message_id": "msg_abc123",
"to": "+48600123456",
"status": "delivered",
"sent_at": "2026-05-18T10:30:00.000Z",
"done_at": "2026-05-18T10:30:04.000Z",
"idx": "stripe-cs_test_xyz"
}
Dodaj kolejne nody: zapis do bazy (Postgres node), Slack notification gdy status === "failed", retry przez VMS (połączenie głosowe) gdy SMS nie dotrze.
7. Rate limit — jak nie wykosić limitu 100/min
Domyślny limit Przypominamy.com to 100 żądań na minutę. W n8n masz dwa sposoby:
Wait node między SMS-ami
Dla małych volumenów (poniżej 100 SMS w workflow) wystarczy Wait node z parametrem amount: 700, unit: milliseconds — daje 85 req/min, z marginesem.
SplitInBatches dla większych wolumenów
Dla 100+ SMS-ów:
(batchSize: 50)→HTTP Request→Wait (35s)
50 SMS-ów co 35 sekund daje ~85 SMS/min — bezpiecznie pod limitem.
8. Obsługa błędów
HTTP Request node w n8n zwraca kod HTTP i payload. Dodaj Error Trigger lub IF node sprawdzający {{ $json.success === true }}:
| Kod | Co zrobić w n8n |
|---|---|
| 401 | Slack alert do adminów — token wygasł |
| 402 | Slack alert + pauza workflow — brak środków |
| 422 | Loguj do Postgres jako "invalid payload" — nie ponawiaj |
| 429 | Wait node + retry (use Continue On Fail w HTTP Request) |
| 5xx | Retry 3x z Wait, potem alert |
W ustawieniach HTTP Request node włącz Continue On Fail i Retry On Fail (3 próby, wait 60s) — najprostsza obrona przed transient errors.
9. Przykład gotowego workflow do importu
Możesz zaimportować ten przykład bezpośrednio do n8n: Workflow → Import from File. Najpierw skontaktuj się z nami ([email protected]) — przygotowujemy dedykowany pakiet workflow templates dla popularnych use cases (przypomnienia o wizytach, potwierdzenia zamówień, 2FA).
FAQ
Czy do wysyłki SMS w n8n potrzebuję dedykowanego node'a?
Nie. Standardowy HTTP Request node wystarczy. To samo dotyczy odbioru webhooków DLR — używasz wbudowanego Webhook node.
Czy n8n self-hosted obsługuje wysyłkę SMS przez API?
Tak. Self-hosted n8n (Docker, Kubernetes) obsługuje pełen zakres HTTP Request node. Możesz wysyłać SMS-y i odbierać webhooki bez ograniczeń.
Jak zabezpieczyć token API w n8n?
Twórz osobne Credentials w n8n (Settings → Credentials → New) typu HTTP Header Auth. n8n szyfruje tokeny w bazie. Nie wpisuj tokenu bezpośrednio w body — zawsze przez Credentials.
Jak obsłużyć rate limit 100 req/min w n8n?
Dodaj Wait node między HTTP Request (600-700ms = ~85-100/min). Lub SplitInBatches z batchSize=50 i Wait 35s. Dla większej skali — Queue Mode z workerami.
Czy webhooki DLR są kompatybilne z n8n Webhook node?
Tak — POST application/json. Pamiętaj że n8n w trybie self-hosted musi być publicznie dostępne (tunel, ngrok, reverse proxy).
Chcesz dedykowany community node n8n?
Pracujemy nad oficjalnym node'em Przypominamy.com dla n8n marketplace. Zarejestruj się — damy znać gdy będzie gotowy.
Załóż konto