WhatsApp Trigger - Bad request on startup, never enters listening mode

[BUG] WhatsApp Trigger — “Bad request - please check your parameters” on startup, never enters listening mode
Environment

  • n8n version: 2.23.3
  • Installation: npx n8n (Node.js, Windows)
  • OS: Windows 11
  • Tunnel: ngrok (ngrok-free.app)
  • WhatsApp node: WhatsApp Trigger (official n8n node, version 1 latest)
  • Credential type: WhatsApp OAuth
    Problem description
    When I click “Test this trigger” on the WhatsApp Trigger node, the workflow immediately throws the error “Bad request - please check your parameters” without ever entering listening mode (“Waiting for trigger event…”). The node never registers the webhook.
    Terminal logs
Bad request - please check your parameters
Bad request - please check your parameters
Database connection timed out
Database connection recovered
Bad request - please check your parameters
Received request for unknown webhook: The requested webhook "26ac6c82-dd08-40c3-a624-5805b663b1ab/webhook" is not registered.
404 The requested webhook "26ac6c82-dd08-40c3-a624-5805b663b1ab/webhook" is not registered.
Bad request - please check your parameters

What I have already tried

  • Verified credentials: WhatsApp OAuth connection test returns “Connection tested successfully” :white_check_mark:
  • Configured webhook URL + Verify Token in Meta Developer Console
  • Tried clicking “Test this trigger” before clicking “Verify” in Meta
  • Restarted n8n with npx n8n start
  • Confirmed ngrok is online and forwarding to localhost:5678
  • Confirmed n8n also exposes its own ngrok tunnel on the same port (possible conflict?)
    Suspected cause
    I noticed n8n exposes its own ngrok tunnel AND I was running a separate ngrok instance on the same port 5678 simultaneously. Could this conflict cause the “Bad request” and database timeout issues?
    Question
    Is the “Bad request” triggered by n8n trying to register the webhook with Meta and failing? If so, what exactly does n8n send to Meta at that moment, and what could cause Meta to reject it?
    Any help appreciated, thank you! French answers will be also appreciated

Close your manual ngrok terminal completely. Let n8n handle it by starting n8n with the tunnel flag:

npx n8n start --tunnel

This should fix it, if any error I would be happy to help for that as well

Hi @Samuel_Kponzot

The “Bad request” error you’re seeing is actually a failed “handshake” between n8n and Meta. When you test the trigger, n8n tells Meta, “Please send my messages to this web address.” Meta immediately tries to call that address to verify it’s real. If Meta doesn’t get the exact right response back instantly, it rejects the connection, and n8n shows you that generic “Bad request” message.

Your logs show that Meta is actually reaching your computer, but n8n is rejecting the call as an “unknown webhook.” This happens because n8n is confused about its own identity. It hasn’t finished registering the webhook yet, so when Meta calls to verify it, n8n doesn’t recognize the request and hangs up on Meta, which causes the registration to fail.

The root cause is that you have two different “tunnels” (n8n’s built-in one and your manual ngrok one) fighting over the same port. It’s like having two different front doors to the same house; the system doesn’t know which one to use. This conflict is not only breaking the WhatsApp connection but is also causing the “database timeout” errors because your network connection is becoming unstable.

To fix this, you need to simplify your setup. Turn off n8n’s built-in tunnel and use only your manual ngrok link. Most importantly, you must explicitly tell n8n exactly what that ngrok address is by setting a WEBHOOK_URL environment variable. This ensures n8n gives Meta the correct address and recognizes the verification call when it arrives.

PowerShell: $env:WEBHOOK_URL="https://your-ngrok-subdomain.ngrok-free.app/"
CMD: set WEBHOOK_URL=https://your-ngrok-subdomain.ngrok-free.app/

Welcome @Samuel_Kponzot

From what you described and the logs you shared, the problem is not the WhatsApp Trigger node itself but how the webhook and tunnels are set up around it.

The most likely root cause is the double-tunnel setup: you are running your own ngrok on port 5678 while n8n also starts its own tunnel on the same port, so Meta does not have a single, stable HTTPS URL to talk to and the webhook registration fails immediately with “Bad request - please check your parameters”. When you click “Test this trigger”, n8n calls the Meta API to subscribe your app to WhatsApp events using the webhook URL it knows about, but if that URL does not match the one configured in the Meta Developer Portal (or it points to the “other” tunnel), Meta rejects the request and n8n shows the generic Bad request error.

I would suggest these concrete steps:

  • Stop your separate ngrok process and let n8n manage the tunnel on its own, or do the opposite (use only your own ngrok URL and disable the n8n tunnel) – but never both at the same time.

  • In the Meta Developer Portal, make sure the webhook is configured under the “WhatsApp Business Account” product and that the callback URL is exactly the HTTPS URL that n8n (or your single ngrok instance) exposes.

  • Use the Graph API Explorer on phone_number_id/subscribed_apps to confirm that your app is actually subscribed to your phone number; if the response is empty, you need to POST to that endpoint to subscribe it before the trigger can enter “listening mode”.

Once you have a single tunnel, the correct product selected and the app properly subscribed, the WhatsApp Trigger should move from “Bad request” to “Waiting for trigger event” when you test it.

Thank you very much for your help, and yes I still got the same error message despite that

Thank you very much, I’ll try it and get back to you.

Oh I am so sorry it didn’t work, after entering the command,
Delete the WhatsApp Trigger node from your canvas completely, save the workflow.
Refresh your tab and then add a brand new WhatsApp Trigger node back onto the canvas.
Open the WhatsApp Trigger node.
Ensure your credentials pass the connection test.
Do not click verify in Meta yet.

  • Click Test step or Listen for test event inside n8n first. The UI should now cleanly spin into a waiting state because there are no network/port collisions.
  • While n8n is spinning and actively listening, trigger a test message from a real phone number to your WhatsApp Business number, or manually paste n8n’s provided URL/Token into Meta’s dashboard to complete the validation handshake.

Check if this works :smiling_face:

Should I also create a new Meta app?

No, you shouldn’t create a new Meta app. :smiling_face:

So if I understand correctly, I delete the first node and then create a new one and test again?

If that’s it, I just did it and unfortunately it still didn’t work

I am extremely sorry T-T, but the solutions given by @nguyenthieutoan and @kjooleng should work, till then I will find more solutions.

@Samuel_Kponzot one thing to double-check: when you run npx n8n start --tunnel, n8n generates a brand new tunnel URL each time. You need to go back to the Meta Developer Portal and update the callback URL there with this new URL - it won’t match your old ngrok address anymore. When n8n starts with the tunnel, look in the terminal output for the tunnel URL (something like https://xxxx.hooks.n8n.cloud/) and paste that into the WhatsApp webhook callback field in Meta, then click Verify and Save. If the URL in Meta still points to your old ngrok address, Meta will keep rejecting the handshake regardless of what n8n is doing.

Welcome to the n8n community @Samuel_Kponzot
please always keep your instance updated to the stable version, 2.23.4, check if the callback URL in Meta is exactly the same as displayed by the WhatsApp Trigger, Verify Token the same in n8n and in Meta, and if the Meta App has the WhatsApp/Webhooks product configured with correct permissions.

according to the documentation, this is an error in the parameters

I have a fix that might work:

ngrok http 5678

copy the secure URL generated by ngrok (it must start with https://)

Start n8n with the WEBHOOK_URL variable,
CMD:

set WEBHOOK_URL=https://1234-abcd.ngrok-free.app/
npx n8n start

Powershell:

$env:WEBHOOK_URL="https://1234-abcd.ngrok-free.app/"
npx n8n start

Open your local n8n panel (http://localhost:5678).
Open your workflow and look at your WhatsApp Trigger node.
Because you set the environment variable, n8n will now dynamically generate a Webhook URL that hopefully starts with your ngrok address instead of localhost.
Copy this new https:// webhook URL and the Verify Token from the node.
Go to your Meta App dashboard, then WhatsApp, then to configuration.
Paste the new ngrok-based webhook URL and the verify token.
Click save and verify, meta will send a test ping, ngrok will forward it, n8n will recognize its own URL, and the verification will hopefully succeed.

Hopefully this helps you

@Samuel_Kponzot To be clear: n8n tunnel (–tunnel) can be unreliable on self-hosted local installs, and, as you’ve noted, is not officially supported for production. The ngrok approach is heading in the correct direction, but there’s something else to look at. Meta requires a specific confirmation challenge value in the response to a GET request to the webhook verification URL. If Meta’s verification ping attempts to contact your ngrok URL and n8n is not yet fully up and running at that moment, or if the WEBHOOK_URL env var is not set prior to n8n, Meta’s verification ping will return a bad request.

Additionally, Meta’s webhook URLs may require there not be a trailing slash in certain configurations. If you keep receiving bad requests, try both ways with https://your-ngrok-url.ngrok-free.app/webhook/… as well as with and without the trailing slash.

The “tunnel stays on localhost” part is the key clue. The built-in --tunnel sometimes does not generate the hooks.n8n.cloud URL reliably, and even when it does, Meta needs the publicly reachable HTTPS callback, so the cleaner path is to run your own ngrok and tell n8n about it explicitly, which the reply above lays out.

The piece people miss: starting ngrok is not enough, you have to set WEBHOOK_URL to the ngrok https URL before starting n8n, otherwise n8n keeps building callback URLs on localhost and Meta rejects them as a Bad Request. So: ngrok http 5678, copy the https URL, set WEBHOOK_URL to it, then start n8n, then open the WhatsApp Trigger and the callback it shows you should now be the ngrok URL, and that is the one to paste into the Meta portal.

One catch with free ngrok: the URL changes every restart, so every time you restart you have to update WEBHOOK_URL and re-paste the callback in Meta, which is why this is painful for anything beyond testing. For something a client relies on, moving n8n to a host with a real domain and HTTPS removes the tunnel dance entirely. Are you doing this for testing, or does it need to run continuously? That decides whether ngrok is fine or you want a proper host.

Thank you very much for your response and your time ! I will try this and i’ll tell you