The quickest way to forward webhooks to localhost from the command line is a tunnel CLI. Install the Hooklistener CLI, run hooklistener login once, then hooklistener tunnel --port 3000. You get a public HTTPS URL that forwards each request to your local server and keeps a copy you can inspect and replay.
Stripe, GitHub, Shopify, Twilio — any provider can deliver webhooks to your local dev server. On paid plans your subdomain is persistent: configure it once in Stripe and it stays the same every time you restart the tunnel. Looking for a comparison? See how Hooklistener compares to ngrok.
Hooklistener tunnels are integrated with the full webhook debugging platform. Every request is captured, searchable, and replayable.
Reserve a subdomain like my-api.hook.events. It stays the same across restarts — configure Stripe once and forget about it.
Every request through the tunnel is captured with full headers, body, and timing. Search and filter from the dashboard.
Missed a webhook while your server was down? Fix the bug and replay the exact request from your history.
Request history is retained — not just while the tunnel is running. Come back tomorrow and your payloads are still there.
Share tunnel URLs and captured requests with teammates. Role-based access keeps secrets masked.
HTTPS everywhere. TLS terminates at the edge so your local server can run plain HTTP. All traffic encrypted in transit.
The biggest pain with ngrok's free tier is URL resets. Hooklistener solves this with static subdomains like my-api.hook.events that survive restarts.
With ngrok free, every restart generates a new URL — and you have to update Stripe, GitHub, or whatever provider you configured. With a persistent subdomain, your webhook URL stays the same forever.
Hard-code the tunnel URL in your test harness or staging environment. It never changes, so your automated tests and CI pipelines keep working across restarts.
Give your persistent URL to a teammate or paste it in docs. It resolves to whoever is running the tunnel, making pair debugging straightforward.
Every webhook provider has a settings page where you paste the endpoint URL. With a persistent subdomain, you touch that page once — not every time you restart your dev server.
Four commands from install to receiving your first webhook locally.
Install Hooklistener globally with npm. Works on macOS, Linux, and Windows.
Log in once to link the CLI to your account. Anonymous tunnels work without login, but you need an account for persistent subdomains.
Point the tunnel at your local port. You get a public HTTPS URL immediately. Every request is captured in your dashboard.
Paste the tunnel URL into Stripe, GitHub, Shopify, or any webhook source. With a persistent subdomain, you only do this once.
Checked September 2026
All four commands forward webhooks to a local port. They differ in which URL the provider sees and what happens to a request after it arrives.
| Criteria | hooklistener tunnel | hooklistener listen | ngrok http | hookdeck listen |
|---|---|---|---|---|
| Command | hooklistener tunnel --port 3000 | hooklistener listen YOUR_ENDPOINT_SLUG --target http://localhost:3000 | ngrok http 3000 | hookdeck listen 3000 <source> |
| URL you give the provider | Random hook.events subdomain on Free; a static subdomain on paid plans | Your hosted endpoint URL, which doesn't change, on Free too | 1 static dev domain on Free | A permanent event URL per source |
| When your machine is offline | Requests aren't delivered while the tunnel is closed | The endpoint still captures requests; replay them later | Requests aren't delivered while the agent is stopped | Not documented |
| History and replay | Stored in the cloud: 1 day on Free, up to 90 days on Scale; replay to localhost | Stored in the cloud: 1 day on Free, up to 90 days on Scale; replay to localhost | Traffic Inspector, 24-hour retention on Free; replay needs opt-in Full Capture | CLI Events page and local retry (not in guest mode) |
| Free tier | 1 CLI tunnel at a time, 50 stored requests | 1 hosted endpoint, 50 stored requests | 20,000 HTTP requests/mo, 1 GB transfer; interstitial page on HTTP endpoints | Developer plan: 10,000 events/mo, 3-day retention |
| Pick it when | You want a public URL for a local port right now | You want a provider URL that never changes and no lost webhooks | You also need TCP/TLS tunnels or non-webhook traffic | You already route production events through Hookdeck |
Sources: ngrok pricing, ngrok Traffic Inspector, Hookdeck CLI docs, Hookdeck pricing, Hooklistener pricing.
Move from one-off bins to a production-grade webhook platform with replay, forwarding, and monitoring built in. Compare features side-by-side and migrate in minutes.
Persist webhook history for 14+ days, search instantly, and replay to any environment.
Send events to QA, staging, and production with conditional routing and transformations.
Invite collaborators, mask secrets, and stay audit-ready—no public bins or shared tokens.
How does this compare to ngrok?
ngrok's Free plan includes one static dev domain and keeps Traffic Inspector data for 24 hours. Hooklistener adds persistent subdomains on paid plans, built-in webhook inspection, replay, and team sharing — included in the platform.
Can I use this for production traffic?
Tunnels are designed for development and testing. For production webhooks, use a Hooklistener endpoint directly — no tunnel needed.
Is there a bandwidth or request limit?
Free tunnels have generous limits for development use. Paid plans raise those limits and add persistent subdomains with extended retention.
One command to connect
Connect Claude Code, Cursor, or Codex to the MCP server and your agent gets 67tools for webhooks, replays, email inboxes, real-time endpoints, and tunnels. You get the same data live in the dashboard.
Free plan includes MCP access. No credit card required.