Watch Vercel usage and spend against your included credit

Every weekday: what this Vercel billing cycle has cost so far, how much included credit is left, the projected total, and which resource is driving it.

Runs
Weekdays at 9:30
Uses
Vercel
Posts
Stat tile

What lands on your board

AcmeUsage spend this cycle$14.82+15% vs previous period, worsevs last report
Included credit used$14.82 of $20.00
Invocations10.0M+58% vs previous period, worse
Data transfer1.03TB+12% vs previous period, worse
Build minutes86-5.0% vs previous period, better
An example with made-up numbers. Your agent posts your real ones.

What it does

Most surprises on a Vercel invoice were visible on the Usage page two weeks earlier: a crawler walking every preview URL, an image route with no cache, a function that started running three times longer. The page is good; it just only helps people who open it.

The agent reads the cycle's charges every weekday, compares spend so far with the included credit and with an even pace, and names the resource that moved, whether function invocations, Active CPU, Fast Origin Transfer or build minutes. When the pace points past the credit, the card says by roughly how much, early enough for developers and finance to act.

How it works

  1. 1Pull the cycle's charges

    GET /v1/billing/charges?from=<cycle start, ISO 8601 UTC>&to=<tomorrow>&teamId=<team> streams one JSON line per charge and day in the FOCUS 1.3 format (ServiceName, SkuId, ChargeCategory, ConsumedQuantity, ConsumedUnit, BilledCost, ChargePeriodStart, and Tags with the project ID and name). With the Vercel MCP server, use its billing charges tool.

  2. 2

    2Group by resource

    Keep rows with ChargeCategory of Usage and sum BilledCost and ConsumedQuantity per ServiceName: Function Invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, Fast Data Transfer and CDN Requests beyond the Flat Rate CDN capacity, Image Optimization and build minutes. Keep daily totals for the cycle-to-date line, and leave out seat, add-on and Flat Rate CDN tier charges.

  3. 3

    3Compare with the credit and the pace

    Subtract spend from the plan's included usage credit (every Pro team gets $20 a month, applied from the first unit; it expires at the end of the cycle). Project the cycle total from the daily average and flag a projected overage of more than 10%.

  4. 4

    4Find what moved

    Compare each resource's last 7 days with the 7 before. A jump of 50% or more in invocations, Active CPU or origin transfer usually means a crawler, a retry loop or a cache miss; name the project from Tags, and point to Observability for the route.

  5. 5

    5Report

    Spend so far, credit left, the projected total, and the top resources by cost with their weekly change.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Spend this cycle so far, and the included credit left.
  • Projected total for the cycle at the current pace.
  • By resource: function invocations, Active CPU, data transfer, build minutes and anything else above a dollar, with the week-over-week change.
  • What moved: the resource and project behind any jump.
  • One line on what to change if an overage is coming.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/vercel-usage-and-spend/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the vercel-usage-and-spend skill

    Or paste the prompt instead of installing:

    promptUsing the Vercel REST API (GET /v1/billing/charges for the current billing cycle, FOCUS rows with ChargeCategory Usage) or the Vercel MCP server, add up my team's usage charges so far this cycle by ServiceName: function invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, any CDN usage beyond the Flat Rate CDN capacity, and build minutes. Leave out seats, add-ons and the Flat Rate CDN tier itself. Compare total spend with my plan's included usage credit ($20 unless I say otherwise), project the end-of-cycle total from the daily average, and compare each resource's last 7 days with the 7 before. Tell me spend so far, credit left, the projected total and overage, the top three resources by cost, and the most likely cause of any resource that jumped 50% or more.
  3. Put it on a schedule

    Weekdays at 9:30, from cron on any machine where Claude Code is signed in:

    crontab30 9 * * 1-5 claude -p "Run the vercel-usage-and-spend skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a stat tile. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: vercel-usage-and-spend
description: "Every weekday: what this Vercel billing cycle has cost so far, how much included credit is left, the projected total, and which resource is driving it. Use when the user asks for this, or when it runs on a schedule."
---

# Vercel usage and spend this billing cycle

Every weekday: what this Vercel billing cycle has cost so far, how much included credit is left, the projected total, and which resource is driving it.

Most surprises on a Vercel invoice were visible on the Usage page two weeks earlier: a crawler walking every preview URL, an image route with no cache, a function that started running three times longer. The page is good; it just only helps people who open it.

The agent reads the cycle's charges every weekday, compares spend so far with the included credit and with an even pace, and names the resource that moved, whether function invocations, Active CPU, Fast Origin Transfer or build minutes. When the pace points past the credit, the card says by roughly how much, early enough for developers and finance to act.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Vercel token for a team member with the Owner, Member, Developer, Billing or Security role (the roles the charges endpoint accepts) in `VERCEL_TOKEN`, with the team ID.
- Or the Vercel MCP server or connector, signed in as such a member.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Pull the cycle's charges** (Vercel): `GET /v1/billing/charges?from=<cycle start, ISO 8601 UTC>&to=<tomorrow>&teamId=<team>` streams one JSON line per charge and day in the FOCUS 1.3 format (`ServiceName`, `SkuId`, `ChargeCategory`, `ConsumedQuantity`, `ConsumedUnit`, `BilledCost`, `ChargePeriodStart`, and `Tags` with the project ID and name). With the Vercel MCP server, use its billing charges tool.
2. **Group by resource**: Keep rows with `ChargeCategory` of `Usage` and sum `BilledCost` and `ConsumedQuantity` per `ServiceName`: Function Invocations, Active CPU, Provisioned Memory, Fast Origin Transfer, Fast Data Transfer and CDN Requests beyond the Flat Rate CDN capacity, Image Optimization and build minutes. Keep daily totals for the cycle-to-date line, and leave out seat, add-on and Flat Rate CDN tier charges.
3. **Compare with the credit and the pace**: Subtract spend from the plan's included usage credit (every Pro team gets $20 a month, applied from the first unit; it expires at the end of the cycle). Project the cycle total from the daily average and flag a projected overage of more than 10%.
4. **Find what moved**: Compare each resource's last 7 days with the 7 before. A jump of 50% or more in invocations, Active CPU or origin transfer usually means a crawler, a retry loop or a cache miss; name the project from `Tags`, and point to Observability for the route.
5. **Report**: Spend so far, credit left, the projected total, and the top resources by cost with their weekly change.

## Route B: the browser

### What you need

- Signed in to Vercel as a member of the team with a role that can open Usage and Settings > Billing (Owner, Member or Billing; Viewer seats cannot see billing).

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://vercel.com/dashboard. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the team's Usage page**: Select the team in the team switcher, then click **Usage** in the sidebar. Leave the billing cycle dropdown on the current cycle; the overview shows each resource's usage so far and its projected cost for the cycle.
2. **Read the credit**: At the top of the overview, read spend so far against the included credit ($20 a month on Pro). Open **Settings > Billing** once to confirm the plan, the credit and any Flat Rate CDN tier, and keep those in the prompt.
3. **Go through the sections**: Scroll the **Functions**, **CDN**, **Builds** and **Image Optimization** sections. For each metric note the quantity, the billed amount and the projection. Switch the view from **Count** to **Project** to see which project drives a metric.
4. **Find what moved**: Change the billing cycle dropdown to **Last 30 days** and read each chart: compare the last 7 days with the 7 before by eye. A step up of 50% or more in invocations, Active CPU or origin transfer is the one to name, with its project from the Project view.
5. **Report**: Spend so far, credit left, the projected cycle total and overage, the top three resources by cost with their weekly change, and the likely cause of any jump.

Note: The Usage page already projects cost per resource, so the browser route needs less arithmetic than the API one; the week-over-week comparison is read off charts and is approximate. Usage data on the page lags by up to a few hours.

## The report

- **Spend this cycle** so far, and the included credit left.
- **Projected total** for the cycle at the current pace.
- **By resource**: function invocations, Active CPU, data transfer, build minutes and anything else above a dollar, with the week-over-week change.
- **What moved**: the resource and project behind any jump.
- One line on what to change if an overage is coming.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "vercel-usage-and-spend/<date of this run, e.g. 2026-10-16>",
  "item_key": "vercel-usage-and-spend",
  "project": "Acme",
  "source": "Vercel usage and spend this billing cycle skill",
  "kind": "metric",
  "title": "$14.82 of the $20 credit used, overage likely",
  "metric": {
    "label": "Usage spend this cycle",
    "value": 14.82,
    "prefix": "$",
    "better": "lower",
    "period_start": "<start of the period, ISO 8601>",
    "period_end": "<end of the period, ISO 8601>"
  },
  "glance": [
    {
      "type": "Progress",
      "props": {
        "label": "Included credit used",
        "value": 74,
        "text": "$14.82 of $20.00",
        "tone": "warn"
      }
    },
    {
      "type": "Grid",
      "props": {
        "columns": 3
      },
      "children": [
        {
          "type": "Stat",
          "props": {
            "label": "Invocations",
            "value": "10.0M",
            "delta": 58,
            "better": "lower"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Data transfer",
            "value": 1.03,
            "unit": "TB",
            "delta": 12,
            "better": "lower"
          }
        },
        {
          "type": "Stat",
          "props": {
            "label": "Build minutes",
            "value": 86,
            "delta": -5,
            "better": "lower"
          }
        }
      ]
    }
  ],
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Resource",
          "Used",
          "Billed",
          "vs last week"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "Function invocations",
            "10.0M",
            "$5.40",
            "+58%"
          ],
          [
            "Fast Data Transfer",
            "1.03 TB",
            "$4.12",
            "+12%"
          ],
          [
            "Active CPU",
            "24.2 h",
            "$3.10",
            "+41%"
          ],
          [
            "Build minutes",
            "86 min",
            "$1.20",
            "-5%"
          ],
          [
            "Edge Requests",
            "10.5M",
            "$1.00",
            "+9%"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "At this pace the cycle ends near $27.80, about $7.80 past the credit. Invocations jumped after Oct 12, mostly /api/og on acme-web.",
        "tone": "warn"
      }
    }
  ],
  "size": "md"
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

Set `period_start` and `period_end` to the window the number covers: the tile names it from them ("Last 7 days", "Today", "This month"). For a count right now (open items, a balance), send `"period_label": ""` so no period shows; for another name, send it as `period_label` (at most 24 characters).

## Run it on a schedule

Suggested: Weekdays at 9:30 (`30 9 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
30 9 * * 1-5 claude -p "Run the vercel-usage-and-spend skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/vercel-usage-and-spend#schedule

Source: https://briefkin.dev/skills/vercel-usage-and-spend

What your agent needs

  • A Vercel token for a team member with the Owner, Member, Developer, Billing or Security role (the roles the charges endpoint accepts) in VERCEL_TOKEN, with the team ID.

  • Or the Vercel MCP server or connector, signed in as such a member.

Connecting Vercel

  1. Vercel MCP, Vercel's official remote server at https://mcp.vercel.com, signed in with OAuth. It lists projects and deployments, reads build and runtime logs, and searches Vercel's docs.
  2. The vercel CLI. vercel ls <project> lists recent deployments, vercel inspect <deployment-url> --logs prints the build log, and vercel logs <deployment-url> shows runtime logs. Pass --token $VERCEL_TOKEN and --scope <team> in scheduled runs.
  3. REST API with an access token created under Account Settings > Tokens and scoped to the team, stored in VERCEL_TOKEN, with VERCEL_TEAM_ID sent as teamId.

Vercel tokens can be limited to one team and given an expiry but can't be made read-only, so use a short-lived token for reports and keep deploy and env var tasks out of the same skill.

Questions

Does it include the seat fee?

No. It tracks usage charges, which are what the included credit covers and what moves from day to day. Seats, add-ons and the Flat Rate CDN capacity tier are fixed for the cycle and show up on the invoice, not in the daily pace.

Can it stop an overage, not just warn about one?

The projection is the early warning: the card turns into a warning as soon as the pace points past the credit, ahead of Vercel's own email at 75% of the credit. For a hard stop, set a spend amount under Spend Management in the team's billing settings; the skill never changes billing settings itself.

Do I need Briefkin to use the Vercel usage and spend this billing cycle skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a stat tile, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Vercel pages themselves: the agent opens vercel.com/dashboard in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Watch usage spend this cycle on your board, run after run

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.