Three times in the last month I wanted to send myself an SMS from a script and the answer involved Twilio. Three times I bounced off the same things.
First, Twilio's minimum is $0.0079 per SMS in the US and you pay setup costs that dwarf the per-message price for low-volume use. Second, US 10DLC registration is now mandatory and the verification flow takes days. Third, my account got auto-suspended once for sending three test messages back-to-back from a new number.
For a small-team alerting setup, that is too much friction. PagerDuty starts at $19/user/month. Opsgenie at $9. Both overkill if all you want is "send an SMS to my own phone when the build fails."
What actually worked was a cheap Android phone with a SIM card in a drawer, an API key, and one curl call.
This is the cloud-SMS-forwarder approach. I built SMS Sender 24 because it scratched my own itch, and this article walks through using it (or the open-source equivalents) to trigger SMS from a webhook in 30 seconds.
Three scenarios where this actually helps
Deploy failed at 11 PM. GitHub Actions detects the failure, posts to Slack, but Slack notifications get muted on the on-call phone after hours. Slack is fine for context, not great as the wake-up channel. An SMS cuts through Do Not Disturb without the full critical-alert entitlement song and dance.
Payment of $X received in Stripe. You want to know without checking the dashboard every time. Email works, but at high volume your eyes glaze over. An SMS for transactions above a threshold (say $500) brings the relevant ones to the surface.
Uptime Kuma says the database is down at 4 AM. Push notifications from one more app on your phone get lost. SMS lands in the same inbox as your bank and your boss, which is why it gets read.
The common pattern: you already have the trigger source (CI, payments, monitoring). You already have the destination (your own phone). The annoying middle piece is "get this string to that SIM card without a $500/year contract."
Why Twilio is overkill for this
Twilio is built for sending tens of thousands of SMS per month with regulatory compliance, deliverability guarantees, and global routing. For that use case it is the right answer.
For "send myself 5 SMS per day from internal scripts" it is the wrong answer:
- Per-message floor pricing that does not amortize for low volume.
- A2P 10DLC registration for US numbers, which now takes days to process and requires a registered business entity.
- Account verification friction if you signed up with a personal email or used a VoIP number for SMS receiving.
- Random auto-suspensions because the abuse-detection model is tuned for high-volume senders, and your 5 messages from a new number look anomalous.
You can work around all of this. You should not have to.
The alternative: an Android phone with a SIM
Strip the problem down. SMS over the GSM network is sent by a SIM card. If you have a SIM card you can put it in a phone. If the phone is Android you can put a small app on it that pushes the SMS for you when you POST to an endpoint.
The Android phone is the gateway. The SIM is the credential. Your script is the trigger. Total moving parts: 3.
I do not care which cloud forwarder you use, this pattern works with several open-source projects too (SMS2Tg, SMS Forwarder by Spirit532, custom Tasker setups). For the walk-through below I will use the one I built, but the architecture is the same.
Walk-through: pair, get API key, curl
Step 1: register and pair an Android transmitter.
Sign up at smssender24.com on the Free plan. Install the Android app on a phone with the SIM you want to send from (an old phone works, Android 8.0 minimum). In the web dashboard, click "add device", scan the QR code with the Android app. The phone is now your sender gateway.
Step 2: get an API key.
In the dashboard, go to API keys, generate one. Copy it. It looks like a long hex string. Treat it like a password.
Step 3: send an SMS with curl.
curl -X POST https://smssender24.com/api/outgoing-sms \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipient": "+15551234567",
"message": "Deploy failed: builds/2348 (commit abc123, exit code 1)"
}'
The backend wakes the paired Android via FCM. The Android sends the SMS through the SIM. Total latency from curl to phone vibrating: under 10 seconds typical, sometimes 30 if the Android was deep-sleeping.
If you have multiple transmitters paired and want to pick a specific one, add "apiKeyId": <id>. Omit it and the backend uses whichever transmitter is online.
That's it. The other 27 minutes of setup are picking which webhooks to wire up.
Webhook recipes
GitHub Actions on failure. Add a step to your workflow:
- name: SMS me on failure
if: failure()
run: |
curl -X POST https://smssender24.com/api/outgoing-sms \
-H "X-API-Key: ${{ secrets.SMSAPI }}" \
-H "Content-Type: application/json" \
-d "{\"recipient\":\"+15551234567\",\"message\":\"CI failed: ${{ github.repository }} @ ${{ github.sha }}\"}"
Stripe payment_intent.succeeded over a threshold.
@app.post("/stripe/webhook")
def stripe_webhook(payload: dict):
if payload["type"] == "payment_intent.succeeded":
amount_cents = payload["data"]["object"]["amount"]
if amount_cents >= 50000: # $500 and up
requests.post(
"https://smssender24.com/api/outgoing-sms",
headers={"X-API-Key": API_KEY},
json={"recipient": "+15551234567",
"message": f"Big payment: ${amount_cents/100:.0f}"},
)
return "ok"
Sentry critical issue. Sentry alerts can hit a webhook. Point that webhook at a small Cloudflare Worker that POSTs to outgoing-sms. The Worker is 20 lines.
Uptime Kuma down-alert. Uptime Kuma natively supports custom webhooks. Configure one to POST to the API with the down URL in the SMS body.
The pattern is always the same: source webhook fires, your tiny adapter formats the SMS body, curl to outgoing-sms. The adapter exists because most webhooks send rich JSON and you want to flatten it to one line.
Honest pricing comparison
This matters most for international numbers, where Twilio gets expensive fast.
| Channel | Cost per SMS (US) | Cost per SMS (EU) | Setup friction |
|---|---|---|---|
| Twilio | $0.0079 | varies, ~€0.04 to €0.06 | A2P 10DLC, business verification |
| SMS Sender 24 Free | €0 (up to 300/mo) | included | sign up, pair phone, done |
| SMS Sender 24 Pro | €9/mo flat, unlimited SMS | included | same |
| Open-source APK + your bot | €0 software | + your time | manage Android, write router |
(SMS-per-message cost on this approach is whatever your SIM's own tariff is — many prepaid SIMs bundle hundreds of SMS for a few euros, or include them free. The table prices the platform, not the carrier.)
If you are sending 50 SMS a month to your own phone from internal scripts, you are well inside the Free tier. The math only flips toward Twilio when you need real deliverability guarantees or high-volume global routing.
Where this is weaker than Twilio
I want to be honest, because the audience for this article is people who know their infrastructure choices.
You depend on a SIM card. Twilio gives you a virtual long code or short code with deliverability guarantees. A SIM card can run out of money, get blocked by the carrier for spam patterns, or just die. Have a process for monitoring it.
No phone number routing. Twilio can pick the best route per destination country. With one Android and one SIM, you send from one country.
Compliance. If you are sending marketing SMS to customers, you need 10DLC, consent records, opt-out handling, and an actual SMS-marketing platform. This article is about internal alerts to your own phone. Do not use it to spam customers, that is a different problem and the cheap solution is the wrong solution.
Volume ceiling. SIM cards have practical limits before the carrier flags them. If you are sending more than a few hundred SMS per day, this is the wrong tool.
What I would build next
If I were rebuilding this from scratch I would add idempotency keys to outgoing-sms so retried webhook deliveries do not double-send the SMS. I have not done this yet because nobody has hit the bug in practice, but it is on my list.
Launch offer
If you read this far and the webhook-to-SMS pattern fits something you actually want to wire up, here is the launch deal: take a 5-question survey and get 6 months of Pro free, no card. Pro is unlimited SMS (Free is 300/mo), 5 transmitters, and 90 days of history. The trade is honest — I need real feedback more than I need your money right now, so 5 minutes of your time buys 6 months of the paid tier.
Details: smssender24.com/launch-promo.html. The survey button appears in the dashboard right after signup, and Pro unlocks instantly when you submit. The Free plan is enough for personal alerting if the survey is not your thing.
If you give it a try, my support email is at support@smssender24.com and I read everything. The most useful feedback is "I tried to wire this up to X and got stuck at Y". That is the data I cannot get from analytics.
Originally published at https://smssender24.com/en/
Top comments (0)