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? Build against a sandbox number while your current provider still carries production traffic.
Step 2: Get your phone number IDs
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.
- Text
- Template
- Media
- Interactive
- Location and reactions
- Read and typing
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.Step 4: Update webhooks
Register per phone number: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.X-Webhook-Signature:
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: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: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.

