Skip to main content
We are the Meta Tech Provider: our Meta app, our App Review, one shared inbound webhook. Each merchant owns their own WhatsApp Business Account and phone number. Meta bills that merchant directly — message cost never flows through you or us.

Connecting takes two calls with a human step between them

WhatsApp cannot be provisioned headlessly, and that is Meta’s rule rather than ours: the merchant has to complete an Embedded Signup popup in a real browser.
1

Read the popup parameters

app_id and config_id are public by design — a browser needs them to open Meta’s dialog and they authorise nothing without the secret we never send. Open the popup in your own admin UI.If server_ready is false, stop: this deployment has no Meta app configured, and the popup would open and immediately fail.
2

Exchange the code, server-side

The popup hands the browser a short-lived code. Post it back from your server.
This is the one call in the whole integration that is not safe to blind-retry. The code is single-use and short-lived; replaying a spent one fails at Meta, not here. If you lose our response, read the channel back with GET before you decide anything.
Set coexistence: true when the number also stays live on the WhatsApp Business App. We start Meta’s required contacts and history sync for you — Meta gives you 24 hours from onboarding, so do not defer this call.
Meta’s own consent dialog names the app, so the merchant sees ImpelLabs during signup. This is the one place the white label leaks. Per-partner Meta apps would fix it and would push App Review onto every partner. Tell your merchants to expect it rather than letting them discover it in a demo.

Connecting does not start the assistant

A newly connected number arrives pending. Inbound messages are recorded, a lead is created, webhooks fire — and nothing replies.
This is deliberate. The number a merchant connects is usually one their existing customers already message. Finishing a popup must not point an untested assistant at them.
Naming an assistant_id binds the number to it, so “turn the AI on” is one call. {"on": false} pauses again — credentials kept, inbound still recorded. Activating a number that nothing will answer on is a 400 no_binding rather than a silent success: a silent success there is a merchant waiting for replies that can never arrive. Pass force: true if you mean it. Reconnecting a released number returns it to pending, not to answering. Nobody has said the assistant should resume. Once a number is live, see Numbers for managing more than one, and Conversations for sending.