Migrating from Twilio

Moving off Twilio chat, concept by concept

Twilio replaced Programmable Chat with Conversations. If you are rebuilding anyway, or you only used it for in-app chat, GravEx Chat is a free place to land. If you rely on SMS or WhatsApp, stay on Conversations.

Twilio facts are from its changelog entries dated 2021-01-25 and 2025-05-19, its migration guide and its Conversations API pricing page, checked 2026-11-03. Confirm what applies to your account with Twilio.

// 01

What happened to Programmable Chat

  • On 2021-01-25 Twilio announced that it would sunset the Programmable Chat API on 2022-07-25 and pointed customers to the Conversations API.
  • Programmable Chat in Flex has its own end-of-life date, 2026-06-01, in a changelog entry of 2025-05-19. After that date Twilio says it may stop working as expected and gets no enhancements, bug fixes or security updates. Flex customers are sent to Flex Conversations.
  • In the migration guide, Chat Services, Channels and Members become Conversation Services, Conversations and Participants, and existing data is made available in Conversations with no data migration.

So the official path is Conversations. It is the right answer if one conversation mixes chat with SMS, WhatsApp or other channels. If it is only in-app chat, you can leave Twilio instead.

// 02

Stay on Conversations, or move?

IfChoose
One conversation mixes chat with SMS or WhatsAppTwilio Conversations. GravEx Chat has no phone channels.
You use the native iOS or Android Twilio SDKs and cannot rewrite the clientsTwilio Conversations. GravEx Chat has no official native SDKs.
It is in-app chat in a web product and the bill mattersGravEx Chat.
You need a contractual SLA or compliance certificationsTwilio or another large vendor. GravEx Chat has neither.

For scale, Conversations lists the first 200 monthly active users free, then $0.05 per active user per month for 201 to 5,000, $0.0475 for 5,001 to 10,000 and $0.045 for 10,001 to 20,000, plus channel fees and media storage from $0.25 per GB per month. Read as marginal tiers, 5,000 active users is about $240 a month before those extras (4,800 times $0.05). GravEx Chat has no paid plan.

// 03

Concept map

TwilioGravEx Chat
Chat Service, Conversation ServiceAn app. One app is one tenant with its own keys: pk_ for the browser and sk_ for your server.
Channel, ConversationA room. Types are public, private, channel (anyone reads, only owner and admin write) and dm. Your backend creates rooms with rooms.ensure.
Member, ParticipantA room member, added with members.add. A member can have the admin role.
Identity and access tokenA user id and a JWT that your backend signs with chat.token({ userId, name }). It is HS256 and valid for at most 24 hours.
Message and mediaA message with text, attachments as URLs (you store the files), replyTo for quotes and threadId for threads.
WebhooksSigned webhooks (message.created, message.deleted, reaction events and more), delivered at least once, plus a synchronous before_publish hook that can deny or rewrite a message.
Typing and read stateroom.typing(), room.markRead(seq) and chat.unread().
Push notificationsNot built in. Receive message.created and send through FCM, web push or email from your own server.
Client SDKs@kispi/chat for browsers and Node. For other languages, implement the REST and WebSocket protocol.

// 04

Migration steps

  1. Create an app in the console and put pk_ and sk_ in your environment variables. Or have your AI tool do it with an account key, as the Start with AI guide describes.
  2. Replace the Twilio token endpoint with one that calls chat.token(). It signs locally and makes no network call.
  3. Create rooms from your backend where you used to create channels or conversations. Use a stable ASCII key such as order-1234 so roomByKey can find the room again.
  4. Swap the client. createChatClient replaces the Twilio client, room.subscribe() loads the latest 100 messages, and room.on('messages', ...) hands you the whole list on every change.
  5. Move the webhooks. Verify the signature with chat.webhooks.verify and map your handlers to message.created and the other events.
  6. Run both for a while. Ship the new chat behind a flag to a share of users before you switch everyone.

// 05

History: what carries over

  • There is no importer. Read conversations and messages from Twilio's API and replay them through the GravEx REST API: PUT /v1/rooms to create rooms and POST /v1/rooms/{roomId}/messages to add messages. Use the Twilio message SID as clientMessageId so a failed run can be repeated without duplicates.
  • The send route takes no timestamp, so imported messages carry the time of import. Put the original time in appMeta, or keep the Twilio history as an archive and start the new rooms empty.
  • Check your app's Limits tab before a bulk import. The default publish rate is 5 per second per user, and limits can be raised on request.

// FAQ

Questions

Is Twilio Programmable Chat still available?
Twilio announced in January 2021 that it would sunset the API on 2022-07-25 in favor of Conversations, and set 2026-06-01 as the end of life for Programmable Chat in Flex. Check Twilio's current notices for your account. For new work, Twilio points to Conversations.
Is there an importer for Twilio data?
No. History moves through the REST API, as described above.
Can I keep SMS or WhatsApp?
Not with GravEx Chat, which has no phone channels. Keep Twilio for those channels.
What about my iOS and Android apps?
There are no official native SDKs. The REST API and the WebSocket protocol are public, and the real-time protocol guide has a checklist for building a client without the SDK. Token issuing on your backend stays the same.

Keep reading

Sources