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 MessageStatus values map as:

    Twilio Sendoka event
    queued message.sent (on enqueue for scheduled)
    sent message.sent
    delivered message.delivered
    failed message.failed
    undelivered message.failed
    received inbound.sms
  • Opt-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 /sms with 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

  1. Provision 10DLC with AWS.
  2. Point a portion of traffic at Sendoka; keep Twilio as fallback.
  3. Watch delivery rates side-by-side for 2 weeks.
  4. Migrate inbound webhooks.
  5. 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.