WhatsApp
The Appmixer WhatsApp connector talks to the WhatsApp Business Cloud API hosted by Meta. This page has two distinct parts:
Part 1 — Configuring the connector
Appmixer administrator
One-time tenant setup: Meta App, WhatsApp product, Facebook Login for Business, Appmixer Backoffice, webhook endpoint, App Review
Part 2 — Using the connector
End customer / flow builder
What every customer must bring (WABA, phone, registration), how to connect their account, how Sender vs Recipient works, the 24-hour window, going Live
If you're setting WhatsApp up on a fresh Appmixer tenant for the first time — start with Part 1. If you're a customer building flows on an Appmixer where WhatsApp is already configured — skip to Part 2.
Part 1 — Configuring the WhatsApp connector
A one-time setup performed by an Appmixer administrator. End customers don't see any of these steps; once the Meta App is wired up they simply click "Connect WhatsApp" in the Designer.
1.0 Admin prerequisites
A Meta Business Account at business.facebook.com. A personal Facebook account can create one for free.
Admin / Backoffice access to your Appmixer tenant.
(Recommended for testing) a phone number you can use as a WhatsApp sender. Meta provides a free test phone number during App development.
1.1 Create the Meta App
Open https://developers.facebook.com/ and choose My Apps → Create app.
Use case: select Other, then on the next screen choose Business as the app type.
Give the app a descriptive name (e.g.
Appmixer – WhatsApp) and link it to your Business Account.
1.2 Add the WhatsApp product
In the new app dashboard, scroll to Add products to your app.
Click Set up on the WhatsApp card. This attaches a WhatsApp Business Account (WABA) to the app — Meta offers to create a brand-new test WABA if you don't already own one.
After setup, you'll land on the API Setup page. Note the following — you'll need them for testing:
Phone number ID (the long numeric ID Appmixer's
phoneNumberIdinput expects)WhatsApp Business Account ID (WABA ID — used by the
ListPhoneNumberscomponent, templates, etc.)Temporary access token (24h lifetime; fine for smoke tests, not for production)
The pre-supplied test phone number Meta gives you
1.3 Add Facebook Login for Business
The end-user OAuth flow goes through Facebook Login for Business.
In the app sidebar choose Add products → Facebook Login for Business → Set up.
When prompted for Login variation, choose General — NOT "Conversions API for Business Messaging" (which is for ad-conversion tracking, not WhatsApp auth) and NOT "Instagram Graph API".
Under Facebook Login for Business → Settings, set the Valid OAuth Redirect URIs to your tenant's WhatsApp callback URL:
Replace
YOUR_TENANTwith the subdomain of your Appmixer tenant. Self-Managed customers can use any domain configured for the Appmixer API; append/auth/whatsapp/callback.Under App settings → Basic → App Domains, add your tenant domain(s) — at minimum the API host above. Without this Meta will reject the redirect at runtime.
1.3.1 Create a Login Configuration (Meta asset picker)
Plain OAuth shows the end customer a generic "Continue as X" consent screen — they grant access without explicitly choosing which WABA they share. Facebook Login for Business with a Login Configuration swaps this for a granular asset picker: customer explicitly selects which WhatsApp Business Accounts the connector can access. This is the same underlying flow Zapier, Make, and other competitors use, and Meta strongly recommends it for any 3rd-party WhatsApp integration. (Note: Zapier's UX additionally uses Meta's WhatsApp Embedded Signup via the JS SDK — a multi-step wizard with phone number setup inline. That requires Tech Provider designation and frontend SDK integration — not currently supported by Appmixer.)
In the Meta App sidebar go to Facebook Login for Business → Configurations → Create new.
Fill in the wizard:
Configuration name: anything descriptive, e.g.
Appmixer WhatsApp OAuthLogin Variation: General
Permissions:
whatsapp_business_messaging,whatsapp_business_managementAssets: check WhatsApp Business Accounts
Save → Meta displays a Configuration ID (long numeric). Copy it — you'll paste it into Backoffice in the next section.
When the connector's OAuth URL contains config_id=<ConfigurationID>, Meta:
Shows the WABA / Business asset picker instead of a plain consent screen
Reads scopes from the Login Configuration (ignores
scopequery parameter)Returns
granular_scopes[]in the access token with WABAtarget_ids, used by the connector to auto-discover the customer'sbusinessAccountId
If you skip this step the connector falls back to plain OAuth (still works, just worse UX).
1.4 Configure Appmixer Backoffice
From the app dashboard, copy the App ID and App Secret (under App settings → Basic).
Open your Appmixer Backoffice → Connector Configuration.
Create (or edit) the entry with configuration ID
appmixer:whatsappand add:clientId= Meta App IDclientSecret= Meta App Secret — used both for the OAuth token exchange and for HMAC verification of incoming webhooks (X-Hub-Signature-256)configId= Login Configuration ID from section 1.3.1. (Optional — without it the connector falls back to plain OAuth, no asset picker.)verifyToken= any string you choose. You'll enter the same value into Meta App Dashboard when configuring webhook callback URL (section 1.6). Treat it as a shared secret.
Save.
End customers on your tenant can now click Connect WhatsApp in the Designer and walk through the Meta asset picker.
Auto-discovery of WABA ID: During OAuth the connector automatically queries Meta's
/debug_tokenendpoint and extracts the user's WhatsApp Business Account ID fromgranular_scopes. It's stored on the account's profile (profileInfo.businessAccountId) so end customers don't need to paste it into every component. ThebusinessAccountIdinput fields on Send/Upload and trigger components are optional overrides — only fill them when the customer's account has access to multiple WABAs.
1.5 Required permissions (scopes)
The connector requests these scopes during OAuth:
whatsapp_business_messaging
Send/receive messages, mark as read, upload media
whatsapp_business_management
Manage the WABA, phone numbers, templates, business profile
Both are part of Meta's standard WhatsApp product and do not require Advanced Access for development testing. They do require App Review before going Live for users outside your test list (see section 1.7).
1.6 Webhook setup for triggers (one-time admin step)
The Appmixer WhatsApp NewMessage and MessageStatusUpdated triggers receive events from Meta over HTTPS webhooks. Meta allows one webhook callback URL per Meta App, so Appmixer uses a connector-level plugin endpoint that all customers' WABAs share. The admin configures this once per tenant; per-customer WABA subscription happens automatically when a trigger flow starts.
One-time admin steps
Get the plugin endpoint URL for your tenant:
(Self-Managed customers: substitute your Appmixer API base URL for
https://api.YOUR_TENANT.appmixer.cloud.)In the Meta App Dashboard go to WhatsApp → Configuration → Webhooks.
Click Edit on Callback URL:
Callback URL = the plugin endpoint URL from step 1
Verify token = the
verifyTokenvalue you set in Backoffice →appmixer:whatsapp(section 1.4)
Click Verify and save. Meta sends a
GETto the endpoint withhub.mode=subscribe&hub.challenge=…&hub.verify_token=…. The plugin echoes backhub.challengewhen the verify token matches.On the same page, find the
messagesfield in the webhook fields table and click Subscribe. This single field covers:Inbound messages (
value.messages[]) — used byNewMessagetriggerOutbound status updates (
value.statuses[]) — used byMessageStatusUpdatedtriggerReactions, button clicks, system messages, etc.
That's the entire admin setup. From here, every customer whose flow includes a WhatsApp trigger gets webhook events automatically (Part 2, section 2.5).
How the routing works
This means:
✅ One Meta App serves unlimited customers on the same Appmixer tenant
✅ Customer A's messages never leak to customer B's flows (eventName includes wabaId)
✅ HMAC signature verification is centralized (uses the Meta App Secret stored in
appmixer:whatsapp.clientSecret)❌ But: still only one Meta App per Appmixer tenant. Multiple tenants need a Meta App each.
1.7 App Review for production
Until your Meta App is reviewed and switched to Live mode, only verified test recipients and limited features are available. To onboard real customers you must submit for App Review:
App settings → Basic — fill in app icon, category, privacy policy URL, terms of service URL.
App Review → Permissions and Features — request advanced access for
whatsapp_business_messagingandwhatsapp_business_management.Business Verification — verify your business entity in Meta Business Manager. Requires a business document (commercial register entry, articles of incorporation, …) and may take several days.
Tech Provider designation — required if you plan to onboard other businesses' WABAs via Embedded Signup. Appmixer hosted plans typically already operate under a Tech Provider Meta App; Self-Managed customers will need to apply separately.
Part 2 — Using the WhatsApp connector
This part is for the end customer / flow builder on an Appmixer tenant where the WhatsApp connector is already configured (Part 1 complete).
2.0 What you need on Meta's side
Before you can use the connector in your flows, you need an active WhatsApp Business presence on Meta. Appmixer does not provision this for you — each customer brings their own.
Must have
Active Meta Business Account — at business.facebook.com, free. A personal Facebook account can create one.
Active WhatsApp Business Account (WABA) — created under your Business Account, either:
Manually via Meta Business Suite → Settings → Business Settings → Accounts → WhatsApp Accounts → Add, OR
Automatically when you sign up via a Business Solution Provider (BSP) or template setup.
At least one phone number added to the WABA — added via WhatsApp Manager, verified by Meta with an SMS / voice OTP code. During verification you also set a 6-digit two-step verification PIN for the number — write it down, you'll need it for Cloud API registration in section 2.2.
Phone number registered for Cloud API — one-time activation. Easiest via the
Ensure Sender Phone Number Registeredcomponent (section 2.2 below). Required before sending/receiving any message; without it Meta returns133010 — Account not registered.Business Verification in Meta Business Manager — strictly required only for going Live (section 2.6), but recommended even in Development mode for better sender quality rating.
Hierarchy of Meta entities
Phone Number ID is auto-assigned by Meta when you add a phone number into a WABA. It's stable for the lifetime of the number on that WABA — but if you migrate the number to a different WABA, it gets a new Phone Number ID.
Where to find your IDs
WABA ID (businessAccountId)
business.facebook.com → Settings → Business Settings → Accounts → WhatsApp Accounts → click WABA → ID at top
Phone Number ID
Same path → click the phone number in the Phone Numbers tab → ID in the details panel
PIN (for register)
Set during phone verification. Reset via Meta Business Manager → WhatsApp Manager → phone number → Two-step verification PIN
In practice you rarely need to look these up — Appmixer auto-discovers them after OAuth (see next section).
2.1 Connect your WhatsApp account in Appmixer
In the Appmixer Designer, drop any WhatsApp component (e.g.
Send Text Message) onto a flow.Click Connect new account → a Meta consent screen opens.
Select the WABA you want to use. Meta explicitly asks which WhatsApp Business Account(s) to share — don't skip this, the connector relies on this selection to discover your WABA.
Grant the requested scopes (
whatsapp_business_messaging,whatsapp_business_management).Back in Appmixer, your account is connected. The WABA ID is auto-discovered and stored on the account — you don't need to paste it anywhere.
Already connected before? If you previously authorized Appmixer with the same Meta account, Meta will show a cached "Continue as X" screen instead of the asset picker. Click "Edit settings" to re-open the asset picker and review/change which WABA you share. Alternatively, revoke the prior authorization at facebook.com/settings?tab=applications and reconnect for a fresh flow.
What happens if you don't select a WABA
If you click Continue in the asset picker without selecting any WhatsApp Business Account (or your Meta account has no WABA at all), Appmixer deliberately fails the authentication with an error message asking you to retry. This is intentional — a connected account without a WABA can't send or receive anything, so we'd rather refuse than let you end up with a non-functional account that fails silently inside flows.
If you see this error:
Open Meta Business Manager → Settings → Business Settings → Accounts → WhatsApp Accounts
Add a WhatsApp Business Account if you don't have one (free)
Add at least one phone number to it and verify it
Reconnect in Appmixer — and make sure to select the WABA in the asset picker this time
Sender vs recipient terminology
Two distinct concepts often confused:
Sender
YOUR business phone number — the number you message FROM
Inside your WABA
Phone Number ID (1044539225419737)
Recipient
An end user you message TO
Anywhere on WhatsApp
E.164 phone number (+420725657976)
Appmixer components named *PhoneNumber* (List/Get/Register/Deregister/EnsureRegistered/GetRegistrationStatus) always operate on YOUR sender numbers, never on recipients. Recipients need no registration — they're just E.164 phone numbers in the to field of Send components.
2.2 Register your sender phone number for Cloud API
One-time step per sender phone number. Without it the Cloud API returns 133010 — Account not registered.
Two components:
Ensure Sender Phone Number Registered(recommended for onboarding) — idempotent: checks status first, only calls register if not already registered. ReturnswasAlreadyRegisteredso you can branch on first-time setup vs resume.Register Sender Phone Number(explicit) — always calls register. Useful when you want a hard failure on PIN mismatch.
Both take:
Phone Number ID — your sender number's ID. Pick from the dropdown (loaded from your WABA) or paste manually.
PIN — the 6-digit two-step verification PIN you set during phone verification (section 2.0).
For Meta test numbers it's typically
000000.For owned numbers, the one you wrote down. Forgot? Reset via Meta Business Manager → WhatsApp Manager → phone number → Two-step verification PIN.
Data Localization Region — leave empty unless your WABA is in a Meta data-localization program (AU/BR/DE/IN/ID/GB).
Run the component once per phone number. registered: true (Ensure) or success: true (Register) confirms.
For diagnostics there's also Get Sender Registration Status — read-only, no side effects. Returns { registered, platformType, codeVerified, qualityRating, … }.
Alternative: register via curl
2.3 Verified recipients (Development mode only)
While the Appmixer admin's Meta App is in Development mode, Meta only delivers to phone numbers explicitly added as test recipients on the App.
If you can't deliver to a phone:
Open Meta App Dashboard → WhatsApp → API Setup. (Requires Meta App access — coordinate with your Appmixer admin if you don't have it.)
In the To dropdown, click Manage phone number list and add the recipient.
WhatsApp will send a verification code via WhatsApp; enter it back in Meta Console.
This restriction goes away once the Meta App is Live (App Review approved — Part 1, section 1.7).
2.4 Understanding message delivery — the 24-hour customer service window
This explains 90 % of "my Appmixer flow succeeded but the message never arrived" tickets. Read it carefully.
You can send free-form text / image / video / audio / document / location messages only during a 24-hour customer service window, which opens when the end user sends a message to your WhatsApp Business number. Outside that window, the only message type Meta will actually deliver is a pre-approved template message.
What makes this insidious:
Meta does not reject out-of-window free-form sends with an HTTP error. The API returns HTTP 200 with a valid
messageId— your Appmixer flow shows green — but the message is silently dropped on Meta's side.The Meta App Dashboard's built-in "Send Message" button uses
hello_world(a template) by default, so a manual test there appears to work even when your text-based Appmixer flow does not.The same applies to Meta-supplied test phone numbers — verified recipients still need to write to the test number first to open the 24-hour window.
How to verify delivery in practice
First contact must be a template. Use
Send Template MessagewithtemplateName: hello_world,languageCode: en_US.Add a
Message Status Updatedtrigger to the same flow. Meta sendsstatuswebhook events through it:sent— accepted by Meta's serversdelivered— reached the recipient's deviceread— recipient opened itfailed— not delivered; the payload includes aerrors[]array with the reason code
If you receive
deliveredbut neverread, the message reached the phone. If you never receivedeliveredwithin ~30 seconds, the message was dropped — typically because the 24-hour window was closed or the recipient isn't on the verified list.
Switching to free-form text
You only get to use Send Text Message after the user replies. Two ways:
Manual: open WhatsApp on the recipient device, send any message ("hi") to your test number. The 24-hour window now starts ticking; your
Send Text Messageflow will deliver until 24 hours after that message.Programmatic: start every conversation with a template, then react to the
New Messagetrigger when the user replies — only then send text.
2.5 Triggers — how inbound messages reach your flow
When you drop a New Message or Message Status Updated trigger into a flow and start the flow, the trigger automatically:
Calls
POST /{wabaId}/subscribed_appson Meta — tells Meta to start delivering webhook events for your WABA to the Appmixer plugin endpoint.Registers a listener so the plugin can route incoming events to this specific trigger instance.
No webhook URL or token entry on your side — the Appmixer admin configured the global endpoint once (Part 1, section 1.6).
What each trigger sees
New Message
Inbound from a user to your sender number (text, media, location, reaction, interactive response, system event)
{ id, from, timestamp, type, text/image/…, phoneNumberId, wabaId }
Message Status Updated
Status change of an outbound message you previously sent
{ id, recipientId, status (sent|delivered|read|failed), timestamp, errors[], conversation, phoneNumberId, wabaId }
Optional WABA override
Both triggers expose a WhatsApp Business Account ID inspector field. Leave blank to use the default WABA discovered during OAuth. Fill in only when your account has access to multiple WABAs and you want the trigger to listen on a non-default one.
Important constraint
Only one Meta App per Appmixer tenant is configured. If your tenant has many customers, they all share the same plugin endpoint — Appmixer routes events by WABA so isolation works fine. But if you operate multiple Appmixer tenants you need a Meta App per tenant.
2.6 Going Live — what changes and what does not
Switching the Meta App from Development to Live mode (after App Review approval) lifts a few restrictions but does not change the fundamental WhatsApp Business messaging policy.
What changes when you go Live
Recipient must be on the Verified Recipients list
Required
Removed — message anyone
Available templates
Only Meta-provided (e.g. hello_world)
All approved templates in your WABA
Daily messaging cap
250 business-initiated conversations / 24h
Quality-tier based: 1K → 10K → 100K → unlimited
Geographic reach
Limited to Meta-approved regions
Worldwide
What does NOT change
These constraints apply to every WhatsApp Business app, forever:
The 24-hour customer service window. Free-form messages allowed only within 24h of the user's last message. Outside → templates only.
Opt-in requirement for business-initiated messages. Sending unsolicited templates puts your number's quality rating in the red zone and risks WABA suspension.
Templates require pre-approval. Submit via Meta Business Manager → WhatsApp → Message Templates, or programmatically via
POST /{waba-id}/message_templates. Approval typically takes hours to a day.Silent-drop behaviour for out-of-window sends. HTTP 200 +
messageIdon accept, no delivery, no error. Detect viaMessageStatusUpdated(you'll getsentbut neverdelivered/failed).
Common production patterns
A) User-initiated conversation (chatbot, support inbox)
Free-form messages are service conversations — typically free or at the lowest rate.
B) Business-initiated outreach (notifications, reminders, marketing)
Templates are billed per conversation by category and country:
Service
Reply within 24h window
Free (or very low)
Authentication
OTPs, login codes
~$0.005–0.015 / conv
Utility
Order status, account updates
~$0.015–0.04 / conv
Marketing
Promotions, newsletters
~$0.04–0.10 / conv
Exact rates depend on country and change periodically — see Meta's conversation-based pricing.
Designing a customer's flow — checklist
When asked "how do I broadcast to all my users":
☐ Did the recipient explicitly opt in? (Required; no opt-in = ToS violation.)
☐ Is the message intent Marketing, Utility, Authentication, or Service? Each has its own template category and pricing tier.
☐ Is there an approved template for this message? If not, submit one and wait for approval.
☐ Does the flow gracefully handle the
failedstatus webhook (number blocked, opted out, invalid)?☐ Is the recipient potentially outside the 24-hour window? If unknown → use a template.
2.7 Test the connection
The quickest end-to-end smoke test from inside Appmixer:
In the Designer, click Connect WhatsApp on any WhatsApp component → complete OAuth. WABA ID is auto-discovered onto your account.
Add an Ensure Sender Phone Number Registered component, fill
phoneNumberIdandpin, run it once. (Idempotent — safe to re-run.)Drop a Send Template Message component (the safest first message — see section 2.4 above for why). Use:
Sender Phone Number — leave the WABA field blank, the dropdown auto-loads
to= a verified recipient in E.164 format (e.g.+420777123456)templateName=hello_world(Meta's always-approved default template)languageCode=en_US
Run the flow. A message should arrive on the recipient's WhatsApp within seconds.
Only after the recipient writes back from WhatsApp do you have a 24-hour window in which
Send Text Messagewill actually deliver.(Optional) Add a
New Messagetrigger to a separate flow, run it, then send a reply from your phone to the test number — the trigger should fire within seconds.
Troubleshooting
Invalid Scopes: business_management during OAuth
The Meta App doesn't have business_management whitelisted. The connector only requires the two whatsapp_* scopes — make sure your published connector matches and re-run OAuth.
OAuth shows plain "Continue as X" instead of asset picker
configId is missing in Backoffice → appmixer:whatsapp, OR the Login Configuration was deleted in Meta App. Create one in Meta App → Facebook Login for Business → Configurations (see Part 1, section 1.3.1) and paste the ID into Backoffice.
Asset picker says "No WhatsApp Business Accounts available"
The customer's logged-in Facebook account doesn't own / co-manage any WABA. They must create one in Meta Business Manager first (see Part 2, section 2.0).
Auth fails with "No WhatsApp Business Account selected during authentication"
Customer reached the asset picker but clicked Continue without selecting a WABA, OR their Meta account has zero WABAs. Add a WABA in Meta Business Manager and reconnect; explicitly tick a WABA in the asset picker. See Part 2, section 2.1.
133010 — Account not registered
The phone number was not registered on the Cloud API. Run Ensure Sender Phone Number Registered once.
Security PIN Mismatch: Wrong PIN used (during register)
The PIN you supplied does not match the phone number's two-step verification PIN. Reset it: Meta Business Manager → WhatsApp Manager → phone number → Two-step verification PIN. Then re-run Register with the new PIN.
Flow succeeds with valid messageId but recipient never receives the message
You sent a free-form (text / media / location) message outside the 24-hour customer service window. Meta accepts the request and returns HTTP 200 but silently drops delivery. Fix: use Send Template Message with hello_world for the first contact, then wait for the user to reply before sending text. See section 2.4.
131030 — Recipient phone number not in allowed list
Meta App is in Development mode and the recipient isn't in the verified list. Add the recipient under WhatsApp → API Setup → Manage phone number list, or move to Live mode (Part 1, section 1.7).
Test works in Meta App Dashboard "Send Message" but not in Appmixer
The dashboard's built-in send button uses hello_world (a template) by default. Your Appmixer flow is probably sending text outside the 24-hour window — switch to Send Template Message for the first contact.
132000 — Number of parameters does not match (templates)
Template components array doesn't match the template's required parameters. Inspect the template structure in WhatsApp → Message Templates and adjust the JSON.
NewMessage trigger never fires (but MessageStatusUpdated works)
Most often: no inbound message has been sent to your business number yet. Outbound sends generate statuses[] but not messages[]. From a verified recipient phone, write a message TO your test number — then the trigger fires.
Both triggers silent
messages field is not subscribed in Meta App webhook configuration (Part 1, section 1.6), or the per-WABA subscription failed. Check Meta App Dashboard → WhatsApp → Configuration → Webhooks → messages shows "Subscribed". The customer's flow must be in Running state — start() calls POST /{wabaId}/subscribed_apps.
Webhook verify fails (Meta returns "Couldn't validate the callback URL")
The verify token in Meta App Dashboard must match verifyToken configured in Backoffice → appmixer:whatsapp (Part 1, section 1.4). Re-check both and re-save. The plugin endpoint must also be reachable (HTTPS, 200 on GET /plugins/appmixer/whatsapp/events handshake).
Token expires after ~60 days
Long-lived tokens are issued via fb_exchange_token and need periodic refresh. Appmixer refreshes them automatically; if a customer's account stops working, ask them to reconnect via the Designer.
References
WhatsApp Business Cloud API docs: https://developers.facebook.com/docs/whatsapp/cloud-api
Register phone number: https://developers.facebook.com/docs/whatsapp/cloud-api/reference/registration
Access tokens & System Users: https://developers.facebook.com/documentation/business-messaging/whatsapp/access-tokens/
Conversation-based pricing: https://developers.facebook.com/docs/whatsapp/pricing
Last updated
Was this helpful?
