Decomposing a $46K Vercel bill: what would it cost to self-host
A viral app hit 450 million pageviews and got a $46,485.99 invoice from Vercel. I modeled how much it would cost when using CDN and self-hosting.
In February, Riley Walz shipped Jmail - a satirical, Gmail-shaped site riding the Epstein-files release. It went off. Once it is crossed 450 million pageviews, and Riley published his article: Vercel On-Demand Charges reading whopping $46,485.99.
Jmail has crossed 450M pageviews, and our Vercel bill has exploded, even after tons of cache mitigation.
— Riley Walz (@rtwlz) February 9, 2026
Many kind people chipped in to cover the bill, but it’s not sustainable. What are solid, cheaper alternatives? pic.twitter.com/zzumW8VK6V
To Vercel's credit, their CEO of Vercel Guillermo Rauch replied offering to cover it personally, and noted Jmail had become the "609th highest-traffic app on Vercel" - the kind of scale he said usually only shows up from large enterprises.
That says volumes. Jmail didn't do anything wrong; it just worked, and the pricing model and success turned working essentially static website into a five-figure invoice. The X/Twitter replies filled up with the same instinct from a hundred engineers: put Cloudflare in front, run a VPS, this should cost a couple hundred bucks. One person guessed ~$200/mo on Cloudflare. Somebody offered a $50 VPS plus caching. A few pointed at Hetzner and said a single server would easily handle it.
Here's what worried me: nobody actually made the breakdown. Someone from Cloudflare literally had to ask the author how the $46K split - bandwidth vs requests vs functions. The whole thread was estimating from a total.
So I've done the thing the thread didn't. I decome here a bill where it comes from, then model the same 450M pageviews on hardware you could actually rent. (Disclosure: I am building DollarDeploy and we are helping companies self-host their apps with a Vercel-like deployment experience.)
Why can serverless bill explode
Vercel's Pro plan is $20/user/month, and that number is not the problem when you work alone. The problem is three pay-by-request features that scale with traffic:
- Fast Data Transfer. You get 1 TB included, then it's $0.15/GB. That's $150 per additional TB.
- Edge Requests. 10M included, then $2 per 1M. Every request - including a lot of your static assets - counts.
- Function Invocations. From $0.60 per 1M on Fluid Compute. Every server side rendering, every API hit, every piece of middleware.
Now you can image how it can go wrong. A viral static-ish app is mostly cache hits and reads. But on a per-request, per-GB, per-invocation model, "mostly cheap operations, 450 million times" is exactly how you can get a $46k invoice. One person put it well in the thread: it becomes a huge tax on success somewhere past ~100–150M views/month.
Unfortunately, I have not seen Jmail's itemized bill. Neither did anyone dispensing advice. So everything below is a model built from published pricing - not a claim about Riley's exact line items. If you've got the real breakdown, I'd genuinely like to see it.
What 450M pageviews actually moves
Start with bytes, because bandwidth is the scariest-sounding line and the easiest to tame.
Say each pageview delivers ~100 KB over the wire - reasonable for an HTML-forward app whose static assets get cached. (Jmail is heavier in places and lighter in others; so putting 100 KB as a reasonable average.)
- 450,000,000 pageviews × 100 KB ≈ 45 TB delivered to browsers.
On Vercel, past your 1 TB that's 44 TB × $150/TB - on this model, ~$6,600 in transfer alone, before a single function invocation. On a CDN, that same 45 TB is served from the edge, and here's the part that changes everything: Cloudflare doesn't bill per-GB for standard cached web delivery. Not on Pro, not even on Free.
So the 45 TB served to users would cost $0 in bandwidth via CDN. What reaches your actual server is only the cache misses and API calls. At a 90% CDN/cache hit ratio - the low end of what one engineer cited - your server sees ~4.5 TB/month. Every Hetzner server I'll list here includes 20 TB. You never touch the overage.
The compute side is just as calm. Those 10% misses on 450M is ~45M origin (your server) requests/month, which averages as ~17 requests per second. That's nothing. You should size the server for the peak concurrency headroom, not an average load - and even then you stay small.
The cost, on hardware you can rent today
Here's the same traffic, Cloudflare in front, on current Hetzner Cloud pricing (EUR is how they bill; USD is approximate). Every one of these includes 20 TB:
| Traffic | Server | Specs | Compute/mo | CDN | Realistic total |
|---|---|---|---|---|---|
| ~50–150M/mo | CX43 | 8 vCPU / 16 GB | $19.09 | Cloudflare Free | ~$17 |
| 450M+ (Jmail) | CX53 | 16 vCPU / 32 GB | $35.59 | Cloudflare Free | ~$32 |
| 450M+, paranoid | CCX33 | 8 dedicated vCPU / 32 GB, 30 TB | $163.59 | Cloudflare Free | ~$150 |
That's the headline: $46,485.99 versus somewhere between $19 and $160 a month. A reasonably-sized CX53 handles Jmail-scale traffic for ~$35. Even if you're spooked and buy dedicated server cores you don't usually need - the CCX33, eight guaranteed vCPUs - you're at ~$160. The same price range were confirmed in X/Twiiter thread by other engineers, and the math backs them up.
Your choice only depends on what your app does:
- Static / ISR / mostly-cached (Jmail's situation). The CDN eats ~90%+ of traffic. A Hetzner's CX43 is plenty; the CDN is doing the heavy lifting, not the origin.
- Genuinely dynamic (personalized per request, auth on every hit - poor cache ratio). Now the origin does real work. Move up to a CX53, or general purpose with dedicated CPUs (CCX23/CCX33) for consistent latency under load. Still tens of dollars, not tens of thousands.
- App plus a database. Run Postgres on the same server for small workloads, or a second dedicated server as you grow. No per-invocation multiplier hiding in the corner.
If you can change one thing, it is the CDN
Everything above relies on CDN cache-hit ratio. Get that right and bandwidth basically disappears.
Use Cloudflare The Free plan gives you CDN caching, unmetered DDoS protection, and a WAF with a managed ruleset. For a viral moment that combination is close to ideal: the DDoS protection matters more than people expect when you're briefly famous, and the cached delivery isn't metered by the gigabyte. Set sane cache rules and your origin goes quiet.
Bunny.net, UE alternative. If you'd rather pay for bandwidth than lean on a free tier, Bunny is $0.01/GB in the US and EU (dropping to $0.005/GB at volume), no request fees, $1/mo minimum. Even serving the entire 45 TB through Bunny with zero origin caching is ~$450 - and with any real cache ratio it's a rounding error. That's your worst case, and it's still 100x under the Vercel number.
The catch nobody mentions
I was only mentioning dollars and quiet about ops: HTTPS renewal, backups, monitoring, deploys, the server not falling over at 3 a.m. during your one viral week. That work is the real reason people pay the serverless premium - not the compute.
The good news is that layer is now largely automatable. Kamal, Coolify, Dokploy or DollarDeploy will each get you from "a repo" to "running on your own server with TLS and deploys," without you ever need to manage your server via SSH.
Disclosure: I build DollarDeploy - a hosted control plane that deploys your GitHub repo to your own Hetzner/DigitalOcean/etc. server without Docker, as isolated systemd services, with HTTPS, backups, logs, and monitoring on by default, and the 20 TB that comes with the server instead of Vercel's 1 TB. All-in it runs about $12/month. The Hetzner and Cloudflare math above stands on its own regardless of what you deploy it with.
Here is the example NextJs template you can start with, deployed with DollarDeploy, running behind cloudflare: https://nextjs-cloudflared.dollardeploy.work
I also wrote an article on how to have your app working with Cloudflare: https://docs.dollardeploy.com/your-app-with-cloudflare/
When Vercel is still the right call
If you want genuinely zero ops and will never think about a server, it's excellent at that. If your traffic is small, the flat $20 often beats fiddling with anything. And if your load is wildly spiky and unpredictable, letting someone else autoscale is a real feature you're choosing to pay for.
The trap is specifically the middle Jmail fell into: a mostly-cacheable app that gets popular, on a model where popularity is the thing you're metered on. That's the case where a $5–$32 server plus a CDN isn't a downgrade - it's just the right tool.
Ask from the community
If you've moved your app off a serverless provider like Vercel, AWS or Cloudflare workers, I want the real numbers: what did the server and maintenance actually cost you, and - the part everyone glosses - what broke the first time you got more traffic? And if anyone has Jmail's true bill breakdown, post it. I'd rather correct this model than defend it.
Links
- Comment thread on HackerNews
- Original X/Twitter thread;
- Vercel pricing
- Hetzner Cloud pricing
- Cloudflare plans
- Bunny.net pricing
Figures current as of August 2026.