Get the number before you make any decision, because the two outcomes here are wildly different and people usually guess wrong about which one they are in.
Getting the honest number.
- Find the usage view, not the pricing page. Every one of these platforms exposes current consumption per resource — compute time, memory-hours, storage, egress, database size, request counts. That is your actual consumption in the platform's own units, which is the only thing that multiplies cleanly against their rates.
- Multiply it out by hand, per line. Do not trust a summary estimate. Take each metered dimension, take your last full month of it, multiply by the published rate, and write the lines down. The exercise takes twenty minutes and it almost always produces one surprising line.
- Set a spending limit or a budget alert immediately, whatever they offer, at a number you would be annoyed but not hurt by. Do this before the analysis, not after. It is the difference between learning you were wrong from a notification and learning it from an invoice.
The line that surprises people is usually one of these three:
- Idle compute. Under an always-free allowance, an app sitting there doing nothing was free. Under usage billing, a container that runs 24/7 bills for 24/7 whether anyone visits or not. For a low-traffic app this is normally the entire bill. If the platform supports scaling to zero and starting on request, turning that on can take the cost of a hobby app to near nothing. The trade is a cold start on the first request after idle, which for a side project is usually completely acceptable.
- The database. Managed databases are often the largest single line and frequently cannot scale to zero, because something has to hold the data. A small always-on database can cost more than everything else combined.
- Egress. Usually trivial for an API. Not trivial if you serve images or files. Check before assuming.
Then the stay-or-move decision, which is mostly about the shape of your app rather than the price.
- A stateless container moves in an afternoon. It is a Dockerfile and some environment variables, and half a dozen platforms will run it. If that is all you have, your switching cost is genuinely low and you can be relaxed about it.
- State is the expensive part. A managed database, a queue, object storage, scheduled jobs, anything with a platform-specific API — that is what makes migration a project rather than an evening. Count those honestly before deciding you can leave whenever you like.
My actual advice, having done this twice: if the number comes out to less than a couple of coffees a month, pay it and get on with your life. The hours you would spend migrating are worth more, and a paid account tends to be a more stable place for something you care about than a free tier that exists at somebody's discretion.
If the number is genuinely uncomfortable, fix the shape first — scale to zero, right-size the database, move static assets to something that serves them cheaply — and re-measure. That usually closes the gap without a migration at all.
And if you do move: do not move to another free tier. You will be doing this again in eighteen months. Either pay a small amount somewhere stable, or self-host deliberately with your eyes open about the maintenance.