# Twilio

> Calls and SMS from code, including the call that has to wake someone up. Not amazing, but it works, and approval is quick.

- Verdict: My default
- Vendor: Twilio
- Layer: [Email and messaging](https://cloudlesslabs.com/stack/layers/email/index.md). Job: Phone calls and SMS
- Last reviewed: 24 October 2026, by Nicolas Dao (Cloudless Labs, Sydney)
- Web page: https://cloudlesslabs.com/stack/twilio/. The whole stack in one file: https://cloudlesslabs.com/stack/brief.md

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 (<Gather>), 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](https://cloudlesslabs.com/stack/pagerduty/index.md): The people called are the client's own team, with rotas and escalation.
- [AWS End User Messaging](https://cloudlesslabs.com/stack/aws-end-user-messaging/index.md): SMS only, and everything must stay on the AWS bill.

## Worked examples

- [A fire alarm at 2:14 am](https://cloudlesslabs.com/stack/guides/fire-alarm/index.md): A detector smells smoke at night. How does a person know within a minute?

## Where it fits

- [Alerts that must wake someone up](https://cloudlesslabs.com/stack/use-cases/critical-alerts/index.md): pick 5. 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)](https://www.twilio.com/docs/voice/twiml/gather)
- [Twilio: answering-machine detection](https://www.twilio.com/docs/voice/answering-machine-detection)
- [Twilio: SMS pricing, Australia](https://www.twilio.com/en-us/sms/pricing/au)
- [Twilio: voice pricing, Australia](https://www.twilio.com/en-us/voice/pricing/au)
- [Twilio: regulatory bundles](https://www.twilio.com/docs/phone-numbers/regulatory/getting-started/console-create-new-bundle)
- [Twilio: API SLA](https://www.twilio.com/en-us/legal/service-level-agreement/twilio-apis)
- [ACMA: unregistered branded SMS labelled Unverified from 1 July 2026](https://www.acma.gov.au/articles/2026-05/unregistered-branded-sms-be-labelled-unverified-1-july-acma-warns)

## Related

- [Email and messaging](https://cloudlesslabs.com/stack/layers/email/index.md): every tool in this layer, with its verdict
- [The whole stack in one file](https://cloudlesslabs.com/stack/brief.md): every use case and tool, for questions that span many
- [Map of every Markdown file on cloudlesslabs.com, with what each one answers](https://ask.cloudlesslabs.com)
