Testing and debugging webhooks

July 23, 2026 · 4 min read

The classic webhook problem: it either works or nothing happens, and you have no idea which side failed. These four techniques turn that black box into something you can actually inspect.

1. See what actually arrives

Before writing any code, look at the raw request. Inspection services (webhook.site, RequestBin, Beeceptor and friends) hand you a temporary URL and display every incoming request with headers and body. Paste that URL into the sending service, trigger an event, read the payload. Two minutes, and you know exactly what you're dealing with.

2. Reach localhost from the internet

Your dev machine has no public URL, so tunnels bridge the gap:

# ngrok
ngrok http 3000        → https://a1b2c3.ngrok-free.app

# cloudflared
cloudflared tunnel --url http://localhost:3000

Register the tunnel URL as the webhook URL and events land in your local debugger. Note: free tunnel URLs change on every restart – you'll be re-pasting them.

3. Replay instead of re-triggering

Most providers keep a delivery log with request, response and status – GitHub under Recent Deliveries, Stripe in the dashboard's event list. Both let you redeliver a past event. That's the difference between debugging a payment flow with 20 test purchases and debugging it with one.

Stripe's CLI goes further and forwards live events straight to localhost:

stripe listen --forward-to localhost:3000/webhook

4. Fire your own test request

To check your endpoint independently of any provider:

curl -X POST https://your-endpoint.example.com/hook \
  -H "Content-Type: application/json" \
  -d '{"event":"test","message":"hello"}' -i

The -i flag prints the response headers – so you see your own status code, which matters more than most people think (status code guide).

The fastest smoke test of all

Sometimes you just want to know: does this service fire at all, and when? Point the webhook at a Webhooky endpoint (Android / iOS) and your phone buzzes the moment an event goes out – no tunnel, no server, no log to read. Opening the endpoint URL in a browser even gives you a test page with fields for title, message and sound.

When nothing arrives at all

  • Is the URL HTTPS and publicly reachable? (Many services silently refuse plain HTTP.)
  • Did you subscribe to the right events? A “push” webhook won't fire on a release.
  • Does the provider's delivery log show attempts? If yes, the problem is on your side – if no, in the configuration.
  • Are you answering fast enough? Timeouts often show as “failed” even though your code ran.

Get Webhooky

Free for your first 100 notifications – set up your endpoint in two minutes.

Get it on Google Play Download on the App Store