These three don't compete on price so much as on what "price" even means.
Render charges a fixed instance price — pick a size, pay it whether the app is busy or sitting idle. Starter is around $7/month for 0.5 CPU / 512 MB; Standard, $25, gets you 1 CPU / 2 GB. It's the most predictable of the three and the only one with a genuinely permanent free tier, though that free web service spins down after 15 minutes of inactivity and takes 30–50 seconds to wake back up — fine for a side project, annoying for anything someone might actually visit on a cold link.
Railway has no free tier at all anymore, just a 30-day, $5 trial. After that, everything is metered per second on top of a small plan fee: Hobby is $5/month for a single developer, Pro is $20/month and includes $20 of usage credit plus unlimited seats. For a typical solo project that isn't running 24/7 at full tilt, Railway tends to come out cheapest in practice, even though the pricing page looks more complicated than Render's.
Fly.io drops the plan fee entirely — pure pay-as-you-go, billed per second, no free tier since they removed it. The smallest instance (shared-cpu-1x, 256 MB) runs about $2.02/month if left on continuously; extra RAM is roughly $5/GB/month, egress in North America and Europe is $0.02/GB. It rewards precise sizing and punishes guessing.
| Model | Free tier | |
|---|---|---|
| Render | fixed instance price | yes, but sleeps after 15 min idle |
| Railway | plan fee + metered usage | no (30-day trial only) |
| Fly.io | pure metered, per-second | no |
Rule of thumb that holds up in practice: Railway wins on price for a typical solo developer's workload, Render wins on predictability (you always know the bill in advance), and Fly.io wins on latency if you're deploying close to users in multiple regions and know how to size instances tightly. Don't pick based on the marketing page — pick based on which failure mode you'd rather deal with: a surprise bill, or a cold-start delay.