Vercel billing
Why is my Vercel bill so high?
Your Vercel bill is high because on-demand usage kicked in across serverless compute, image processing, or data transfer without a hard spend cap stopping it. While the Hobby plan includes 4 hours of Active CPU and 1 million invocations before locking down, a Pro account charges on-demand fees like $0.60 per million invocations as soon as you exhaust your monthly Pro usage credit.
It rarely comes down to one single setting. A crawler hits uncached endpoints, an external API stalls while your provisioned memory keeps running the meter, or an image gallery triggers hundreds of thousands of write units.
Tracking the spike in your usage dashboard
You can't fix what you haven't pinned down. Open the Usage page in the sidebar from your Vercel dashboard, which displays the aggregate metrics of all projects across your account by default.
To spot what actually changed, switch the billing cycle dropdown under Usage to "Last 30 days" instead of looking at the current day alone. The overview tab provides an allotment indicator showing the amount consumed in the active cycle alongside your projected costs. Look at the Ratio view in the dashboard to see what is happening underneath the hood:
- Requests: cached versus uncached requests.
- Fast Data Transfer: incoming versus outgoing transfer.
- Fast Origin Transfer: incoming versus outgoing traffic between the CDN and compute.
- Functions invocations and execution: successful versus errored versus timed out runs.
If you live in your terminal, pull the raw project totals straight from the Vercel CLI:
vercel billing usage --since 30d --group-by projectAdd --group-by region to that command if you run multi-region deployments and want to know which data centers are driving the line items.
Fluid compute: Active CPU vs Provisioned Memory
On the Pro plan, serverless functions run on Fluid compute, where billing splits into three parts: Invocations, Active CPU, and Provisioned Memory. Function Invocations run $0.60 per million requests whether those requests succeed, fail, or blow up halfway through.
Active CPU bills for the exact milliseconds your code executes. It pauses billing during external I/O waits, so if your route waits five seconds for an AI model or a slow database response, you don't pay CPU time for that idle wait.
Provisioned Memory behaves differently. It allocates memory in gigabytes and bills continuously in GB-hours across the entire lifetime of the instance until the final in-flight request finishes. If your route hangs on a slow external webhook, you pay for the reserved memory every single second it sits there waiting. Once all in-flight requests finish, the instance pauses, and it incurs no CPU or memory charges until another invocation arrives.
How regional compute pricing changes your invoice
Where your functions run matters just as much as how long they execute. If your deployment defaults to a high-cost region, you pay a steep premium on every single CPU-hour and GB-hour of memory.
| Region | Region code | Active CPU (per hour) | Provisioned Memory (per GB-hr) |
|---|---|---|---|
| Cleveland, USA | cle1 | $0.128 | $0.0106 |
| Portland, USA | pdx1 | $0.128 | $0.0106 |
| Washington D.C., USA | iad1 | $0.128 | $0.0106 |
| San Francisco, USA | sfo1 | $0.177 | $0.0147 |
| Frankfurt, Germany | fra1 | $0.184 | $0.0152 |
| Tokyo, Japan | hnd1 | $0.202 | $0.0167 |
| Osaka, Japan | kix1 | $0.202 | $0.0167 |
| São Paulo, Brazil | gru1 | $0.221 | $0.0183 |
Running functions in São Paulo (gru1) costs $0.221 per CPU-hour compared to $0.128 in Washington D.C. (iad1). That is a 72% jump for the exact same compute workload.
Image optimization charges
Image Optimization is a frequent source of billing surprises for media-heavy sites. The Hobby plan gives you 5K transformations, 300K cache reads, and 100K cache writes per month. When you exceed those limits on Hobby, you aren't billed; new images return a 402 status code error that falls back to the image alt text, while cached images continue to render.
On a Pro plan, Image Optimization usage is billed on demand:
- Image transformations: $0.05 to $0.0812 per 1K transformations.
- Image cache reads: $0.40 to $0.64 per 1M reads.
- Image cache writes: $4.00 to $6.40 per 1M writes.
Transformations and cache writes are billed on every cache MISS and cache STALE. Both cache reads and writes are measured in 8KB units. Cache reads are only billed when pulling from the shared global cache - an image accessed recently within several hours in the same region is served from the regional cache and avoids the read charge. Delivering the final image still incurs standard Fast Data Transfer and CDN Requests fees.
Optimization enforces strict rules: source images cannot exceed 8192 pixels in width or height, the maximum transformed output size is 10 MB, and Vercel only processes image/jpeg, image/png, image/webp, and image/avif. Other formats pass through as-is.
Data transfer, caching, and scraper traffic
Data transfer on Vercel separates into two distinct charges: Fast Data Transfer (CDN to your end users) and Fast Origin Transfer (CDN to Vercel Compute). Every uncached hit pulls from origin, stacking origin transfer on top of client transfer while invoking a function in the process.
Incremental Static Regeneration (ISR) splits into Read Units and Write Units. If crawlers or bot nets hammer your dynamic paths, they force constant background revalidations that burn through ISR writes and edge storage. For caching pipelines, note that starting October 30, 2026, Vercel is unifying Data Cache with Runtime Cache for new teams, serving fetch caching and unstable_cache directly from Runtime Cache and billing it as Runtime Cache usage.
Unmanaged bot traffic easily turns into a denial-of-wallet attack. If an indexing bot crawls thousands of faceted search URLs without cache headers, you pay for the CDN Requests, the function invocations, the provisioned memory, and the egress transfer simultaneously.
Spend management and external billing guards
You can protect your account natively. Usage Notifications are turned on automatically, and Pro teams can customize alert thresholds for approaching usage limits.
Spend Management is an opt-in feature for Pro teams and Enterprise teams on Flexible Commitment. It lets you configure a target spend amount that triggers notifications, calls a webhook, or pauses your projects automatically when your bill hits that ceiling. Learn how to configure this step-by-step in our guide on how to set a spending limit on Vercel.
Costbrake can watch your spend alongside your other infrastructure. It connects to 23 providers - including AWS, Cloudflare, Supabase, and Vercel - running checks every 5 minutes on paid tiers and, for Vercel, every 2 minutes during an active spike. A spike alert fires when an hour costs more than 3x the 7-day baseline and at least $5 above normal. For Vercel, an admin can click and confirm an opt-in brake in Costbrake to turn on Attack Challenge Mode or pause the production project to stop runaway bleed. Check the agent setup documentation to connect your team token, or read our breakdown on how to stop bots and DDoS traffic from running up your Vercel bill.
Questions and answers
Does Vercel charge for function throttles?
No, requests that aren't served because your deployment hit a concurrency limit are logged as throttles and are not priced.
What happens when my Hobby team hits image limits?
You won't get an overage bill; new images fail optimization with a 402 runtime error that displays the alt text, while previously cached assets continue to load normally.
Why did my Active CPU stop billing during a long database call?
Fluid compute only bills Active CPU while your code executes instructions, pausing CPU charges when the function waits on network I/O or external database queries.
Am I billed for memory while my function waits for an API response?
Yes, Provisioned Memory stays allocated and bills in GB-hours for the full lifetime of the instance until all active, in-flight requests finish.
How does Vercel bill ISR usage?
Incremental Static Regeneration is billed through Reads (total Read Units to access data) and Writes (total Write Units used to store updated data).
Sources
Updated