Skip to content
Unverified — AI-generated content. Help verify this page

Vercel vs Netlify vs Cloudflare Pages vs AWS Amplify

Choosing a deployment platform is one of the most consequential early decisions in a web project. It affects build speed, cold-start latency, pricing at scale, and even which frameworks you can adopt. This comparison cuts through the marketing and evaluates four leading platforms on what actually matters in production.

Overview

PlatformFoundedCore PhilosophyPrimary Audience
Vercel2015 (as ZEIT)"Framework-defined infrastructure"Frontend / full-stack teams using Next.js
Netlify2014"Composable web architecture"Jamstack & static-first teams
Cloudflare Pages2021"Edge-first everything"Performance-obsessed teams, global apps
AWS Amplify2017"AWS services with a simpler DX"Teams already invested in AWS ecosystem

Key Insight

No platform is universally "best." Vercel dominates the Next.js ecosystem, Netlify pioneered Jamstack workflows, Cloudflare wins on edge latency, and Amplify is the on-ramp to the full AWS service catalog.

Architecture Comparison

Feature Matrix

FeatureVercelNetlifyCloudflare PagesAWS Amplify
Free tier bandwidth100 GB/mo100 GB/moUnlimited15 GB/mo
Free tier builds6,000 min/mo300 min/mo500 builds/mo1,000 min/mo
Pro plan price$20/user/mo$19/user/mo$5/mo (Workers Paid)Pay-as-you-go
Edge locations~70+ (Anycast)CDN (multi-provider)310+ PoPs600+ CloudFront PoPs
Serverless runtimeNode.js (AWS Lambda)Node.js (AWS Lambda)V8 Isolates (Workers)Node.js (Lambda)
Edge runtimeV8 IsolatesDeno DeployV8 Isolates (native)Lambda@Edge / CloudFront Functions
Cold start~250ms (serverless) / <1ms (edge)~250ms (serverless) / <5ms (edge)<1ms (Workers)~300ms (Lambda)
Max function duration60s (Pro) / 300s (Enterprise)10s (free) / 26s (paid)30s (Workers) / 15min (Queues)15min (Lambda)
Next.js supportFirst-class (creator)Adapter-basedAdapter (OpenNext)Adapter-based
Framework adaptersNext, Nuxt, SvelteKit, AstroNext, Nuxt, Gatsby, Remix, AstroNext (partial), Astro, Nuxt, SvelteKitNext, Nuxt, Gatsby, Angular
Preview deploymentsPer-PR, instantPer-PR, instantPer-branchPer-branch
Monorepo supportTurborepo-nativeBuild pluginsManual configAmplify monorepo
AnalyticsWeb Vitals, Speed InsightsBuilt-in analyticsWeb Analytics (free)CloudWatch integration
DDoS protectionIncludedIncludedEnterprise-grade (native)AWS Shield
Custom domainsUnlimited (free)Unlimited (free)Unlimited (free)Unlimited (free)
Image optimizationBuilt-in (next/image)Large Media / pluginsCloudflare Images (paid)Manual (Lambda@Edge)
DatabaseVercel Postgres, KV, BlobNone (BYO)D1 (SQLite), KV, R2DynamoDB, Aurora
AuthNone (BYO)Netlify IdentityCloudflare AccessCognito (native)

Code & Config Comparison

Build Configuration

Vercel (vercel.json):

json
{
  "buildCommand": "npm run build",
  "outputDirectory": ".next",
  "framework": "nextjs",
  "regions": ["iad1", "sfo1", "cdg1"],
  "functions": {
    "api/**/*.ts": {
      "memory": 1024,
      "maxDuration": 60
    }
  },
  "crons": [
    { "path": "/api/cron/sync", "schedule": "0 */6 * * *" }
  ]
}

Netlify (netlify.toml):

toml
[build]
  command = "npm run build"
  publish = ".next"

[build.environment]
  NODE_VERSION = "20"

[[redirects]]
  from = "/api/*"
  to = "/.netlify/functions/:splat"
  status = 200

[[headers]]
  for = "/*"
  [headers.values]
    X-Frame-Options = "DENY"
    X-Content-Type-Options = "nosniff"

Cloudflare Pages (wrangler.toml):

toml
name = "my-app"
compatibility_date = "2026-03-01"
pages_build_output_dir = "./dist"

[[d1_databases]]
binding = "DB"
database_name = "my-db"
database_id = "xxxx-xxxx-xxxx"

[vars]
ENVIRONMENT = "production"

AWS Amplify (amplify.yml):

yaml
version: 1
frontend:
  phases:
    preBuild:
      commands:
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: .next
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*
      - .next/cache/**/*

Serverless Function Example

Vercel (Edge Function):

typescript
// app/api/hello/route.ts
export const runtime = 'edge';

export async function GET(request: Request) {
  const country = request.headers.get('x-vercel-ip-country') || 'unknown';
  return new Response(
    JSON.stringify({ message: `Hello from ${country}` }),
    { headers: { 'content-type': 'application/json' } }
  );
}

Cloudflare (Worker):

typescript
// functions/api/hello.ts
export const onRequest: PagesFunction = async (context) => {
  const country = context.request.cf?.country || 'unknown';
  return new Response(
    JSON.stringify({ message: `Hello from ${country}` }),
    { headers: { 'content-type': 'application/json' } }
  );
};

Netlify (Edge Function):

typescript
// netlify/edge-functions/hello.ts
import type { Context } from "@netlify/edge-functions";

export default async (request: Request, context: Context) => {
  const country = context.geo?.country?.code || 'unknown';
  return new Response(
    JSON.stringify({ message: `Hello from ${country}` }),
    { headers: { 'content-type': 'application/json' } }
  );
};

Performance

Cold Start Benchmarks

MetricVercel (Serverless)Vercel (Edge)Netlify (Serverless)Netlify (Edge)Cloudflare WorkersAmplify (Lambda)
Cold start p50180ms<1ms200ms3ms<1ms250ms
Cold start p99800ms5ms900ms15ms5ms1200ms
Warm response p5015ms<1ms20ms<1ms<1ms20ms
Max bundle size50 MB4 MB50 MB20 MB10 MB (compressed)50 MB
Memory1024-3008 MB128 MB1024 MB512 MB128 MB128-10240 MB

Edge Function Constraints

Edge runtimes (V8 Isolates) are fast but restricted. No fs module, limited Node.js APIs, smaller bundle sizes, and shorter execution limits. If your function needs heavy computation or Node.js-specific APIs, serverless (Lambda-based) functions remain the better choice.

Build Speed

ScenarioVercelNetlifyCloudflare PagesAmplify
Next.js app (100 pages)~45s~70s~90s~120s
Static site (1000 pages)~30s~35s~40s~60s
Monorepo (Turborepo)~20s (cached)~60s~80s~90s
Concurrent builds (free)1111
Concurrent builds (paid)Up to 12Up to 31 (Pages)Up to 5

Developer Experience

What Each Platform Excels At

Vercel:

  • Zero-config Next.js deployments with instant rollbacks
  • Speed Insights and Web Vitals baked into the dashboard
  • vercel dev perfectly mirrors production environment locally
  • Preview deployments with comment-powered feedback (Vercel Toolbar)

Netlify:

  • Form handling without a backend (Netlify Forms)
  • Split testing (A/B) built into the platform
  • Plugin ecosystem (build plugins for Lighthouse, caching, etc.)
  • Netlify CMS (now Decap CMS) integration for content teams

Cloudflare Pages:

  • Unbeatable free tier (unlimited bandwidth)
  • Native access to Workers KV, D1, R2, Queues, Durable Objects
  • Fastest edge network in the industry (310+ PoPs)
  • wrangler CLI for local development with full Workers API

AWS Amplify:

  • Deep integration with 200+ AWS services
  • Cognito for production-grade auth
  • AppSync for managed GraphQL
  • Fine-grained IAM controls for enterprise compliance

Pain Points

PlatformCommon Frustration
VercelPricing jumps sharply at scale; vendor lock-in with Next.js features
NetlifyBuild times slower; limited serverless function duration
CloudflareNode.js compatibility gaps; smaller ecosystem of adapters
AmplifySlow builds; complex debugging; AWS console complexity

When to Use Which

Decision Summary

ScenarioRecommended Platform
Next.js app with team of 1-5Vercel
Static blog or marketing siteNetlify or Cloudflare Pages
Global app requiring <10ms TTFB everywhereCloudflare Pages
Project needing DynamoDB, Cognito, SQSAWS Amplify
Budget-constrained hobby projectCloudflare Pages (unlimited bandwidth)
Enterprise with compliance requirementsAWS Amplify (IAM, VPC, SOC2)
Monorepo with TurborepoVercel
Content site with CMSNetlify + Decap CMS

Migration

Vercel to Cloudflare Pages

bash
# 1. Install wrangler
npm install -D wrangler

# 2. Add OpenNext adapter for Next.js
npm install @opennextjs/cloudflare

# 3. Update build script in package.json
# "build": "opennextjs-cloudflare"

# 4. Create wrangler.toml
cat > wrangler.toml << 'CONF'
name = "my-app"
compatibility_date = "2026-03-01"
pages_build_output_dir = ".open-next"

[vars]
ENVIRONMENT = "production"
CONF

# 5. Deploy
npx wrangler pages deploy

Netlify to Vercel

bash
# 1. Remove Netlify-specific files
rm netlify.toml
rm -rf netlify/

# 2. Remove Netlify plugins from package.json
npm uninstall @netlify/plugin-nextjs netlify-cli

# 3. Install Vercel CLI
npm install -g vercel

# 4. Initialize Vercel project
vercel

# 5. Move redirects to vercel.json or next.config.js
cat > vercel.json << 'CONF'
{
  "redirects": [
    { "source": "/old-path", "destination": "/new-path", "permanent": true }
  ]
}
CONF

# 6. Deploy
vercel --prod

Key Migration Considerations

ConcernNotes
Environment variablesAll platforms use different naming; audit process.env references
Redirects/headersConfig format differs; convert _redirects / netlify.toml / vercel.json
Serverless functionsPath conventions differ (/api/* vs /.netlify/functions/* vs /functions/*)
Edge functionsRuntime APIs are not 100% compatible; test thoroughly
Build cacheRemote cache (Turborepo) is Vercel-specific; self-host for others
DNS propagationAllow 24-48 hours when moving custom domains

Verdict

Vercel is the gold standard for Next.js projects and teams that value developer experience above all else. Its tight integration with the framework it created is unmatched, but costs climb quickly at scale.

Netlify remains the best choice for Jamstack purists who want form handling, split testing, and a mature plugin ecosystem without vendor lock-in to a specific framework.

Cloudflare Pages offers the most aggressive free tier and the fastest global edge network. If your application can work within Workers constraints, it delivers the best performance-per-dollar ratio in the industry.

AWS Amplify is the right answer when your backend is already AWS-native. It trades developer experience for access to the most comprehensive cloud service catalog on the planet.

Bottom Line

Start with Cloudflare Pages for budget-conscious projects, Vercel for Next.js teams that want zero-friction DX, Netlify for content-heavy static sites, and AWS Amplify when your infrastructure is already in AWS. The migration cost between platforms is moderate (1-3 days for most projects), so do not let lock-in anxiety paralyze your v1 launch.

Which Would You Choose?

Scenario 1: You are a solo indie hacker launching a SaaS product. You have zero revenue, your traffic is unpredictable, and every dollar counts. Your stack is Astro + a few API endpoints.

Recommendation: Cloudflare Pages

Unlimited bandwidth on the free tier is unbeatable for a pre-revenue project. You can deploy your Astro site with Workers for API endpoints and D1 for a database — all on the free or $5/month Workers Paid plan. If your product goes viral overnight, Cloudflare's edge network handles the traffic without surprise bills.

Scenario 2: Your 8-person startup is building a Next.js e-commerce app with ISR, image optimization, and per-PR preview deployments. The team wants the fastest DX possible.

Recommendation: Vercel

Vercel created Next.js and optimizes every feature for their platform. ISR, next/image, middleware, and preview deployments work flawlessly with zero config. The $20/user/month Pro plan is worth it for the DX gains. Be aware that costs will climb as traffic grows — plan to negotiate an Enterprise contract before you hit scale.

Scenario 3: Your content team manages 500+ pages with a headless CMS. They need A/B testing, form submissions without a backend, and easy rollbacks. The dev team is small and does not want to manage infrastructure.

Recommendation: Netlify

Netlify's built-in form handling, split testing (A/B), and Decap CMS integration make it the best platform for content-heavy teams. The plugin ecosystem covers Lighthouse audits, caching, and CMS webhooks. For a 500-page static site, Netlify's build and deploy pipeline is mature and reliable.

Scenario 4: Your enterprise has a microservices backend on AWS with DynamoDB, Cognito, and SQS. You need a frontend deployment platform that integrates with your existing AWS infrastructure and meets SOC 2 compliance requirements.

Recommendation: AWS Amplify

Amplify is the natural choice when your backend is already AWS-native. Cognito for auth, DynamoDB for data, and fine-grained IAM controls satisfy enterprise compliance requirements. The DX is worse than Vercel or Netlify, but the operational coherence of staying within one cloud provider outweighs the convenience gap.

Common Misconceptions

  • "Vercel is only for Next.js" — Vercel supports Nuxt, SvelteKit, Astro, Remix, and static sites. However, advanced features like ISR and image optimization are most polished with Next.js.
  • "Cloudflare Pages cannot run full-stack apps" — Cloudflare Workers, D1, KV, R2, and Queues provide a complete backend. The constraint is the V8 Isolates runtime, not the feature set. If your code runs in a Worker, you have a full-stack platform.
  • "Netlify is dead because Vercel won" — Netlify serves different needs: form handling, split testing, and CMS integrations that Vercel does not offer. Netlify's composable architecture avoids single-vendor lock-in.
  • "Vendor lock-in means you can never leave" — Migration between these platforms typically takes 1-3 days. The config files differ, but the application code stays the same. Lock-in anxiety is overrated for most projects.

Real Migration Stories

Kent C. Dodds: Netlify to Fly.io — Kent migrated his high-traffic site off Netlify because he needed a long-running Node.js server for his custom content pipeline, which did not fit Netlify's serverless model. The lesson: pick a platform that matches your architectural pattern, not just your deploy workflow.

Cal.com: Vercel to self-hosted — Cal.com, an open-source scheduling platform, moved off Vercel to self-hosted infrastructure as their traffic scaled. Vercel's per-seat pricing and bandwidth costs became untenable at their volume. They still use Next.js but deploy via Docker on their own servers.

Quiz

1. Which platform offers unlimited bandwidth on its free tier?

Cloudflare Pages. All other platforms cap bandwidth (Vercel: 100 GB, Netlify: 100 GB, Amplify: 15 GB).

2. What is the primary advantage of Vercel's Edge Functions over their Serverless Functions?

Edge Functions use V8 Isolates with sub-millisecond cold starts and run on ~70+ edge locations globally. Serverless Functions use AWS Lambda with ~250ms cold starts and run in specific regions.

3. Why might you choose Netlify over Vercel for a marketing site?

Netlify offers built-in form handling (no backend needed), A/B split testing, and Decap CMS integration — features Vercel does not provide. For content-heavy marketing sites, these built-in capabilities save significant development time.

4. What is the main limitation of Cloudflare Workers compared to traditional serverless?

Workers run in a V8 Isolate, not a Node.js environment. There is no fs module, limited Node.js API compatibility, a 10 MB compressed bundle size limit, and shorter execution time limits (30 seconds for Workers).

5. When does AWS Amplify make sense despite its worse developer experience?

When your backend is already AWS-native (DynamoDB, Cognito, SQS, etc.) and you need enterprise compliance controls (IAM, VPC, SOC 2). The operational coherence of staying within AWS outweighs the DX gap.

One-Liner Summary

Vercel is the gold standard for Next.js DX, Cloudflare Pages wins on free-tier generosity and edge speed, Netlify owns the content-site niche, and Amplify is the AWS on-ramp.

"What I cannot create, I do not understand." — Richard Feynman