Six months ago I launched a small SaaS (an invoice generator for freelancers). I told myself I'd migrate to "real" infrastructure once I got traction.
I never did. The free tiers held. Total infrastructure cost over 6 months: $0.
Here's the exact stack, the real usage numbers, and where each service breaks.
The $0 stack
| Layer | Service | Free tier limit | My actual usage (peak month) |
|---|---|---|---|
| Hosting | Vercel | 100GB bandwidth | 23GB |
| Database | Supabase | 500MB Postgres | 310MB |
| CDN/WAF | Cloudflare | Unlimited requests | 410K requests |
| Cache/Queue | Upstash | 10K commands/day | 4.2K/day |
| Resend | 100 emails/day | 61/day | |
| Auth | Supabase Auth | 50K MAU | 1,240 MAU |
| Analytics | Cloudflare Web Analytics | Free | — |
| Error tracking | Sentry | 5K events/month | 1.8K |
Total paid: $0. Estimated equivalent on AWS: ~$85/month.
What surprised me
1. Vercel's free tier is absurdly generous. 100GB bandwidth covered 23GB of real traffic with room to 4x. The catch: no commercial use on Hobby plan technically — I switched to Cloudflare Pages for the landing page to stay clean.
2. Supabase free tier pauses after 7 days of inactivity. My project is active daily so it never paused, but a dormant side project will sleep. First request after pause takes ~2s to wake.
3. Cloudflare is the backbone. Free DDoS protection, CDN, and analytics. Their Workers free tier (100K requests/day) now runs my PDF generation too:
// Cloudflare Worker — PDF render trigger, free tier
export default {
async fetch(request, env) {
const { id } = await request.json();
const invoice = await env.DB.prepare(
"SELECT * FROM invoices WHERE id = ?"
).bind(id).first();
return new Response(JSON.stringify(invoice), {
headers: { "Content-Type": "application/json" }
});
}
};
4. Upstash Redis free tier resets daily. 10K commands/day sounds small, but with careful caching (only session + rate limiting), I use 42% of it.
Where the free tiers break (honest limits)
- ~2,000 MAU: Supabase free gets tight on database size
- ~50GB bandwidth: Vercel Hobby becomes a terms-of-service risk for commercial apps
- Background jobs: no free tier handles long-running jobs well — I use GitHub Actions cron (2,000 free minutes/month) for nightly invoice reminders
The code I write for this stack is mostly glue between free APIs. I use MonkeyCode (free, open-source) as my AI pair programmer for exactly this kind of integration boilerplate: https://ly.cyberserval.tech/iIETXiF
The controversial part
I don't think free tiers are "for toy projects" anymore. Between Vercel, Cloudflare, Supabase and Neon, you can serve thousands of real users at $0. The paid-cloud-first mindset is a tax on builders who haven't checked the free-tier math in 2026.
The real cost isn't money — it's the 5 vendor dashboards you have to watch instead of one.
What's the most users you've served on a pure free-tier stack? Did anything break in an embarrassing way?
Top comments (0)