Choosing your production stack after the builder
A framework for deciding where your app should actually run once the builder's hosting stops fitting - including the case against each option, which is the half most comparisons leave out.
At a glance
- Format
- Decision guide
- Sections
- 8
- Reading time
- 9 min
- Last revised
- 22 August 2026
What you take away
- Pick the highest-managed option that can run your workload. Operational time is the most expensive line item on a small team.
- You will move compute several times before you move the database once. Choose the database with that asymmetry in mind.
- If two options are within about 30% on cost, the tiebreaker is which one your team can operate at 2am.
- Staying on the builder is a legitimate answer, and often the correct one under a few hundred dollars a month.
Written for: Founders and technical leads whose builder hosting is starting to cost too much, constrain the product, or fail a customer's security review.
Contents (8 sections)
01
When leaving the builder is the right call
Migration is not a maturity milestone. It is a trade: you spend engineering weeks and take on operational responsibility, in exchange for cost, control, or capability. If none of those three is currently hurting, the trade is bad.
There are four honest triggers. Cost, when the bill grows faster than revenue and the shape of the pricing means that will continue. Capability, when the product needs something the platform cannot do - long-running jobs, websockets, a private network, a specific region. Control, when a customer's security review, an auditor or a regulator asks a question the platform cannot answer for you. And risk, when the entire business depends on a single vendor whose pricing or terms you do not control.
02
Five questions that decide it
Answer these before looking at a single pricing page. In most cases they eliminate three of the five options, and the remaining choice is a coin toss you should resolve with familiarity.
- 1. What shape is the traffic?
- Spiky and mostly idle favours request-priced, scale-to-zero platforms. Steady around the clock favours a rented machine, where a fixed monthly price beats per-request pricing well before you expect it to. Get the real numbers: requests per day and the ratio of peak hour to median hour.
- 2. What does the work look like?
- Short request-response handlers fit anywhere. Anything holding a connection open, running longer than a minute, keeping state on disk, or processing a queue rules out serverless-only hosts immediately - and this is the constraint people discover after migrating, not before.
- 3. Who owns it on a Tuesday when it breaks?
- Name the person. If the answer is “nobody yet” or “we will figure it out”, you have chosen a managed platform whether you admit it now or three incidents from now.
- 4. Where must the data live, and who has to be satisfied about it?
- Enterprise buyers, health and finance regulators and EU data residency requirements all constrain the answer, and they beat your preferences. Get the requirement in writing before you choose, not during the security questionnaire.
- 5. What is the budget horizon?
- Optimising for a bill you will have in three years, at a company that may not exist in three years, is a common and expensive error. Model twelve months out, and prefer options you can leave.
03
Four app shapes and what fits each
| Shape | What it looks like | Fits well | Fits badly |
|---|---|---|---|
| Bursty consumer web app | Marketing-driven traffic, long idle periods, spikes on launch days. | Request-priced platforms that scale to zero - Vercel, Cloud Run. | A rented always-on machine you pay for while nobody is using it. |
| Steady B2B SaaS | Weekday working hours, predictable concurrency, a handful of large tenants. | A small fixed set of machines - Fly, Railway, ECS, Cloud Run with a minimum instance. | Per-invocation pricing, which quietly becomes the largest line item at constant load. |
| Realtime or long-running | Websockets, collaborative editing, streaming responses, jobs measured in minutes. | Platforms that run a real process - Fly, Railway, ECS, a container on Cloud Run with extended timeouts. | Function platforms with execution limits. This is the single most common migration regret. |
| Batch and model-heavy | Queues, scheduled work, document processing, large model calls. | A queue plus workers you control, near the data. Cloud Run jobs, Fly machines, ECS tasks. | Doing the work inside HTTP handlers, wherever they run. |
04
The options, honestly
Every one of these is a good product. The useful information is not what each does well - the marketing site covers that - but what it costs you and where it stops fitting.
Vercel
- Good at
- The shortest path from a Next.js repository to a fast, globally cached site with preview deployments on every pull request. Routing, image optimisation and the CDN are handled, and the developer experience is genuinely the best on this list.
- What it costs you
- Metered function execution and bandwidth, plus per-seat pricing. You still need a database somewhere else, so this is one line on the bill rather than all of it.
- Wrong choice when
- Long-running work, websockets at scale, and media-heavy egress. The pricing that is free at small volume is the fastest-growing line at large volume, and execution limits mean batch jobs need somewhere else to live regardless of budget.
Fly.io
- Good at
- Runs an actual process, close to your users, with persistent volumes and private networking. Websockets, long-lived connections, background workers and per-region placement all work the way you would expect a server to work.
- What it costs you
- You own the Dockerfile, the health checks and the machine sizing. Managed-service comfort is not included - their Postgres offering is infrastructure you operate, not a managed database with a support contract.
- Wrong choice when
- A team that does not want to think about machines at all, or a workload that needs a database somebody else is accountable for. Pair it with a managed Postgres rather than running your own.
Railway
- Good at
- The smallest step from builder to real infrastructure. Deploy from git, attach Postgres and Redis in a couple of clicks, and get environments and preview deployments that behave sensibly without configuration.
- What it costs you
- Usage-based pricing that is easy to lose track of across environments, and less control over networking, regions and isolation than a full cloud gives you.
- Wrong choice when
- Compliance paperwork, private network peering, fine-grained access policies, or committed pricing at larger scale. It is a great second home and a limited fifth one.
AWS
- Good at
- Every primitive exists, the cost at scale is the best on this list once you commit, and it is the answer that satisfies an enterprise security review without further discussion.
- What it costs you
- Real operational time, permanently. Identity policies, networking and the several competing ways to run a container are not incidental complexity you can skip past.
- Wrong choice when
- A team of two or three with nobody who wants to own infrastructure. Weeks spent on infrastructure code instead of product is the most expensive mistake in this guide. If you do go, start with the small surface - a managed container runner plus a managed database - not a Kubernetes cluster.
Google Cloud
- Good at
- Cloud Run is the best request-priced container runtime available: scale to zero, no cluster to operate, and a normal container image rather than a function packaging format. Analytics-heavy products get a genuinely strong warehouse next door.
- What it costs you
- A smaller body of worked examples than AWS, the same access-policy learning curve, and a product catalogue that changes names more often than you would like.
- Wrong choice when
- A team whose existing experience is entirely AWS-shaped, or buyers who ask for AWS-specific attestations. Switching clouds to chase a projected fifteen percent is a poor trade against the retraining cost.
| Option | Operational load | Long-running work | Cost shape | How hard to leave |
|---|---|---|---|---|
| Vercel | Very low | Constrained | Metered, grows with traffic | Easy for a portable app |
| Fly.io | Medium | Native | Mostly fixed per machine | Easy - it is a container |
| Railway | Low | Native | Metered, per environment | Easy - it is a container |
| AWS | High | Native | Fixed plus metered, discounts on commitment | Hard once managed services are wired in |
| Google Cloud | Medium | Good on Cloud Run | Metered, scale to zero | Moderate |
Operational load assumes a team with no dedicated infrastructure engineer. With one, every row moves down a level.
05
The database decision is the bigger one
You will move compute several times before you move data once. Compute is a container and a deploy; data is a migration with a rehearsal, a maintenance window and a rollback plan.
- Stay on the builder's bundled database
- Often the right first move: keep Supabase or the platform's Postgres, move only the application off. It removes the hosting constraint without touching data gravity, and it is reversible in an afternoon.
- Serverless Postgres with branching
- Scale-to-zero pricing and a database branch per pull request are real productivity gains. The trade is cold starts on the first query after idle, which matters for a low-traffic B2B app more than the benchmarks suggest.
- Managed Postgres from a major cloud
- Boring, predictable, well-documented backups, and the answer that satisfies procurement. Costs more at small scale and requires you to think about instance sizes, but nothing about it will surprise you at 3am.
- Self-hosted on your own machine
- Cheapest on paper and the most expensive in practice unless someone on the team genuinely wants to own backups, upgrades, failover and connection limits. For most teams this is a false economy.
- Put compute and database in the same region. A cross-region round trip per query, multiplied by the queries per request, is the most common self-inflicted latency problem we find after a migration.
- Add a connection pooler before you need it. Serverless compute opens connections faster than a database will accept them, and the failure mode is a full outage rather than a slowdown.
- Whatever you choose, prove the export path works on day one. A database you cannot get data out of is the same lock-in you just paid to leave.
06
A decision path you can follow
- 1
Is the current bill small and the product still changing weekly?
Then stay, and set a numeric trigger for revisiting. Migrating during heavy product change means every regression has two possible causes.
- 2
Is the pain ownership rather than cost?
You may only need your own database, your own secrets and a repository you control - not a new host.
- 3
Does anything run longer than a minute, hold a connection, or keep state on disk?
If yes, remove function-only platforms from the list now. Discovering this after the migration is the single most common regret.
- 4
Name the person who owns infrastructure when it breaks.
No name means you pick the most managed option that satisfies the previous step, and you accept its pricing as the cost of not having that hire.
- 5
Collect the external requirements in writing.
Data residency, certification, network isolation and log retention from customers, auditors or regulators.
- 6
Model the bill at ten times current traffic before deciding.
If two options land within about thirty percent of each other, cost is not the deciding factor.
07
If you move, move in this order
- 1Secrets and environments first. A clean, per-environment secret store makes every later step reversible and is useful even if you stop here.
- 2Continuous integration and a reproducible build. Until the app builds identically from a clean checkout, nothing after this is repeatable.
- 3The database, with a rehearsal. Copy, verify row counts and checksums, measure the cutover window, and write the rollback steps before touching production.
- 4Background jobs and scheduled work. These are the pieces that quietly do not exist on the new platform, so move them while you still have the old one running.
- 5The web tier, running in parallel against the same data, verified with real traffic replay or a small percentage of users.
- 6DNS and CDN last, with a short time-to-live set a day in advance so a rollback takes minutes rather than hours.
- 7Decommission after a bake period you decide up front - two weeks is typical - not on the day the cutover looks fine.
08
Five ways this goes badly
- Kubernetes for one service and three engineers. The cluster becomes a part-time job that nobody was hired for, and the workload would have run on a container platform unchanged.
- Multi-cloud before product-market fit. You inherit the constraints of both providers and the strengths of neither, at twice the operational surface.
- Rewriting the app during the migration. When something breaks - and it will - you cannot tell whether the cause is the new platform or the new code. Move first, refactor after.
- A big-bang cutover with no rehearsal. The window is always longer than the estimate; the difference between a rehearsed migration and an unrehearsed one is measured in hours of downtime.
- Choosing from a benchmark post rather than your own numbers. Someone else's workload, region and traffic shape tell you almost nothing about your bill.
Get this audited for free
We design the target architecture around your numbers and run the migration, including the rehearsal and the rollback plan.
Book a Free CallCloud IndependenceThe other three guides
Checklist · 9 min
Production readiness checklist
40 numbered checks across eight areas, each with a one-line verification step
Read the guidePlaybook · 12 min
AI-built app security audit
Nine passes in the order that finds the worst problems first
Read the guideModel · 9 min
Cost modelling at 10x and 100x
A four-step model you can build in a spreadsheet in an afternoon
Read the guide
Want a second pair of eyes on the results?
Send us what you found. The first call is free and you keep the report either way.