If Webhook tests work in Meta but real WhatsApp messages never reach n8n, the problem is very likely that your WABA (WhatsApp Business Account) is subscribed to a DIFFERENT Meta App than the one where you configured the webhook.
This is extremely easy to miss.
Symptoms
-
WhatsApp “Test” button in Meta Webhooks works
-
You can see real messages in Meta event logs
-
Your webhook URL:
-
is public
-
accepts
POST -
returns
200 OK
-
-
BUT:
-
n8n never receives real messages
-
No executions appear in n8n
-
The Hidden Cause (this is the key)
A WhatsApp Business Account (WABA) can be subscribed to multiple Meta apps, but:
Real WhatsApp messages are delivered ONLY to the webhook configured on the app that is actually subscribed to the WABA.
In our case:
-
WABA was subscribed to App A (a DevX / test app)
-
Webhook was configured on App B (our real app)
-
Result:
-
Meta logs showed messages
-
But they were being routed to another app’s webhook, not ours
-
The Meta UI does not make this obvious.
How to Diagnose (100% deterministic)
Identify your WABA ID
You’ll see it in webhook payloads as:
entry[0].id
Example:
2198758223867330
Check which apps are subscribed to your WABA
Run:
curl -s "https://graph.facebook.com/v24.0/WABA_ID/subscribed_apps?access_token=YOUR_TOKEN"
If you see something like:
{
"data": [
{ "id": "2202427980234937", "name": "WA DevX Webhook Events 1P App" }
]
}
…and your app is NOT listed, then real messages will never reach your webhook, no matter how perfect your setup is.
The Fix (this is what actually solved it)
Generate a System User access token for YOUR app
Do not use:
-
Graph API Explorer token
-
Temporary “Getting Started” token
Instead:
-
Business Manager → System Users
-
Assign:
-
Your App
-
Your WABA
-
-
Generate token
Subscribe the WABA to YOUR app
curl -X POST "https://graph.facebook.com/v24.0/WABA_ID/subscribed_apps" \
-d "access_token=SYSTEM_USER_TOKEN_FOR_YOUR_APP"
Verify it worked
curl -s "https://graph.facebook.com/v24.0/WABA_ID/subscribed_apps?access_token=SYSTEM_USER_TOKEN_FOR_YOUR_APP"
Expected result:
{
"data": [
{ "id": "YOUR_APP_ID", "name": "Your App Name" }
]
}
(or multiple apps, but your app must be there).
Final Step (very important)
Make sure the webhook callback URL is configured on the SAME app that is now subscribed to the WABA.
Each app has its own webhook configuration.
Result
After subscribing the WABA to the correct app:
-
Real WhatsApp messages immediately started triggering n8n executions
-
No changes were required in:
-
n8n
-
reverse proxy
-
webhook URL
-
SSL
-
permissions
-
Takeaway
Seeing messages in Meta logs ≠ webhook delivery
Always check
/{WABA_ID}/subscribed_apps
This single endpoint would have saved days of debugging.
Hope this helps someone else ![]()