Make SMS from your own number: send and receive

Checked against the docs:

In Make you send an SMS with the HTTP → Make a request module: POST https://smsportal.app/api/v1/gateway/send-sms with your API key in an x-api-key header and JSON containing recipients and message. Replies arrive at a Webhooks → Custom webhook trigger, 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

  • A Make account (the HTTP and Webhooks apps are built in, nothing to install).
  • A smsportal account with an Android phone and SIM card connected.
  • An API key from the smsportal dashboard (API Keys → Generate API Key).
  • Recipient numbers in international format, for example +14155550123.

How to send an SMS from Make

  1. Add the HTTP → Make a request module

    In your scenario add the HTTP app and the Make a request module. Set URL to https://smsportal.app/api/v1/gateway/send-sms and Method to POST.

  2. Store the API key in Credentials

    Set Authentication type to API key, then create a key under Credentials: Name smsportal, Key is the bare key from the dashboard (no prefix), API key placement In the header, API key parameter name x-api-key. Make keeps the key in Keys, so it stays out of the Headers field and you rotate it in one place.

  3. Paste the JSON body

    Body content type application/JSON, Body input method JSON string, then paste the JSON below. {{1.phone}} and {{1.name}} are fields from module 1: delete them and insert your own from the mapping panel. Optionally add deviceId (several phones), simSubscriptionId (dual-SIM phone) or scheduledAt (send later, ISO 8601 time).

    Body content (JSON string)
    {
      "recipients": ["{{1.phone}}"],
      "message": "Hi {{1.name}}, we got your request. Reply to this number if you have questions."
    }
  4. Stop on errors

    Set Parse response to Yes. In Advanced settings turn on Return error if HTTP request fails, so a 401, 400 or 429 stops the scenario and shows up in the history.

  5. Test with your own number

    Put your own number in for the test and click Run once. A 200 response with a data field means the message is queued. The status (sent, delivered) shows up in the smsportal dashboard.

How to receive a customer reply in Make

When the phone receives an SMS, smsportal POSTs JSON to your webhook URL. Make splits the JSON into mappable fields: sender (the number), message (the text), receivedAt and webhookEvent. Every request carries an X-Signature header: a hex HMAC-SHA256 of the raw body, keyed with your signing secret.

  1. Create a new scenario with a Webhooks → Custom webhook trigger. Next to the Webhook field click **Add**, enter a Webhook name, click **Save** and copy the generated URL.
  2. In the smsportal dashboard open Webhooks → Create Webhook, paste the URL, enter a signing secret (at least 20 characters) and tick MESSAGE_RECEIVED.
  3. Click Run once and text your phone from another number. Make detects the fields so you can map them, for example SMS from {{1.sender}}: {{1.message}}. When you later add fields or events, click **Detect new values** in the module and send another text.
  4. Activate the scenario. The webhook starts it as soon as each SMS arrives, and Make's default response (200 Accepted) is enough, so you do not need a Webhook response module.
  5. To verify the signature, turn on Get request headers and JSON pass-through in the webhook's Advanced settings. The sha256 function with your secret as the key and hex encoding hashes the raw body; compare it with the x-signature header in a filter, then extract the fields with JSON → Parse JSON.
Example MESSAGE_RECEIVED body
{
  "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 form submission gets a confirmation text

    Typeform → Watch Responses or Google Forms → Watch Responses starts the scenario and HTTP Make a request texts the number from the form. Make the phone field collect the country code, or the API rejects the recipient.

  • Customer replies land in a sheet or CRM

    Custom webhook on MESSAGE_RECEIVED, then Google Sheets → Add a Row with sender, message and receivedAt columns. Instead of a sheet you can search your CRM for the sender number and add the text as a note.

  • A daily send from a sheet in one request

    A daily schedule, Google Sheets → Search Rows picks today's rows, an Array aggregator collects them into a list, and one HTTP module sends it to https://smsportal.app/api/v1/gateway/send-bulk-sms as messages (each item has its own recipients and message). One request uses one credit instead of one per row.

Errors and fixes

The HTTP module returns 401
Cause: The key went into an Authorization header instead of x-api-key, has a prefix in front of it, or is wrong.
Fix: In Credentials set API key parameter name to x-api-key and put the bare key from the dashboard in Key. Check for leading or trailing spaces.
400 on some messages only
Cause: The mapped text contains a double quote or a line break, and JSON string mode does not escape them, so the JSON is invalid.
Fix: Switch Body input method to Data structure: recipients as an array of text, message as text. Make escapes special characters for you.
400 on every send
Cause: No enabled phone on the account, an unverified email, or recipients is not a list.
Fix: Check in the dashboard that a phone is enabled and your email is verified. recipients must look like ["+14155550123"].
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 stopped taking texts
Cause: The scenario is inactive, or the webhook was not attached to any scenario for over 5 days and Make now returns 410 Gone. smsportal stops retrying after 3 attempts that get a 4xx, and pauses a subscription that keeps failing.
Fix: Attach the webhook to a scenario and activate it. Then check the subscription under Webhooks in the smsportal dashboard.
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.

Frequently asked questions

Is there a native smsportal app in Make?

No. Two built-in Make apps are enough: HTTP (the Make a request module) to send and Webhooks (Custom webhook) to receive replies.

How many Make credits does one SMS use?

Make bills in credits (operations until August 2025). For non-AI apps one module run is one credit, so a scenario with a trigger and an HTTP module usually uses two credits per message. smsportal does not charge per message: your SIM plan pays the carrier.

How many texts can Make send at once?

Make 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 Make know the SMS was delivered?

The HTTP module 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 Custom webhook.

Can I use this for marketing campaigns?

No. From a SIM card, send messages the customer expects: confirmations, reminders, replies. Bulk campaigns belong with an SMS provider that sends under a sender name.

Sources

  1. Make: HTTP (Make a request)
  2. Make: API key authentication type
  3. Make: Webhooks (Custom webhook)
  4. Make: Webhooks, queue and limits
  5. Make: Credits
  6. smsportal API documentation

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.