The day your side project takes its first payment, your hosting becomes a terms-of-service violation. Vercel's free Hobby plan is restricted to personal, non-commercial use — the moment your app generates revenue or serves paying customers, you owe Vercel a Pro seat. That rule catches more founders than any usage limit ever has, because everything about Hobby feels like a startup tier: generous quotas, preview URLs, edge deploys. It is, legally, a staging tier.
The natural next thought is "fine, I'll move to someone else's free tier." In 2026, that map is close to empty. Railway and Fly.io are trial-credit-only for new accounts, and only Render still offers a genuinely free-forever tier — with sleeps. So this post is the honest version of that migration search: the current free-tier map, the real monthly math for a typical indie SaaS across Vercel Pro, Railway, Fly.io, Render, and a small Hetzner box, a primitive-by-primitive mapping of what your Vercel app actually depends on, and the short list of things with no honest equivalent outside the edge.
The 2026 free-tier map: nowhere left to run for free
Here is every refuge, current as of this month:
| Platform | Free option in 2026 | The catch |
|---|---|---|
| Vercel Hobby | $0: 100 GB transfer, 1M edge requests, 1M function invocations | Non-commercial use only — a business may not run on it |
| Railway | One-time $5 trial credit (~30 days) | Then Hobby at $5/mo minimum, which includes $5 of usage |
| Fly.io | Short trial only (new orgs) | No free tier for organizations created after Oct 7, 2024 — pay-as-you-go from the first dollar |
| Render | Free web service, free forever | 0.1 CPU / 512 MB, sleeps after 15 min idle with ~1 min wake, 750 instance-hours/mo per workspace; free Postgres expires after 30 days |
Two footnotes matter. First, Railway's trial really is one-time: after the $5 credit, there is no ongoing free allowance, and paid Railway services bill for every second they exist — there is no scale-to-zero, so "free while idle" is not a thing there. Second, Render's free tier is the only one you can camp on indefinitely, but the sleep/wake cycle makes it a demo tier, not a home for anything customers open daily.
If you need the metered-platform pricing at more depth than one table — seat-fee decay, the Render bandwidth replan, Railway's workspace flattening — our September audit of the Railway-vs-Render-vs-Fly.io verdict table re-ran every row against real bills. This post answers the narrower question: you are leaving Hobby because you have revenue, so where do you go?
The real monthly math: one founder, one app, one database
Take a typical just-monetized SaaS: a Next.js app, one Postgres database, modest traffic (tens of GB of transfer), one founder. Here is the honest monthly total per option, database included — because a comparison that prices compute without the database is quoting half an invoice:
| Option | Monthly total | Notes |
|---|---|---|
| Vercel Pro | ~$20 + usage | $20/seat; 1 TB transfer and 10M CDN requests included, then from $0.15/GB. At this scale usage is ~$0 — the seat is the bill |
| Railway Hobby | ~$10–20 | $5 base incl. $5 usage; app + containerized Postgres metered on top. No PITR, no replicas |
| Fly.io | ~$5–10 + external DB | Small always-on Machine ~$4–6; real DB bill is external (Managed Postgres Basic $38/mo) or your own on-call time |
| Render paid | ~$13–20 | Starter web ~$7 + managed Postgres from ~$6 — the only option here with PITR included at this price |
| Hetzner CX23 + self-hosted | ~$7 | CX23 (2 vCPU / 4 GB) at €5.49 + €0.50 IPv4 on the post–June 15, 2026 list; app + Postgres + 20 TB transfer on one box |
The shape of the answer depends on the workload, so run the sensitivity before you pick:
Idle-mostly internal tool (~10% duty cycle). Fly.io wins on metered pricing because Machines scale to zero — roughly 10% of the always-on cost plus a stopped volume, call it $1–2/mo for compute. Railway and paid Render bill the full always-on rate regardless. The Hetzner box is $7 whether it idles or not, which loses at this duty cycle if you truly need nothing else on it — but the moment the same box also holds staging, previews, or a second service, the flat rate absorbs them for $0 marginal.
Bandwidth-heavy app (500 GB+ egress). This is where metered rows detonate: past roughly half a terabyte, bandwidth dominates every managed invoice (Render ~$0.15/GB past allowance, Railway $0.05/GB, Fly.io $0.02/GB in NA/EU). Hetzner's 20 TB included allowance swallows the entire line. A SaaS serving video, images, or file downloads can pay more for transfer on Vercel Pro overages than the whole self-hosted box costs.
Two founders, not one. Vercel Pro is per-seat, so the second teammate doubles the base to $40 before usage. Railway Pro ($20/workspace, unlimited seats after the summer 2026 flattening) and Render Pro ($25/workspace flat) stopped charging per seat; self-hosting never did. Teams should re-check any comparison older than ~60 days — the team row is the row vendors rewrote most aggressively this year.
The pattern: Vercel Pro is the best product and roughly 3x the price of the box; the metered middle (Railway, Fly.io, Render) clusters around $10–20 for this profile; the Hetzner row is ~$7 flat and gets cheaper per service with everything you consolidate onto it. The rest of this post is about what that $13/mo savings actually costs you in primitives.
What your Vercel app depends on, primitive by primitive
Most Hobby apps use a small subset of Vercel's surface. Map each one before you move:
| Vercel primitive | Self-hosted equivalent | Fidelity |
|---|---|---|
| ISR (Incremental Static Regeneration) | Works out of the box: self-hosted Next.js persists the ISR cache to the filesystem automatically | Full on a single node; multi-instance needs a custom cache handler (Redis/S3) |
| Serverless Functions | The same Next.js server, running as one long-lived process (output: 'standalone' + Docker) | Full for typical loads; you trade infinite burst for a fixed box |
| Middleware / Edge Functions | middleware.ts runs on Node in self-host; static + cacheable traffic goes behind Cloudflare's free tier | Partial — see the gap list below |
| Preview URLs | Coolify / Dokploy PR preview deployments: one env per PR, unique URL, auto-teardown | Full mechanics; you supply the DNS wildcard and the disk |
| Cron Jobs | System cron or supercronic in a container | Full, minus the dashboard |
Image Optimization (next/image) | Self-hosted optimizer runs locally (sharp); or serve via Cloudflare Polish / a CDN | Full, but CPU and bandwidth are now yours |
| Postgres | Self-hosted Postgres in Docker, or Neon/Supabase free tier alongside your compute | Full; backups and PITR are your runbook now (or Render's $6 managed instance as a hybrid) |
| Analytics / Speed Insights | Plausible self-hosted (or their cloud), Umami, or OpenPanel | Full for page stats; no Web-Vitals-per-deploy without wiring |
Three of these deserve a paragraph. ISR is the one founders over-worry about: the Next.js docs are explicit that filesystem ISR "works automatically when self-hosting," and a single-node indie SaaS is the case that works — the custom-cache-handler story only starts when you scale past one server. Preview URLs are the one founders under-worry about: Coolify and Dokploy both reproduce the invariants (env per branch, unique URL, teardown on close, status comment on the PR), but preview envs consume real disk and RAM on your box, so set a retention policy before your tenth open PR. Image optimization is the silent bill: on Vercel it is metered and cached at the edge; self-hosted, every uncached transform burns your CPU and every byte your transfer — put Cloudflare in front on day one and let its cache eat the repeats.
What has no honest equivalent outside the edge
Intellectual honesty requires the other list. Three things do not survive the move, and you should know which of them you actually need:
1. Global point-of-presence latency. Vercel serves cached content from its global edge network with zero config. A single Hetzner box in Falkenstein serves Berlin in 10ms and Sydney in 300ms. Cloudflare's free tier closes most of this gap for cacheable content — which, for a marketing site plus dashboard SaaS, is most bytes — but dynamic, authenticated responses still travel to one region.
If your customers cluster in one geography (most indie SaaS at this stage), this gap is theoretical. If you already have paying users on three continents hitting latency-sensitive dynamic endpoints, it is disqualifying, and you should stay on an edge platform.
2. Burst scaling without capacity planning. Vercel absorbs a Hacker News front page by scaling functions horizontally; your CX23 absorbs it until it doesn't, then it falls over. The mitigations are real but manual: Cloudflare caching + rate limiting in front, a bigger box one resize away, and (for genuinely spiky workloads) an autoscaled tier you build later. If virality is your growth strategy rather than your nightmare scenario, price that risk honestly.
3. Zero-ops failover and deploys. Multi-region failover, atomic rollbacks, and "git push, it's live" are one-platform features. Self-hosted, you reimplement the deploy pipeline (Coolify/Dokploy give you most of it) and you accept single-region availability until you engineer otherwise. The pragmatic middle: keep the marketing site on the edge (one Vercel Pro seat for a static-ish property is at least bounded) and self-host the app — though at that point you are paying both bills, so do the addition first.
Notice what is not on this list: TLS, custom domains, rollbacks, logs, env management, team access. Every self-hosted PaaS layer ships those. The edge gap is latency, burst, and multi-region — nothing else. Most single-region B2B SaaS products never touch it.
The migration playbook
Assuming a standard Next.js + Postgres SaaS, the move is a weekend project. In order:
1. Containerize the app. Set output: 'standalone' in next.config, build a Dockerfile from the standalone output, and verify next start serves ISR revalidation correctly in the container. This is also your rollback artifact — tag it and keep it.
2. Pick your PaaS layer. Coolify and Dokploy both install on a bare box with one script and give you git-push deploys, PR previews, TLS, and backups. If you want Render-compatible primitives (services, deploys, and audit trail shaped like the platform you already know) on machines you own, that is the gap Bex.co fills. Either way: do not hand-roll nginx + certbot + pm2 in 2026. The PaaS layer is what makes the $7 box operationally comparable to the $20 seat.
3. Move the database first, the app second. Provision Postgres (self-hosted container with scheduled backups to S3, or a managed instance as a hybrid), pg_dump / restore, then point a staging deployment at the new DB and soak it for a day. Database moves are the only step with no clean undo — everything else can flip back via DNS.
4. Stand up preview environments. Enable PR previews in your PaaS layer with a wildcard DNS record (*.preview.yourdomain.com), and confirm teardown works by closing a test PR. This is the Vercel habit your team will miss most if you skip it.
5. Cut over DNS and TLS. Lower the TTL a day ahead, flip the apex/CNAME to the new box (or to Cloudflare in front of it), and watch issuance + redirect chains. Keep the Vercel project deployed but idle for one billing cycle as a hot rollback — Hobby costs $0, but remember it may no longer serve commercial traffic, so treat it as a rollback artifact, not a fallback tier.
6. Decommission checklist. The gotchas that bite after cutover: cron jobs still firing on Vercel (double-billing and double-sending), env vars that lived only in the Vercel dashboard, ISR revalidation webhooks pointing at the old domain, next/image remote patterns allowlisting the old host, and analytics funnels split across two properties. Walk each one the week after the move.
Total honest cost of the weekend: ~$7/mo ongoing, plus the ops surface you now own (OS updates, Postgres backups, box monitoring). For a SaaS doing any real revenue, that trade is usually correct — the $13+/mo savings is not the point; the point is that your hosting bill stops scaling with your success along axes (seats, bandwidth, function invocations) you do not control.
Your first paying customer should be a celebration, not a compliance event. Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.



