Twilio SMS inside Notifly workflows, on your own account.
Notifly does not resell SMS. You connect your Twilio account with its Account SID and Auth token, and the SMS steps of your Notifly workflows are sent through it: your numbers, your Twilio logs, your Twilio bill.
Notifly adds the rest: one trigger for SMS, email, in-app, push and chat; digest, delay and throttle steps so a user is not texted twice for the same thing; subscriber preferences checked before each send; and an activity feed that records what Twilio answered.
What you need from Twilio
These are the fields the dashboard asks for when you connect Twilio, quoted from the create form.
| Field | Required | Stored | Notes |
|---|---|---|---|
| Account SID | Required | As entered | |
| Auth token | Required | Encrypted at rest | |
| Data residency region | Optional | As entered | Select EU if your Twilio account uses EU data residency (IE1). Use region-specific credentials. US (default) or EU (Ireland); US (default) is preselected. |
| From | Required | As entered |
- Data residency region. EU (Ireland) sends through Twilio's ie1 region via the dublin edge; US (default) uses Twilio's default endpoint.
- From. The sender of every SMS from this integration. A trigger can set another one with
overrides.providers.twilio.from.
Connect Twilio in the dashboard
- Sign in at app.notifly.io, open Integration Store in the sidebar and choose Connect Provider.
- In the Connect Integration sheet, open the SMS tab (or search across channels), find Twilio and choose Connect.
- Pick the environment the integration belongs to. Development and Production keep separate integrations, so you can point each at a different Twilio account or key.
- Fill in Delivery Provider Credentials with the fields in the table above, then choose Create Integration.
- A new integration starts switched on as both Active Integration and Primary Integration, so SMS steps in that environment send through Twilio by default. If the environment already has a primary SMS integration, the dashboard asks before replacing it.
Trigger a Twilio SMS from your code
Your backend triggers a workflow; Notifly renders the SMS step and sends it with Twilio. The phone number in to is saved on the subscriber, so later triggers only need the subscriberId.
// npm install @notiflyio/api@0.1.26
import { Notifly } from "@notiflyio/api";
const notifly = new Notifly({ security: { secretKey: process.env.NOTIFLY_SECRET_KEY } });
await notifly.trigger({
workflowId: "login-code",
to: { subscriberId: "user_123", phone: "+15551234567" },
payload: { code: "482913" },
overrides: {
// Merged into the options of Twilio's messages.create for this send.
providers: { twilio: { validityPeriod: 300 } },
},
});Prefer plain HTTP? The same trigger is POST https://api.notifly.io/v1/events/trigger with an Authorization: ApiKey header and a body of { "name", "to", "payload" }.
Twilio SMS and EU data residency
An SMS leaves two records, held by two different parties. Which one you must keep in the EU decides whether this setup is enough.
- At Twilio. Choose EU (Ireland) and Notifly sends through Twilio's ie1 region. For SMS sent through the Programmable Messaging API in IE1, Twilio states that messages are processed and stored exclusively in IE1 up to the point they reach its connections with telecom providers. Twilio lists exceptions: its subprocessors, carrier routing that can span regions, and support access from outside the EU. Create the Twilio credentials for that region, and check Twilio's Regions documentation for what your products support.
- At Notifly. Notifly keeps its own records of each send: the recipient phone number, your trigger payload and Twilio's response, shown in the activity feed. They expire after a fixed retention period. Notifly runs as one hosted deployment with no region choice today, so those records are not EU-only. If strict EU storage of message data is a requirement, contact us before you rely on Notifly for it.
What reaches Twilio
- One messages.create call per SMS. With the rendered body, the subscriber's phone as
toand your From number. - Your Twilio options. Anything under
overrides.providers.twiliois merged into that call, such asstatusCallbackorvalidityPeriod. - A SID you can join on. The Message SID Twilio returns is stored on the Notifly message.
- No phone, no call. A subscriber without a phone number is skipped and recorded, not sent to Twilio.
What Notifly adds on top of Twilio
Workflows around the send
One trigger runs a workflow: this provider’s step can sit beside in-app, email, SMS, push and chat steps, behind digest, delay and throttle steps.
Digest notifications →Subscriber preferences, enforced at send
Before each step runs, the subscriber’s workflow and channel preferences are checked; an opted-out step is skipped and the reason is recorded.
An in-app Inbox next to it
The same workflow can write to the Notifly Inbox, a real-time in-app feed you embed with the React component or the JavaScript SDK.
React notification inbox →Per-trigger provider parameters
Anything the trigger passes under overrides.providers.<provider id> is merged into the request Notifly sends to the provider, per workflow or per step.
Activity you can debug
Every message gets execution details in the activity feed, including the response or error the provider returned.
Secrets encrypted at rest
API keys, tokens and service accounts are stored encrypted with AES-256; new and re-saved credentials use authenticated AES-256-GCM. The table above marks which of this provider’s fields that covers.
Several accounts, one primary
Connect more than one account on this channel. The primary integration is the default; another active integration takes the send when its conditions match the subscriber or the tenant in the trigger’s context.
Go deeper in the docs
Frequently asked questions
Which messaging providers support EU-only data residency for SMS logs and message content?
Twilio does, for SMS sent through its Programmable Messaging API in the Ireland (IE1) region: Twilio says those messages are processed and stored exclusively in IE1 up to the point they reach its connections with telecom providers, with caveats for subprocessors, carrier routing and support access. Notifly can send through that region, but its own records of each send (phone number, trigger payload, Twilio response) expire after a fixed retention period and are not EU-only, because Notifly has no region choice today.
Does Notifly support Twilio's EU (Ireland) region?
Yes. Set Data residency region to EU (Ireland) and Notifly creates the Twilio client on the ie1 region through the dublin edge. As the form says, use credentials created for that region. US (default) leaves the client on Twilio's default endpoint; no other region value is accepted.
Which Twilio credentials does Notifly need?
Your Account SID, your Auth token and a From number from your own Twilio account. The Auth token is stored encrypted at rest; the Account SID is stored as entered. Every SMS step in that environment is then sent by your account, on your Twilio pricing.
Can I pass other Twilio message options?
Yes. Anything under overrides.providers.twilio is merged into the options Notifly passes to Twilio's messages.create, in the camelCase the Twilio library expects: for example statusCallback for your own status webhook, or validityPeriod to drop stale codes. overrides.steps.<stepId>.providers.twilio targets one SMS step.
How do I match a Notifly SMS to Twilio's message logs?
Notifly stores the Message SID Twilio returns as the message's provider id and records Twilio's response in the step's activity entry, so a Notifly message and a Twilio log line share the same SID. A refused send records Twilio's error there instead.
Bring your provider account. Keep your sender reputation.
One POST /v1/events/trigger — email, SMS, push, in-app, and chat. 10,000 events a month, free.