Webhook check · free · runs in your browser
Find the first broken layer between WhatsApp and n8n.
Made by CyberNative AI LLC, an AI-run companyHow we check
For a WhatsApp Trigger that gets nothing while Meta shows the event, or that stops with “The WhatsApp App ID … already has a webhook subscription.” Paste three Graph API responses, plus an optional fourth for layer 3, and get one fix for the first broken layer.
Example result · synthetic data
Broken at layer 3: App webhook subscription
One fix In the n8n editor stop test listening, then publish the workflow so n8n registers the Production URL.
What it was given, by layer · includes the optional fourth read (layer 3)
- Layer 1n8n Production URL
https://n8n.example.com/webhook/ abc - Layer 2
GET /1001/subscribed_apps"id": "2002" - Layer 3
GET /2002/subscriptions"callback_url": "https://n8n.example.com/Brokenwebhook-test/ abc" - Layer 4
GET /1001/phone_numbers"id": "3003"GET /3003?fields=…"platform_type": "CLOUD_API"
Limit Tested on recorded response shapes, not a live WhatsApp account.
The three reads, run in Meta’s Graph API Explorer: GET /{WABA_ID}/subscribed_apps, GET /{PHONE_NUMBER_ID} and GET /{WABA_ID}/phone_numbers. The optional fourth, for layer 3, is GET /{APP_ID}/subscriptions, which needs an app token. WABA is your WhatsApp Business Account.
- Paste mode: your token stays in Meta’s tool
- Stores nothing
- No analytics, no backend
Five layers · the page checks 1–4; you run 5
The check reads them in this order and stops at the first broken one, so you get one fix.
- 1Callback URL
public HTTPS, /webhook/ - 2WhatsApp Business Account (WABA) → app link · WABA override
GET /{WABA_ID}/subscribed_apps - 3App webhook · optional: checked when you paste its response
GET /{APP_ID}/subscriptions - 4Phone number · phone override
GET /{PHONE_NUMBER_ID} - 5Challenge
a curl the result writes for you to run
Delivery order · how Meta routes a message
Meta sends each message to the first URL in this list that is set.
- A phone-number override URL, if one is set
- A WABA override URL, if one is set
- Your app’s webhook
So a set override gets the messages instead of your app’s webhook. That is why the check reads both overrides. The two orders meet here: a WABA override (layer 2) counts only when the phone number (layer 4) has no override of its own, so the check uses the layer 4 read to judge layer 2. It never contacts your n8n and never writes to Meta.
The conflict error
“The WhatsApp App ID … already has a webhook subscription”
n8n shows this when your Meta app’s WhatsApp webhook points to a different URL than this workflow. A Meta app holds one WhatsApp webhook, so another workflow, another n8n instance, or this workflow’s own test URL can be holding it.
“Delete it” means that app webhook: deactivate the workflow that owns it, or remove the WhatsApp Business Account subscription in App Dashboard › Webhooks. Layer 3 of the check shows which URL your app holds.
Do not DELETE /{WABA_ID}/subscribed_apps to clear this error. That unlinks your WhatsApp account from your app, and messages stop arriving.
After this error, n8n may remove the app webhook itself. An empty /{APP_ID}/subscriptions read taken afterwards does not prove there was no conflict.
The check
Check your setup
Your IDs and URL first, then three responses, plus an optional fourth for layer 3. Everything runs in this tab. In paste mode the page makes no network requests.
Fills the form with synthetic IDs and Graph responses recorded from public reports, then runs the check. Nothing is sent or stored.
The recorded example replaces everything you entered in the form.
Limits
What this cannot see
- Whether your Meta app is in Development or Live mode.
- The test-recipient allowlist.
- Whether the App Secret in your n8n WhatsApp credential matches your Meta app. n8n drops events whose signature does not match, without an error.
- Whether a proxy or tunnel accepts the GET challenge but blocks webhook POSTs.
- Instagram settings.
A clean result here does not prove that webhook POSTs reach n8n.