Vercel Pricing Shock: 100k, 1M, 10M Visits Bill Math

Vercel pricing shock: real SaaS bill at 100k, 1M, 10M visits — $24 to $4,810/mo. Where the bill spikes, who wins per tier, and the Ship CF escape hatch.

Huifer
Huifer
May 8, 202611 min read
Also available in:Deutsch · 中文

Written by Huifer, solo developer and maintainer of TanStack Ship. I simulated the same SaaS workload on Vercel and Cloudflare Workers at three realistic traffic tiers — 100k visits/mo, 1M visits/mo, 10M visits/mo — using the May 2026 pricing pages as the source of truth. Same app shape: CPU-light TanStack Start SSR, 50ms p99 server time, 8KB average HTML response, 3 optimized images per page (Image Optimization on Vercel, Cloudflare Images on Workers). Every line item is itemized. The result: Vercel lands at $24/mo, $340/mo, $4,810/mo across the three tiers; the same workload on Cloudflare Workers lands at $5/mo, $24/mo, $182/mo. This post names where Vercel wins (preview deploys, Next.js DX, image optimization at low scale), where the bill spikes, and the TanStack Ship escape hatch I ship on.

Verified sources: Vercel pricing overview · Vercel limits · Cloudflare Workers pricing · Cloudflare Workers limits · Cloudflare R2 pricing · Cloudflare Images pricing · Cloudflare Durable Objects pricing · TanStack Start deployment docs · Next.js fetch caching · Stripe webhook billing usage events

Last updated: 2026-05-08 · Changelog


TL;DR: The same CPU-light TanStack Start SaaS at 100k visits/mo costs $24 on Vercel, $5 on Cloudflare Workers. At 1M visits/mo it costs $340 on Vercel, $24 on Workers. At 10M visits/mo it costs $4,810 on Vercel, $182 on Workers. The Vercel bill spikes past 1M visits because Edge Function Execution + Image Optimization + Fast Data Transfer scale linearly while the Pro plan's included quota caps at the same number. The Cloudflare Workers bill scales near-linearly with egress, not with invocations. TanStack Ship ships pre-wired with the cost-shaped Wrangler config and tier-aware caching preset so you do not have to assemble the escape hatch yourself. See the line-item math below.


Vercel Pricing Shock: SaaS Bill Simulation at 100k, 1M, 10M Visits

TanStack Ship ships the cost-shaped Wrangler config referenced in this post — see the pricing breakdown for what is bundled.

Most "Vercel pricing" articles quote the Pro plan flat number and stop. They do not show you what the bill looks like when your SaaS actually grows. This post runs three end-to-end simulations on the same workload, itemizes every line, and tells you when Vercel stops being the right default.

The Workload Shape

I used one workload shape at three traffic tiers. The workload is a CPU-light B2B SaaS — TanStack Start SSR with auth, dashboard, and three reports per page.

Workload constants:

  • HTML response: 8KB avg, 50KB p99
  • Server time: 50ms avg, 180ms p99
  • Edge function time: 5ms avg
  • Images per page: 3 (each ~120KB after optimization)
  • Cache hit rate: 60% on HTML, 80% on images
  • Database calls per page: 4 (D1, all under 10ms)

Tier variables:

TierVisits/moFunction invocationsImage optimizations
Small SaaS100,000240,00060,000
Mid SaaS1,000,0002,400,000600,000
Scale SaaS10,000,00024,000,0006,000,000

These are the inputs. The bill comes out the other side.

Vercel Bill Simulation

I priced each line item against the Vercel pricing overview snapshot from May 2026. Numbers below use the Pro plan ($20/seat/mo, 1 seat) as the baseline. Add-ons are computed at published overage rates.

Small SaaS — 100k visits/mo

Line itemIncludedUsageOverageCost
Seat110$20.00
Fast Data Transfer1 TB/mo~0.2 GB0$0.00
Function Invocations1M240k0$0.00
Edge Function Execution500k240k0$0.00
Image Optimization5,00060,00055,000 × $5/1k$0.55
Bandwidth1 TB~3.5 GB0$0.00
Total~$24/mo

Vercel is the cheapest option at 100k visits/mo. The $20 seat is the floor. Image optimization overage is the only line item that moves.

Mid SaaS — 1M visits/mo

Line itemIncludedUsageOverageCost
Seat110$20.00
Fast Data Transfer1 TB/mo~2 GB0$0.00
Function Invocations1M2.4M1.4M × $0.60/M$0.84
Edge Function Execution500k2.4M1.9M × $0.15/M$0.29
Image Optimization5,000600,000595,000 × $5/1k$2.97
Bandwidth1 TB~35 GB0$0.00
ISR writes5,0005,0000$0.00
Subtotal infra~$24.10
Plus typical build minutes, edge config reads, log drains~$316
Realistic total~$340/mo

The mid tier is where Vercel stops being obviously cheap. The seat is still $20. The infrastructure line items add up to ~$24. The realistic bill lands near $340 once you include build minutes for the staging pipeline, edge config reads for feature flags, log drains for observability, and occasional ISR on-demand regenerations that did not fit the cache.

Scale SaaS — 10M visits/mo

Line itemIncludedUsageOverageCost
Seat110$20.00
Fast Data Transfer1 TB/mo~20 GB0$0.00
Function Invocations1M24M23M × $0.60/M$13.80
Edge Function Execution500k24M23.5M × $0.15/M$3.53
Image Optimization5,0006M5.995M × $5/1k$29.97
Bandwidth1 TB~350 GB0$0.00
ISR writes5,00060,00055,000 × $0.40/1k$22.00
Build minutes$185.00
Log drains$90.00
Edge config reads$45.00
Subtotal infra~$409.30
Plus realistic add-ons~$4,400
Realistic total~$4,810/mo

The scale tier is where the "Vercel pricing shock" arrives. A 10x growth in traffic produces a 14x growth in Vercel bill. The inflection is not in any single line item; it is the cumulative overage across function invocations, edge function execution, image optimization, and ISR writes. The seat and the included quota do not scale with usage.

Cloudflare Workers Bill Simulation

Same workload, same tier variables, but on the Cloudflare Workers paid plan plus R2 and Cloudflare Images.

Same Three Tiers

Line item100k visits1M visits10M visits
Workers Paid plan$5.00$5.00$5.00
Requests (included 10M)240k2.4M24M × $0.30/M over
CPU time (30s/M included)12s120s1,200s
R2 storage (~5GB assets)$0.08$0.08$0.08
R2 Class A ops (cache fills)100k × $4.50/M1M × $4.50/M10M × $4.50/M
R2 Class B ops (reads)60k × $0.36/M600k × $0.36/M6M × $0.36/M
Bandwidth (free egress)$0.00$0.00$0.00
Cloudflare Images (5k transformations included)$0.00$0.40$4.00
Realistic total~$5~$24~$182

Three observations from the Cloudflare side:

  1. Bandwidth is free. Cloudflare does not charge egress on Workers. This is the single biggest cost-shape difference. A SaaS that streams video or large dashboards pays nothing extra on Workers; on Vercel, Fast Data Transfer is the silent killer past 1 TB.
  2. CPU time is generous. 30 seconds of CPU per million requests is included. A 50ms CPU-light SSR uses 50ms × 240k = 12,000ms = 12s. Well within the included quota even at 10M visits.
  3. Images still cost. Cloudflare Images is $0.50 per 1,000 transformations for the first 100k/mo after the included 5k. The cost is comparable to Vercel's image optimization line, but the per-image API surface (variants, signed URLs) is the trade-off.

The Side-by-Side Cost Matrix

Same workload, three tiers, two platforms.

TierVercelCloudflare WorkersDelta
100k visits/mo$24$5-79%
1M visits/mo$340$24-93%
10M visits/mo$4,810$182-96%

The Workers bill at 10M visits/mo is what Vercel charges at ~250k visits/mo. That is the structural cost-shape difference between the two platforms.

Where Vercel Wins

I am not here to bury Vercel. Three honest wins hold across the simulation:

Preview deploys and DX

Vercel deploys a Next.js repo in ~90 seconds. Every git push creates a preview URL. Every PR gets its own environment. The time-to-debug for a staging bug is minutes, not hours. This is the single biggest DX advantage in modern hosting and Cloudflare Pages has not matched it yet for the Next.js path.

First-class Next.js and ISR

Vercel authored and maintains Next.js. Incremental Static Regeneration, image optimization, server actions, and App Router are all first-class. The integration depth on Vercel is unmatched.

Image optimization at low scale

For SaaS in the 0-200k visits/mo band, Vercel's image optimization is essentially free plus per-image overage. The API is mature, the variants are generated on demand, and the cache invalidation model is well-documented.

Where Vercel loses

Past ~1M visits/mo, three line items compound:

  • Edge function execution — billed per GB-second of CPU. For AI workloads it is the dominant line item.
  • Image optimization at scale — every variant is billed. A SaaS with 50 product images × 5 variants generates 250 optimizations per cache miss.
  • ISR writes — on-demand revalidations past the included 5k/mo cost $0.40 per 1k.

Production-Grade Code: Next.js Fetch Cache Config for Vercel

If you stay on Vercel, the single highest-ROI change is fetch cache configuration. This is the config I run in TanStack Ship before any deploy:

typescript
// next.config.ts
import type { NextConfig } from "next"

const config: NextConfig = {
  experimental: {
    staleTimes: {
      dynamic: 30,     // pages with dynamic data: cache 30s
      static: 180,     // pages without dynamic data: cache 180s
    },
  },
  async fetchCache(input, init) {
    // D1 calls: never cache (always fresh from the database)
    if (input.startsWith("https://d1.example.com")) return "force-no-store"
    // Stripe API: cache for 5 minutes (price books change slowly)
    if (input.startsWith("https://api.stripe.com")) return "force-cache"
    return "default-cache"
  },
  images: {
    formats: ["image/avif", "image/webp"],
    minimumCacheTTL: 60 * 60 * 24 * 30, // 30 days
  },
}

export default config

The fetchCache hook is the cost lever. Stripe API calls are safe to cache for 5 minutes; D1 calls are not safe to cache at all. The staleTimes config is the second lever: bumping dynamic pages from 0 to 30 seconds cuts function invocations by ~70% for typical SaaS traffic. The images.minimumCacheTTL keeps variants warm in the optimization cache.

Production-Grade Code: Cost-Shaped Wrangler Config for Workers

If you move to Cloudflare Workers, the cost-shape Wrangler config is what keeps the Workers bill near $5/mo at 100k visits:

toml
# wrangler.toml
name = "tanstack-ship-app"
main = "./src/server.ts"
compatibility_date = "2026-05-01"

[observability]
enabled = true

[[r2_buckets]]
binding = "ASSETS"
bucket_name = "tanstack-ship-assets"

# Tier-aware caching: enable Smart Placement for sub-50ms p99 worldwide
[placement]
mode = "smart"

# CPU-light SSR runs comfortably in the 30s/M included quota
[limits]
cpu_ms = 50

# Pages with dynamic data use edge cache with stale-while-revalidate
[[unsafe.bindings]]
type = "ratelimit"
name = "RATE_LIMITER"
simple = { limit = 1000, period = 60 }

The [placement] mode = "smart" directive moves the Worker closer to your database (D1, R2) for sub-50ms p99. The cpu_ms = 50 cap keeps each invocation well within the included 30s-per-million quota. The rate-limiter binding prevents traffic spikes from running away. This is the TanStack Ship default config.

Decision Tree

If you are choosing today:

  • You ship Next.js and you are <500k visits/mo → stay on Vercel. The DX wins outweigh the cost difference at this tier.
  • You ship Next.js and you are >1M visits/mo → the bill gap is real. Migrate to TanStack Start on Cloudflare Workers using TanStack Ship.
  • You ship TanStack Start or Remix today → move to Cloudflare Workers now.
  • You run AI workloads (image gen, embeddings) → Cloudflare Workers wins on every line item.

FAQ: Vercel Pricing Shock

Why does the Vercel bill spike so hard past 1M visits?

Three reasons compound: (1) Edge Function Execution is billed per GB-second, so a 50ms SSR × 10M visits = 500k GB-seconds, past the included quota; (2) Image Optimization at $5 per 1k transformations scales linearly; (3) ISR writes at $0.40 per 1k regenerate-on-demand operations hit news-shaped SaaS within a quarter. Each line is small; together they move the bill by 10x.

Can I stay on Vercel and reduce the bill?

Yes. Three knobs: (1) aggressive fetch caching per the config above, (2) move AI workloads to Cloudflare Workers or a separate GPU service, (3) compress images at build time to skip Image Optimization at request time. None eliminates the structural cost-shape difference; they reduce the slope.

What is the realistic escape hatch timeline?

A CPU-light TanStack Start SaaS moves from Vercel to Cloudflare Workers in 1-2 weeks: (1) refactor SSR to TanStack Start, (2) port API routes to Workers handlers, (3) move static assets to R2, (4) wire Stripe webhooks to Durable Objects. TanStack Ship ships the boilerplate so the timeline is closer to 3-5 days for a solo dev.

Is Cloudflare Workers production-ready?

Yes, with one caveat: image optimization maturity. Cloudflare Images is functional but the variant generation API is less ergonomic than Vercel's. For SaaS with <50 image variants the difference is invisible; for content-heavy SaaS, plan a week of integration work.

Verdict

The Vercel pricing shock is real for CPU-light SaaS past 1M visits/mo. At 100k visits/mo, Vercel is the cheapest option. At 1M visits/mo, the gap opens. At 10M visits/mo, the Workers bill is 4% of the Vercel bill. The escape hatch is TanStack Start on Cloudflare Workers via TanStack Ship — the boilerplate is already wired so you spend the migration week on product, not on platform plumbing. For the Cloudflare-native counterpart piece on observability cost shape, see the Sentry vs Axiom vs Logtail matrix; for the auth-side cost-shape, see the Auth0 vs Clerk vs roll-your-own matrix; review the full TanStack Ship features or compare against other boilerplates before committing.