Connect WhatsApp via Meta (Cloud API)
Step-by-step guide to connect your WhatsApp Business number directly to Meta Cloud API - no intermediaries, with screenshots for every step.
Goal
Walk through, step by step, how to connect a WhatsApp Business number to Helios directly via the Meta Cloud API, without intermediaries like Twilio.
Why Meta Cloud API over Twilio
- Lower cost: no middleman markup, just Meta's own pricing.
- Direct control: you manage your own app on Meta for Developers.
- Latest features first: immediate access to new WhatsApp API capabilities.
About Meta's "1,000 free conversations / month": this free tier exists, but it does NOT apply to AI-driven phone numbers. Meta classifies AI integrations as a paid use case, so even your test traffic counts. Without a payment method on file, Meta silently drops every inbound message — see Step 8.
Prerequisites
Before you start, make sure you have:
- A Meta for Developers account (free, can use your Facebook account).
- A Meta Business account (created automatically when you create an app, or you can use an existing one).
- A phone number for WhatsApp Business (must NOT be registered on regular WhatsApp; if it is, you must unlink it first).
- A valid payment method (credit card or debit card) you can attach to the WABA. Cost is trivial (~$0.005-$0.02 USD per conversation), but Meta requires it for AI numbers.
- Admin or owner access to your Helios tenant.
- An agent created in Helios with the WhatsApp channel enabled.
What Helios automates for you

Three configuration steps that historically caused new tenants to silently fail are now handled by Helios when you click Connect Number:
Helios does this automatically — you don't need to do it in Meta:
- Webhook URL is generated from your production domain (no manual construction).
- Verify Token is generated as a secure random string (
hv_...).- WABA-app subscription is registered against Meta's Graph API (
POST /{waba_id}/subscribed_apps) so your app actually receives webhooks. This is the step that StackOverflow forgets.- WABA ID auto-detection: if you only provide the Phone Number ID + Access Token, Helios queries Meta and fills the Business Account ID for you.
You still need to perform Steps 1-7 in Meta yourself (creating the app, adding the phone, generating the token, configuring the webhook URL/Token in the Meta dashboard). The two-level webhook concept is explained in Step 7.
Part 1: Setup in Meta
Step 1 — Create your Meta Business and developer account

- Go to Meta Business Suite and create a Business account (skip if you already have one).
- Go to Meta for Developers and log in with the same Facebook account that owns the Business.
Step 2 — Create an app in Meta for Developers

- In Meta for Developers, click My Apps → Create App.
- Choose app type Business.
- Fill in:
- App name: descriptive name (e.g. "MyCompany WhatsApp Bot").
- Contact email: your business email.
- Business portfolio: select an existing portfolio.
- Click Create App.
Step 3 — Add the WhatsApp product and a phone number

- After creating the app, you land on the dashboard.
- In the left sidebar, open Use Cases and pick "Connect with customers through WhatsApp" → click Customize.
- Select or create a WhatsApp Business Account (WABA):
- If you already have one: select it.
- If you don't: create one here, or create it in advance via Meta Business Suite → More tools → WhatsApp Manager.
- Inside Customize, go to Production setup. This is the new home for everything you used to find under "API Setup" / "Configuration": the cards for Register your WhatsApp phone number, Configure Webhooks, and Add payment to send business-initiated messages all live here.
- On the Register your WhatsApp phone number card, Meta auto-assigns a free test number you can use immediately. To use your own production number, click Add phone number, enter your business number, and verify with the SMS / voice code.
Note: The number you add cannot be registered on regular WhatsApp. If it is, uninstall WhatsApp from the phone and wait a few minutes before adding it here.
Step 4 — Create a permanent token (System User Token)

The temporary token shown in Production setup expires in ~24 hours. For production you need a System User Token:
- Go to Meta Business Suite.
- Click Settings → System Users.
- Click Add to create a new system user:
- Name: lowercase letters and underscores only (e.g.
helios_whatsapp). - Role: Admin.
- Name: lowercase letters and underscores only (e.g.
- Once created, select the System User and click Add Assets:
- Apps → choose your WhatsApp app → toggle Manage app (and Full Control if shown) → Save.
- WhatsApp Accounts → ALSO add the WhatsApp Business Account as an asset and grant Full Control → Save. Without this, the connection step in Helios will fail with
missing_permissionswhen it tries to bind the app to your WABA via Graph API.
- Click Generate Token on that user.
- Select your WhatsApp app and tick the permissions:
whatsapp_business_managementwhatsapp_business_messaging
- Click Generate Token and copy it. It's permanent, but only shown once.
Step 5 — Get the App Secret
- In the left menu of your app on Meta, go to Settings → Basic.
- Find App Secret, click Show, enter your Facebook password.
- Copy the App Secret.
The App Secret allows Helios to verify that webhooks really come from Meta (HMAC-SHA256 signature). Highly recommended.
Part 2: Paste credentials in Helios
Step 6 — Connect the number in Helios

- In Helios, go to WhatsApp in the sidebar.
- Click Connect New Number → select Meta Cloud API.
- Fill in:
| Field | Value | Required |
|---|---|---|
| Phone Number ID | The numeric ID from Production setup → Register your WhatsApp phone number (e.g. 1048935644968344) | Yes |
| Business Account ID | The WABA ID. Optional — Helios auto-detects it from the Phone Number ID + token | No |
| Access Token | The System User Token from Step 4 (or temporary token for testing) | Yes |
| App Secret | The secret from Step 5 | Recommended |
| Display Name | Friendly label for this number (e.g. "WhatsApp Support") | Yes |
| Assigned Agent | The agent that will process messages | Yes (if active) |
- Click Test Connection to verify (it returns the verified business name and quality rating).
- Toggle Active if you want the number ready to receive messages.
- Click Connect Number. At this point Helios calls Meta's Graph API to bind your app to the WABA — the silent webhook gap that broke many integrations in the past.
Note: If clicking "Connect Number" seems to do nothing, scroll up around the button — you may have a hidden validation error like missing Display Name or missing Assigned Agent.
Editing an existing Meta connection
- Encrypted credentials (Access Token and App Secret) show a "Saved" indicator — actual values are not displayed for security.
- You can keep them or replace them with new values.
- Test Connection works with stored credentials, no need to re-enter.
Part 3: Configure the webhook in Meta
Step 7 — Register the webhook URL

This is where Meta has two separate subscription levels, and confusing them costs people days of debugging:
- App-level field subscription (you do this — Step 7).
- WABA-level app subscription (Helios does this for you — see "What Helios automates for you").
Both must be in place for webhooks to arrive. Now configure the field-level subscription:
- Go back to Meta for Developers, in your app.
- In the left menu, open Use Cases → "Connect with customers through WhatsApp" → Customize → Production setup.
- Find the Configure Webhooks card and click Configure (or Edit if it's already set up).
- Fill in:
- Callback URL: paste the Webhook URL shown in Helios (e.g.
https://heliosvisionai.com/api/whatsapp/webhook). - Verify Token: paste the Webhook Verify Token from Helios (
hv_...).
- Callback URL: paste the Webhook URL shown in Helios (e.g.
- Click Verify and Save. Meta sends a GET to your URL to confirm the token matches.
- Meta will normally subscribe the
messagesfield for you in the background as part of this same step. If you want to double-check (5 seconds), open WhatsApp → Configuration → Webhook fields (the legacy page that exposes field-level toggles), find themessagesrow, and confirm it shows Subscribed (green). If it isn't, click Subscribe. While you're there, you can also subscribemessage_statusfor delivery / read receipts.
If verification fails: confirm the URL is HTTPS, the domain is publicly reachable (not localhost), and the token matches exactly the one Helios generated.
Part 4: Payment method and publishing the app
These last two steps were undocumented for too long. Skipping either of them produces the exact same symptom: zero inbound messages, no error in the dashboard.
Step 8 — Add a payment method (mandatory for AI numbers)

Meta's "1,000 free conversations / month" tier explicitly excludes AI phone numbers. Without a payment method, Meta silently drops every inbound message — there is no error in the Meta dashboard, no rejection in Helios, just silence.
- Go to Use Cases → "Connect with customers through WhatsApp" → Customize → Production setup.
- Find the card labeled "Add payment to send business-initiated messages" (the wording also covers AI-initiated traffic).
- Click Add payment method and enter your card.
- Save.
Cost reality check: ~$0.005-$0.02 USD per conversation depending on country. A few cents covers extensive testing.
Step 9 — Publish the app (App Mode → Live)

Apps in Development mode never deliver real production webhooks — not even for app admins or testers. Meta's dashboard mentions this, but it's easy to miss.
- In your app's left sidebar, click Dashboard.
- Look for the panel "Check that all requirements are met, then publish your app".
- Complete the basic requirements (Meta will list them):
- Privacy Policy URL — required.
- Terms of Service URL — required.
- Data Deletion URL — required.
- App Icon (1024x1024 PNG).
- Category: "Business and Pages".
- Business use description (a short paragraph about your use case).
- Once requirements are met, the page redirects you to Publish, with the button now enabled. Click Publish.
Which URLs do I paste for Privacy / Terms / Data Deletion?
- Ideal: use your own legal pages if you already publish them (e.g.
https://yourcompany.com/privacy). They name your business as the data controller, which is exactly what Meta wants to see. - Fallback: Helios generates ready-to-use per-tenant legal pages for you at:
https://heliosvisionai.com/privacy/{your-slug}https://heliosvisionai.com/terms/{your-slug}https://heliosvisionai.com/data-deletion/{your-slug}
You can grab the exact URLs (with a one-click copy button) and edit your business name, contact info, address, and optional industry-specific clauses in Helios under Settings → Legal & Compliance. The same page also lets you override any of the three URLs with your own external link (Helios will 302-redirect Meta to it).
Why per-tenant URLs, not the platform
/privacy: under GDPR/CCPA you are the data controller of your customers' data; Helios is only the data processor. Meta's app review expects the URLs to describe your business — name, contact, sensitive-data disclosures — not the underlying platform. The per-tenant URLs do exactly that; the platform-levelhttps://heliosvisionai.com/privacydescribes Helios itself and will not pass a tenant submission.
UX gotcha: clicking Publish in the left sidebar before completing the basic fields shows a disabled button with no clear next step. The path that actually works is Dashboard → Check requirements → fill fields → redirect to Publish.
No App Review required: WhatsApp Business Messaging does not need formal App Review. Live mode activates instantly once the basic fields are filled.
Step 10 — Click Connect Number

You already picked the agent and toggled Active at the top of this form, so the only thing left is to click Connect Number below. Helios will automatically subscribe this app to your WhatsApp Business Account so inbound messages reach the webhook — you do NOT need to do this in Meta. Send a test WhatsApp from another phone and your agent should reply within seconds.
If the message reaches Helios but no reply is generated, check:
- The assigned agent has the WhatsApp channel enabled.
- The agent has a system prompt configured.
- The server logs for processing errors.
Common silent failures (no error, no message)
These three are the usual suspects when "everything looks right but nothing arrives". Helios solves the third one for you, but the first two are still on you:
| Silent failure | Root cause | Fix |
|---|---|---|
| Inbound messages never arrive, dashboard looks fine | Payment method not added (Step 8) | Add a card under Use Cases → "Connect with customers through WhatsApp" → Customize → Production setup → "Add payment to send business-initiated messages" |
| Webhook is verified, fields are subscribed, still nothing | App is in Development mode (Step 9) | Publish the app via Dashboard → Check requirements → Publish |
| Brand-new tenant: webhook configured but no events ever fire | App not subscribed to the WABA at the WABA level | Helios now does this automatically when you click Connect Number. If you connected before this fix, click Edit → Test Connection → Save again to re-trigger the bind |
Connection error codes
When Helios fails to connect or bind your number, the modal shows one of these codes (returned by the server action as meta_bind:<code>):
| Code | Meaning | Fix |
|---|---|---|
invalid_token | Meta rejected the access token | Regenerate the System User Token (Step 4) and paste again |
missing_permissions | Token lacks whatsapp_business_management on this WABA | In Meta Business Suite → System Users, grant Full Control to the System User over the WhatsApp Account (not just the App) |
waba_not_found | Token can't see the WABA | The token belongs to a different Meta app than the phone number. Generate a new token from the System User scoped to the correct app |
invalid_phone_number_id | Phone Number ID is wrong | Re-copy the Phone Number ID from Use Cases → "Connect with customers through WhatsApp" → Customize → Production setup → "Register your WhatsApp phone number" (it's numeric, no hyphens) |
network_error | Transient connectivity issue with Meta | Retry in a few seconds. If it persists, check Meta's status page |
Temporary vs Permanent Token
| Feature | Temporary Token | System User Token |
|---|---|---|
| Lifetime | ~24 hours | Permanent |
| Generated where | Production setup (Use Cases → Connect with customers through WhatsApp → Customize) | Meta Business Suite → System Users |
| Recommended for | Initial testing | Production |
| Shown again | Yes (regenerable) | Only once |
For production, always use a System User Token. If you use the temporary one, your integration will stop working when it expires.
Meta Cloud API costs
Meta charges per conversation (24-hour window), not per individual message:
| Conversation type | Cost |
|---|---|
| User-initiated (service) on AI numbers | ~$0.005-$0.08 USD per conversation (varies by country). The 1,000-free-per-month tier does NOT apply |
| Business-initiated (marketing, utility, authentication) | ~$0.01-$0.15 USD per conversation (varies by country) |
| Messages within a 24-hour window | No additional cost once the conversation is open |
See Meta's current pricing for your region.
Other common errors
| Problem | Likely cause | Fix |
|---|---|---|
| Test Connection fails | Phone Number ID or Access Token wrong | Confirm Phone Number ID is numeric and the token is valid and not expired |
| Webhook does not verify in Meta | URL not reachable or token mismatch | Use HTTPS with a public domain (not localhost). Confirm the token is exactly the one Helios generated |
| "Connect Number" does nothing | Hidden validation error | Scroll up in the modal — likely "Active WhatsApp numbers must have an assigned agent" |
| Invalid signature (401) on webhook | App Secret wrong or missing | Re-copy the App Secret from Meta → Settings → Basic and save it in Helios |
| Token expired | Using temporary token | Create a permanent System User Token (Step 4) |
| Encryption error | Connection created from a different environment | Delete the connection and reconnect from the same environment (production) where Helios is deployed |
Quick checklist
- Step 1: Meta Business + Meta for Developers account
- Step 2: Create app in Meta for Developers (Business type)
- Step 3: Add WhatsApp product, link a WABA, add phone number
- Step 4: Permanent System User Token with
whatsapp_business_management+whatsapp_business_messaging(Full Control on App AND WhatsApp Account) - Step 5: Copy App Secret from Settings → Basic
- Step 6: In Helios, paste credentials → Test Connection → Connect Number (Helios auto-binds the WABA)
- Step 7: In Meta (Use Cases → Connect with customers through WhatsApp → Customize → Production setup → Configure Webhooks), paste Webhook URL + Verify Token → Verify and Save → confirm
messagesis Subscribed under WhatsApp → Configuration → Webhook fields - Step 8: Add payment method (mandatory for AI numbers)
- Step 9: Publish the app (Dashboard → Check requirements → Publish)
- Step 10: Click Connect Number in Helios (Helios auto-subscribes the app to your WABA), then send a test WhatsApp from another phone and confirm the agent replies
Related
- whatsapp — General WhatsApp manual (managing conversations, chat, notifications)
- twilio-setup — Alternative setup with Twilio
- integrations — General integrations