I lost 4 months of production data on a Tuesday morning, and the worst part is I had no one to blame but myself and a checkbox I never read.
The Stack I Was Proud Of
By episode-whatever of building the BOGO deals app, I had convinced myself I was being clever. The whole thing ran on free tiers, stitched together like a quilt made of other people's generosity.
The breakdown looked like this: a free Postgres database on one platform (the kind that gives you 512MB and calls it "production-ready"), a free Redis instance on another for session caching, a free tier on a third service for scheduled jobs, and my API layer living on a hobby dyno that spun down after 30 minutes of inactivity. Total monthly cost: $0.00. I had a screenshot. I showed it to a friend. I was genuinely smug about it.
This lasted about 4 months before the whole thing quietly collapsed.
The Thing Nobody Tells You About Free Tiers
It wasn't a dramatic failure. No alert. No email with a red banner. I woke up, opened the app's admin dashboard, and the user table showed 0 rows. The deal submission table: 0 rows. The store list I'd spent two weeks curating manually: gone.
My first thought was that I'd accidentally run a DELETE somewhere. I checked every migration file, every recent deploy. Nothing. Then I logged into the database provider's dashboard and saw it: a small orange badge I'd never noticed. The account had been marked inactive. The free tier had a clause — buried in the third tab of their pricing page — that said databases with no paid plan attached would be purged after 90 days of "low activity."
Low activity, in their definition, was fewer than a certain number of writes per day. The BOGO app didn't have a ton of daily write traffic. Users browsed, they didn't submit deals that often. So to their system, my database looked like an abandoned sandbox.
It wasn't. It was four months of real users, real submissions, and a store directory I can't reconstruct from memory.
Free tiers have TTLs. I just didn't know that until mine expired.
What "Free" Actually Costs You
After the initial "I'm going to be sick" feeling passed, I started doing the actual post-mortem. Here's what I found.
The Redis instance on a different service had already been quietly deleted six weeks earlier. I hadn't noticed because sessions were just failing silently — users were getting logged out more often, which I had chalked up to a bug in my auth code. I spent probably 8 hours across three sessions debugging auth logic that was completely fine. The cache was just gone.
The scheduled job runner had also throttled itself down. The free tier only allowed 100 job executions per month, and I'd blown past that in week two. After that, the nightly deal-expiration job stopped running entirely. Users were seeing expired deals. I thought the feed logic had a bug. Spent another 4 or 5 hours on that.
So the actual cost of "free" wasn't $0. It was closer to 12+ hours of misdirected debugging across three separate incidents, plus the permanent data loss. If I bill my own time at any reasonable rate, the free tier cost me more than a paid plan ever would have.
I was optimizing for the line item on a spreadsheet and ignoring the real cost column entirely.
The Rebuild, And What I Changed
I didn't have a backup. Of course I didn't — the database provider had a backup feature, but it was behind the paid plan. I'd seen the upsell prompt a dozen times and dismissed it.
I moved to a $7/month managed Postgres on a different provider. Not the cheapest option, but one with a documented data retention policy I actually read this time. Cover to cover, like terms of service I should have read on the first one. Also set up a daily pg_dump to a cheap object storage bucket — $0.02/month for the amount of data I have. I genuinely cannot believe I didn't do this from the start.
The Redis situation I just abandoned. Turns out my session handling didn't need a separate cache at all — I was over-engineering it because I'd read a tutorial for a much larger scale system and cargo-culted the architecture. Removed the Redis dependency entirely. The app is actually simpler now.
For scheduled jobs I switched to a self-hosted cron on the same $6/month VPS I've been running other things on. No execution limits. No surprise throttling. Just a crontab entry and a curl call.
The Awkward Part
The data loss was bad, but the most uncomfortable moment was realizing how many small warning signs I had dismissed. The auth weirdness. The expired deals. The occasional "connection timeout" errors I saw in logs and clicked past. I had a mental model of my stack that was weeks out of date, and I never stress-tested the assumption that all these free services were still functioning as configured.
I think there's something about free-tier infrastructure that makes you treat it as more stable than paid infrastructure. Because you didn't pay for it, maybe you subconsciously don't worry about it as much. You check in on the things you're paying for. You ignore the free stuff because it's "not real" money.
That's exactly backwards from how you should think about it.
Paid services have SLAs, support tickets, financial incentive to keep your data alive. Free tiers have none of that. They can purge you whenever their terms say they can, and the terms are written by lawyers, not by people who want you to succeed.
The services with no financial relationship with me also had no obligation to me. That should have been obvious from the start.
What I Actually Run Now
Current stack for the BOGO app, with real costs:
- Managed Postgres: $7/month
- Daily backup to object storage: ~$0.02/month
- App hosting (same VPS as before): $6/month
- Scheduled jobs: included in the VPS, so $0 incremental
- Total: ~$13/month
That's the actual number. Thirteen dollars. For four months I ran on $0 trying to avoid thirteen dollars a month, and I lost everything anyway.
I'm not saying free tiers are useless — they're fine for prototyping, for the first two weeks before you know if something will get any users at all. But the moment real users show up, real data starts accumulating. At that point the economics of "free" stop making sense in any direction that matters.
$13/month is what I should have been paying from month one. Instead I paid $0 for four months and then paid with my data.
TL;DR: I ran the BOGO app on a $0 free-tier stack for 4 months, silently lost my Redis cache, had my cron jobs throttled to zero, then had my entire Postgres database purged — all without a single alert. Moved to a $13/month paid stack and haven't touched it since.
Next time: I tried adding a simple referral system to the app — one feature, three weeks, and a conversion rate so low I had to double-check the tracking was even working.
Get the $31 Stack Prompt Pack — $19
The exact prompts, cost calculator, and n8n templates from this stack.
Top comments (0)