Going live
The whole journey from sandbox to a real customer's first message, including the steps only a human can do.
1 · Connect your WhatsApp number
Use the business you already have in Blueticked.
You do not need to create a customer business through the API.
Select the right business in the workspace switcher, then connect its number with Meta Embedded Signup. The business owner completes Meta's verification. Check the channel's readiness before sending live messages; connecting a number alone does not mean Meta has approved everything.
Connect WhatsApp2 · Get your first template approved
Use a template to start a conversation or message outside the 24-hour reply window.
Create a template for your real use case, submit it to Meta and wait for approval. Use its approved name, language and variables in your integration. Message only people who have given the appropriate consent.
Manage templates3 · Check billing and the wallet
Confirm how each channel you intend to use is paid for.
WhatsApp charges are paid directly to Meta. Set up the payment method Meta requires for your account. Blueticked's prepaid ZAR wallet covers billable Blueticked services, including SMS and email; fund it if your integration uses those services. Check readiness for any billing blockers.
Open wallet4 · Create a live key for your server
Keep your test key for development; use a separate live key for real sends.
Finish the Quickstart with a test key first. In API keys, complete two-step verification if requested and create a live key with only the permissions your server needs. Copy it when revealed and keep it in your server's secret store, never in browser code. Configure your webhook and send one controlled message to a consenting test recipient before opening up your integration.
Manage API keysStart the slow things first
Steps 3 and 5 involve Meta reviewing something, and Meta takes hours to days. Everything else here takes minutes. If you build in the order below you will be waiting on Meta while you write code, instead of discovering a two-day queue on your launch morning.
1 · Build the whole integration in the sandbox
No account setup, no Meta, no money.
A blu_test_ key works on a workspace with nothing connected at all.
Sandbox sends are simulated end to end: nothing reaches a real phone, nothing is billed, and no channel needs to exist. The Quickstart takes you from nothing to a delivered message, and the magic numbers let you exercise delivery, failure and inbound replies deterministically rather than waiting for a real handset to do something.
Do not treat this as a toy stage: the routes, the request checks, contacts, opt-outs and webhooks are real. What the sandbox cannot check is everything that needs a real channel or Meta, so plan for these when you swap the key:
- A send needs a connected channel for its business; the sandbox needs none.
- Marketing email needs a verified sending domain, and the reply-to rules apply (each refusal names its
details.reason). - A WhatsApp template must be attached to the number and submitted to Meta; one approved only in the sandbox is refused.
- The sandbox numbers stop working: a live key refuses them.
- A free-form WhatsApp message to someone who has not written in the last 24 hours is accepted, then fails later as
message.failed. Use a template. - Billable sends draw on the wallet; the sandbox charges nothing.
2 · Create the customer, then get their WhatsApp connected
Onboarding is one API call; the Meta signup is a link you send.
Each of your customers is a business in your workspace: its own number, contacts and templates, isolated from the rest. bt.businesses.create makes one and can mint its credential in the same call. Connecting WhatsApp, though, means the business owner completing Meta's Embedded Signup with their own Facebook login. You cannot do it on their behalf and neither can we. What you can do is hand them a link.
// Your server. One call creates the customer AND their credential.
const business = await bt.businesses.create({
name: customer.company_name,
create_key: true, // key is returned ONCE — store it now
});
await store(customer.id, business.id, business.api_key.key);
// Then mint a connect link and send it to them.
const link = await bt.channels.createConnectSession({
business_id: business.id, // WHOSE channel this becomes
reference: customer.id, // comes back on the webhook
redirect_url: "https://yourapp.example/whatsapp/done",
});
await sendYourOwnEmail(customer.email, link.url);The link works once, expires in 24 hours by default, and needs no Blueticked account. If you send it to the wrong address, revoke it.
3 · Wait for Meta: business verification and display name
Hours to days.
This is the long pole, and it is not yours to shorten.
- Business verification
- Meta verifies the business is real, using documents the OWNER supplies. A brand-new business can take several days. Nothing you or we do changes the queue.
- Display name review
- The name recipients see must match the business and follow Meta's policy. Rejections are common for names that read as promotional rather than as the business.
- What you should do meanwhile
- Keep building against the sandbox. Poll readiness, or wait for the channel.connected webhook, and show your customer where they are rather than asking them.
- What NOT to do
- Do not block your onboarding on this finishing. A customer who has to sit and wait on a spinner will leave; one who can finish signing up and be told later will not.
4 · Know when they are ready, without asking them
Two ways, both better than a support conversation.
// Ask about ONE customer. Without business_id you get the whole
// workspace, which reads "ready" as soon as ANY customer has connected.
const status = await bt.workspace.getReadiness({
business_id: business.id,
});
if (!status.can_send.whatsapp) {
// Every blocker says what it is and who can clear it.
for (const b of status.blockers) {
console.log(b.code, b.message, b.resolve); // dashboard | api | meta_review
}
}// POST from us when your customer finishes.
if (event.event === "channel.connected") {
const customerId = event.data.reference; // what you passed when minting
await markWhatsAppReady(customerId);
}Every blocker carries a stable code, the channels it blocks, and a resolve of dashboard, api or meta_review. Branch on resolve: a dashboard blocker should be surfaced to your user as a task, not retried; meta_review means wait.
5 · Get a template approved
Required before you can message anyone who has not messaged you first.
WhatsApp only lets a business start a conversation with an approved template. Replying inside the 24-hour window after a customer messages you is free-form; everything else is a template, and templates are reviewed by Meta.
Submit them as early as you can, usually while step 3 is still in the queue. See WhatsApp for the category rules and what makes a template fail review.
6 · Fund the wallet, then swap the key
The last two things, and the only ones that are instant.
Blueticked is prepaid: billable sends draw on a ZAR wallet, and an empty wallet refuses them with insufficient_balance rather than silently queueing. Readiness reports this as a blocker before you hit it.
Then change one thing: blu_test_ becomes blu_live_. Your code stays the same; what changes is what Blueticked can check, listed in step 1. Consider a per-customer key with a monthly spend cap, so a bug in your code cannot spend more than you decided.
The order, on one line
Build in the sandbox → send the connect link → wait on Meta → submit templates → fund the wallet → swap the key. The only steps measured in days are the two Meta owns, so start them first and write code while they queue.