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

Step 1: Connect your number

  1. In WhatsApp Manager, check the WABA for other numbers, templates, or assets you still need.
  2. Turn off two-step verification, under Phone numbers → Settings → Two-step verification, or re-registration will ask for a PIN.
  3. Remove the phone number from the WABA. Leave the WABA itself in your Business Portfolio.
  4. Wait about 10 minutes.
  5. In Kapso, start embedded signup. Create a new WABA when the flow asks.
  6. Recreate your templates on the new WABA (see Step 5). Wait for Meta review.
The number stops sending after step 3, 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 embedded signup fails with 2655093, or Meta blocks a billing change over a pending balance, the WABA is still tied to another partner, most often through your old provider’s credit line. In Meta WhatsApp account settings, open the WABA’s Summary → Payment method. If it shows a Credit line from your old provider, ask your old provider to revoke its allocation for this WABA and confirm when it is done. Disconnecting, or disappearing from Partners, does not revoke it. Revoking changes billing for every number on that WABA. If the error remains after one retry, contact Kapso Support to escalate to Meta. A different number on a new WABA unblocks you in the meantime. See recovery steps.
On coexistence? The pairing with the WhatsApp Business app is exclusive to one provider. Do step 1, ask the old provider to revoke its credit line for the number’s WABA (see above), and disconnect the old provider in the app under Settings → Account → Business Platform if it is listed. Revoking changes billing for every number on that WABA, so if others still use the old provider’s billing, move them or give them replacement billing first. Do not remove the number or the WABA. Wait about 10 minutes, then connect through Kapso’s WhatsApp Business App flow. Coexistence always creates a new WABA, so recreate your templates. If it fails, see coexistence troubleshooting.
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, with three attempts in about 50 seconds: the first, then retries at 10s and 40s. 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