Przypominamy.com
+
n8n

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.

KrokCo zrobić
1. InstalacjaW 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ępoweCredentials → 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.

PoleWartość
MethodPOST
URLhttps://api.przypominamy.com/v1/messages
AuthenticationGeneric Credential Type → Header Auth
Header Auth credentialName: 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 BodyON · Body Content Type: JSON · Specify Body: Using JSON
JSON body
={{ JSON.stringify({
  to: $json.phone,
  text: $json.text,
  reference: $json.reference
}) }}
OptionsRetry 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.

Limit: 120 żądań na minutę na konto. Przekroczenie zwraca HTTP 429 z nagłówkiem Retry-After. Zamiast pętli po pojedynczych numerach użyj node Aggregate i jednego żądania z tablicą to.

Trzy gotowe scenariusze

Form Trigger → HTTP Request

Formularz n8n → SMS z potwierdzeniem

Zapis na webinar, konsultację lub wizytę z wbudowanego formularza n8n. Odbiorca dostaje SMS w sekundę po wysłaniu.

  1. n8n Form Trigger z polami Imię, Telefon, Termin.
  2. HTTP Request jak wyżej; w body: to: $json.Telefon, text: `Dziękujemy, ${$json.Imię}. Twój termin: ${$json.Termin}.`, reference: $execution.id.
  3. Opcjonalnie Google Sheets → Append z id wiadomości.
Schedule Trigger → Google Sheets → Filter → HTTP Request

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.

  1. Schedule Trigger: codziennie 10:00.
  2. Google Sheets → Get Many Rows.
  3. Filter: data_wizyty == $today.plus({days:1}).toFormat('yyyy-MM-dd') i wyslano puste.
  4. HTTP Request: to: $json.telefon, reference: 'wizyta-' + $json.row_number.
  5. Google Sheets → Update Row: wyslano = $json.id.
Webhook → Set → HTTP Request → Respond to Webhook

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.

  1. Webhook (POST, Respond: Using 'Respond to Webhook' node).
  2. Set: mapowanie phone, text z $json.body.order_id, reference: 'order-' + $json.body.order_id.
  3. HTTP Request z nagłówkiem Idempotency-Key = reference — ponowny webhook nie wyśle SMS-a drugi raz.
  4. Respond to Webhook: 200 z id wiadomoś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:

Rejestracja webhookabash
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 — weryfikacja podpisuJavaScript
// 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.

przypominamy-wyslij-sms.jsonn8n 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?
Nie, ale jest dostępny. Oficjalny community node n8n-nodes-przypominamy (Settings → Community Nodes) daje węzły „Przypominamy.com SMS” i „Przypominamy.com Trigger” z operacjami do wyboru z listy i automatyczną weryfikacją podpisu webhooków. Jeśli wolisz nie instalować dodatków, wbudowany HTTP Request node wystarczy: metoda POST, adres https://api.przypominamy.com/v1/messages, uwierzytelnienie Header Auth z nagłówkiem Authorization: Bearer pk_live_… i JSON w body — gotowy workflow do importu znajdziesz na tej stronie.
Czy to działa w n8n Cloud i w wersji self-hosted?
Tak, w obu. API jest publicznie dostępne przez HTTPS, więc n8n Cloud łączy się bez konfiguracji sieci. W wersji self-hosted upewnij się tylko, że kontener ma wyjście do internetu, a jeśli chcesz odbierać webhooki statusów, że adres Webhook node jest osiągalny z zewnątrz (WEBHOOK_URL) i ma ważny certyfikat TLS.
Jak wysłać ten sam SMS do wielu odbiorców z n8n?
Przekaż w polu to tablicę numerów (do 500 w jednym żądaniu), np. {{ $items().map(i => i.json.phone) }} po nodzie Aggregate lub Code. Jedno żądanie liczy się jako jedno wywołanie w limicie 120 żądań na minutę, a każda wiadomość jest rozliczana osobno za część SMS. Duplikaty numerów API usuwa automatycznie.
Co zrobić z limitem 120 żądań na minutę?
Przy pętli po pojedynczych numerach włącz w HTTP Request node opcję Batching (np. 100 elementów, odstęp 60 000 ms) albo dodaj node Wait. Gdy limit zostanie przekroczony, API zwraca HTTP 429 z nagłówkiem Retry-After; w opcjach node ustaw Retry On Fail z 3 próbami. Lepszym rozwiązaniem jest jednak agregacja numerów do tablicy i jedno żądanie.
Jak sprawdzić, czy SMS został doręczony?
Ustaw webhook przez PUT /v1/account/webhook na adres Production URL z Webhook node w n8n. Przy każdej zmianie statusu dostaniesz POST ze zdarzeniem message.sent, message.delivered, message.undelivered, message.failed lub message.expired. Podpis w nagłówku X-Przypominamy-Signature zweryfikujesz w Code node (przykład na tej stronie). Alternatywnie odpytuj GET /v1/messages/{id} po kilku minutach.

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.

Przypominamy.com – logo platformy SMS, MMS i IVR
Asystent Przypominamy ● Online. Odpowiada od razu
Cześć! 👋 Jestem asystentem platformy Przypominamy.com.

Pomogę Ci dobrać plan, wyjaśnię jak działa API lub odpowiem na pytania o SMS, MMS i IVR. Jak mogę pomóc?
teraz