Step 1: Connect your number
- In WhatsApp Manager, check the WABA for other numbers, templates, or assets you still need.
- Remove the phone number from the WABA.
- In Meta Business Settings, open Accounts → WhatsApp accounts.
- If the old WABA sits in your Business Portfolio, remove it.
- Wait about five minutes.
- In Kapso, start embedded signup. Create a new WABA when the flow asks.
- Recreate your templates on the new WABA (see Step 5). Wait for Meta review.
Testing first? The sandbox replaces Twilio’s
join <code> flow. Create a session for your test phone, then send the 6-character code from WhatsApp. You can then send and receive without a production number.Step 2: Get your phone number IDs
whatsapp:+E164 to phone_number_id.
Two IDs address different things:
Templates belong to the WABA, not to a number, so every number on that WABA can send them. That is why the template endpoints take the WABA ID in the path, as in
POST /{waba_id}/message_templates.
Step 3: Update message sending
For every message type, Kapso uses one endpoint:POST /{phone_number_id}/messages. The type field says which kind of message you are sending, and a field of that same name carries the content. A text message sets type: "text" and puts the body in text.
- Template
- Text
- Media
- Interactive
- Read and typing
Business-initiated sends, outside the 24-hour window. Kapso:Parameters are positional and must match the placeholder order. Named parameters work too. See Simple text templates.
ContentSid becomes the template name, ContentVariables becomes Meta’s components array.Twilio:Step 4: Update webhooks
Kapso posts JSON and expects a200. There is no TwiML, so auto-replies move into your handler or into a workflow.
Register per phone number:
Field mapping
conversation threads the messages for you, but it does not track the 24-hour window. A send can fail with 131047 while conversation.status is active. Read conversation.kapso.last_inbound_at, or handle the rejection and fall back to a template.
from is not always present. WhatsApp can identify a contact with business_scoped_user_id instead. See business-scoped user IDs.
Signature verification
Twilio signs the request URL plus every form field, so verification needs all of them. Twilio’s helper assembles them for you. Kapso signs only the request body. Verification is one HMAC over the bytes you received. Twilio:Delivery behavior
Delivery is at-least-once. Dedupe on
X-Idempotency-Key. See Advanced for buffering and ordering, and Security for verification in Python and Ruby.
Do you parse raw Meta payloads elsewhere? Register the webhook with
"kind": "meta" and Kapso forwards Meta’s exact payload with no reshaping.Step 5: Templates
Twilio needs two calls: create the content, then request WhatsApp approval. Kapso submits on create. Twilio:Multi-tenant setups
Twilio subaccounts become customers, and each customer connects their own number through a setup link instead of you provisioning a sender per subaccount:url. They log in with Facebook and connect in about five minutes. You then get whatsapp.phone_number.created on your project webhook, with the customer.id and phone_number_id. See Onboard customers and Connection detection.
One API key covers every customer, so there is no per-subaccount credential juggling.
Bulk sends
If you loop over recipients yourself, or drive bulk sends from Studio, use broadcasts instead. Create, add recipients with per-recipient template parameters, send, poll:POST /{id}/schedule sends later, POST /{id}/cancel stops one in flight.
Keep your Twilio account for numbers
You do not have to leave Twilio to leave Twilio’s WhatsApp API. Point Kapso at your Twilio credentials and it provisions new numbers into your Twilio account, billed to you. You choose the countries, and each one can keep a pool of reusable pre-verified numbers. This covers provisioning, not the numbers your Twilio WhatsApp senders already use. Those still follow Step 1. This is an Enterprise feature, or a paid add-on on other plans. See Provide local numbers.Feature map
Things Kapso adds:
- An inbox for your team
- CTWA attribution and contact properties
- Automatic voice-note transcription
- An MCP server and a CLI
- Findings, which reads ended conversations with AI and groups the recurring problems
What does not map
- Messaging Services. No sender pools, sticky sender, or geomatch. You send from a specific
phone_number_id. - TwiML. Auto-replies move into your webhook handler or a workflow.
- Link shortening and click tracking.
- Conversation tags. Organize in the inbox UI, not the API.
Cutover
Migrate one number at a time. A number’s WhatsApp registration and webhook routing move as a unit, so there is no gradual split per number.
One thing needs no migration. Meta bills message charges against the WABA on either platform, per delivered template message, at category and market rates. See pricing.

