n8n SMS from your own number: send and receive
Checked against the docs:
In n8n you send an SMS with the HTTP Request node: POST https://smsportal.app/api/v1/gateway/send-sms with an x-api-key header and JSON containing recipients and message. Replies arrive at a Webhook node, because smsportal posts a MESSAGE_RECEIVED event to it. The text goes out from your own Android phone, so customers see your number and can reply.
What you need
- n8n Cloud or self-hosted (the HTTP Request and Webhook nodes are built in).
- A smsportal account with an Android phone and SIM card connected.
- An API key from the smsportal dashboard (API Keys → Generate API Key).
- For replies: an n8n instance reachable from the internet over HTTPS.
How to send an SMS from n8n
Store the API key as a credential
In n8n create a Header Auth credential with the header name
x-api-keyand your smsportal key as the value. That keeps the key out of exported workflow JSON.Paste the ready-made node
Copy the JSON below and paste it onto an empty n8n canvas with Ctrl+V (Cmd+V on a Mac). It creates an HTTP Request node with the URL, header and body. Swap the header for your Header Auth credential.
HTTP Request node to paste{ "nodes": [ { "parameters": { "method": "POST", "url": "https://smsportal.app/api/v1/gateway/send-sms", "sendHeaders": true, "headerParameters": { "parameters": [{ "name": "x-api-key", "value": "YOUR_API_KEY" }] }, "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"recipients\": [\"{{ $json.phone }}\"],\n \"message\": \"{{ $json.message }}\"\n}", "options": {} }, "name": "Send SMS (smsportal)", "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [460, 300] } ], "connections": {} }Map data from the previous node
The node reads
phoneandmessagefrom the previous step. Use international format, for example+14155550123. Optionally adddeviceId(several phones),simSubscriptionId(dual-SIM phone) orscheduledAt(send later, ISO 8601 time).Test with your own number
Click Execute step. A 200 response means the message is queued. The status (sent, delivered) shows up in the dashboard.
How to receive a customer reply in n8n
When the phone receives an SMS, smsportal POSTs JSON to your URL. The fields you usually need are sender (the number), message (the text), receivedAt and webhookEvent. Every request carries an X-Signature header: an HMAC-SHA256 of the raw body, keyed with your signing secret.
- Add a Webhook node, method
POST, path such asincoming-sms. Copy its **Production URL**. - In the smsportal dashboard open Webhooks → Create Webhook, paste the URL, enter a signing secret (at least 20 characters) and tick
MESSAGE_RECEIVED. - Activate the workflow. The data is under
$json.body, for example{{ $json.body.sender }}and{{ $json.body.message }}. - To verify the signature, turn on the Raw Body option in the Webhook node and compute the hash of the body in a Crypto node (action Hmac, SHA256, hex encoding) with your secret. It must equal the
x-signatureheader.
{
"smsId": "6720f0c2a1b2c3d4e5f60718",
"message": "Confirmed, see you then",
"deviceId": "671f9e10a1b2c3d4e5f60001",
"webhookSubscriptionId": "671fa001a1b2c3d4e5f60002",
"webhookEvent": "MESSAGE_RECEIVED",
"idempotencyKey": "3f1c9a8e-5d2b-4c7a-9e1f-2b6d8c0a4e57",
"sender": "+14155550123",
"receivedAt": "2026-10-28T09:41:00.000Z"
}Ready-made scenarios
A new Google Sheets row sends an SMS
Google Sheets Trigger (Row added) starts the workflow and HTTP Request texts the number in that row. The trigger polls the sheet, so the text goes out after the next poll, not instantly.
Customer replies land in Slack or Telegram
Webhook on
MESSAGE_RECEIVED, then a Slack or Telegram node withSMS from {{ $json.body.sender }}: {{ $json.body.message }}. Your team sees replies without opening the dashboard.An alert when an SMS fails
A second webhook on
MESSAGE_FAILEDreceivesrecipient,errorCodeanderrorMessage. Forward them to Slack or email so you know at once which message did not go out.
Errors and fixes
- HTTP Request returns 401
- Cause: An
Authorizationheader instead ofx-api-key, or a wrong key. - Fix: Send the
x-api-keyheader. In the Header Auth credential check that the header name is exact. - The API returns 200 but nothing is sent
- Cause: The phone is offline or Android puts the app to sleep.
- Fix: Check signal, internet and the phone status screen in the dashboard. Queued messages wait up to 72 hours, then expire.
- The webhook never fires
- Cause: The dashboard has the test URL (
webhook-test) or the workflow is inactive. - Fix: Register the Production URL and activate the workflow. n8n on
localhostis not reachable from the internet: set a public HTTPS address (WEBHOOK_URL) or use a tunnel. - 429 when sending
- Cause: The SMS limit of your plan is used up.
- Fix: The response body says which limit ran out. Check the counter in the dashboard or change plans on the pricing page.
- One text counts as several
- Cause: An emoji or accented letter switches the encoding and the limit drops from 160 to 70 characters per part.
- Fix: Shorten the text or remove those characters if one part matters to you.
Frequently asked questions
Is there a native smsportal node in n8n?
No. Two built-in nodes are enough: HTTP Request to send and Webhook to receive. Setup takes a few minutes and works the same in every workflow.
How many texts can n8n send at once?
n8n fires requests quickly, but the phone sends with a pause between messages (5 seconds by default, about 720 per hour per phone). Spread large batches over time or add another phone.
Does n8n know the SMS was delivered?
The HTTP Request response only says the message was queued. Sending and delivery are reported by the `MESSAGE_SENT` and `MESSAGE_DELIVERED` events, which you can catch with a separate webhook.
Can I send one SMS to many people?
Yes. `recipients` takes a list of numbers and each one gets its own message from your number. For different texts per person use `send-bulk-sms` or a loop in n8n.
Does this work with self-hosted n8n?
Yes, sending works from any instance with internet access. To receive replies, the instance must be reachable from the internet over HTTPS.
Sources
More in the guides
Send your first SMS today
Create a free account, connect your phone and see how customers respond to messages from your number.