Choosing a Deployment Platform for APIs and MVPs#

Picking a deployment platform early in a project matters more than most teams realize. The platform determines your cost floor, your scaling ceiling, your deployment workflow, and how much operational overhead you carry. Switching later is possible but never free – you are always migrating data, rewriting config, and updating DNS.

This guide compares four platforms that cover the most common deployment scenarios: Cloudflare (Workers + D1 + Pages), AWS (Lambda + API Gateway + RDS + S3), Vercel (Pro + serverless functions), and Fly.io (Apps + Postgres). Each has a genuine sweet spot. None is best for everything.

Decision Matrix: Project Type x Platform#

Project Type Best Fit Runner-Up Avoid
Static site + blog Cloudflare Pages Vercel AWS (overkill)
API-only backend Cloudflare Workers Fly.io Vercel (oriented toward frontend)
Full-stack web app (Next.js/Remix) Vercel Fly.io Cloudflare (limited SSR runtime)
REST/GraphQL API + relational DB Cloudflare (Workers + D1) Fly.io (Apps + Postgres) Vercel (no managed DB)
Docker-based microservices Fly.io AWS (ECS/Fargate) Cloudflare (no containers in GA)
Data pipeline / heavy compute AWS (Lambda + Step Functions) Fly.io (dedicated VMs) Cloudflare (CPU limits)
Real-time / WebSocket app Fly.io Cloudflare (Durable Objects) Vercel (no persistent connections)
Multi-region, latency-sensitive Cloudflare Workers Fly.io AWS (requires explicit multi-region)

Cost Comparison at Scale#

Costs include compute, database, storage, and bandwidth. All estimates assume a typical API-backed web application with a relational database.

Hobby Scale ($0/month target)#

Platform What You Get Free Monthly Cost
Cloudflare 100K req/day, D1 (5B reads, 5 GB), KV (100K reads/day), R2 (10 GB), Pages (unlimited bandwidth) $0
AWS Lambda (1M req/mo, 400K GB-s), API Gateway (1M calls), S3 (5 GB), DynamoDB (25 GB). RDS is NOT free-tier-forever $0 (12-month limit on many services)
Vercel 100 GB bandwidth, serverless functions (100 GB-hrs), edge functions, one project. No managed DB $0
Fly.io 3 shared VMs, 3 GB persistent storage, 160 GB bandwidth $0

Winner at hobby scale: Cloudflare. The free tier includes a relational database (D1), object storage (R2), KV cache, and unlimited Pages bandwidth with no time limits. AWS free tier expires after 12 months for key services like RDS and EC2.

Small Scale (~1,000 users, ~1M requests/month)#

Platform Stack Monthly Cost
Cloudflare Workers ($5 plan) + D1 (within free) + KV (within free) + R2 (within free) + Pages ~$5
AWS Lambda + API Gateway + RDS db.t3.micro + S3 + CloudFront ~$25-40
Vercel Pro ($20) + external DB (PlanetScale/Neon ~$0-10) ~$20-30
Fly.io 1-2 shared VMs ($3-7) + Fly Postgres ($0-7) ~$5-15

Medium Scale (~10,000 users, ~10M requests/month)#

Platform Stack Monthly Cost
Cloudflare Workers ($5 + minor overage) + D1 ($5-15) + KV ($5) + R2 (~$5) ~$15-30
AWS Lambda + API GW + RDS db.t3.small + S3 + CloudFront + NAT Gateway ~$100-200
Vercel Pro ($20) + DB ($25-50) + bandwidth overages ~$70-120
Fly.io 2-4 VMs ($15-30) + Postgres ($15-30) ~$30-60

Growth Scale (~100,000 users, ~100M requests/month)#

Platform Stack Monthly Cost
Cloudflare Workers ($5 + $27 overage) + D1 ($30-60) + KV ($25) + R2 (~$20) ~$80-150
AWS Lambda + API GW + RDS db.r5.large + ElastiCache + S3 + CloudFront + NAT GW ~$500-1,500
Vercel Enterprise (custom) or Pro with overages ~$300-800
Fly.io 4-8 VMs ($50-120) + Postgres HA ($60-120) + bandwidth ~$150-300

The cost gap between Cloudflare and AWS widens dramatically at scale. Cloudflare charges per operation with no bandwidth fees. AWS charges per operation AND per instance-hour AND per GB of data transfer AND per NAT Gateway byte.

Free Tier Comparison#

Feature Cloudflare AWS Vercel Fly.io
Compute 100K req/day (no expiry) 1M req/mo Lambda (12-month limit on some) 100 GB-hrs serverless 3 shared VMs
Database D1: 5B reads, 100M writes, 5 GB DynamoDB: 25 GB. RDS: 12 months only None (bring external) 3 GB Postgres storage
Object Storage R2: 10 GB, $0 egress S3: 5 GB (12-month) None None
KV/Cache KV: 100K reads/day ElastiCache: none free Edge Config (limited) None
Bandwidth Unlimited (Workers, Pages, R2) CloudFront: 1 TB/mo (12-month) 100 GB/mo 160 GB/mo
Custom Domains Unlimited, free SSL Via CloudFront or ALB 1 per project (free) Unlimited, free SSL
Expiry Never 12 months for most Never Never

Platform Strengths and Weaknesses#

Cloudflare (Workers + D1 + Pages)#

Strengths:

  • Runs at 330+ edge locations globally with no configuration
  • Zero egress fees on R2 and Workers
  • Sub-5ms cold starts (V8 isolates, not containers)
  • Integrated ecosystem (compute, DB, cache, storage, DNS, CDN in one dashboard)
  • Free tier is genuinely production-capable with no expiry
  • wrangler deploy deploys globally in seconds

Weaknesses:

  • 128 MB memory limit per Worker
  • 30s CPU time limit (paid plan) – no long-running jobs
  • D1 is single-writer with 10 GB max – not for write-heavy workloads
  • No container support in GA (Containers is beta)
  • Smaller ecosystem of tutorials, Stack Overflow answers, and third-party integrations compared to AWS
  • Some npm packages that depend on Node.js APIs do not work in the Workers runtime

Best for: APIs, static sites, edge applications, projects where cost efficiency and global latency matter. Teams that want to ship fast without infrastructure management.

AWS (Lambda + API Gateway + RDS + S3)#

Strengths:

  • The most comprehensive cloud platform – a service for literally everything
  • Battle-tested at every scale from startup to Fortune 500
  • Massive ecosystem of tools, tutorials, consultants, and managed services
  • Granular IAM for security-sensitive workloads
  • Services like Step Functions, SQS, SNS, EventBridge enable complex event-driven architectures

Weaknesses:

  • Expensive at small-to-medium scale (NAT Gateway alone costs $32/month + $0.045/GB)
  • Complex pricing with dozens of line items per service
  • Cold starts on Lambda (100ms-1s depending on runtime and VPC)
  • Operational overhead: VPCs, security groups, IAM roles, CloudFormation/Terraform
  • Free tier expires after 12 months for key services (RDS, EC2, CloudFront)
  • Data transfer charges ($0.09/GB out) add up fast

Best for: Enterprise applications, complex event-driven architectures, workloads requiring specific AWS services (SageMaker, Redshift, Kinesis), teams with existing AWS expertise.

Vercel#

Strengths:

  • Best-in-class developer experience for Next.js, Remix, and frontend frameworks
  • Preview deployments for every PR with instant rollback
  • Edge Functions for low-latency middleware
  • Built-in analytics and performance monitoring
  • Zero-config deployments (git push and done)

Weaknesses:

  • No managed database (you bring PlanetScale, Neon, Supabase, etc.)
  • Expensive at scale – bandwidth overages and function execution add up
  • Oriented toward frontend/full-stack frameworks – not ideal for API-only backends
  • Serverless functions have a 10s default timeout (60s on Pro)
  • No persistent connections (WebSockets require external services)
  • Vendor lock-in for framework-specific optimizations (ISR, edge middleware)

Best for: Next.js and React applications, frontend teams that want zero-ops deployment, projects where developer experience is the top priority.

Fly.io#

Strengths:

  • Run any Docker container globally with simple CLI (fly launch)
  • Full Linux VMs with persistent volumes – run anything (Postgres, Redis, custom binaries)
  • Multi-region by default with automatic request routing
  • WebSocket and long-running connection support
  • Good middle ground between serverless simplicity and container flexibility
  • Built-in Postgres and Redis as managed add-ons

Weaknesses:

  • Higher baseline cost than serverless (VMs run 24/7 unless you scale to zero)
  • Smaller community and ecosystem than AWS or Vercel
  • Scale-to-zero support exists but is less mature than serverless platforms
  • Storage options are limited (persistent volumes, not managed object storage)
  • Networking can be complex for multi-region setups with Fly Postgres

Best for: Docker-based applications, projects needing persistent connections (WebSockets, gRPC), teams that want global deployment without serverless constraints.

When to Outgrow Each Platform#

Outgrowing Cloudflare Workers#

  • D1 write throughput becomes a bottleneck (sustained high writes)
  • You need more than 128 MB memory per request
  • Jobs routinely exceed 30s CPU time
  • You need container-based workloads (ML inference, video processing)

Migration path: Move database to Neon/Supabase (Postgres, SQL is portable). Move compute to Fly.io or AWS Lambda. Keep R2 for storage and Pages for static content – no reason to leave those.

Outgrowing AWS Lambda#

  • You need long-running processes (>15 min) or persistent connections
  • Cold starts are unacceptable for your latency requirements
  • You want simpler deployment than CloudFormation/SAM/CDK

Migration path: Move to ECS/Fargate (containers on AWS) or Fly.io. Data stays on AWS (RDS, S3).

Outgrowing Vercel#

  • Bandwidth costs exceed your budget
  • You need backend-only APIs without a frontend framework
  • You need persistent connections or long-running tasks

Migration path: Move API to Cloudflare Workers or Fly.io. Keep Vercel for the frontend if it is a Next.js app. Split frontend and backend deployments.

Outgrowing Fly.io#

  • You need managed services (ML, data warehousing, event streaming)
  • Compliance requires specific cloud certifications (FedRAMP, HIPAA BAA)
  • You need the breadth of AWS/Azure/GCP service catalog

Migration path: Move to AWS ECS/EKS or GKE. Dockerized apps are portable by design.

Migration Portability#

Layer Portability Notes
Application code High (if using web standards) Workers use Fetch API – works anywhere. Fly.io runs Docker – runs anywhere. Lambda handlers need adapters
Database schemas High (SQL is SQL) D1 (SQLite), RDS (Postgres/MySQL), Fly Postgres – all speak SQL. Schema migration is straightforward
Object storage High (S3 API is universal) R2, S3, GCS, MinIO all support the S3 API. rclone sync moves data between them
DNS/domains High DNS records move in minutes. Custom domain setup is trivial on all platforms
CI/CD pipelines Medium GitHub Actions works with everything. Platform-specific deploy commands change
Caching layer Low KV, ElastiCache, Vercel Edge Config are all different. Cache logic needs rewriting
Platform-specific features Low Durable Objects, Vercel ISR, Fly.io Machines API – these do not port

Recommendation Framework#

Answer these three questions:

  1. What is your project type? Static site, API, full-stack app, or Dockerized service. This narrows to 1-2 platforms (see decision matrix above).

  2. What is your budget? If $0 for the first year matters, Cloudflare and Fly.io have the best permanent free tiers. AWS free tier expires. Vercel free tier is limited.

  3. What is your scaling ceiling? If you anticipate 100K+ users, Cloudflare has the flattest cost curve. AWS has the most services but the steepest cost curve. Fly.io and Vercel fall in between.

When in doubt, start with Cloudflare Workers for APIs and static sites. The free tier covers most hobby and small-scale projects, the cost curve is flat, and the deployment workflow is simple. Move to Fly.io if you need containers, or AWS if you need the depth of managed services.