ngrok alternatives for webhook testing (2026)

ngrok is a tunnel: it relays live traffic to a local port and needs an account. Free alternatives: Cloudflare quick tunnels (cloudflared), localhost.run, localtunnel and zrok. If you only need to see what a sender posts, a no-signup request bin skips the tunnel.

ngrok shows up in every "test webhooks locally" tutorial ever written, so it's the tool most people reach for first. But ngrok is a tunnel, not a mailbox: it relays live traffic to your machine. That's a different category from a request bin, and picking between them changes your whole debugging workflow. This page explains both approaches, lists honest alternatives for each, and tells you when you want which.

What ngrok is

ngrok exposes a local port on a public URL. You run ngrok http 3000, point your webhook provider at the generated HTTPS address, and requests are forwarded through ngrok's network to your local server. You inspect traffic in its local web interface (traditionally on localhost:4040), which shows requests and responses and can replay them. The free tier requires an account and an authtoken, and your URL changes every time you restart — so you re-paste it into the provider dashboard each session. It's a mature, reliable product; the friction is the account requirement and the per-session URL, not the engineering.

Tunnel vs mailbox: two different tools

A tunnel drives your actual code. The request hits your local handler with your breakpoints, your logs, your database. This is what you want when you're iterating on the handler itself. The cost: your laptop must be on, the tunnel must be running, and the request is gone once it's served — there's no durable record to share with a teammate.

A mailbox (request bin) stores requests at a hosted URL. Nothing runs on your machine; you inspect method, headers, and body exactly as the provider sent them, whenever you like. This is what you want for "what does this provider actually send?", for capturing events you can't trigger on demand, or for sharing a capture with someone else. The cost: your code isn't in the loop until you replay or forward the request yourself.

Most real debugging sessions use both at different moments, so the useful question isn't "which is better" but "which one do I need right now".

The annoying part of tunnels for webhooks

Every tunnel shares the same workflow tax: the URL is random per session, so each morning starts with re-pasting an endpoint into Stripe, GitHub, or Shopify. Sender dashboards are slow to update, and some providers keep retrying deliveries to the old URL, so events look "lost" when they're really just addressed to yesterday's tunnel. If your integration work spans days, either pay for a persistent tunnel address or keep a bin URL configured in the provider and treat tunnels as the on-demand half.

Tunnel alternatives

  • Cloudflare Quick Tunnels — cloudflared tunnel --url http://localhost:3000. Free, no account, random trycloudflare.com URL on Cloudflare's edge network. Cloudflare's own docs scope quick tunnels to testing and development; named, persistent tunnels require a Cloudflare account.
  • localhost.run — tunnels over SSH: ssh -R 80:localhost:3000 localhost.run. Automatic TLS, no install, no signup — it uses the SSH client you already have.
  • localtunnel — npx localtunnel --port 3000. No account, open source, dead simple. The project sees little maintenance these days, but it still works.
  • zrok — open source, built on OpenZiti, with public and private sharing modes. The hosted service needs a free account (zrok invite); or self-host the whole stack if you'd rather own it.

All four get your local handler a public URL without ngrok's account requirement. Full walkthrough: test webhooks without ngrok.

The mailbox alternative

webhooks.sh's free bins at view.webhooks.page are the no-install, no-account option: create a bin, paste the URL into the provider, watch requests land live. Bins expire after 48 hours, so there's nothing to clean up. The bin also pairs well with the boring parts of webhook work: check a captured Stripe-Signature against the HMAC signature verifier, or generate a realistic signed test event with the payload generator when the provider's sandbox won't cooperate. Provider-specific gotchas live in the playbooks — Stripe, GitHub, Shopify.

The paid Solo plan ($12/month) covers the tunnel half too: the wsh CLI relays deliveries from a persistent endpoint to localhost and replays them on demand, with no inbound tunnel. With a free bin, pair it with one of the tunnels above when you need your code in the loop. webhook.site and requestbin.net are credible mailboxes too, covered in their own comparisons.

The comparison

TypeAccount neededInstall neededRequest inspection
ngrokTunnelYesYesLocal web UI with replay
cloudflared quick tunnelsTunnelNoYesNone built-in
localhost.runTunnelNoNo, SSH onlyNone built-in
localtunnelTunnelNoYes (npx)None built-in
zrokTunnel / sharingYes, hosted serviceYesWeb console
webhooks.shMailboxNoNoLive web UI, full headers/body

Features and pricing change fast; check each product's current pages before deciding.

Verdict

Pick a tunnel — ngrok, cloudflared, localhost.run, localtunnel, zrok — when you're iterating on handler code and need live traffic hitting your machine. cloudflared quick tunnels and localhost.run are the least-friction starting points; ngrok earns its keep if you want the polished inspection UI and don't mind the account.

Pick a mailbox when you need ground truth on the wire, a durable capture to share, or a sender-facing URL that works while your laptop is closed. That's the free bin at view.webhooks.page. On Solo the two approaches merge: the endpoint keeps collecting while your laptop is closed, and wsh listen catches up when you're back. On the free tier, the pragmatic stack is bin plus tunnel, and our local testing guide walks the whole loop.

Last updated

Try it in 10 seconds.

Create a free bin at view.webhooks.page — no signup, no install. Point your sender at the URL and watch requests land live. Bins expire after 48 hours.