SMS notifications for Shopify without an app: Shopify Flow or Make with the TopSMS API
There is no TopSMS app for Shopify. Here is the honest route to SMS order notifications: Shopify Flow or Make calling the TopSMS API, with example payloads.
Let us start with what does not exist: there is no TopSMS app in the Shopify App Store, and we are not going to pretend otherwise. What does exist is a REST API that sends an SMS with one HTTP request, and two tools that can make that request whenever something happens in your shop: Shopify’s own automation tool Flow, and the integration platform Make, for which TopSMS has an official app. This guide shows both routes with example payloads, explains which one suits which shop, and lists the details that decide whether notifications arrive once, on time and in one segment.
Which route fits your shop
| Shopify Flow → TopSMS API | Make → TopSMS app | |
|---|---|---|
| Shopify plan | The “Send HTTP request” action is only available on the Plus, Advanced and Grow plans | Works with any plan that allows connecting apps |
| Extra cost | None besides the SMS | A Make subscription, depending on the number of operations |
| Setup | JSON and a little Liquid | Point and click, no code |
| Delivery reports | Visible in the TopSMS dashboard, or via webhook to your own server | The TopSMS app has a trigger for delivery reports, so a scenario can react to failed messages |
| Best for | Shops on a qualifying plan that want everything inside Shopify | Smaller plans, or shops that already automate other things with Make |
Before you start: phone numbers and the API key
- Collect the phone number. In the checkout settings you decide whether the phone number is hidden, optional or required. For shipping notifications, the phone number of the shipping address is the most reliable field, because carriers ask for it as well.
- International format. The TopSMS API expects numbers in international format such as +4915112345678. It also accepts 0049…, but a German number without a country code cannot be assigned to a country reliably. Shopify usually stores numbers in international format; check a few real orders.
- API key. In the TopSMS dashboard under API access, create a key (client ID and secret). Start with a test key: it returns the same responses and the price, simulates delivery reports and sends nothing.
- Sender name. Up to 11 letters and digits, approved for your account; German and Austrian networks deliver it without registration.
Route 1: Shopify Flow with “Send HTTP request”
Flow workflows consist of a trigger, optional conditions and actions. For order notifications the useful triggers are Order paid (confirmation), Fulfillment created (shipping notice with tracking number) and Order canceled. Then add the action Send HTTP request:
- HTTP method:
POST, URL:https://www.topsms.cz/api/sms/send. - Store the API key as a secret in Flow → Settings (for example with the handle
topsms_keyand the valueCLIENT_ID:SECRET). Flow never shows secret values in the interface and redacts them from the run logs. - Headers and body as below. Insert variables through Flow’s variable picker; the paths in the example are illustrative and the picker shows the ones available for your trigger.
Authorization: Bearer {{secrets.topsms_key}}
Content-Type: application/json
Idempotency-Key: order-paid-{{order.id}}{
"to": "{{order.phone}}",
"text": "MyShop: Thank you {{order.customer.firstName}}, order {{order.name}} is confirmed. We will text you when it ships.",
"from": "MyShop"
}A successful call returns HTTP 200 with the number of charged segments and the price (in CZK, the currency of the credit):
{
"ok": true,
"id": "cmp7a1b2c3...",
"to": "+4915112345678",
"from": "MyShop",
"smsCount": 1,
"price": 2.04,
"status": "sent"
}Why the Idempotency-Key matters here
Flow can be configured to retry a request for up to 24 hours when it receives a 4xx or 5xx response, and it also retries when the server does not answer within 30 seconds. Without protection, a timeout after a successful send would result in a second SMS. With an Idempotency-Key header that is unique per order and event, the repeated request returns the original response with Idempotent-Replayed: true and nothing is sent twice. The key is valid for 24 hours, which matches Flow’s retry window.
Set the error handling deliberately. A 400 response (for example an invalid or blacklisted number) will not fix itself, so “Ignore” or “Fail” is right for client errors; “Retry” makes sense for 5xx and 429. A 402 means your credit has run out: top up, and keep an eye on the balance with GET /api/credit.
The shipping notice
For the shipping SMS use the Fulfillment created trigger and take the tracking number from the fulfillment’s tracking information. Use a different idempotency key, for example fulfillment-{{fulfillment.id}}, so that partial shipments each get their own message. Keep the text short: a tracking number is often 20 characters, and a full carrier URL can be 80.
Route 2: Make with the official TopSMS app
If your plan does not include the HTTP action in Flow, or you prefer not to write JSON, use Make. The official TopSMS app for Make has modules for sending, bulk sending, message status and credit, plus a trigger for delivery reports.
- Create a scenario with the Shopify app as the trigger, for example a module that watches new orders, or a webhook that Shopify calls for the event you need.
- Optionally add a filter, for example “only if a phone number is present” and “only orders shipped to Germany or Austria”.
- Add the TopSMS module Send an SMS, connect it with your API key, map the phone number and compose the text from the order fields.
- Run the scenario once with a test key and a test order, then switch to the live key.
Make handles the JSON encoding for you, so names with quotation marks or line breaks cannot break the request. With the delivery-report trigger a second scenario can, for example, tag an order or notify your team when a message has status failed.
Many messages at once
If you collect shipping notices and send them in a batch, for example after the daily pickup by the carrier, use the bulk endpoint. It takes up to 500 recipients per request, each with its own text:
POST https://www.topsms.cz/api/sms/send-bulk
{
"messages": [
{ "to": "+4915112345678", "text": "MyShop: Order #1024 has shipped. Tracking: 00340434161094042557" },
{ "to": "+436641234567", "text": "MyShop: Order #1025 has shipped. Tracking: 00340434161094042558" }
],
"from": "MyShop"
}Each recipient gets its own result in the response. Above 50 recipients the request is processed asynchronously and returns a jobId whose progress you can query.
Templates and costs
Keep every text under 160 characters of the GSM-7 alphabet, including the filled-in values. German umlauts and ß are fine; emoji, typographic quotes and en dashes switch the message to Unicode with 70 characters per segment. Some proven texts:
MyShop: Thank you Anna, order #1024 is confirmed. We will text you when it ships.MyShop: Order #1024 has shipped. Tracking: 00340434161094042557MyShop: Order #1024 has been cancelled. Questions? help@myshop.de
An SMS to German and Austrian numbers costs €0.084 per segment with TopSMS, no monthly fee and no charge for the API. Rejected messages are not charged. Order notices are transactional and need no marketing consent, but they must not contain advertising; details are in our article on SMS and GDPR in Germany.
/api/sms/send, bulk sending, the Idempotency-Key and webhooks; the integrations page lists the Make app and all plugins.