Fix · WhatsApp Cloud API + n8n / Make
WhatsApp Cloud API webhook is active but no messages arrive
The problem
“The WhatsApp Trigger is configured for “Messages”, and the workflow is published, but incoming WhatsApp messages are not triggering any executions.”
Short answer: Check the chain in order. The app's webhook subscription for whatsapp_business_account must be active, include the messages field and point at your production URL, not a test URL. Your app must appear in the WABA's subscribed_apps. The phone number must belong to that WABA. The callback must answer the hub.challenge check. The app must be in Live mode, and you must message the real number. The doctor script reads the first four with the Graph API and tells you which one fails.
When the trigger says it is active but nothing arrives, the break is usually on the Meta side, and the dashboard doesn't show it in one place. In n8n, running manual tests on the trigger can also replace or remove the app level subscription, which is why the forum advice is to stop testing and read GET /{app-id}/subscriptions first.
Download
- wa_webhook_doctor.py: the read-only diagnostic (PASS or FAIL per check, with the fix)
- README.md: tokens, IDs, checks and limits
- whatsapp-cloud-api-webhook-not-receiving.zip: everything, including broken and healthy sample data and the offline test
Step by step
1. Stop manual trigger tests
While you debug, don't click test on the n8n WhatsApp Trigger. Its test cleanup can change the app level subscription you are trying to inspect.
2. Collect the IDs
App ID, WhatsApp Business Account (WABA) ID and Phone number ID from the Meta app dashboard, and the production webhook URL from your n8n trigger or Make webhook.
3. Set two tokens
META_APP_TOKEN is an app access token, used to read /{app-id}/subscriptions. META_SYSTEM_TOKEN is a system user token with whatsapp_business_management, used for the WABA calls. The script never prints them.
4. Run the doctor
Add --verify-token if you want it to probe your callback with a hub.challenge request.
python3 wa_webhook_doctor.py --app-id <APP_ID> --waba-id <WABA_ID> \
--phone-number-id <PHONE_NUMBER_ID> \
--expected-callback-url 'https://your-n8n/webhook/...' --verify-token '<token>'5. Fix the first FAIL
Common results: the callback points at a /webhook-test/ URL or another workflow, messages is missing from the subscribed fields, or the app is missing from the WABA's subscribed_apps.
6. Re-subscribe if needed
If the app is missing from the WABA, re-run with --apply. It only calls POST /{waba-id}/subscribed_apps and never deletes anything.
7. Check the two things no API shows
Confirm the app is in Live mode, and send from a normal phone to the real business number, not the test number.
What this does not cover
- Tested offline against sample responses only, not against the live Graph API. The Graph version is a flag (default v21.0).
- It cannot change the app level callback URL. Re-save the webhook from n8n, Make or the Meta dashboard for that.
- It reads only the first page of phone numbers on the WABA.
Want this done for you?
Kingdom of Kumar runs it for $500/month, first automation live in 48 hours. Claude + Grok Bot + $500/month (my fee). Email me the task you hate doing every week.