Three months ago I moved my side project (a small SaaS with ~2,000 monthly users) off a $47/month AWS setup onto Cloudflare's free tier. I expected to hit a paywall within two weeks.
Ninety days later, my total Cloudflare bill is $0.00. The AWS bill I avoided: $847 (I kept the old stack running in parallel for a month to compare, then killed it).
Here's the actual breakdown.
What I'm running
- Workers (API + backend logic): free tier = 100,000 requests/day
- Pages (frontend): unlimited static requests, 500 builds/month
- R2 (file storage): 10 GB storage, 10M Class B operations/month
- D1 (SQLite database): 5M rows read/day, 100K rows written/day
- KV (session cache): 100K reads/day, 1K writes/day
My real usage (average day, last 30 days):
| Service | Free limit/day | My usage/day | Headroom |
|---|---|---|---|
| Workers requests | 100,000 | 31,400 | 3.2x |
| D1 rows read | 5,000,000 | 412,000 | 12x |
| D1 rows written | 100,000 | 8,700 | 11.5x |
| R2 storage | 10 GB | 3.1 GB | 3.2x |
| KV reads | 100,000 | 22,000 | 4.5x |
What the same thing costs on AWS
I ran the equivalent setup (EC2 t3.small + RDS db.t3.micro + S3 + CloudFront + ALB) for 30 days in parallel:
- EC2 t3.small: $15.18
- RDS db.t3.micro: $13.14
- ALB: $17.20
- S3 + CloudFront + data transfer: $36.50
- Route53 + misc: $1.80
Total: ~$84/month × 3 months = $252. Add the months before this experiment and I'm at $847 spent on infra that Cloudflare now handles for free.
The honest catches
This isn't a "Cloudflare is magic" post. Real limitations I hit:
- D1 is SQLite. No concurrent writes worth mentioning. Fine for a SaaS with 2K users, dead on arrival at 50K.
- Workers CPU limit: 10ms on free tier. I had to move a PDF-generation endpoint to a $5/mo Hetzner box. That endpoint alone would have blown the limit.
- Cold starts on D1 are real — first query after idle: ~80ms vs ~8ms warm. Noticeable in a snappy UI.
- No WebSockets on free Workers. I use SSE instead, which is fine for my use case.
My takeaway
The uncomfortable truth: for most side projects, AWS is a resume decision, not a technical one. We pick it because it looks serious, not because the workload demands it.
If your app fits in Cloudflare's free tier — and a surprising amount does — you're paying $80+/month for the feeling of being "production grade."
What about you — have you actually priced out what your side project would cost on a free tier, or are you (like past me) just defaulting to AWS because that's what serious projects use?
I sketched the migration plan and the D1 schema with MonkeyCode — free, open-source AI coding assistant: https://ly.cyberserval.tech/iIETXiF
Top comments (0)