Twilio is the one I know, and it's the one I'd use. It isn't amazing, but it works: the console is better than AWS's, and getting a number approved is quicker.
For alerting it has the one feature that matters. A call can say "smoke detected at the north warehouse, press 1 to acknowledge", and Twilio posts the keypress back to your code. Nothing else counts as "someone knows". AWS's own voice service can't do that without adding Amazon Connect, a call-centre product.
Twilio gives you the channels, not the process. Who to call first, how long to wait, who's next, and how fifty events from one fire become one incident: that's your code (a queue, a function and an EventBridge Scheduler timer per step), or PagerDuty's job if the people being called are the client's own on-call team.
Use it when
- Alert calls that must be acknowledged: the call says what happened, asks to press 1 (
), and posts the keypress back to your code. - Calling or texting people who aren't seats on a paging service: site managers, residents' families, the client's customers.
- Two-way SMS: a reply such as ACK reaches your code on the same number.
Don't use it when
- The client's own on-call team, with rotas: escalation, schedules and duplicate merging come ready-made in PagerDuty. With Twilio you write them.
Pricing
Australia (USD): SMS $0.0515 per segment, calls to mobiles $0.075 a minute, answering-machine detection $0.0075 a call. An Australian mobile number costs about $8.25 a month (one of Twilio's pricing pages says $20: check the console). Pay as you go. An alerting month of 20 alarms and 4 drills (72 one-minute calls, 120 SMS) is about $20.
In my words: what hurts
- Not a delightful product, just a dependable one.
Gotchas, with fixes
Gotcha: Since 1 July 2026, a branded sender name (an alphanumeric sender ID) to Australian phones must be on the ACMA register, or the message shows as "Unverified" next to possible scams.
Fix: Send alerts from an Australian mobile number: numeric senders aren't affected, and recipients can reply. Register a name only if the client wants one.
Gotcha: An Australian number needs a regulatory bundle (business and address details), reviewed in up to three business days, sometimes longer.
Fix: Buy the numbers in the first week of the project, not the week before go-live.
Gotcha: A trial account only calls and texts verified numbers, and expires after 30 days.
Fix: Upgrade before testing real escalation chains.
Gotcha: A call that reaches voicemail reports as answered.
Fix: Count only a keypress as an acknowledgement, and turn on answering-machine detection to move on to the next person sooner.
Gotcha: Anyone who finds your webhook URL can post fake call results to it.
Fix: Validate the X-Twilio-Signature header on every webhook.
Provisioning
Pulumi via a Terraform provider · Official Terraform provider
The twilio/twilio Terraform provider, still 0.x. Buying numbers and the regulatory bundle are console steps; keep call logic (TwiML) in code.
Instead, consider
- PagerDuty The people called are the client's own team, with rotas and escalation.
- AWS End User Messaging SMS only, and everything must stay on the AWS bill.
Worked examples
Where it fits
- Alerts that must wake someone up: Pick 05.
When the people called aren't paging seats: a call that asks to press 1, with escalation in your code (an EventBridge Scheduler timer per step).
Sources
- Twilio: <Gather> (keypress and speech)
- Twilio: answering-machine detection
- Twilio: SMS pricing, Australia
- Twilio: voice pricing, Australia
- Twilio: regulatory bundles
- Twilio: API SLA
- ACMA: unregistered branded SMS labelled Unverified from 1 July 2026
Last reviewed by Nicolas Dao