
We Ditched Ngrok for Cloudflared. It Cost Us 2 euros
We Ditched Ngrok for Cloudflared Tunnels. It Cost Us 2 euros.
For four years, the same command was typed into our terminal almost every morning.
ngrok http 80
It was normal for us to us it. Ngrok was the tool that made local development easy, offering instant tunnels, shareable links, and working webhooks. It was doing its job we never really thought about another solution.
As the team grew, we started to face its limitations. Not dramatically. Gradually. The kind of friction that you tolerate for months before you finally decide you are done tolerating it.
So we ran an experiment. Could we replace Ngrok, which starts at $8 a month billed annually on the Hobbyist plan and moves to $20 a month plus usage charges beyond that, with something better, for a one-time investment of 2€?
As we started digging, we went from a maybe, to an absolute yes! By a wide margin.
What Was Actually Broken
Before getting into the solution, it is worth being honest about the problem. Ngrok's free tier is useful for quick tasks. But when a project gets more serious, the limitations become a source of friction.
The biggest one is the URL. Every time an Ngrok tunnel restarts, it gets a new address. That sounds like a minor inconvenience until you realise what breaks alongside it: every webhook registered with Stripe, GitHub, or any external service becomes invalid. Each restart means logging into dashboards, updating endpoint URLs, and waiting for propagation. For a team running several integrations at the same time, this is not a minor inconvenience. It is a recurring tax on the working day.
Bandwidth caps compounded the problem. Testing anything with substantial data, like video, large files, or extended demo sessions, would eventually hit an invisible ceiling. Sometimes things would slow down. Sometimes they would simply stop.
The paid tier resolved both issues but introduced a different kind of discomfort. The Hobbyist plan sits at $8 a month billed annually, or $10 month to month. It covers one developer, up to 3 online endpoints at any time, and 5GB of bandwidth before usage credits start being consumed. For anything beyond solo use, the Pay-as-you-go plan starts at $20 a month and adds charges on top for bandwidth at $0.10 per GB, requests beyond 100k, and additional team members at $5 each. For a small team running several services, the bill can grow in ways that are not always easy to predict upfront.
We decided to look elsewhere.
The 2€ Entry Point
The misconception people have about Cloudflared and its services, including Cloudflared Tunnels, is that you need an expensive domain or a paid Cloudflare subscription. But this is not the case.
The only thing you need is a domain managed by Cloudflare's DNS. Nothing more, nothing less.
We bought the cheapest domain on the market, a .ovh extension from OVH.com for roughly 2€ per year. Then we changed its nameservers to point at Cloudflare. The action took us around five minutes. After the DNS promagation, that 2€ domain unlocked Cloudflare's tunnel infrastructure at no additional cost.
No monthly subscription. No bandwidth meter ticking in the background. Just a one-time registration fee for a domain we would have owned anyway.
What We Found on the Other Side
We were amazed of what Cloudflare offers on its free tier.
A single account supports up to 1,000 tunnels. Not one. Not three. One thousand. Every project, microservice, client demo environment could have its own permanent, named address like project-a.example.com, api.example.com, or staging.example.com, all running at the same time without any of them interfering with the others.
Bandwidth is unmetered for standard usage. The anxiety of watching a file transfer inch toward a cap simply goes away.
And perhaps, the most useful for teams running complex local setups is that a single tunnel can route traffic not just to different ports on one machine but to entirely different devices on the local network. A laptop, a test server, and a NAS can all be reached from the public internet through a single configuration file.
Here is an example of a tunnel yaml configuration file:
tunnel: <YOUR_TUNNEL_ID>
credentials-file: /path/to/your/credentials.json
ingress:
- hostname: dev-app.example.com
service: http://localhost:3000
- hostname: api.example.com
service: http://localhost:9000
- hostname: admin.example.com
service: http://192.168.1.100:8069
- hostname: storage.example.com
service: tcp://192.168.1.200:22
- service: http_status:404
One process. One configuration file. An entire local network is made accessible through named, stable addresses. The contrast with ngrok multiple terminal windows is huge.
In the following table you can find how the two options compare.
| Ngrok free | Ngrok Hobbyist ($8/mo) | Ngrok Pay-as-you-go ($20/mo+) | Cloudflare Tunnel (free) | |
|---|---|---|---|---|
| Online endpoints | 3 | 3 | Unlimited | 1,000 |
| Custom domains | No | Yes* | Yes | Yes |
| Stable URLs | No | Yes | Yes | Yes |
| Bandwidth | 1 GB | 5 GB then $0.10/GB via credit | 5 GB then $0.10/GB | Unmetered |
| Team members | 1 | 1 | 3 then $5 each | Unlimited |
| Annual cost | $0 | $96 | $240 and up | ~2€ |
*Custom ngrok domains for public endpoints
The One Thing Ngrok Still Does Better
We also need to point out some stuff that we will miss from Ngrok.
Ngrok provide a local dashboard at localhost:4040, that shows every incoming request in full detail: headers, body, and timing. It also offers the ability to replay any request with a single click. For debugging webhooks, this is extraordinarily useful. A failed Stripe event or a misbehaving GitHub action can be replayed instantly without having to trigger the original action again.
Cloudflare Tunnels have no equivalent. Traffic passes through cleanly, but there is no built-in window to inspect it.
Our workaround has been a combination of application-level logging and, for particularly tricky webhook debugging, routing through a dedicated inspection service. It works, but it adds a step that Ngrok makes effortless. If webhook debugging is a large part of your daily workflow, this gap is worth knowing about before making the switch.
What This Experiment Settled
Four years of habit is difficult to break. But after running both tools in parallel long enough to form an honest opinion, the conclusion was not close.
Cloudflare Tunnels are not a compromise or a budget alternative. They are a more capable tool, available at a fraction of the cost, with one meaningful limitation that affects a specific subset of use cases.
For a team that was looking at $96 a year at minimum on the Hobbyist plan, or an unpredictable monthly bill on Pay-as-you-go once bandwidth, requests, and team members started adding up, the switch freed up budget without giving anything meaningful back. The development workflow became more organised, with everything under real domain names, consistently available, and manageable from a single config file.
The 2€ domain is now one of the better small investments in our setup. The experiment is over. The switch is permanent.