Skip to main content
Move your WhatsApp number to Kapso from any Business Solution Provider. Are you on Twilio? Use the Twilio guide instead.

Step 1: Connect your number

  1. In WhatsApp Manager, check the WABA for other numbers, templates, or assets you still need.
  2. Remove the phone number from the WABA.
  3. In Meta Business Settings, open Accounts → WhatsApp accounts.
  4. If the old WABA sits in your Business Portfolio, remove it.
  5. Wait about five minutes.
  6. In Kapso, start embedded signup. Create a new WABA when the flow asks.
  7. Recreate your templates on the new WABA (see Step 5). Wait for Meta review.
The number stops sending after step 2, and it can send templates again once Meta approves them on the new WABA. Plan the migration accordingly. See Connect WhatsApp for the signup flow. If Meta blocks the WABA removal over a pending balance, your old provider may still have a credit line attached to it. Meta Direct Support has to clear that. A different number on a new WABA unblocks you in the meantime. If the reconnect fails, see coexistence troubleshooting. You can also start on a fresh number. Instant setup gives you a pre-verified US number, with no SMS verification step.
Testing first? Build against a sandbox number while your current provider still carries production traffic.

Step 2: Get your phone number IDs

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. Some providers proxy Meta’s Cloud API. If yours did, your payloads already have this shape, and you only change the base URL and the auth header. If your provider had its own message API, use the tabs below as the target shapes.
Free-form messages, inside the 24-hour window:
To reply to a specific message, add "context": { "message_id": "wamid..." }. To address a contact that has no phone number, use recipient with a business-scoped user ID instead of to. See Send text.
The TypeScript SDK wraps all of this, so you do not have to write the envelopes by hand.

Step 4: Update webhooks

Register per phone number:
Payloads carry message, conversation, and phone_number_id, with Kapso’s own fields under message.kapso. The event name arrives in the X-Webhook-Event header. Full shapes in Message events. 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. For connection lifecycle events (a customer finishing a setup link, Meta disabling a WABA), use project webhooks instead. You configure those once for the whole project.
Does your current provider forward raw Meta payloads? Register the webhook with "kind": "meta" and Kapso forwards Meta’s exact payload with no reshaping. Your existing parser keeps working.
Kapso signs the raw request body with HMAC-SHA256 and sends the hex digest in X-Webhook-Signature:
Delivery is at-least-once, retried at 10s, 40s, and 90s. Dedupe on X-Idempotency-Key. See Security for Python and Ruby, and Advanced for buffering and ordering.

Step 5: Templates

Templates belong to the WABA at Meta, not to your provider. If you build templates in WhatsApp Manager, pull them into Kapso from WhatsApp → Templates → Sync from WhatsApp. The path takes the WABA ID, not the phone number ID:
Meta reviews them, usually within 24 hours. See Template lifecycle.

Multi-tenant setups

If you message on behalf of your own customers, each one becomes a Kapso customer that connects its own number through a setup link:
Send your customer the returned 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. One API key covers every customer. Migrate one customer at a time.

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. Meta bills message charges against the WABA either way, per delivered template message. See pricing.

Troubleshooting

Need help