Research · Infrastructure

Where to host an MVP, and what it really costs

Frontend, backend and Postgres compared on the four things that decide it: cost before users, deploy time, whether Postgres is first-class, and what it costs to leave.

Every hosting comparison you find ends in a table and no answer. This one ends in an answer, because for spinning up an MVP the decision is genuinely not that close, and pretending otherwise wastes the week you were supposed to spend building.

The criteria that actually decide it: what you pay before you have users, how long a deploy takes, whether Postgres is a first-class thing or an afterthought, and how expensive it is to leave when the pricing stops making sense.

The frontend question is already settled

Static frontends are a solved, commoditised problem. Every serious option gives you a global CDN, automatic TLS, preview deploys per pull request, and a free tier that will carry an MVP indefinitely.

HostFree tierBest atWhere it bites
Cloudflare PagesUnlimited bandwidth, 500 builds/monthBandwidth cost, edge functions via WorkersBuild minutes are the cap, not traffic
Vercel100GB bandwidthNext.js, by a wide marginBandwidth and function pricing past the free tier; commercial use restricted on Hobby
Netlify100GB bandwidthForms, redirects, identity without a backendBuild minutes run out faster than you expect
GitHub PagesFree, 100GB softDocs and static sites with zero moving partsNo server-side anything, no previews, no redirects

If you are on Next.js, use Vercel and stop thinking about it; the integration is the product and nobody else matches it. If you are shipping anything else, or bandwidth is a real cost, Cloudflare Pages is the better default because unlimited bandwidth removes an entire category of future surprise. If the site is genuinely static, GitHub Pages is free and has fewer moving parts than either.

Do not spend a day on this decision. It is reversible in an afternoon.

The backend question is the real one

This is where the money and the regret live. The options split into three philosophies.

Platform-as-a-service: Railway, Render, Fly.io

You push a repo, it detects your stack, builds a container and runs it. Postgres is a checkbox. This is the category built for exactly the situation you are in.

RailwayRenderFly.io
Entry costUsage-based, ~$5/mo creditFree web tier that sleeps, $7/mo to stay awakeUsage-based, small free allowance
Cold startsNone on paidFree tier sleeps after 15 min, ~30s wakeConfigurable, can scale to zero
PostgresOne click, backups on paidOne click, free tier expires after 30 daysYou run it, or use an external provider
Deploy ergonomicsBest in class, near zero configVery good, blueprint fileGood, but you will meet a Dockerfile
RegionsLimitedLimitedExcellent, run close to users
Bites youUsage billing gets expensive quietlyThe sleeping free tier makes demos look brokenNetworking and volumes have real depth to learn

Render's sleeping free tier deserves a specific warning. It is the single most common reason an investor or a first customer opens your demo and sees a spinner for thirty seconds. If you are going to use Render for anything anyone will click, pay the seven dollars.

Fly.io is the strongest of the three technically and the weakest for a first MVP, because its advantages, multi-region, anycast, running your own Postgres cluster, are answers to problems you do not have yet and its learning curve is real.

Serverless containers: Cloud Run, AWS App Runner

Google Cloud Run is the most underrated option in this whole comparison. You give it a container, it scales to zero, you pay per request, and the free tier is genuinely generous. An MVP with modest traffic often costs literally nothing.

Two caveats. Cold starts are real, typically a second or two for a Python container, which is fine for an API and poor for a page load. And it has no managed Postgres of its own, so you are pairing it with Cloud SQL (expensive at small scale) or an external provider like Neon (better).

AWS App Runner is the same idea, executed less well and priced worse. Skip it.

A box you rent: Hetzner, DigitalOcean, plus Coolify or Dokku

The unfashionable option that keeps quietly winning on economics. A Hetzner cloud server with 4 vCPU and 8GB of RAM is around five euros a month. Put Coolify or Dokku on it and you have your own Heroku: git push to deploy, automatic TLS, Postgres in a container, preview environments.

What you are buying: an order of magnitude more compute per euro, no usage billing that can surprise you, and no vendor who can reprice you.

What you are paying: you own the operating system. Security updates, backups that you have actually tested, and being the person who gets paged. That is perhaps two hours a month once it is set up, and a full day to set it up properly the first time.

Postgres is a separate decision, and it matters more

This is the part most comparisons skip, and it is the one you will regret getting wrong, because moving compute is a day and moving a database with real customer data is a project.

ProviderFree tierStandoutWatch for
NeonGenerous, realScale to zero, and database branching per pull requestCold start on the first query after idle
SupabaseGenerous, pauses when idleAuth, storage and realtime includedYou are adopting a platform, not just a database
Railway / RenderBundledSame dashboard as the app, zero extra setupRender's free database expires at 30 days
AWS RDS12 months onlyOperationally boring at scaleCosts real money from day one, heavy to configure

Neon's branching is the feature worth changing your mind over. Every pull request gets a copy-on-write branch of production data, so migrations are tested against the real shape of your data before they merge. That kills an entire class of Friday-evening incident, and nothing else in this table offers it.

The costs nobody puts in the table

  • Egress. AWS charges roughly nine cents per gigabyte out. Cloudflare charges nothing. On a media-heavy product this difference dwarfs your compute bill.
  • The idle tax. A managed Postgres that cannot scale to zero costs the same whether you have four users or none. Over a nine-month pre-launch period that is real money for nothing.
  • Your hours. A day setting up a VPS is a day not building. At an MVP's stage that is usually the most expensive line item on the page, and it is the one people leave off.
  • Exit cost. Ask of any platform: if the pricing doubles, how long to leave? A Docker container on a PaaS moves in an afternoon. A product built on a proprietary function runtime, a bespoke KV store and a vendor auth system does not move at all.

The verdict

Default, and what we use

Frontend on Cloudflare Pages. Backend on Railway. Postgres on Neon. Under ten dollars a month at MVP scale, deploys in under two minutes, database branching on every pull request, and everything is a container or standard Postgres so leaving is an afternoon rather than a rewrite.

Three situations change that answer, and only three:

  1. You are on Next.js. Use Vercel for the frontend. The integration is worth more than the bandwidth pricing costs you, at least until you are large enough for that to invert.
  2. You are cost-sensitive and comfortable with Linux. Hetzner plus Coolify, with Postgres in a container and backups to object storage. Roughly one tenth the cost at ten times the compute. Budget a full day to set it up, and actually test a restore.
  3. Traffic is spiky or near zero. Cloud Run plus Neon, both scaling to zero. Genuinely free at low volume, and it stays cheap through a launch spike.

What we would not do for an MVP: raw AWS with ECS, ALB, RDS, VPC and IAM. It is the right answer eventually and it is a week of yak-shaving now, at a stage where your only real risk is not shipping. Get to users first. The migration is a known quantity, and by then you will know what you actually need.