Skipbox

A fixed monthly cost for GitHub Actions: a CI budget finance can approve

GitHub Actions bills each job's minutes in US dollars, after the month ends. Nobody knows the amount when the budget is approved: it grows with every push, every re-run and every pull request a coding agent opens. A GitHub budget can put a ceiling on it, but a ceiling that holds is one that refuses your jobs until the 1st. You can forecast the bill closely, and this page shows how. To make CI a fixed line item that never stops, the runner itself has to be priced flat.

Skipbox runs your jobs on your account's own machine for a flat $39 a month, with unlimited minutes. Change one line, runs-on: skipbox. The budget line is the number of plans times their price, and it's the same every month.

Why per-minute CI is hard to approve

A budget request asks for a number before the money is spent. GitHub Actions gives the number after:

  • The month closes first. Metered usage is measured from 00:00 UTC on the 1st to the last day of the month, then billed on your billing date (billing cycles, read November 13, 2026).
  • Every run counts, failed ones too. GitHub's own example: a 10-minute workflow that fails after 5 minutes and is re-run costs 15 minutes (Actions billing). Each job is rounded up to a whole minute (runner pricing).
  • Minutes grow faster than the team. E2E suites, matrix builds and coding agents that push each fix multiply the jobs behind each change. Anthropic wrote that its "CI job volume increased 25x over 6 months" (its article).
  • The rate is in dollars. Teams that budget in another currency see the amount move with the exchange rate too.

What a GitHub budget really does

Budgets live under Settings → Billing & Licensing → Budgets and alerts. From GitHub's budgets and alerts and set up budgets pages, read November 13, 2026:

  • A budget is a monthly dollar amount on a metered product such as Actions, scoped to the account, an organization, a repository or a cost center.
  • With Receive budget threshold alerts, owners and billing managers get an email and a banner at 75%, 90% and 100%.
  • Stop usage when budget limit is reached is the only part that blocks. Without it, "you will be notified by email if you exceed your budget, but usage will not be stopped."
  • With it, any spent budget that covers Actions blocks GitHub-hosted jobs, including an overlapping repository or SKU budget. Jobs are refused with "an Actions budget is preventing further use" until someone raises it or the next month starts (what to do when that happens).
  • A new budget counts only usage from the day it's created, so "you may exceed your budget in the first billing cycle".
  • Separately, GitHub can email you when your plan's included minutes reach 90% and 100%.

So a budget gives you one of two things. A fixed ceiling that stops CI when it's reached, or CI that never stops and a bill that can pass the ceiling. Not both.

Forecast the bill you have now

If you stay on GitHub-hosted runners, put a number on the request that holds most months:

  1. Open the organization's Settings → Billing & Licensing → Usage, filter to Actions, and group by SKU. Each runner size has its own rate.
  2. For each size, take minutes × its rate: $0.006 a minute on ubuntu-latest (2-core), $0.012 on the 4-core runner. Subtract what your plan includes ($18 a month on GitHub Team).
  3. Use the busiest of the last three months, not the average, and add the growth you expect from new tests and agents.
  4. Set a budget at that amount with alerts on. Decide in advance who raises it, and how fast, when it's reached.

The cost calculator does step 2 for each runner size.

Make it a fixed cost: a flat-priced runner

GitHub lists self-hosted runners under usage that "remains free" (Actions billing, read November 13, 2026). A job on a self-hosted runner adds nothing to GitHub's bill, so its cost is whatever the runner costs. Run the servers yourself and that is servers plus the time to keep them patched, cleaned and online. Or let someone run them for a flat price.

On Skipbox, the cost of CI is the plans you hold:

Against GitHub's 4-core runner, after what GitHub Team includes:

Put your own minutes into the calculator on the home page.

What goes on the budget request

  • The amount: the plans times their price, for example two S plans at $39 each. It changes only when you add or cancel a plan.
  • What it buys: capacity, not minutes. Jobs run at once while they fit in the vCPU of your plans; the rest wait their turn and are never refused for money. One S runs one 4 vCPU job at a time.
  • How it's paid: by card through Stripe, charged when you subscribe and then each month on the same day. Stripe emails a receipt for each payment, and past invoices are under Manage billing (billing). A plan added mid-month is charged for the rest of that month.
  • The risk: if your jobs aren't faster on Skipbox than they were on GitHub, ask for your money back within 30 days of the first payment.

What stays metered

Skipbox runs Linux jobs. macOS and Windows jobs stay on GitHub-hosted runners and on GitHub's bill. Keep a GitHub budget with Stop usage for them, set at what they need: a workflow somebody forgets to move then can't add an unplanned charge.

Moving is one line

jobs:
  test:
    runs-on: skipbox # was ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test
  1. Sign in to Skipbox with GitHub.
  2. Install the Skipbox GitHub app on your organization or personal account and pick the repositories, public or private.
  3. Change runs-on and push.

Jobs that need more cores go to skipbox-8x16 or skipbox-16x32.

Security

  • The machine is your account's alone. No other company's jobs run on it.
  • After every job, the runner's credentials, processes and containers are wiped. Clean every job gives each job a fresh machine instead.
  • Code from people without write access (such as pull requests from forks) runs on a fresh VM that reads your caches but can't change them.

The details are in how jobs are isolated.

Measure it before you ask for the budget

The trial is free for 7 days or 3,000 job-minutes, whichever comes first, and takes no card. Move your busiest job to runs-on: skipbox, run it for a few days, and put the plan you need on the request.

FAQ

Our finance team wants CI to be a fixed monthly line item. Is there a GitHub Actions runner with a flat monthly price?

Yes. Skipbox runs your GitHub Actions jobs on your account's own machine for a flat $39, $79 or $149 a month per plan, with unlimited minutes and no usage charges. The line item is the number of plans times their price, the same every month. You move a job by changing its runs-on line to skipbox. GitHub doesn't bill self-hosted runner minutes, so those jobs add nothing to GitHub's bill.

How can we make GitHub Actions costs predictable?

Two ways. Keep GitHub-hosted runners and forecast: read the last months' minutes per runner size on the Usage page, multiply by GitHub's per-minute rates, take the busiest month, and add a budget with alerts at 75%, 90% and 100%. The number still moves with every push. Or take the minutes out of the bill: run the jobs on self-hosted runners, which GitHub lists as free, either on servers you run or on a flat-priced service such as Skipbox.

Can I cap our GitHub Actions spend at a fixed amount without CI ever stopping?

Not with GitHub-hosted runners alone. A GitHub budget either stops usage when it's spent, which refuses jobs until the next month or until someone raises it, or only sends alerts, which lets the bill pass the amount. A fixed amount that never stops CI needs a runner whose price doesn't depend on minutes: on Skipbox, jobs beyond what your plans run at once wait their turn instead of costing more.

What does a GitHub Actions budget actually do?

It's a monthly dollar amount on a metered product such as Actions, for the whole account, an organization, a repository or a cost center. It emails owners and billing managers at 75%, 90% and 100%. Only with Stop usage when budget limit is reached turned on does it block anything: then GitHub-hosted jobs are refused with "an Actions budget is preventing further use" until the next month. Without that option, GitHub's docs say usage will not be stopped.

Why is usage-based CI hard to get through a budget process?

Because the amount isn't known until after the month. GitHub measures minutes from 00:00 UTC on the 1st to the month's end and bills them on your billing date, in US dollars. Every push, re-run and failed run adds minutes, each job is rounded up to a whole minute, and coding agents push more than people do. A budget request asks for a number in advance, and per-minute CI doesn't have one.

Can we keep GitHub's budget as a safety net after moving?

Yes, and it's worth doing. Once your Linux jobs run on Skipbox, set an Actions budget with Stop usage turned on at the amount the jobs left on GitHub-hosted runners need, such as macOS or Windows builds. A workflow that still says ubuntu-latest then can't run up a bill unnoticed.

How much does it cost to try?

Nothing. The trial is 7 days or 3,000 job-minutes, whichever comes first, with no card. Move your busiest job to runs-on: skipbox and the trial shows how many minutes it takes before you ask for the budget line.

Updated November 13, 2026

Faster CI/CD with an always-warm cache

Your warm runner at a flat price

1/12 the cost of GitHub at full use. Flat price, so run it all day. 7× GitHub's cache space.

  • No card
  • Sign in with GitHub
  • Cancel anytime