Deploy Center Docs Guides GitHub Download

Savings: simulate and ledger

Last updated · Edit on GitHub

On this page

German version: ERSPARNIS.md.

Two commands, two questions:

Both need gh (logged in), because they count pushes on GitHub. Add --json for the machine answer. In the app: the Simulator (a banner before anything is turned off, and Settings → Costs) and the Ledger ("≈ $X saved since …", per project).

Every number is an estimate and shows "≈". The JSON says how it was made (method).

How it is estimated#

pushes to the deploy branch × the project's average build

  1. Pushes. From GitHub's activity list for the deploy branch (repos/{repo}/activity: push, force_push, pr_merge, merge_queue_merge). Where that cannot be read, commits on the branch stand in. One push can carry several commits, so that count is an upper bound. basis says which one was used.
  2. Average build. The mean duration of the project's last 20 finished builds (Vercel: READY; Render: live or deactivated). Failed and canceled builds are not measured.
  3. Price per build, the first one that is known:

    1. Vercel billing (deploys costs, last 7 days): billed build dollars / builds of that project (vercel-billing).
    2. The team's price per build minute (billed build dollars / billed build minutes over all Vercel projects with billing) × the average build (vercel-team-rate).
    3. A rate you set (rate-setting): DEPLOYS_VERCEL_USD_PER_MIN for one Vercel build minute, DEPLOYS_RENDER_USD_PER_MIN for one Render pipeline minute.

    Render has no billing API. Without DEPLOYS_RENDER_USD_PER_MIN, Render shows pipeline minutes only, and the dollars stay null ("?").

simulate: every push in the window counts as one build ("auto-deploy"). "Once a day" counts one build on each day that had a push. Both are scaled from the window (--days, 1 to 90) to 30 days.

ledger: from the day auto-deploy was turned off (per project), every push whose commit was never built counts as a skipped build. Projects whose auto-deploy was never turned off here are left out.

Examples#

deploys simulate
Estimate over the last 30 days, per month:
  web (vercel): 6 pushes; auto-deploy ≈ $1.2, 18 build minutes; once a day ≈ $0.4
  api (render): 4 pushes; auto-deploy ≈ ?, 20 pipeline minutes; once a day ≈ ?
Auto-deploy would cost ≈ $1.2 a month; deploying once a day ≈ $0.4.
DEPLOYS_RENDER_USD_PER_MIN=0.01 deploys simulate --days 14
deploys ledger
Since 2026-01-20: ≈ $0.8 saved, 6 builds skipped (12 Vercel build minutes, 10 Render pipeline minutes).
  web (vercel), off since 2026-01-20: 4 of 5 pushes not built, ≈ $0.8, 12 build minutes
  api (render), off since 2026-01-25: 2 of 3 pushes not built, ≈ ?, 10 pipeline minutes
deploys ledger --json | jq '.total.usd'

JSON#

Both: estimate (always true), kind (simulate or ledger), currency (USD), generatedAt, method, projects, total.

Per project, both:

FieldMeaning
platform, namevercel or render, and the project
unitbuild minutes (Vercel) or pipeline minutes (Render)
basispushes or commits (upper bound); null if GitHub could not be read
problemwhy a number is missing, or null
pushespushes counted in the window
avgBuildMinutes, buildsMeasuredthe average build and how many builds it is from (at most 20)
usdPerBuild, priceSourcethe price of one build, and vercel-billing, vercel-team-rate, rate-setting or null

simulate (days, teamUsdPerBuildMinute at the top):

FieldMeaning
autoauto-deploy is on now
activeDays, pushesPerDaydays with a push, pushes per day
autoMonth, dailyMonth, savingMonth{builds, minutes, usd} per month: auto-deploy, once a day, the difference
total.*Month{usd, vercelMinutes, renderMinutes, builds} over all projects
total.usdCompletefalse if a project with pushes has no price, so usd is too low

ledger (since, days since the first project was turned off, at the top):

FieldMeaning
offAt, offDaywhen auto-deploy was turned off
builds, skippedbuilds since then, and pushes never built
savedMinutes, savedUsd, builtUsdthe skipped builds in minutes and dollars, and what the builds that did run cost
skippedPushesthe last 20 skipped pushes, {day, sha}
totalskipped, pushes, builds, usd, builtUsd, vercelMinutes, renderMinutes, usdComplete

Limits#