Free Tiers Are a Loan, Not a Gift: Notes From Shipping an App for $0
Photo: (CC-BY-SA-4.0), CC BY-SA 4.0, via Wikimedia Commons
Every developer has the same daydream: build the thing, ship the thing, pay nothing. Free tiers have gotten genuinely good over the last few years — good enough that I wanted to find out just how far the $0 stack actually goes.
So I did it. I built and launched a small but real product (a scheduling tool for a local rec league, if you're curious) with a hard budget of zero dollars. No trial credits that expire, no "free for twelve months" gotchas. Actual free tiers, indefinitely.
It shipped. It works. People use it. But the journey taught me that free tiers aren't free — they're loans, and the interest comes due in currencies other than money.
The Stack That Cost Nothing
Here's what I landed on:
- Hosting: A static frontend on Cloudflare Pages, with a serverless API on the same platform
- Database: A free-tier Postgres from one of the many generous providers out there
- Auth: Hand-rolled email magic links (more on that decision later)
- Analytics: A privacy-first free option, plus server logs I actually read
- Email: A transactional email service with a modest free monthly allowance
Total bill: $0.00. Total account signups: six. That last number matters, and I'll explain why.
Where Free Gets Expensive
The first surprise wasn't a hard limit — it was soft friction. Free tiers are engineered with gentle slopes that nudge you toward upgrading. Cold starts on serverless functions. Connection pooling you have to configure yourself because the free Postgres instance caps simultaneous connections. Bandwidth ceilings you discover only when something breaks.
Then there's the time tax. I spent an entire Saturday optimizing my database queries not because the app was slow, but because I was paranoid about hitting row limits. That Saturday has a dollar value. On a paid tier, it never happens.
Lock-in is sneakier. Six services means six proprietary config formats, six deployment quirks, six dashboards to check when something's on fire. Migrating away from any one of them is a weekend project you'll never prioritize. The vendors know this. That's the business model.
And auth — oh, auth. I rolled my own magic-link system to avoid another vendor relationship, and I'd do it again, but it cost me two full days and a healthy respect for everyone who's ever said "just use a managed service."
The Decision Framework I Wish I'd Had
After living in the free tier trenches, here's the rubric I now use:
- Is it stateful? Pay for anything that holds user data. Free database tiers are where you're most likely to wake up to a surprise migration or a throttled connection.
- Does it email humans? Deliverability is a professional service. Free email tiers are fine until the moment your league commissioner's confirmation doesn't arrive and nobody knows why.
- Is it your core loop? If the feature is the product, own it or pay for it. Peripheral stuff — analytics, monitoring, error tracking — free tiers are perfect.
- What's your hourly rate? Every hour fighting a limit is an hour not building. If the paid tier is $9/month and saves you four hours, the frugal choice is obvious. Paying isn't the opposite of being cheap. Sometimes it is being cheap.
The Verdict
Can you ship a real product for $0? Absolutely — and for a side project, a portfolio piece, or a validation experiment, you should. The free stack is the best deal in software.
But go in with open eyes. You're not spending money; you're spending setup time, operational attention, and future migration effort. Track those like dollars, because eventually you'll have to decide whether to keep paying them.
For my little league app, the answer is still zero dollars — the scale doesn't justify it. The moment it does, I'll pay without guilt. That's not selling out. That's graduating.