B Builderlog
Builderlog ·Shipping Mini-Apps ⑧ ·Jun 26, 2026 ·2 min read

I Thought It Was Free, Then the Bill Showed Up

#free tier#infra cost#API pricing#side project#cloud cost

One of the most satisfying moments after shipping an app is sitting there smug to yourself thinking “this is running for free.” I had that too. Right up until last month.

The smugness didn’t last

My convenience-store BOGO deals app was ticking along pretty quietly. DAU was in the low triple digits, and I had about three services pinned to free plans. One notification API, one image-optimization CDN, and one DB host.

The trouble started when my app got casually mentioned in some community. Within a day, traffic jumped to about six or seven times the usual. Not so much explosive growth as just a spike. Two days later it was back to normal.

But those two days were the problem.

From spike to bill

01 Normal day low triple-digit DAU · 3 free plans
02 Mentioned in a community traffic ×6–7 for 2 days
03 Free limits hit API calls · CDN GB · DB conns
04 Auto-overage billed past the free range
05 The bill small amount — scarier for it
A free plan is a range, not a condition — size it for your worst single day, not your average.

A free plan is a “range,” not a “condition”

It was only after I got the bill that I actually read them properly — each service’s pricing page. The free plans were structured in more ways than I’d expected.

  • The notification API was billed per monthly call count, and two days of spike burned through nearly the whole month’s free allowance.
  • The CDN was billed per GB of bandwidth. It’s an image-heavy app, so I was already running tight on a normal day, and on the spike day I just blew past it.
  • The DB host had a connection-count limit. This one didn’t bill me, it just threw errors. In a way that might have been the better outcome.

That’s when it hit me: free-tier limits have to be sized for your “worst single day,” not your “normal traffic.”

The amount wasn’t big, and that somehow made it worse

I wasn’t shocked because the total was huge. If anything the number on the bill was smaller than I expected, and that scared me more. If it cost this much for a spike this size, what would happen if I ever actually went viral?

From then on I dug through each service for spending alerts and hard caps. Some supported them and some didn’t, and for the ones that didn’t I just switched plans. Even if it costs a bit more, a clear, defined limit turned out to be the better deal.

”Free” with no spending ceiling might not actually be free.

What I do now

I’m still running all three free plans as-is. The one thing that changed is that I put an 80%-usage alert on each service’s dashboard. Where I can, I made checking the counter at the start of the month part of my routine.

It’s tedious, but without it I figured I’d just end up getting another bill on another similar day, wearing the same exact face.

Using free plans well turned out to be less about knowing the limits and more about the habit of monitoring them.

TL;DR

The trap in the free zone wasn’t in the pricing table — it was in the exact moment my traffic pattern and the limits fell out of sync.

In the next one, I changed my infra setup a bit after all this — and I’ll tell you about the other thing that broke while I was changing it.