WhatsApp Cloud API — Manual Setup (Single WABA, no Tech Provider needed)

This guide is for the typical CodeCanyon buyer who wants to send WhatsApp messages from their own WhatsApp Business Account (WABA) — without becoming a Meta Tech Provider or BSP. Total setup time: about 5 minutes.

When to use Manual Setup vs Embedded Signup:

What you need before you start

You do NOT need: Tech Provider approval, App ID, App Secret, App Review, or a Configuration ID.

Step 1 — Generate a long-lived System User Access Token

  1. Open business.facebook.com/settings.
  2. Go to Users → System Users → click Add.
  3. Name: XSender API. Role: Admin. Click Create System User.
  4. Click the new System User → Generate New Token.
  5. Select your Meta App.
  6. Tick these two permissions: whatsapp_business_management, whatsapp_business_messaging.
  7. Token Expiration: Never.
  8. Click Generate Token. Copy the token immediately — it begins with EAAB... and Meta will not display it again.

Step 2 — Assign your WABA to the System User

  1. Still in Business Manager → Accounts → WhatsApp Accounts.
  2. Click your WABA → Add People / Assign.
  3. Select the XSender API System User → permission: Full Control → Assign.

Without this step the token cannot send messages from your WABA — even though it's a valid token.

Step 3 — Find your two IDs

Open developers.facebook.com/apps → your App → WhatsApp → API Setup. The page shows:

Copy both.

Step 4 — Add the gateway in XSender

  1. Open Admin Panel → Gateway → Messaging Gateways → WhatsApp Cloud APIs.
  2. Click the Add Manually button at the top-right.
  3. Fill in the modal:
  4. Click Save. The gateway appears in the list with status Active.

The rate-limit fields above are conservative defaults. Increase them once you have warmed up your number with real traffic. Lower means slower but safer; higher means faster but more likely to trip WhatsApp's anti-spam.

Step 5 — Configure the Meta webhook (one-time)

This is required for delivery + read receipts to appear in XSender.

  1. Open the XSender WhatsApp Cloud APIs page — note the two values shown at the top: Webhook Callback URL and Webhook Verify Token.
  2. In Meta Developer Portal → your App → WhatsApp → Configuration → Webhooks → click Edit.
  3. Paste the Callback URL and Verify Token from XSender into Meta's fields. Click Verify and Save.
  4. Click Manage next to Webhook fields and subscribe to these events:

Step 6 — Send a test message

  1. Communication → WhatsApp → Send.
  2. Pick the new gateway from the dropdown.
  3. Enter your own WhatsApp number (in international format, e.g. +15555550123).
  4. Body: "Hello from XSender".
  5. Click Send. The message should arrive on your phone within 1–2 seconds.
  6. The dispatch log in XSender will flip pending → sent → delivered → read (once you open the message on your phone).

Troubleshooting

SymptomLikely causeFix
"Embedded signup is only available for BSPs or TPs"You clicked the wrong buttonUse Add Manually, not Connect via Embedded Signup.
Save returns "Invalid OAuth access token"Token was copied incompletely, or the System User was not assigned to the WABARe-generate the token (Step 1) and confirm the WABA assignment (Step 2). Tokens are usually 200+ characters.
Send returns "(#100) The parameter messaging_product is required"Phone Number ID belongs to a different WABA, or the number is not yet registeredRe-check Step 3 values in Meta Developer Portal → WhatsApp → API Setup.
Send returns "Recipient phone number not in allowed list"Your Meta App is in Development modeMeta Developer Portal → your App → App Mode → switch to Live. Note: requires a Privacy Policy URL.
Webhook verification fails in MetaCallback URL not reachable, or Verify Token mismatchedConfirm https://yourdomain/api/whatsapp/webhook returns 200 in a browser. Re-copy the Verify Token exactly — no leading/trailing spaces.
Status stays at sent, never advances to delivered or readWebhook not configured, or required fields not subscribedRe-do Step 5 and tick message_status.

After setup — what to do next

What this setup does NOT use