Aug 8, 2025

Aug 8, 2025

Breaking down Vercel’s 2025 pricing plans quotas and hidden costs

Breaking down Vercel’s 2025 pricing plans quotas and hidden costs

Aug 8, 2025

Aug 8, 2025

7 min

7 min

Koshima Satija

Koshima Satija

Co-founder, Flexprice

Co-founder, Flexprice

Vercel has become a go-to deployment platform for developers building modern web applications, but understanding how its pricing works is another story. 

What started as a simple set of flat-rate plans has evolved into a hybrid model that combines fixed monthly fees with granular, usage-based charges across multiple resources. 

For many developers, this shift has brought more flexibility, but also more complexity, and, in some cases, unexpected bills.

In this guide, we’ll break down Vercel’s current pricing structure, explain how each resource is metered, and show what you actually get at each plan level.

How Vercel Pricing Works in 2025

Vercel uses a hybrid pricing model: you pay a fixed monthly fee based on your plan, and then additional charges come in if your usage exceeds certain included limits.

There are three main plans:

  • Hobby (Free)

  • Pro ($20/month)

  • Enterprise (Custom)

What makes Vercel’s model different is how it breaks down your resource usage. Instead of bundling everything into one simple bill, Vercel meters usage across multiple dimensions:

  • Edge Requests: Each time your app serves a page or makes a call from the edge.

  • Fast Data Transfer: Bandwidth used for delivering static or dynamic assets.

  • Active CPU Time: The time your serverless or edge functions are actively running code.

  • Function Invocations: The number of times your backend logic runs.

  • ISR Reads/Writes: When Incremental Static Regeneration is triggered to serve or update stale content.

Every plan includes a specific amount of each resource. Once you exceed that quota, you enter overage territory, which is where most billing complaints stem from. These overages are billed per unit, and the rates vary depending on the resource (e.g., $2 per million Edge Requests, $0.15 per GB bandwidth, etc.).

What You Actually Get With Each Plan

Pricing pages often look neat, tables of features, usage limits, and green checkmarks. But that rarely tells you what you’ll actually experience as a developer.

Let’s break down how each Vercel plan feels in practice, what’s included, what’s gated, and where the limits really start to matter.

Hobby (Free)

Perfect for portfolios, prototypes, or static sites. But once your project gains traction, you’ll hit limits quickly.

What you get:

  • 1 million Edge Requests/month

  • 100 GB of Fast Data Transfer

  • 4 hours of Active CPU time

  • Basic function support, CI/CD, caching, and a global CDN

What’s missing:

  • No overage support: once you hit your quota, there’s no safety net

  • No performance guarantees or observability

  • No cold-start protection—Edge Functions may feel sluggish

Common trap:
Deploying a demo or hackathon project, then going viral on Reddit or HN. You can’t pay to scale on Hobby, Vercel expects you to upgrade.

Pro ($20/month + usage-based overages)

The real entry point for most developers building serious apps.

What you get:

  • 10x the quotas of Hobby (e.g., 10M Edge Requests, 40 hrs Active CPU)

  • Faster builds, zero cold starts, and production-grade performance

  • Email support, usage graphs, and “Spend Management” for alerts + limits

What matters:

  • You start getting billed for overages once quotas are exhausted

  • Most teams sit on this plan until they outgrow CPU, bandwidth, or need Enterprise-only features like SSO or WAF

Useful for:

  • SaaS MVPs, growing projects, or API-based tools

  • Anyone deploying dynamic content or interacting with user data regularly

Enterprise (Custom pricing, usually 5-figures/year)

Not just higher limits, this plan unlocks an entirely different support and security tier.

What you get:

Everything in Pro, plus:

  • SLA-backed 99.99% uptime

  • Multi-region failover

  • Custom domains, TLS certs, SSO, SCIM, WAF, audit logs

  • Dedicated support SLAs and onboarding help

Reality check:

  • This is not a $99/month upgrade, it’s a contract.

  • Based on community reports, minimum pricing often starts around $20–25K/year

  • Makes sense only if your company has compliance needs, scale, or strict SLAs

Common complaint:

You only need one Enterprise feature, like SSO or custom TLS but you’re forced into a huge pricing jump. Vercel’s not alone here, but the cliff is steep.

Each plan feels designed around a maturity level:

  • Hobby = “just launched”

  • Pro = “shipping fast”

  • Enterprise = “mission-critical”

But the jump from Pro to Enterprise isn’t gradual, it’s a leap. And for small teams scaling up, that’s often where pricing friction begins.

Next, we’ll dive into how Vercel meters your usage, and when things start to get expensive.

Get started with your billing today.

Get started with your billing today.

How Usage Is Metered (and When It Gets Expensive)

You don’t get billed based on how many pages your site has, or how big your repo is. You get billed based on how users interact with your app in production.

Vercel tracks usage across five main resources. Let’s walk through what each one means, how it’s metered, and when it becomes a cost driver.

1. Edge Requests

Every time someone visits your site or loads dynamic content through Vercel’s Edge Network, it counts as an Edge Request. 

Free limit:

  • Hobby: 1M requests/month

  • Pro: 10M requests/month
    Overage rate: $2 per additional 1M requests

Gets expensive when:

  • You serve lots of traffic from SSR or edge functions

  • You have high bot or crawler traffic

  • You forget to cache aggressively

2. Fast Data Transfer

This is bandwidth, how much data you’re serving across the CDN.

Free limit:

  • Hobby: 100 GB/month

  • Pro: 1 TB/month
    Overage rate: $0.15/GB in default regions
    (Regional rates vary slightly. See docs)

Gets expensive when:

  • You serve media-heavy content (videos, high-res images)

  • You have low cache hit rates or long TTFBs

  • A single page view includes lots of external calls or dynamic content

3. Active CPU Time

This is the actual time your serverless function is executing—not just how long the request lasts, but how long the code runs on CPU.

Free limit:

  • Hobby: 4 hours/month

  • Pro: 40 hours/month
    Overage rate: $5 per additional hour
    (Only charged during active execution, not during I/O waits)

Gets expensive when:

  • You do heavy computation in your functions

  • You’re processing large datasets or media

  • You call external APIs synchronously and block compute time

4. Function Invocations

The total number of times your backend logic runs, Edge, Serverless, or Cron.

Free limit:

  • Hobby: 1M/month

  • Pro: 10M/month
    Overage rate: $0.40 per additional 1M invocations

Gets expensive when:

  • You overuse background jobs or frequent API polling

  • You misconfigure revalidation or ISR

  • You rely on functions instead of static delivery

5. ISR Reads/Writes

Incremental Static Regeneration lets you serve static content that updates over time.
Reads = requests for stale content, triggering a regeneration
Writes = content updates or rebuilds

Overage rate: $0.40 per 1,000 reads or writes

Gets expensive when:

  • You use ISR as a workaround for CMS updates

  • You refresh static pages too aggressively

  • You forget to debounce frequent updates

A Note on Regional Pricing

Overage rates for bandwidth and ISR vary slightly by region, depending on infrastructure costs (e.g., BOM1 vs FRA1). But for most use cases, the difference is small and doesn’t affect base plan limits.

By default, most developers don’t pay attention to these metrics, until their bill spikes.

And because Vercel doesn’t hard-stop deployments at quota limits (except on Hobby), overages can quietly accumulate if you don’t set alerts or caps.

How vercel’s pricing has evolved (and why developers were angry)

Vercel didn’t start with metered CPU seconds and ISR pricing.

Earlier, it was simple: flat-rate plans with generous limits. Most developers didn’t even think about bandwidth or function costs.

That changed over time; as usage patterns, costs, and Vercel’s customer base shifted.

Phase 1: Flat plans, high overages (2022–Early 2023)

The Pro plan used to include 1TB bandwidth and 1,000 CPU hours. Overages were steep, $150 per extra TB of bandwidth, $180 per 1,000 CPU hours.

Back then, you either stayed within generous limits, or paid painfully high prices if traffic spiked.

Community reaction:

  • “I didn’t realize my bandwidth spiked and I suddenly got a $400 bill.”

  • Many early-stage teams felt penalized for growth, not rewarded.

Phase 2: Granular usage-based billing (Mid–Late 2023)

Vercel shifted toward granular pricing; metering Edge Requests, ISR events, function calls, and CPU time.

The goal: align pricing more directly with infra usage.

The result: many developers now needed to learn how the billing system worked, fast.

Developer sentiment:

  • “Hard to predict.”

  • “Too many moving parts.”

  • “I just want to know what I’ll pay if I go viral.”

Phase 3: April 2024 Pricing Update “Infra Pricing 2.0”

Vercel’s CEO framed this as a simplification and price cut:

  • Lowered base rates for bandwidth and compute

  • Added more granular spend alerts

  • Gave users more visibility into what’s driving costs

But not everyone saw it as a win. Backlash highlights:

  • Devs with active workloads saw higher bills due to tighter CPU tracking

  • Others said “price reduction” was misleading

Phase 4: New Compute Model & v0 Credits (Mid 2025)

Two major shifts:

  • Fluid Compute: Charges only when CPU is active, not when waiting for I/O.
    → Great for light workloads, but pricier for long-running code.

  • v0 (AI) Pricing: Moved from “free prompt usage” to strict credit-based pricing.
    → Broke the prototyping loop for solo devs and small teams.

This introduced even more metering complexity. And made experimentation feel expensive again.

Enterprise Cliff

All along, a common thread remained:

If you need just one Enterprise feature, SSO, TLS and WAF you still have to commit to a ~$20–25k/year plan. No in-between. No add-ons. Just a pricing cliff.

Community quotes:

“I just want custom domains. Why am I talking to sales?”
“We migrated to Fly.io just to avoid this mess.”

When to Choose Hobby, Pro, or Enterprise

Vercel’s pricing isn’t just about what you pay—it’s about what stage you’re in.

Each tier aligns with a different level of product maturity, infrastructure needs, and risk tolerance.

Let’s break down what makes sense when—based on how you're building, shipping, and scaling.

  1. Hobby

Choose this if:

  • You’re testing out a new idea

  • You’re building a portfolio, blog, or marketing site

  • You want to explore Vercel without commitment

Upsides:

  • It’s free. No credit card. Instant deployment.

  • You get basic CI/CD, CDN, and edge rendering.

Downsides:

  • No overages, when you hit the limit, you hit a wall.

  • No observability or cold-start prevention.

  • Your site can slow down if traffic picks up unexpectedly.

Common mistake: Staying too long on Hobby even after usage spikes—then wondering why pages are timing out or not regenerating.

2. Pro

Choose this if:

  • You’re seeing consistent traffic or user signups

  • You’re using SSR, ISR, or edge functions

  • You want visibility into what’s actually running and costing money

What you get:

  • 10x the free quotas (10M requests, 1TB bandwidth, 40h CPU)

  • Spend management tools to set alerts and hard caps

  • Better build performance and zero cold-starts

This is where most real products live until they either:

  1. Need compliance (SSO, SLA, etc.), or

  2. Hit quotas and face consistent overage costs.

Warning sign: If your Pro bill regularly hits $200+, it’s time to evaluate if you’re scaling toward Enterprise, or leaking cost somewhere.

Enterprise: For scale, security, and support

Choose this if:

  • Your product is handling sensitive data, has strict uptime requirements, or multiple teams deploying

  • You’re managing infrastructure across multiple regions or orgs

  • You need a support contract, not just email tickets

What changes here:

  • You’re negotiating a yearly commit

  • You get SLAs, audit logs, SSO/SCIM, and priority access to support

  • You can define spend ceilings and deployment rules org-wide

The friction:

There’s no self-serve path here. No $299/mo Business plan in between.
If you're not ready for a multi-thousand-dollar commit, there's a gap.

How to replicate Vercel's pricing with Flexprice

Complete guide to replicate Vercel multi-tier pricing structure with usage-based billing in flexprice.io

Overview
Vercel uses a sophisticated multi-tier pricing model with usage-based scaling across multiple dimensions:

Features

Base Price

Key Features

Hobby

$0/ month

1M edge requests, 100GB bandwidth, 4 CPU-hrs

Pro

20/user/month

10M Edge Requests, 1TB bandwidth, 16 CPU-hrs

Enterprise

Custom pricing

Unlimited resources + SLA + compliance + support

Prerequisites
- ✅ flexprice.io account

- ✅ API key ready

- ✅ Understanding of edge computing and CDN billing

- ✅ Knowledge of serverless functions and deployment platforms

Step 1: Get Your API Key

  1. Log in to your flexprice.io dashboard

  2. Navigate to **Settings** → **API Keys**

  3. Copy your API key

Step 2: Create Core Usage Features

Edge Requests Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Edge Requests",
    "type": "metered",
    "unit_singular": "request",
    "unit_plural": "requests",
    "description": "Requests routed through Vercel edge network",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "request_count",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Edge Requests",
      "filters": [],
      "event_name": "edge.requests"
    }
  }'

Fast Data Transfer Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Fast Data Transfer",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "Data transfer from edge network to users",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "bytes_transferred",
        "multiplier": 0.000000001
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Fast Data Transfer",
      "filters": [],
      "event_name": "transfer.fast_data"
    }
  }'

Fast Origin Transfer Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Fast Origin Transfer",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "Data transfer between edge network and functions",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "origin_bytes",
        "multiplier": 0.000000001
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Fast Origin Transfer",
      "filters": [],
      "event_name": "transfer.fast_origin"
    }
  }'

Functions Active CPU Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Functions Active CPU",
    "type": "metered",
    "unit_singular": "hour",
    "unit_plural": "hours",
    "description": "Active CPU time for serverless functions",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "cpu_hours",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Functions Active CPU",
      "filters": [],
      "event_name": "functions.cpu"
    }
  }'

Functions Provisioned Memory Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Functions Provisioned Memory",
    "type": "metered",
    "unit_singular": "GB-hour",
    "unit_plural": "GB-hours",
    "description": "Memory allocated to function instances",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "memory_gb_hours",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Functions Provisioned Memory",
      "filters": [],
      "event_name": "functions.memory"
    }
  }'

Function Invocations Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Function Invocations",
    "type": "metered",
    "unit_singular": "invocation",
    "unit_plural": "invocations",
    "description": "Number of function executions",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "invocation_count",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Function Invocations",
      "filters": [],
      "event_name": "functions.invocations"
    }
  }'

ISR Reads Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "ISR Reads",
    "type": "metered",
    "unit_singular": "read",
    "unit_plural": "reads",
    "description": "Incremental Static Regeneration cache reads",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "isr_reads",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "ISR Reads",
      "filters": [],
      "event_name": "isr.reads"
    }
  }'

ISR Writes Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "ISR Writes",
    "type": "metered",
    "unit_singular": "write",
    "unit_plural": "writes",
    "description": "Incremental Static Regeneration cache writes",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "isr_writes",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "ISR Writes",
      "filters": [],
      "event_name": "isr.writes"
    }
  }'

Image Transformations Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Image Transformations",
    "type": "metered",
    "unit_singular": "transformation",
    "unit_plural": "transformations",
    "description": "Image optimization and transformations",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "image_transforms",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Image Transformations",
      "filters": [],
      "event_name": "images.transforms"
    }
  }'

Image Cache Reads Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Image Cache Reads",
    "type": "metered",
    "unit_singular": "read",
    "unit_plural": "reads",
    "description": "Image cache read operations",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "image_cache_reads",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Image Cache Reads",
      "filters": [],
      "event_name": "images.cache_reads"
    }
  }'

Image Cache Writes Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Image Cache Writes",
    "type": "metered",
    "unit_singular": "write",
    "unit_plural": "writes",
    "description": "Image cache write operations",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "image_cache_writes",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Image Cache Writes",
      "filters": [],
      "event_name": "images.cache_writes"
    }
  }'

Blob Storage Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Blob Storage",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "File storage in blob store",
    "meter": {
      "aggregation": {
        "type": "MAX",
        "field": "storage_gb",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Blob Storage",
      "filters": [],
      "event_name": "blob.storage"
    }
  }'

Blob Simple Operations Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Blob Simple Operations",
    "type": "metered",
    "unit_singular": "operation",
    "unit_plural": "operations",
    "description": "Simple blob operations (head, URL access)",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "simple_ops",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Blob Simple Operations",
      "filters": [],
      "event_name": "blob.simple_ops"
    }
  }'

Blob Advanced Operations Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Blob Advanced Operations",
    "type": "metered",
    "unit_singular": "operation",
    "unit_plural": "operations",
    "description": "Advanced blob operations (put, copy, list)",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "advanced_ops",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Blob Advanced Operations",
      "filters": [],
      "event_name": "blob.advanced_ops"
    }
  }'

Blob Data Transfer Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Blob Data Transfer",
    "type": "metered",
    "unit_singular": "GB",
    "unit_plural": "GB",
    "description": "Data transfer for blob downloads/views",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "blob_transfer_gb",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Blob Data Transfer",
      "filters": [],
      "event_name": "blob.transfer"
    }
  }'

Edge Config Reads Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Edge Config Reads",
    "type": "metered",
    "unit_singular": "read",
    "unit_plural": "reads",
    "description": "Edge configuration data reads",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "config_reads",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Edge Config Reads",
      "filters": [],
      "event_name": "edge_config.reads"
    }
  }'

Edge Config Writes Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Edge Config Writes",
    "type": "metered",
    "unit_singular": "write",
    "unit_plural": "writes",
    "description": "Edge configuration data writes",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "config_writes",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Edge Config Writes",
      "filters": [],
      "event_name": "edge_config.writes"
    }
  }'

Web Analytics Events Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Web Analytics Events",
    "type": "metered",
    "unit_singular": "event",
    "unit_plural": "events",
    "description": "Web analytics events collected",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "analytics_events",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Web Analytics Events",
      "filters": [],
      "event_name": "analytics.events"
    }
  }'

Speed Insights Data Points Feature

curl --location 'https://api.cloud.flexprice.io/v1/features' \
  -X POST \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Speed Insights Data Points",
    "type": "metered",
    "unit_singular": "data point",
    "unit_plural": "data points",
    "description": "Core Web Vitals data points",
    "meter": {
      "aggregation": {
        "type": "SUM",
        "field": "speed_data_points",
        "multiplier": 1
      },
      "reset_usage": "BILLING_PERIOD",
      "name": "Speed Insights Data Points",
      "filters": [],
      "event_name": "speed.insights"
    }
  }'

Step 3: Create Hobby Plan (Free Tier)

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Vercel Hobby Plan",
    "description": "Free forever for personal projects",
    "lookup_key": "vercel_hobby",
    "prices": [],
    "entitlements": [
      {
        "feature_id": "feat_edge_requests_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 1000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_fast_data_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_fast_origin_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 10,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_cpu_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 4,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_memory_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 360,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_function_invocations_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 1000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_isr_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 1000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_isr_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 200000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_transforms_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 5000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_cache_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 300000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_cache_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_storage_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 1,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_simple_ops_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 10000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_advanced_ops_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 2000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_data_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 10,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_edge_config_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_edge_config_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_analytics_events_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 50000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_speed_data_points_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": false,
        "usage_limit": 10000,
        "usage_reset_period": "MONTHLY"
      }
    ]
  }'

Step 4: Create Pro Plan

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Vercel Pro Plan",
    "description": "Everything you need to build and scale your app",
    "lookup_key": "vercel_pro",
    "prices": [
      {
        "amount": "2000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Pro Plan Base Fee per seat",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      },
      {
        "amount": "200",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Edge Requests overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "200",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "edge_requests"
        }
      },
      {
        "amount": "15",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Fast Data Transfer overage (per GB)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "15",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "fast_data_transfer"
        }
      },
      {
        "amount": "6",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Fast Origin Transfer overage (per GB)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "6",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "fast_origin_transfer"
        }
      },
      {
        "amount": "12.8",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Functions Active CPU overage (per hour)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "12.8",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "functions_cpu"
        }
      },
      {
        "amount": "1.06",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Functions Provisioned Memory overage (per GB-hour)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "1.06",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "functions_memory"
        }
      },
      {
        "amount": "60",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Function Invocations overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "60",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "function_invocations"
        }
      },
      {
        "amount": "40",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "ISR Reads overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "40",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "isr_reads"
        }
      },
      {
        "amount": "400",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "ISR Writes overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "400",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "isr_writes"
        }
      },
      {
        "amount": "5",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Image Transformations overage (per 1K)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "5",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "image_transforms"
        }
      },
      {
        "amount": "40",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Image Cache Reads overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "40",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "image_cache_reads"
        }
      },
      {
        "amount": "400",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Image Cache Writes overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "400",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "image_cache_writes"
        }
      },
      {
        "amount": "2.3",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Blob Storage overage (per GB)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "2.3",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "blob_storage"
        }
      },
      {
        "amount": "40",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Blob Simple Operations overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "40",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "blob_simple_ops"
        }
      },
      {
        "amount": "500",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Blob Advanced Operations overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "500",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "blob_advanced_ops"
        }
      },
      {
        "amount": "5",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Blob Data Transfer overage (per GB)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "5",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "blob_data_transfer"
        }
      },
      {
        "amount": "300",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Edge Config Reads overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "300",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "edge_config_reads"
        }
      },
      {
        "amount": "1000",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Edge Config Writes overage (per 500 writes)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "1000",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "edge_config_writes"
        }
      },
      {
        "amount": "3",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Web Analytics Events overage (per 100K)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "3",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "analytics_events"
        }
      }
    ],
    "entitlements": [
      {
        "feature_id": "feat_edge_requests_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 10000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_fast_data_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_fast_origin_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_cpu_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 16,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_memory_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1440,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_function_invocations_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_isr_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 10000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_isr_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 2000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_transforms_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 10000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_cache_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 600000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_image_cache_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 200000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_storage_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 5,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_simple_ops_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_advanced_ops_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 10000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_blob_data_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_edge_config_reads_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_edge_config_writes_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_analytics_events_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 100000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_speed_data_points_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 10000,
        "usage_reset_period": "MONTHLY"
      }
    ]
  }'

Step 5: Create Enterprise Plan Template

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Vercel Enterprise Plan",
    "description": "Critical security, performance, observability, platform SLAs",
    "lookup_key": "vercel_enterprise",
    "prices": [
      {
        "amount": "300000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Enterprise Plan Base Fee (starting price)",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ],
    "entitlements": [
      {
        "feature_id": "feat_edge_requests_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 50000000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_fast_data_transfer_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 5000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_cpu_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 1000,
        "usage_reset_period": "MONTHLY"
      },
      {
        "feature_id": "feat_functions_memory_123",
        "feature_type": "metered",
        "is_enabled": true,
        "is_soft_limit": true,
        "usage_limit": 50000,
        "usage_reset_period": "MONTHLY"
      }
    ]
  }'

Step 6: Create Add-on Plans

Web Analytics Plus Add-on
curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Web Analytics Plus",
    "description": "Extended analytics with UTM parameters and 24-month retention",
    "lookup_key": "web_analytics_plus",
    "prices": [
      {
        "amount": "1000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Web Analytics Plus per team",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      }
    ]
  }'

Speed Insights Add-on

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Speed Insights",
    "description": "Core Web Vitals monitoring per project",
    "lookup_key": "speed_insights",
    "prices": [
      {
        "amount": "1000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Speed Insights per project",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      },
      {
        "amount": "6.5",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Speed Insights data points overage (per 10K)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "6.5",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "speed_data_points"
        }
      }
    ]
  }'

Observability Plus Add-on

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/plans' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "Observability Plus",
    "description": "Advanced metrics, query engine, and AI prompting",
    "lookup_key": "observability_plus",
    "prices": [
      {
        "amount": "1000",
        "billing_model": "FLAT_FEE",
        "currency": "USD",
        "description": "Observability Plus base fee (1M events included)",
        "type": "RECURRING",
        "billing_period": "MONTHLY",
        "billing_period_count": 1
      },
      {
        "amount": "120",
        "billing_model": "PER_UNIT",
        "currency": "USD",
        "description": "Observability events overage (per million)",
        "type": "USAGE",
        "tier_mode": "VOLUME",
        "tiers": [
          {
            "unit_amount": "120",
            "up_to": null
          }
        ],
        "filters": {
          "feature": "observability_events"
        }
      }
    ]
  }'

Step 7: Create Customer

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/customers' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "name": "DevStudio Corp",
    "email": "admin@devstudio.com",
    "external_id": "cust_devstudio_123",
    "metadata": {
      "company": "DevStudio Corp",
      "industry": "Software Development",
      "plan_tier": "pro",
      "team_size": "5"
    }
  }'

Step 8: Create Pro Subscription

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/subscriptions' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "customer_id": "cust_123456789",
    "plan_id": "plan_vercel_pro_123",
    "billing_period": "MONTHLY",
    "billing_period_count": 1,
    "currency": "USD",
    "start_date": "2025-01-15",
    "phases": [
      {
        "start_date": "2025-01-15",
        "line_items": [
          {
            "price_id": "price_pro_base_123",
            "quantity": 5,
            "display_name": "Pro Plan - 5 Team Seats"
          },
          {
            "price_id": "price_web_analytics_plus_123",
            "quantity": 1,
            "display_name": "Web Analytics Plus Add-on"
          }
        ]
      }
    ]
  }'

Step 9: Track Usage Events

Edge Requests Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_edge_requests_123",
    "quantity": 15000000,
    "metadata": {
      "project_id": "proj_main_app",
      "region": "us-east-1",
      "measurement_time": "2025-01-15T10:30:00Z"
    }
  }'

Fast Data Transfer Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_fast_data_transfer_123",
    "quantity": 1250,
    "metadata": {
      "project_id": "proj_main_app",
      "transfer_type": "static_assets",
      "region": "global"
    }
  }'

Functions Active CPU Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_functions_cpu_123",
    "quantity": 25,
    "metadata": {
      "project_id": "proj_main_app",
      "function_type": "api_route",
      "runtime": "nodejs18.x"
    }
  }'

Functions Provisioned Memory Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_functions_memory_123",
    "quantity": 2000,
    "metadata": {
      "project_id": "proj_main_app",
      "memory_allocation": "2GB",
      "runtime": "nodejs18.x"
    }
  }'

Image Transformations Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_image_transforms_123",
    "quantity": 25000,
    "metadata": {
      "project_id": "proj_main_app",
      "format": "webp",
      "optimization_type": "auto"
    }
  }'

ISR Operations Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_isr_reads_123",
    "quantity": 15000000,
    "metadata": {
      "project_id": "proj_main_app",
      "cache_type": "data_cache",
      "region": "global"
    }
  }'

Blob Storage Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_blob_storage_123",
    "quantity": 8.5,
    "metadata": {
      "project_id": "proj_main_app",
      "storage_type": "file_uploads",
      "measurement_time": "2025-01-15T10:30:00Z"
    }
  }'

Web Analytics Events Usage

curl --request POST \
  --url 'https://api.cloud.flexprice.io/v1/usage' \
  --header 'Content-Type: application/json' \
  --header 'x-api-key: YOUR_API_KEY_HERE' \
  --data '{
    "subscription_id": "sub_123456789",
    "feature_id": "feat_analytics_events_123",
    "quantity": 250000,
    "metadata": {
      "project_id": "proj_main_app",
      "event_type": "page_view",
      "custom_events": true
    }
  }'

Step 10: Monitor Usage

Check current usage across all features:

curl --location 'https://api.cloud.flexprice.io/v1/subscriptions/sub_123456789/usage' \
  --header 'x-api-key: YOUR_API_KEY_HERE'

Vercel’s Pricing Isn’t Simple, But It’s Predictable If You Know What to Watch

Vercel’s pricing has evolved from generous, flat-tier plans to a usage-based model that mirrors how modern infrastructure scales.

It’s not meant to be confusing, it’s meant to give you flexibility.

But that flexibility comes with responsibility: understanding what you’re consuming, setting limits, and tracking the right metrics.

If you're building something simple and static, Vercel will likely stay free forever.

If you're launching a production-grade app or running dynamic logic at scale, you’ll need to keep an eye on usage, Edge Requests, CPU, bandwidth, ISR, and more.

Once you understand the logic behind the model, you can predict your costs, control your overages, and avoid the classic “How did this happen?” billing moment.

Vercel doesn’t hide what you’re paying for. But you do have to know where to look.

More insights on billing

Insights on
billing and beyond

Explore expert tips, industry trends, and best practices for billing, pricing, and scaling revenue.

Get started with your billing today.