SMS z n8n: natywny community node albo jeden HTTP Request node
Formularz, arkusz, sklep, CRM, cron — każdy trigger w n8n może wysłać SMS przez API Przypominamy.com. Zainstaluj community node n8n-nodes-przypominamy i wybieraj operacje z listy, albo użyj wbudowanego HTTP Request node z gotowym workflow do importu. Statusy doręczenia wracają webhookiem podpisanym HMAC.
Sposób 1: community node n8n-nodes-przypominamy
Oficjalny węzeł Przypominamy.com jest dostępny jako community node n8n-nodes-przypominamy. Zamiast składać JSON w HTTP Request wybierasz zasób i operację z listy, a statusy doręczeń odbierasz węzłem Trigger, który sam weryfikuje podpis HMAC.
| Krok | Co zrobić |
|---|---|
| 1. Instalacja | W n8n: Settings → Community Nodes → Install, wpisz n8n-nodes-przypominamy, zaakceptuj i zainstaluj. Self-hosted alternatywnie: cd ~/.n8n/nodes && npm install n8n-nodes-przypominamy i restart n8n. Wymagania: n8n ≥ 1.0, Node.js ≥ 18.10. |
| 2. Dane dostępowe | Credentials → Add credential → Przypominamy.com API: wklej klucz z app.przypominamy.com/keys (zakresy send i read; do kontaktów i grup także manage). Przycisk Test wywołuje GET /v1/account. Dla triggera dopisz sekret webhooka whsec_… z panelu. |
| 3. Węzeł „Przypominamy.com SMS” | Zasoby: Wiadomość (wyślij SMS, wyślij głosową, pobierz, lista, anuluj), Kontakt, Grupa, Czarna lista, Konto (saldo, nadpisy, raport, HLR), Szablon — 1:1 z REST API v2. Odbiorca: numer, kilka numerów po przecinku (do 500) albo group:VIP z personalizacją {{imie}}. Działa też jako narzędzie agenta AI w n8n. |
| 4. Węzeł „Przypominamy.com Trigger” | Wybierz zdarzenia (doręczona, niedoręczona, błąd, wygasła, a także message.received i link.clicked), skopiuj Production URL do zakładki Webhook w panelu i aktywuj workflow. Podpis X-Przypominamy-Signature jest sprawdzany automatycznie. |
Błędy API ({ error: { code, message, param } }) węzeł pokazuje z kodem, polem i request_id. Włącz Settings → On Error → Continue, żeby np. insufficient_funds dla jednego elementu nie zatrzymał całego workflow. Klucz pk_test_… na koncie testowym wysyła tylko na zweryfikowane numery i nie pobiera opłat.
Sposób 2: wbudowany HTTP Request node
Nie chcesz instalować community node? Cała integracja mieści się w jednym wbudowanym nodzie. Poniżej dokładne wartości pól; identyczne dla n8n Cloud i self-hosted.
| Pole | Wartość |
|---|---|
| Method | POST |
| URL | https://api.przypominamy.com/v1/messages |
| Authentication | Generic Credential Type → Header Auth |
| Header Auth credential | Name: Authorization · Value: Bearer pk_live_… (klucz z panelu; do testów pk_test_…) |
| Send Headers (opcjonalnie) | Idempotency-Key = {{ $json.reference }}-{{ $now.toFormat('yyyyLLdd') }} — chroni przed podwójnym SMS-em przy ponowieniu |
| Send Body | ON · Body Content Type: JSON · Specify Body: Using JSON |
| JSON body | ={{ JSON.stringify({
to: $json.phone,
text: $json.text,
reference: $json.reference
}) }} |
| Options | Retry On Fail: ON, Max Tries: 3, Wait Between Tries: 5000 ms. Przy pętli po wielu elementach: Batching → Items per Batch 100, Batch Interval 60000 ms |
Pola opcjonalne w body: from (własny nadpis z GET /v1/senders), send_at (ISO 8601, np. {{ $now.plus({ hours: 24 }).toISO() }} — wysyłka za dobę), a to może być tablicą do 500 numerów. Numery podawaj w formacie międzynarodowym +48…. W odpowiedzi dostaniesz id (msg_…), status: "queued", liczbę części parts i swoje reference — zapisz je w kolejnym nodzie, żeby później dopasować status doręczenia.
Retry-After. Zamiast pętli po pojedynczych numerach użyj node Aggregate i jednego żądania z tablicą to.Trzy gotowe scenariusze
Formularz n8n → SMS z potwierdzeniem
Zapis na webinar, konsultację lub wizytę z wbudowanego formularza n8n. Odbiorca dostaje SMS w sekundę po wysłaniu.
- n8n Form Trigger z polami Imię, Telefon, Termin.
- HTTP Request jak wyżej; w body:
to: $json.Telefon,text: `Dziękujemy, ${$json.Imię}. Twój termin: ${$json.Termin}.`,reference: $execution.id. - Opcjonalnie Google Sheets → Append z
idwiadomości.
Google Sheets → przypomnienia dzień przed
Arkusz z kolumnami telefon, data_wizyty, godzina, wyslano. Codziennie o 10:00 workflow wybiera jutrzejsze wizyty i wysyła przypomnienie.
- Schedule Trigger: codziennie 10:00.
- Google Sheets → Get Many Rows.
- Filter:
data_wizyty == $today.plus({days:1}).toFormat('yyyy-MM-dd')iwyslanopuste. - HTTP Request:
to: $json.telefon,reference: 'wizyta-' + $json.row_number. - Google Sheets → Update Row:
wyslano = $json.id.
Webhook z Twojego systemu → potwierdzenie zamówienia
Sklep, CRM lub system rezerwacji wysyła POST do n8n przy nowym zamówieniu; n8n odpala SMS z numerem zamówienia i statusem.
- Webhook (POST, Respond: Using 'Respond to Webhook' node).
- Set: mapowanie
phone,textz$json.body.order_id,reference: 'order-' + $json.body.order_id. - HTTP Request z nagłówkiem
Idempotency-Key = reference— ponowny webhook nie wyśle SMS-a drugi raz. - Respond to Webhook: 200 z
idwiadomości.
Odbiór statusów doręczenia: Webhook node + HMAC
Zamiast odpytywać API, odbieraj zdarzenia. W n8n dodaj Webhook node (metoda POST, ścieżka np. przypominamy-status), w opcjach włącz Raw Body (potrzebne do policzenia podpisu na dokładnie tych bajtach, które przyszły) i ustaw Respond: Immediately. Skopiuj Production URL i zarejestruj go jednym żądaniem:
curl -X PUT https://api.przypominamy.com/v1/account/webhook \
-H "Authorization: Bearer $PRZYPOMINAMY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://twoj-n8n.example.com/webhook/przypominamy-status"}'
# odpowiedź zawiera "webhook_secret" — zapisz go jako zmienną środowiskową n8n
Każde zdarzenie message.sent, message.delivered, message.undelivered, message.failed, message.expired przychodzi jako POST z nagłówkiem X-Przypominamy-Signature: t=<unix>,v1=<hex>. Podpis to HMAC-SHA256 z sekretu nad ciągiem "<t>.<surowe body>". Weryfikację robi Code node bezpośrednio za Webhookiem:
// Code node (JavaScript), tryb "Run Once for All Items"
// Webhook node: Options → Raw Body = ON, Respond = Immediately
const crypto = require('crypto');
const secret = $env.PRZYPOMINAMY_WEBHOOK_SECRET; // z odpowiedzi PUT /v1/account/webhook
const item = $input.first();
const header = item.json.headers['x-przypominamy-signature'] || '';
const rawBody = Buffer.from(item.binary.data.data, 'base64').toString('utf8');
const m = /t=(\d+),v1=([0-9a-f]{64})/.exec(header);
if (!m) throw new Error('Brak lub zły format podpisu');
const [, t, sig] = m;
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) throw new Error('Podpis starszy niż 5 minut');
const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
if (!crypto.timingSafeEqual(Buffer.from(sig, 'hex'), Buffer.from(expected, 'hex'))) {
throw new Error('Nieprawidłowy podpis HMAC');
}
const event = JSON.parse(rawBody); // { type: "message.delivered", data: { message: {...} } }
return [{ json: { type: event.type, message: event.data.message } }];
W n8n self-hosted moduł crypto w Code node wymaga zmiennej NODE_FUNCTION_ALLOW_BUILTIN=crypto; w n8n Cloud jest dostępny domyślnie. Za Code node dodaj Switch po type: message.delivered → oznacz w arkuszu, message.failed / message.undelivered → wyślij e-mail lub zadanie w CRM. Pole message.reference zawiera wartość, którą przekazałeś przy wysyłce, więc dopasowanie do rekordu jest natychmiastowe.
Workflow do importu
Skopiuj poniższy JSON, w n8n wybierz Workflows → Import from clipboard (lub wklej bezpośrednio na kanwę). Workflow składa się z trzech nodów: Manual Trigger → Set z danymi wiadomości → HTTP Request do API. Po imporcie utwórz credential typu Header Auth (nazwa Authorization, wartość Bearer pk_test_…), przypisz go w ostatnim nodzie, zmień numer w Set na jeden ze swoich zweryfikowanych numerów i kliknij Test workflow.
{
"name": "Przypominamy.com — wyślij SMS",
"nodes": [
{
"parameters": {},
"id": "a1b2c3d4-0001-4000-8000-000000000001",
"name": "Manual Trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "f1",
"name": "phone",
"value": "+48600123456",
"type": "string"
},
{
"id": "f2",
"name": "text",
"value": "Przypominamy o wizycie jutro o 14:00. Odwolaj: 22 123 45 67",
"type": "string"
},
{
"id": "f3",
"name": "reference",
"value": "wizyta-4521",
"type": "string"
}
]
},
"options": {}
},
"id": "a1b2c3d4-0002-4000-8000-000000000002",
"name": "Dane SMS",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
220,
0
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.przypominamy.com/v1/messages",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Idempotency-Key",
"value": "={{ $json.reference }}-{{ $now.toFormat('yyyyLLdd') }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ to: $json.phone, text: $json.text, reference: $json.reference }) }}",
"options": {
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000
}
},
"id": "a1b2c3d4-0003-4000-8000-000000000003",
"name": "Wyślij SMS (Przypominamy)",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
440,
0
],
"credentials": {
"httpHeaderAuth": {
"id": "1",
"name": "Przypominamy API key"
}
}
}
],
"connections": {
"Manual Trigger": {
"main": [
[
{
"node": "Dane SMS",
"type": "main",
"index": 0
}
]
]
},
"Dane SMS": {
"main": [
[
{
"node": "Wyślij SMS (Przypominamy)",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {},
"active": false
}
Wersja produkcyjna różni się tylko triggerem i źródłem danych: podmień Manual Trigger na Form Trigger, Schedule lub Webhook, a Set na mapowanie z Twoich danych. HTTP Request node zostaje bez zmian.
Częste pytania o n8n + SMS
Czy potrzebuję osobnego community node, żeby wysyłać SMS z n8n?
Czy to działa w n8n Cloud i w wersji self-hosted?
Jak wysłać ten sam SMS do wielu odbiorców z n8n?
Co zrobić z limitem 120 żądań na minutę?
Jak sprawdzić, czy SMS został doręczony?
Powiązane integracje
Pierwszy SMS z n8n w 10 minut
Konto testowe z 25 darmowymi SMS-ami i kluczem pk_test_… działa od razu po rejestracji, bez karty. Importuj workflow, wklej klucz, testuj.