DevTeardown
English

English comparison articles · 비교글 영어 원문 · 比较文章为英文 · 比較記事は英語 · Artículos en inglés · Articles en anglais

Hosting & Edge Vercel vs Cloudflare Pages Source review recorded 2026-11-10 · 5 min read

Vercel vs Cloudflare Pages

Both hosts now meter CPU time, so an idle await is free on either and paying for idle time no longer separates them. What separates them is transfer and requests on Vercel — 3 TB a month adds 2,048 GB × $0.15 = $307.20 — against CPU milliseconds on Cloudflare, where egress costs $0.

Verdict

Teams whose transfer passes 1 TB or whose requests pass 10M a month should pick Cloudflare Pages if every asset fits 25 MiB: 3 TB means $307.20 of Vercel overage against $0. Teams inside Pro's 1 TB and 10M CDN requests should stay on Vercel. Teams eyeing Pages should today compare their monthly builds with its 500 / 5,000 / 20,000 limits and their largest asset with its 25 MiB ceiling.

In this teardown
  1. Vercel runs your framework; Cloudflare runs your requests
  2. An idle await no longer chooses the winner
  3. The penalty moved to bytes and requests
  4. The asset limit can stop the deployment first
  5. Caching cuts Cloudflare's CPU line; requests still bill
  6. Above 1 TB or 10M requests, Vercel Pro is the expensive host
  7. Cost arithmetic
  8. Decision matrix
  9. Migration path
  10. FAQ

At a glance

Dimension Vercel Framework-native Cloudflare Pages Zero egress
Product foundationServerless functions on Fluid computeWorkers runtime + Pages static assets
Pricing modelHobby $0 · Pro $20/seat: 1 TB transfer, 10M requestsPages free · Workers Paid from $5/account, $0 egress
Hosting and deploymentNo (Vercel infrastructure)No (Cloudflare network)
Runtime and integrationStreaming responses and ISR revalidationWebSocket upgrade bills one request; messages bill nothing
AI-related capabilitiesFluid compute targets inference and agent workloadsCPU-metered runtime; 30M CPU-ms included per month
Lock-in riskMedium: framework and platform couplingMedium-high: Workers runtime, per-product line items
Vendor Vercel → Cloudflare Pages →

1. Vercel runs your framework; Cloudflare runs your requests

Vercel runs your framework and bills for what it delivers. Cloudflare runs your requests and bills for what they execute.

Prices are the vendors' listed rates as of 10 November 2026; Vercel's overages are starting rates, and examples credited to Cloudflare are Cloudflare's own.

At 3 TB a month the gap is $307.20 of Vercel transfer overage; at 50M requests it is $80 versus $12 of request overage.

Before moving, check each handler against Workers' listed limits: 10 ms CPU per invocation on Free, and a 30-second default with a 5-minute maximum of CPU time on Paid.

2. An idle await no longer chooses the winner

Fluid compute, the default for new Vercel projects, bills active CPU rather than wall time, and Workers bills CPU-ms. An idle await burns no CPU meter on either; it does not make the whole deployment free.

In-function concurrency lets concurrent requests share one instance; Vercel claims up to 85% savings from it and up to 90% from Active CPU pricing.

Workers Paid includes 30M CPU-ms a month; Vercel bills Active CPU and provisioned memory as separate metered lines.

Waiting on an external API no longer establishes a CPU-price reason to migrate; inspect transfer and request counts before touching the runtime.

3. The penalty moved to bytes and requests

Vercel penalizes byte-heavy delivery and request fan-out after allowances; Cloudflare penalizes uncached CPU work and paid requests, not egress.

Monthly workloadVercel ProCloudflare Workers Paid
3 TB transfer2,048 GB over × $0.15/GB = $307.20$0 egress
50M requests, overage40M CDN requests × $2/M = $8040M × $0.30/M = $12
Same, with plan floor$20 × 1 seat + $80 = $100$5 + $12 = $17
1M CPU-ms$0.128 ÷ 3.6M × 1M ≈ $0.0356, before memory$0.02 after 30M included

The request rows apply only to requests that run a Worker; Vercel's line counts CDN requests, while Cloudflare static asset requests are free and unlimited.

Teams serving 3 TB a month or 50M Worker requests should not pick Vercel Pro: they pay $307.20 against $0, or $100 against $17 before CPU.

4. The asset limit can stop the deployment first

Consider a static export containing a downloadable asset larger than 25 MiB. Cloudflare Pages rejects that deployment shape on its asset ceiling; cheap transfer cannot rescue it.

Exceeding an included traffic allowance raises a bill; exceeding an asset ceiling breaks the deployment plan. Teams whose build runs past 20 minutes should not pick Pages until the build is split, and teams deploying more than 500 times a month need Pages Pro's 5,000.

Shrink or remove every asset over 25 MiB before targeting Pages; a Vercel function that needs more than 5 minutes must be split, or checked against Workers' 5-minute CPU-time cap.

5. Caching cuts Cloudflare's CPU line; requests still bill

Cloudflare charges $0 for egress, but Pages Functions still bill as Workers requests and CPU-ms. D1 and R2 carry their own line items.

Cloudflare's own example uses 100M requests at 7 ms CPU each; Workers Caching at 80% hits changes the CPU bill:

Cache hits still cost a request, but no CPU in Cloudflare's example.

The request line stays at (100M − 10M) × $0.30/M = $27.00, so the cached total is $5.00 + $27.00 + $2.20 = $34.20 against $45.40 uncached.

Only count that saving for responses your app can safely reuse; a lower hit rate moves the bill back toward $45.40.

6. Above 1 TB or 10M requests, Vercel Pro is the expensive host

Pages allows 500 builds a month on Free, and each build must finish within 20 minutes.

Count seats at $20 each, check your longest build against Pages' 20-minute timeout and check your largest asset against 25 MiB.

Cost arithmetic at volume

These are computed from the published unit prices, not measured. Each row prints its own formula, so you can replace our assumption with your traffic and redo it.

Monthly transfer overage at 3 TB
Vercel Pro: 2,048 GB beyond the included 1 TB × starting $0.15/GB = $307.20; Cloudflare: $0 egress by policy
$307.20 Vercel transfer overage versus $0 Cloudflare egress
Monthly request charges at 50M metered requests
Vercel: 40M CDN requests over × starting $2/M = $80; with one seat, $20 + $80 = $100. Cloudflare: 40M over × $0.30/M = $12; with base, $5 + $12 = $17
Request overage: $80 on Vercel versus $12 on Cloudflare; with plan floors, $20 × seats + $80 (= $100 for one seat) on Vercel versus $5 + $12 = $17 on Cloudflare, before CPU
CPU rate normalized to a million CPU-ms
Vercel: starting $0.128 ÷ 3.6M CPU-ms × 1M CPU-ms ≈ $0.0356; Cloudflare: 1M billable CPU-ms × $0.02/M CPU-ms = $0.02
≈ $0.0356 (Vercel starting rate, before provisioned-memory GB-hours) versus $0.02 per million CPU-ms after Cloudflare's 30M included; Vercel meters Active CPU and memory separately
CPU in Cloudflare's own cached example
Uncached: (100M × 7 − 30M) CPU-ms × $0.02/M CPU-ms = $13.40; cached: (100M × (1 − 80%) × 7 − 30M) CPU-ms × $0.02/M CPU-ms = $2.20; requests: (100M − 10M) × $0.30/M = $27.00
In Cloudflare's example, $45.40 uncached ($5.00 + $27.00 + $13.40) versus $34.20 cached ($5.00 + $27.00 + $2.20); caching cuts only the CPU line

Decision matrix

Rows are the situation you are actually in. Pick the row before you read the pricing page again.

If this is youTakeBecause
Byte-heavy delivery, around 3 TB/monthCloudflare PagesAt 3 TB/month, Vercel Pro's transfer overage is 2,048 GB × $0.15/GB = $307.20; Cloudflare charges $0 for egress.
Vercel deployment works, transfer ≤ 1 TB and CDN requests ≤ 10M/monthVercelInside both Pro allowances Vercel's delivery overages are $0, so the bill to beat is $20 per seat plus Active CPU and memory.
Seats growing while traffic stays flatCloudflare PagesEach Vercel Pro seat adds $20/month before traffic changes, while Workers Paid lists a $5/month minimum per account; confirm Pages Pro and Business plan prices before moving for seats.
A Vercel app that mostly waits on external APIsVercelOn Fluid compute an idle wait burns no Active CPU, but provisioned memory still bills in GB-hours at under 10% of the $0.128/vCPU-hour rate, per Vercel; confirm the project runs on Fluid compute and price that line.
The deployment ships an asset larger than 25 MiB that cannot be splitVercelPages caps every asset at 25 MiB; check Vercel's per-asset limit before moving the file there.
The build runs longer than 20 minutesVercelThe 20-minute Pages build timeout defeats that build regardless of $0 egress.
CPU-heavy handlers within Workers' 5-minute CPU capCloudflare PagesWorkers Paid charges $0.02 per million CPU-ms after 30M included, against Vercel's starting ≈ $0.0356 per million CPU-ms with Active CPU and memory metered separately, per Vercel.
A Cron or Queue job that runs longer than 5 minutesCloudflare WorkersVercel lists a 5-minute function duration; Workers Paid allows 15 minutes of CPU time for Cron Trigger and Queue consumer invocations.

Code and configuration

Vercel
// Vercel: the framework's own handler, deployed unchanged.
export const maxDuration = 60; // seconds; the platform caps it
export async function POST(req: Request) {
  const { prompt } = await req.json();
  // Active CPU bills while this code runs, not while it waits:
  const upstream = await fetch('https://api.example.com/v1/chat', {
    method: 'POST',
    body: JSON.stringify({ prompt }),
    headers: { 'content-type': 'application/json' },
  });
  // Here it breaks: default duration limits kill long streams. Set maxDuration
  // and check the platform ceiling before shipping a 5-minute job.
  return new Response(upstream.body, { headers: { 'content-type': 'text/event-stream' } });
}
Cloudflare Pages
// Cloudflare: the Worker handler, not the framework's.
export default {
  async fetch(request, env, ctx) {
    const { prompt } = await request.json();
    // CPU-ms bills only while this isolate executes.
    const upstream = await fetch('https://api.example.com/v1/chat', {
      method: 'POST',
      body: JSON.stringify({ prompt }),
      headers: { 'content-type': 'application/json' },
    });
    // Here it breaks: no Node APIs by default. Anything importing fs, net or
    // a native addon needs nodejs_compat, and some libraries never port.
    return new Response(upstream.body, { headers: { 'content-type': 'text/event-stream' } });
  },
};

What you gain, what you give up

Vercel

You gain
  • Your framework deploys as written; no runtime port to a different JS environment
  • Fluid compute bills execution time, so an idle await on an external API costs no CPU
  • In-function concurrency shares one instance across concurrent requests
  • Per-project previews and ISR in the same product as the build pipeline
You give up
  • Transfer is metered: 2 TB over the Pro allowance is 2,048 GB × $0.15 = $307.20
  • CDN requests bill past 10M/month at $2 per million — fan-out is expensive
  • Price is per seat, so a growing team raises the floor before traffic does
  • Active CPU is a separate metered line on top of the seat price

Cloudflare Pages

You gain
  • Egress is free by policy: 3 TB a month costs $0 where Vercel adds $307.20
  • Requests after 10M cost $0.30/million, against $2/million on Vercel Pro
  • Static asset requests are free and unlimited; cache hits cost a request but no CPU
  • WebSocket messages are not billed as requests — only the upgrade is
You give up
  • Your handlers run on the Workers runtime, so the port is real work, not a config change
  • Hard ceilings that stop a deployment instead of billing you: 25 MiB per asset, 20-minute builds
  • Pages Free allows 500 builds a month and 20,000 files per site
  • CPU time is capped per invocation: 30 seconds default, 5 minutes maximum

Migration path

What switching actually takes

Moving from Vercel to Pages means rewriting handlers for the Workers runtime, not flipping a setting: no Node defaults, and anything importing fs or net needs the compatibility flag. Move the static build first (it costs nothing to serve), measure the handlers' CPU per request against the 30-second default and 5-minute cap, then check your largest asset against 25 MiB and your build against the 20-minute timeout. Going the other way, port back to Node and expect the transfer line to reappear the first month traffic passes 1 TB.

Common questions

What is the Workers Free execution budget?
Workers Free allows 100,000 requests/day with 10 ms CPU time per invocation and no charge for duration.
What execution limits apply to Workers Paid?
The default CPU limit is 30 seconds, with a maximum of 5 minutes per invocation. Cron Trigger and Queue consumer invocations allow 15 minutes.
Can paid Pages sites hold more files?
Paid Pages sites support 100,000 files with PAGES_WRANGLER_MAJOR_VERSION=4.
Can I make a temporary Vercel deployment without an account?
Yes: on the Hobby tier, vercel deploy --temporary creates a temporary deployment without an account.

Sources & verification

Prices and limits were read from these pages on 2026-11-10. Vendor marketing claims are quoted as claims. Anything derived is arithmetic on the numbers below.

https://vercel.com/pricing
https://vercel.com/blog/introducing-active-cpu-pricing-for-fluid-compute
https://developers.cloudflare.com/workers/platform/pricing/
https://developers.cloudflare.com/pages/platform/limits/

Keep reading

Supabase vs Firebase

Metered reads versus metered compute, with the arithmetic shown.

Cursor vs GitHub Copilot

When a vendor moves the meter to credits, the entry tier is where the cost hides.

Try Vercel → Explore Cloudflare Pages →
Source review date recorded in this article: 2026-11-10. This is not a live price or checkout check. Prices can change. If a number here looks wrong, the vendor's own price sheet wins. Derived figures are arithmetic on published unit prices, not measured benchmarks.