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.
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.
- Vercel runs your framework; Cloudflare runs your requests
- An idle await no longer chooses the winner
- The penalty moved to bytes and requests
- The asset limit can stop the deployment first
- Caching cuts Cloudflare's CPU line; requests still bill
- Above 1 TB or 10M requests, Vercel Pro is the expensive host
- Cost arithmetic
- Decision matrix
- Migration path
- FAQ
At a glance
| Dimension | Vercel Framework-native | Cloudflare Pages Zero egress |
|---|---|---|
| Product foundation | Serverless functions on Fluid compute | Workers runtime + Pages static assets |
| Pricing model | Hobby $0 · Pro $20/seat: 1 TB transfer, 10M requests | Pages free · Workers Paid from $5/account, $0 egress |
| Hosting and deployment | No (Vercel infrastructure) | No (Cloudflare network) |
| Runtime and integration | Streaming responses and ISR revalidation | WebSocket upgrade bills one request; messages bill nothing |
| AI-related capabilities | Fluid compute targets inference and agent workloads | CPU-metered runtime; 30M CPU-ms included per month |
| Lock-in risk | Medium: framework and platform coupling | Medium-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.
- Vercel: past Pro's 1 TB Fast Data Transfer and 10M CDN requests, every GB costs from $0.15 and every million requests from $2.
- Cloudflare: egress costs $0, but Workers Paid charges $0.30 per million requests past 10M and $0.02 per million CPU-ms past 30M.
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.
- Vercel Fluid compute: Active CPU starts at $0.128/vCPU-hour.
- Vercel says provisioned memory is billed in GB-hours at less than 10% of the Active CPU rate.
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 workload | Vercel Pro | Cloudflare Workers Paid |
|---|---|---|
| 3 TB transfer | 2,048 GB over × $0.15/GB = $307.20 | $0 egress |
| 50M requests, overage | 40M CDN requests × $2/M = $80 | 40M × $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.
- Pages builds per month: 500 Free / 5,000 Pro / 20,000 Business, with 1 / 5 / 20 concurrent; 20,000 files per site on Free; 100 projects per account.
- Pages: 20-minute build timeout; 25 MiB maximum per asset.
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:
- Without caching: (100M × 7 − 30M) CPU-ms × $0.02/M CPU-ms = $13.40.
- With caching: (100M × (1 − 80%) × 7 − 30M) CPU-ms × $0.02/M CPU-ms = $2.20.
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
- A team above 1 TB or 10M CDN requests a month should move to Cloudflare Pages: at 3 TB that removes $307.20 of overage.
- A team whose Vercel deployment works inside both Pro allowances should stay: the bill to beat is $20 per seat plus Active CPU and memory.
- A team with CPU-heavy handlers inside Workers' CPU cap should move: $0.02 per million CPU-ms beats Vercel's starting ≈ $0.0356.
- A team adding seats faster than traffic pays Vercel $20 per seat against Workers Paid's $5 per-account minimum; it should move after confirming Pages Pro and Business prices.
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.
Decision matrix
Rows are the situation you are actually in. Pick the row before you read the pricing page again.
| If this is you | Take | Because |
|---|---|---|
| Byte-heavy delivery, around 3 TB/month | Cloudflare Pages | At 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/month | Vercel | Inside 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 flat | Cloudflare Pages | Each 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 APIs | Vercel | On 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 split | Vercel | Pages caps every asset at 25 MiB; check Vercel's per-asset limit before moving the file there. |
| The build runs longer than 20 minutes | Vercel | The 20-minute Pages build timeout defeats that build regardless of $0 egress. |
| CPU-heavy handlers within Workers' 5-minute CPU cap | Cloudflare Pages | Workers 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 minutes | Cloudflare Workers | Vercel 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: 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: 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
- 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
- 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
- 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
- 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
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
PAGES_WRANGLER_MAJOR_VERSION=4.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.