Skip to main content
Migrate your WhatsApp numbers from 360dialog to Kapso.

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.
  3. 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.
  4. Remove the phone number from the WABA.
  5. Wait about five minutes.
  6. In Kapso, start embedded signup. Share your existing WABA, or create one when the flow asks.
  7. Recreate your templates if you created a new WABA (see Step 5). Wait for Meta review.
The number stops sending after step 4, and on a new WABA it can send templates again once Meta approves them. Plan the migration accordingly. See Connect WhatsApp for the signup flow. If the reconnect fails, see coexistence troubleshooting and bring your own SIM 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? 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

Store the mapping from each old channel key to its 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.io becomes https://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.
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.
The TypeScript SDK wraps all of this, so you do not have to write the envelopes by hand.

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:
Kapso adds two headers on every delivery: 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 the X-Webhook-Event header, with the payload flattened to message, conversation, and phone_number_id:
What you parse out of Meta’s envelope today maps to: 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 in X-Webhook-Signature, keyed with the secret_key you chose at registration.
If you verified the partner-level 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:
Kapso:
The lifecycle maps directly: 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:
Send your customer the returned 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/archive is 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.
360dialog stores no message history to export, but uploaded media expires 30 days after last use and webhook media after 7 days. Download anything you still reference by media ID before the old keys die.

Troubleshooting

Node.js example

The example keeps a raw Meta parser via a kind: "meta" webhook, which is the shortest path off 360dialog: the send function changes two lines, and the handler gains signature verification.

Need help