webhook.co vs ngrok
ngrok is a gateway. We are a queue with an inspector attached. That one sentence decides almost every case, and most of the internet's advice about ngrok is several years out of date.
Claims about ngrok verified against their own documentation on . Sources below.
webhook.co is pre-launch. Our prices and retention windows below are published, not yet purchasable.
Why people compare these two
If you are here, it is probably not because ngrok is bad at its job. The failure that sends people looking is the one where a provider retries a webhook at 03:00, the laptop is shut, and the event is simply gone — there is no queue behind the tunnel to have caught it. There is a quieter version too: going back for the payload of a request from last Tuesday and finding that the free plan keeps a day of traffic, and only metadata unless somebody had already turned on full capture.
The question that separates these two tools is not speed, price, or URL stability. It is what happens to an event when the thing meant to receive it is not there. ngrok answers that question honestly and in its own error catalogue: when the agent serving an endpoint is not running, the request fails with ERR_NGROK_3200 and the provider sees a failed delivery. There is no buffer to drain when you come back. That is not an oversight — a gateway's job is to route what is happening now, and ngrok's entire traffic-policy action catalogue is built for inspection, authentication and transformation at the edge, with nothing in it that stores an event for later. We do the other job: accept the request, store it, and let you replay it into a handler you are still writing, days later.
At a glance
| Capability | ngrok | webhook.co |
|---|---|---|
| Holds an event while you are offline | No — the request fails with an endpoint-offline error | Yes — accepted, stored, replayable |
| Request bodies stored by default | No — metadata only until Full Capture is enabled | Yes |
| Capture size limit | 10 KB stored, and a truncated request cannot be replayed | 1 MiB, and a larger request is rejected with a 413 |
| Inspection retention | 24 hours free, 72 hours paid; up to 90 days purchasable on pay-as-you-go | 7 days Free, 30 Pro, 90 Scale |
| Provider signature verification | 69 providers listed; docs say 70+ | 141 providers |
| Free plan request allowance | 20,000 HTTP requests/month, 500 webhook verifications/month | 5,000 captured events, once, then capture pauses |
| Stable URL on the free plan | Yes — an assigned dev domain that cannot be changed | Yes — a permanent ingest URL |
| Licence of the receiving path | Agent and cloud service source not published; SDKs are open source | Apache-2.0, engine included |
| Outbound delivery with retries | Not offered | 8 attempts over ~28 hours, then dead-letter |
Three things about ngrok that used to be true
Most comparison pages you will find about ngrok are repeating a version of it that no longer exists, so it is worth clearing this up before anything else — including the parts that make us look worse. Your free URL does not rotate any more: every account, free included, gets an automatically assigned dev domain that ngrok's own documentation says cannot be changed. Free endpoints do not time out; ngrok's free-plan limits page says so in bold, and points out you can run one as a background service indefinitely. And ngrok does verify webhook signatures — a verify-webhook traffic-policy action with a provider list of 69 entries at the time of writing, timestamp tolerance for replay protection, and a 403 on failure. If you picked us because you read that ngrok gives you a URL that changes every restart, you picked us for a reason that stopped being true.
What each tool does when your service is down
Point a provider at an ngrok endpoint and stop the agent. The next delivery gets an endpoint-offline error, the provider marks it failed, and whether you ever see that event again depends entirely on that provider's own retry policy — some retry for days, some retry three times, some never. ngrok's documented remedies are to start the agent, pin a URL, enable endpoint pooling or check the dashboard — recover the connection, rather than recover the traffic that arrived without one. Point a provider at us and stop your handler. The request is still accepted and stored, and you replay it when you are ready. Our outbound side retries eight times over roughly twenty-eight hours with jitter before dead-lettering, so a destination that is down for an afternoon does not lose anything.
Inspection, retention, and the 10 KB line
Both tools let you look at a request and send it again, and the differences are in the defaults. ngrok's cloud inspector keeps traffic for 24 hours on Free and 72 hours on its paid self-serve plans, and pay-as-you-go customers can buy an add-on extending that to 90 days — which matches our longest published window, so the ceiling is a tie rather than the gap the free tiers suggest. By default it stores only metadata about each request — headers and bodies require turning on Full Capture for the whole account, which their own docs warn also exposes that data to everyone on your team. Once on, capture truncates at 10 KB, and a truncated request cannot be replayed at all. That last detail matters more than it sounds: a Shopify order payload or a fat Stripe invoice can cross 10 KB without trying. We store the whole body by default and keep it for the retention window on your plan, because inspecting the payload is the product rather than a mode you switch on. Our limit is a different shape and worth stating plainly: we accept bodies up to 1 MiB and reject anything larger with a 413, so where ngrok would truncate a very large payload and still deliver it, we refuse it outright. Above 1 MiB their behaviour is better than ours.
Signature verification, and how far the lists go
This is a real comparison rather than a walkover. ngrok verifies at its edge, which is genuinely better placement than verifying in your own process — bad signatures never reach your compute. Their supported-provider table listed 69 entries when we counted it on the date below. Our registry covers 141 providers and is Apache-2.0, so you can read exactly how each one is verified rather than trusting that it is. The gap is the long tail: PayPal, Adyen, Salesforce, Discord, Vercel and Notion were all absent from ngrok's list on the date we checked. If your provider is on both lists, this row is a tie and you should decide on something else.
What ngrok does better
Getting traffic into a network that blocks inbound connections. An outbound-only agent inside your firewall, your Kubernetes cluster or a customer's VPC is a structural advantage that a hosted receiver cannot replicate, and ngrok markets that pattern deliberately. It is also not only a webhook tool: TCP, TLS and SSH ingress, an API gateway, OAuth and mutual-TLS enforcement, a web application firewall and rate limiting all sit in the same traffic policy, so if you already need a gateway then verification comes along free. It runs almost anywhere — five agent SDKs and builds down to unusual architectures — and it has the enterprise paperwork, the procurement process and the decade of production use that we plainly do not. If your problem is reaching a machine rather than keeping an event, ngrok is the right tool and we are not.
Where we fit instead
When the event has to survive you: a handler you are still writing, a laptop that closes, a deploy that fails. When you want the payload itself kept and searchable rather than a metadata trace of it. When you want the same capability from a CLI, a REST API, a dashboard and an MCP server without one of them being a second-class citizen. And when you would rather read the verification code than be told it works — the whole engine is Apache-2.0.
Moving from ngrok
Run both for a day
You do not have to cut over to find out. Most providers let you register a second endpoint, so add an ingest URL alongside your ngrok endpoint and leave them both running. You will be comparing the same real traffic in two inspectors, which is the only comparison that settles anything, and you can drop whichever one you like less at no cost.
Swap the command, keep the loop
The local development loop is the same shape. Where you ran ngrok http 3000 and copied the forwarding URL, you run wbhk listen --forward localhost:3000 against an ingest URL that already exists and does not change. The difference you will notice first is that closing the terminal no longer loses anything: events keep arriving and are waiting when you start listening again.
What does not come with you
Traffic-policy rules have no equivalent here, and if you were using ngrok for OAuth, mutual TLS, IP restrictions or a web application firewall in front of your app, we do none of that — keep ngrok for it. Anything already in ngrok's inspector stays there; there is no export we can read.
Questions about ngrok and webhook.co
Does ngrok still give you a random URL that changes on restart?
No. Every ngrok account, including the free one, gets an automatically assigned dev domain, and ngrok's documentation says its URL cannot be changed. What a paid plan buys is the ability to choose the name, use wildcards, or bring your own domain. Comparison pages claiming otherwise are out of date.
Can ngrok verify a Stripe or GitHub webhook signature?
Yes. ngrok has a verify-webhook traffic-policy action that validates signatures at its edge, with timestamp tolerance for replay protection, and returns 403 when verification fails. Their supported-provider table listed 69 entries when we counted its rows on 22 July 2026.
What happens to a webhook if ngrok is running but my app is not?
ngrok returns an error to the provider and the delivery is marked failed. Nothing is buffered for you to collect later. Whether you get another chance depends on the sending provider's own retry schedule, which varies from days of retries to none at all.
Is the ngrok free plan enough for webhook development?
For occasional debugging, comfortably. Its published free-plan limits include 20,000 HTTP requests and 500 webhook verifications a month, one user, 1 GB of data transfer and 10,000 logged events. Traffic retention on that plan is 24 hours, which is documented separately on their traffic-inspection page.
Sources, and how to correct us
Every claim above about ngrok was read off the pages below on the date shown, not from memory. Products change faster than pages do — if something here is wrong or out of date, including if you work at ngrok, tell us and we'll fix it.
- ngrok error reference — ERR_NGROK_3200 — checked
- ngrok docs — traffic inspection — checked
- ngrok docs — verify-webhook traffic policy action — checked
- ngrok docs — free plan limits — checked
- ngrok docs — domains — checked
- ngrok docs — agent SDKs — checked
- ngrok docs — traffic policy actions — checked
Other comparisons
Point a webhook at it. Watch it land.
Start free: a permanent URL, full inspection, one-command replay — and outbound delivery, because every feature is on every plan. Move up when you need more events.