My first project ran on Cloudflare Pages for seven months. The bill was $0.
Not because I was frugal. The free tier gives you unlimited bandwidth and 500 builds a month. For one docs site and a handful of tool pages, that is effectively unlimited.
So I filed "rent a server" under Things Other People Do.
Where the requirement came from
I wanted a weekly digest: every Monday at 8am, collect whatever I'd published that week and email it to myself.
The code was easy. The hard part was the five words "every Monday at 8am."
Static hosting works like this: code runs when someone visits. With no visitor, nothing runs. There is no always-on process sitting there waiting for you.
My feature was entirely about running when nobody was visiting.
Two detours I tried first
GitHub Actions on a schedule. Cheapest option — nothing to buy.
I ran it for two months. It wasn't that it didn't work. It was that it wasn't reliable. Scheduled workflows on the free tier are best-effort; the docs say so themselves, and high-load periods get delayed. I asked for 8:00 and got somewhere between 8:10 and 8:50.
For a database backup, who cares. For a digest I wanted to read over coffee, 9am is useless.
Cloudflare Workers with Cron Triggers. This one genuinely works, and it fits in the free tier. I ran that for another month.
What stopped me was a different detail: part of the digest processed audio — turning a new podcast clip into a waveform — which meant calling ffmpeg. Workers cap CPU time: 10ms on free, 30 seconds on paid. Note that's CPU time, not wall-clock, and ffmpeg is pure CPU work. I could split it into a second service, or I could move.
That was the moment it clicked: I hadn't picked the wrong host. My requirements had changed.
Six months earlier it really was a static site. Now it needed somewhere that could run an arbitrary command for as long as it took.
What I bought
The smallest Hetzner Cloud box: 1 vCPU, 2GB RAM, 20GB disk.
Why not the cheapest thing available? I went down the cheap VPS comparison table row by row:
| Provider | From | Specs | My read |
|---|---|---|---|
| Oracle Cloud | $0 | 4 ARM cores / 24GB | Generous, but the reclaim stories are common enough that I didn't want my weekly job on it |
| RackNerd | ~$1.5/mo | 1 core / 1GB | Billed yearly, cheap, fine for tinkering — a bit tight for me |
| Vultr | $2.5/mo | 1 core / 0.5GB | Running ffmpeg in 512MB is not fun |
| Hetzner Cloud | $4.5/mo | 1 core / 2GB | Picked it: most RAM at that price, hourly billing so I could try a month |
My whole tradeoff in one line: this box does one job a week, so I don't need it fast — I need it to not die halfway. RAM mattered more than CPU.
What it actually costs
Real numbers, USD:
| Item | Cost |
|---|---|
| Domain (.com) | $12 / year |
| Server (smallest Hetzner) | $4.5 / month, about $54 / year |
| Object storage (audio on R2's free tier) | $0 |
| Total | about $66 / year, or $5.50 / month |
Roughly $0.18 a day.
The way I justified it to myself: that Monday email costs me under a nickel. But the more honest half of the sentence is this — if I hadn't needed the scheduled job, none of that $66 should have been spent.
When you don't need a server
Which cuts the other way too. These projects should stay on free static hosting, and "I feel like I should have a server by now" is not a reason to buy one:
- Marketing sites, portfolios, landing pages
- Front-end SPAs, or blogs and docs built with SSG
- Apps whose backend already lives on serverless plus a managed database
- Anything whose only goal is "other people can reach it"
The test I use fits in one line:
Is any part of this required to run when nobody is visiting?
No → static hosting, done. Yes → you need a machine. Start with Buying a server for how to size it.
One case worth checking before you spend anything: if what you want is a stable outbound IP, or a batch job that runs for a few hours, read through Publish to the internet first. It lays out what each of the three hosting models can and can't do. Some of those needs are already covered by serverless platforms, and you don't need to keep a whole machine alive for them.
The part I'd tell you to copy
Get the order right.
I had a requirement, discovered the free option couldn't meet it, and only then went shopping. Do it backwards — buy a VPS first, then figure out what to run on it — and you end up paying $5 a month for a control panel you haven't logged into since spring.
Before you buy, put the domain, the server, and the extras into the cost estimator and look at the yearly total. Decisions get easier once the number is on the screen.