Step 1: Connect your number
- In WhatsApp Manager, check the WABA for other numbers, templates, or assets you still need.
- Turn off two-step verification, under Phone numbers → Settings → Two-step verification.
- Confirm you are an admin of the owning Business Portfolio, and that the number has not sent a paid message in the last 30 days.
- Remove the phone number from the WABA.
- Wait about five minutes.
- In Kapso, start embedded signup. Share your existing WABA, or create one when the flow asks.
- Recreate your templates if you created a new WABA (see Step 5). Wait for Meta review.
Testing first? The sandbox replaces messaging
START to 360dialog’s sandbox number. Create a session for your test phone, then send the 6-character code from WhatsApp. Unlike 360dialog’s sandbox, it uses the same paths as production, supports media, and is not capped at 200 messages.Step 2: Get your phone number IDs
phone_number_id.
If you monitor
GET /health_status, its replacement is GET /platform/v1/whatsapp/phone_numbers/{phone_number_id}/health, which checks actual messaging availability rather than the stored record.
Step 3: Update message sending
Both platforms pass the message body to Meta as-is, so it does not change. Two things do, in every call:- The base URL:
https://waba-v2.360dialog.iobecomeshttps://api.kapso.ai/meta/whatsapp/v24.0. - The sender: the API key no longer implies it, so it moves into the path, as in
POST /{phone_number_id}/messages.
- Text
- Template
- Media
- Interactive
- Read and typing
Free-form replies, inside the 24-hour window. Only the URL and the auth header change.360dialog:Kapso:Kapso forwards the body to Meta byte for byte, so optional fields like
recipient_type pass through unchanged. See Send text.Step 4: Update webhooks
360dialog sends you Meta’s webhook payload as-is. Kapso can forward the same payload, send its own event format, or both: the two webhook kinds register independently on the same number.Keep your Meta parser
Register a webhook with"kind": "meta" and Kapso forwards Meta’s exact payload with no reshaping. Your entry[].changes[].value parser keeps working unchanged:
X-Webhook-Signature (see below) and X-Idempotency-Key for deduplication. If you authenticated 360dialog webhooks with custom headers, pass the same headers object here.
Kapso events
Kapso’s own webhook kind unwraps Meta’s envelope into one event per occurrence, named in theX-Webhook-Event header, with the payload flattened to message, conversation, and phone_number_id:
Full payload shapes in Message events.
Do not assume
message.from is present. Some contacts have no visible phone number, and WhatsApp identifies them with a business_scoped_user_id instead. See business-scoped user IDs.
Webhook configuration
Signature verification
360dialog authenticates webhooks with static custom headers, if you set them. Kapso signs every delivery: HMAC-SHA256 over the raw body, hex digest inX-Webhook-Signature, keyed with the secret_key you chose at registration.
x-360dialog-signature, the scheme is the same HMAC-SHA256 over the raw body. Only the header name and the secret change. See Security for Python and Ruby.
Delivery behavior
See Advanced for buffering and ordering.
Step 5: Templates
The main difference is how you tell the API which WABA you mean: 360dialog reads it from your API key, Kapso takes it in the path. 360dialog:
Templates belong to the WABA. If the number stayed on a WABA you already owned, they are still there and there is no re-review. If it landed on a new one, recreate them and wait for review.
Multi-tenant setups
If you run 360dialog’s Partner API, clients and channels become customers and phone numbers. Instead of the connect button or a direct signup link, each customer connects through a setup link:url. They log in with Facebook and connect in about five minutes. Where 360dialog redirects back with client and channels query parameters, Kapso fires whatsapp.phone_number.created on your project webhook, with the customer.id and phone_number_id. See Onboard customers and Connection detection.
You create customers yourself, so there is no client_created event to wait for, and no per-channel API key generation. One API key covers every customer.
Partner webhook events map to project webhooks:
Partner balance and usage endpoints have no equivalent. Credits live in project settings, and message history is queryable per number.
Billing
360dialog charges a per-number monthly license and prepays Meta from your conversation funds. Kapso runs on project credits, or direct Meta billing:
Choose the billing mode when the WABA is connected. See Meta message billing and pricing.
Feature map
Things Kapso adds:
- Automatic voice-note transcription on inbound audio
- Functions on Cloudflare Workers, as workflow steps, agent tools, or plain endpoints
- Findings, which reads ended conversations with AI and groups the recurring problems
- Conversation lifecycle webhooks, so you can act when a conversation goes quiet or ends
What does not map
- Groups API, Payments API, RCS. WhatsApp one-to-one messaging only.
- Template archiving.
POST /message_templates/archiveis a 360dialog feature, not Meta’s. Delete or keep. - Cascading multi-webhooks. Kapso webhooks deliver independently; there is no primary that gates the secondaries.
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.
The license bills until you cancel, and it renews on the 1st, so time the cancellation after the number is confirmed sending on Kapso.
Troubleshooting
Node.js example
The example keeps a raw Meta parser via akind: "meta" webhook, which is the shortest path off 360dialog: the send function changes two lines, and the handler gains signature verification.

