Connecting a number
Numbers join through Meta's Embedded Signup — no credentials ever pass through us, and none through you.
The connect link
Every account has a unique public link at /connect/{your-slug}. Open it yourself to connect your
own number, or share it — by email, chat, or a button on your own site — with a business whose
numbers you manage. It shows your brand name and a Connect WhatsApp button.
What happens during signup
Meta Embedded Signup opens
The person connecting authenticates with Facebook and selects (or creates) the WhatsApp Business Account and phone number to use.
Authorization is exchanged
On completion, the platform exchanges a one-time code for a long-lived access token, which is stored encrypted. The token never leaves the server.
The number appears in your dashboard
A Company (named after the business Meta returns) and its Connection — the WABA plus the phone
number — are created under your account. The WABA is subscribed to webhooks so statuses flow in,
and the number is registered on the Cloud API so it can send right away.
Numbers already on the WhatsApp Business app
A coexistence number stays on the WhatsApp Business app and is registered by Meta itself, so we leave its registration alone — it connects and sends exactly the same way. If a registration ever fails (an existing two-step PIN, for instance) the connection is still stored, and the number becomes usable once it is registered on Meta's side.
What you can see afterwards
For every connected business: the WABA, its phone number(s) with quality rating and status, every template with its approval state, and message delivery stats (sent / delivered / read / failed with reasons).
Knowing WHICH client connected WHICH number
If you share your link with several clients, put your own identifier for that client in it:
https://wa.genuka.com/connect/{your-slug}?ref=cli_8f3a91e4The reference lands on the Company created at the end of the flow, and you read it back:
curl "https://wa.genuka.com/api/v1/connections?externalRef=cli_8f3a91e4" \
-H "Authorization: Bearer pk_live_xxx"
{ "data": [ { "id": "con_1", "companyId": "cmp_123", "companyName": "Acme Coffee",
"displayPhoneNumber": "+237 6 90 …", "externalRef": "cli_8f3a91e4",
"qualityRating": "GREEN", "status": "connected" } ] }One row: that client's. It spares you both wrong answers to this question — taking the most recent connection, which eventually hands one client's number to another the day two of them connect in the same minute; or showing the list and asking your client to point at their own, which discloses every other client's number and business name on the way.
Pick an unguessable reference
It travels in a URL. A sequential identifier (client-42) can be guessed, and whoever guesses
it can attach their own number to that client. Use a UUID or equivalent randomness.
Accepted characters: letters, digits, . _ : -, 128 max. A missing or malformed reference
is never quietly widened to the full list — the lookup simply returns zero rows. Sending the same
reference again on a reconnection moves it to the number that just connected: it is your ledger,
not ours.
Multiple numbers, limits & re-connection
You can connect as many numbers as your subscription pays for, spread across as many businesses as
you like. Connecting a brand-new number takes a free slot; going past the number count you paid for
is refused with 402 plan_limit_numbers, and raising it takes a new payment from the Billing page.
Re-running the connect flow for a number that is already connected refreshes its token and details
rather than creating a duplicate — and never consumes a slot.