Quick Answer
Match your workload to the right platform: Static sites → Vercel/Netlify. SSR apps → Vercel/Render. APIs with databases → Railway/Render. Global low-latency → Fly.io/Cloudflare. Background jobs → Railway/Render workers. Heavy compute → dedicated servers or cloud VMs. Start simple, scale when needed.

Workload types

Before choosing a platform, identify what you’re deploying:

WorkloadCharacteristicsExamples
Static siteHTML/CSS/JS files, no serverBlogs, docs, landing pages
SPAClient-side app, API callsDashboards, admin panels
SSR appServer-rendered pagesE-commerce, content sites
APIHTTP endpoints, database accessREST/GraphQL backends
Real-timeWebSockets, persistent connectionsChat, collaboration
Background workerAsync processing, queuesEmail sending, image processing
Scheduled jobRuns on a scheduleReports, cleanup, syncing
ML/AIGPU compute, model inferencePredictions, generation

Static sites

What: Pre-built HTML, CSS, JavaScript. No server needed.

Examples: Documentation, blogs, marketing sites, portfolios.

Best platforms

PlatformWhy
NetlifyBuilt for static, great free tier
VercelFast CDN, preview deploys
Cloudflare PagesUnlimited bandwidth free
GitHub PagesFree for public repos

Decision factors

Need forms? → Netlify (built-in) or external service
Need authentication? → Netlify Identity or external
Build time matters? → Cloudflare or Vercel are faster
Budget is zero? → GitHub Pages or Cloudflare Pages

Typical costs

  • Free tier: Usually sufficient forever
  • Bandwidth: Free or very cheap (CDN is efficient)

Single-page applications (SPAs)

What: Client-rendered apps that call APIs. The “app” runs in the browser.

Examples: Admin dashboards, internal tools, complex interactive apps.

Best platforms

PlatformWhy
VercelEasy deploys, good CDN
NetlifySimilar, good free tier
Cloudflare PagesCheapest at scale
S3 + CloudFrontMost control, cheapest at massive scale

Decision factors

Simple app? → Any static host works
Need API routes? → Vercel/Netlify with functions
High traffic? → Cloudflare Pages (free bandwidth)
Enterprise? → S3 + CloudFront for control

What about the API?

SPAs need a backend. Options:

  • Same platform: Vercel/Netlify functions
  • Separate service: Railway, Render, Fly.io
  • BaaS: Supabase, Firebase (database + auth + API)

Server-side rendered apps (SSR)

What: Server generates HTML for each request. Better SEO, faster initial load.

Examples: E-commerce, content sites, any SEO-critical app.

Best platforms

PlatformWhy
VercelBest Next.js support, edge rendering
RenderGood for any framework
RailwayFull-stack with database
Fly.ioGlobal edge deployment

Decision factors

Using Next.js? → Vercel (optimized integration)
Need database? → Railway or Render
Global users? → Fly.io or Vercel Edge
Budget constrained? → Render

Cost considerations

SSR costs more than static—servers run for each request:

  • Serverless: Pay per request (can spike)
  • Containers: Predictable monthly cost
  • Edge: Fast but can be expensive

APIs and backends

What: HTTP endpoints serving data. Usually connected to a database.

Examples: REST APIs, GraphQL servers, BFF (backend for frontend).

Best platforms

PlatformWhy
RailwayDatabase included, simple setup
RenderManaged Postgres, good pricing
Fly.ioGlobal, low latency
AWS App RunnerScales to zero, AWS ecosystem

Decision factors

Need managed database? → Railway or Render
Global latency matters? → Fly.io
Want AWS ecosystem? → App Runner or ECS
Sporadic traffic? → Serverless (Lambda, Cloud Run)
Predictable traffic? → Containers on Railway/Render

Database co-location

Put your API near your database:

  • Same platform (Railway API + Railway Postgres)
  • Same region (Render Oregon API + Render Oregon DB)
  • Latency adds up with every query

Real-time applications

What: WebSockets, Server-Sent Events, persistent connections.

Examples: Chat apps, collaborative tools, live dashboards, gaming.

Best platforms

PlatformWhy
Fly.ioGlobal, excellent for WebSockets
RailwaySupports WebSockets, simple
RenderWebSocket support included
Cloudflare Durable ObjectsEdge state, WebSockets

Challenges

  • Serverless struggles with persistent connections
  • Need sticky sessions or connection state management
  • Consider dedicated real-time services:

Managed alternatives

If you don’t want to run your own:

  • Pusher: Real-time messaging
  • Ably: Pub/sub messaging
  • Supabase Realtime: Database-driven real-time
  • Liveblocks: Collaboration features

Background workers

What: Async processing outside request/response cycle.

Examples: Email sending, image processing, data imports, webhook handling.

Best platforms

PlatformWhy
RailwayRun workers alongside API
RenderBackground workers built-in
Fly.ioMachines API for workers
AWS LambdaEvent-driven processing

Decision factors

Simple queue processing? → Railway/Render worker
Event-driven (S3 uploads, etc.)? → Lambda
Long-running jobs (hours)? → Containers on Railway
Need job management UI? → Add a queue service

Queue options

Workers often need queues:

  • BullMQ + Redis: Node.js, self-hosted
  • Celery + Redis: Python, self-hosted
  • AWS SQS: Managed, AWS ecosystem
  • Inngest: Managed job orchestration

Scheduled jobs (cron)

What: Tasks that run on a schedule.

Examples: Daily reports, database cleanup, sync jobs, backups.

Best platforms

PlatformWhy
RenderCron jobs built-in
RailwayCron service available
VercelCron with vercel.json
GitHub ActionsFree for scheduled tasks
AWS EventBridge + LambdaScalable, managed

Decision factors

Simple daily task? → GitHub Actions (free)
Part of existing app? → Same platform's cron
Need reliability/monitoring? → Render or Railway
Complex orchestration? → Temporal or Inngest

Cron gotchas

  • Timezone handling (use UTC)
  • Missed runs (what if it fails?)
  • Overlap prevention (locks)
  • Monitoring (did it run?)

ML/AI workloads

What: Model inference, GPU compute, AI features.

Examples: Image generation, LLM APIs, recommendations, predictions.

Best platforms

PlatformWhy
ModalGPU serverless, Python-native
ReplicateRun models via API
Hugging FaceModel hosting and inference
RunPodCheap GPU servers
AWS SageMakerEnterprise ML platform

Decision factors

Using existing models? → Replicate or HuggingFace
Custom model, occasional use? → Modal
Custom model, heavy use? → RunPod or cloud GPU
Enterprise requirements? → SageMaker

Cost warning

GPU compute is expensive:

  • On-demand: $0.50-4/hour per GPU
  • Inference: Pay per prediction
  • Consider: Do you need real-time, or can you batch?

Workload-to-platform matrix

WorkloadVercelRailwayRenderFly.ioNetlifyAWS
StaticGreat-Good-GreatGood
SPAGreat-Good-GreatGood
SSRBestGoodGoodGreatLimitedGood
APIGoodGreatGreatGreatLimitedGreat
Real-timeLimitedGoodGoodBestNoGood
WorkersLimitedGreatGreatGoodLimitedGreat
CronGoodGoodGreatGoodLimitedGreat
ML/AINoNoNoLimitedNoGood

The “just tell me what to use” guide

Solo vibecoder, starting out

Static site or SPA → Vercel or Netlify (free tier)
Full-stack with DB → Railway ($5-10/mo)

Small team, real users

Frontend → Vercel
Backend + DB → Railway or Render
Workers → Same as backend

Growing startup

Frontend → Vercel or Cloudflare
Backend → Render or Fly.io
Database → Managed Postgres (Neon, Supabase, RDS)
Workers → Same platform or dedicated queue

Enterprise/scale

Everything → AWS, GCP, or Azure
With managed services for each workload
Plus dedicated DevOps team

Cost optimization tips

Start free or cheap

  1. Use free tiers while validating
  2. Move to paid when you have revenue
  3. Optimize when costs hurt

Reduce hosting costs

StrategyHow
CDN cachingServe static assets from CDN
Database connection poolingUse PgBouncer or similar
Right-size instancesDon’t over-provision
Scale to zeroServerless for sporadic traffic
Caching layerRedis for frequent queries

When to optimize

  • Costs exceed 5-10% of revenue
  • Bills are unpredictable/spiking
  • You’re paying for idle capacity

Migration considerations

Stay portable

  • Use Docker for backends
  • Standard databases (Postgres, Redis)
  • Avoid platform-specific features unless essential
  • Infrastructure as code (Terraform, Pulumi)

Signs you need to migrate

  • Hitting platform limits
  • Costs growing faster than revenue
  • Need features platform doesn’t support
  • Reliability problems

Migration is real work

Budget 1-4 weeks for a migration. Include:

  • Environment setup
  • Data migration
  • DNS changes
  • Testing
  • Rollback plan

The honest take

Don’t overthink it. Pick a platform that fits your current needs:

  • Vercel for frontend-heavy apps
  • Railway for full-stack simplicity
  • Render for production-ready at reasonable cost

You can migrate later if you use standard technologies. The cost of picking “wrong” is usually a few days of work, not catastrophe.

Platform choice matters less than shipping. A deployed app on the “wrong” platform beats a perfect architecture that never launches.

Further reading