Migrate from Twilio
For teams coming from Twilio SMS. Sendoka wraps AWS SNS for SMS, so pricing and carrier behavior differ from Twilio's direct-to-carrier model. Read this before you cut over.
Field mapping
| Twilio | Sendoka |
|---|---|
POST /2010-04-01/Accounts/{sid}/Messages.json |
POST /api/v1/sms |
From: "+1555..." |
from: "+1555..." |
To: "+1555..." |
to: "+1555..." |
Body: "..." |
body: "..." |
MediaUrl: "..." (MMS) |
media: ["https://..."] (array) |
MessagingServiceSid |
from_pool: "pool_..." (Sendoka pool id) |
StatusCallback: "..." |
Configure webhook endpoint once; events fire for every message |
account_sid + auth_token (Basic auth) |
Authorization: Bearer sok_live_... |
Code diff
// Twilio
import Twilio from "twilio";
const client = Twilio(process.env.TWILIO_SID, process.env.TWILIO_TOKEN);
await client.messages.create({
from: "+15551234567",
to: "+15557654321",
body: "Hi",
});
// Sendoka — plain HTTP
await fetch("https://api.sendoka.com/api/v1/sms", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SENDOKA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "+15551234567",
to: "+15557654321",
body: "Hi",
}),
});
What's different
Single channel per key. Your Sendoka key sends both email and SMS — no "Messaging Service" abstraction.
Webhooks are one endpoint per org/tenant, not per-message. Configure once in the dashboard, every message fires events to it.
Event names are different. Twilio's
MessageStatusvalues map as:Twilio Sendoka event queuedmessage.sent(on enqueue for scheduled)sentmessage.sentdeliveredmessage.deliveredfailedmessage.failedundeliveredmessage.failedreceivedinbound.smsOpt-out keywords are handled by SNS. STOP/UNSUBSCRIBE auto-suppresses, tracked in Sendoka's suppression list.
No TwiML. SMS is plain text + optional MMS URLs.
Short codes & toll-free
- 10DLC registration — Sendoka pools support US 10DLC with registration via AWS. Open a ticket to provision; carriers require the same brand/campaign proof as Twilio.
- Toll-free verification — AWS-managed; slower than Twilio's portal (2–3 weeks vs. days).
- Short codes — not natively supported by SNS; use a pool of 10DLC numbers instead.
What you gain
- Email on the same key. One dashboard, one billing account, one suppression list.
- Platform mode. Isolate your customers as tenants.
- Idempotency by header instead of request-level dedup you DIY.
What you might lose
- Verify API. Sendoka doesn't have a native OTP/verify product. Build on top of
/smswith your own code store, or keep Twilio Verify side-by-side. - Programmable Voice / Video / Conversations. Not in scope. SMS-only.
- Carrier-level tooling. Twilio exposes more carrier metadata (MNO, porting status); SNS exposes less.
Cutover strategy
- Provision 10DLC with AWS.
- Point a portion of traffic at Sendoka; keep Twilio as fallback.
- Watch delivery rates side-by-side for 2 weeks.
- Migrate inbound webhooks.
- Decommission Twilio.
Gotchas
- SNS cost model differs — per-message cost varies by destination country. Check AWS SNS SMS pricing.
- Delivery receipts require SNS topic wiring. Sendoka handles this in onboarding; verify in
/overview/domains→ SMS status. - Rate limits are per-key, not per-number. A 600/min Pro key is 600/min total across all pool numbers.