{
  "slug": "cicd-minutes-cost",
  "title": "CI/CD Minutes Cost Calculator",
  "heading": "CI/CD Pipeline Minutes Cost Calculator",
  "category": "financial",
  "url": "https://www.revenuelab.fyi/toolbox/cicd-minutes-cost",
  "summary": "Project your monthly CI/CD bill from pipeline runs and runner minutes.",
  "description": "Most CI/CD platforms (GitHub Actions, GitLab CI, CircleCI) bill on runner-minutes consumed, with a free tier and then a per-minute rate that varies by runner type — standard Linux runners are cheapest, macOS and larger/GPU runners cost several times more per minute. This calculator takes your pipeline run frequency, average duration, and runner rate to compute monthly minutes consumed and cost after the free tier, and separately handles the common case of a matrix build running the same pipeline across multiple OS/version combinations, since that multiplies minutes consumed by the matrix size even though it's 'one' logical CI run per commit. Parallelizing a pipeline into multiple concurrent jobs reduces wall-clock time but does not reduce total billed minutes — minutes are billed per job, not per pipeline, which is a common point of confusion when a parallelization effort doesn't lower the bill the way people expect.",
  "formula": "Billed minutes = runs per month × matrix size × avg job minutes, minus free tier; cost = billed minutes × $/minute.",
  "dateModified": "2026-09-30",
  "run_url": "https://www.revenuelab.fyi/api/public/calc?tool=cicd-minutes-cost",
  "inputs": [
    {
      "id": "runsPerMonth",
      "label": "Pipeline runs per month",
      "kind": "number",
      "hint": null,
      "default": 3000,
      "unit": null,
      "min": 0,
      "max": null
    },
    {
      "id": "jobMinutes",
      "label": "Average minutes per job",
      "kind": "number",
      "hint": null,
      "default": 8,
      "unit": null,
      "min": 0.1,
      "max": null
    },
    {
      "id": "matrixSize",
      "label": "Matrix size (parallel job variants)",
      "kind": "number",
      "hint": null,
      "default": 3,
      "unit": null,
      "min": 1,
      "max": null
    },
    {
      "id": "minuteRate",
      "label": "Runner rate",
      "kind": "number",
      "hint": null,
      "default": 0.008,
      "unit": "$/minute",
      "min": 0,
      "max": null
    },
    {
      "id": "freeMinutes",
      "label": "Free minutes per month",
      "kind": "number",
      "hint": null,
      "default": 3000,
      "unit": null,
      "min": 0,
      "max": null
    }
  ],
  "outputs": [
    {
      "id": "cost",
      "label": "Monthly CI/CD cost",
      "format": "currency",
      "hint": null,
      "primary": true
    },
    {
      "id": "totalMinutes",
      "label": "Total runner minutes consumed",
      "format": "number",
      "hint": null,
      "primary": false
    },
    {
      "id": "billable",
      "label": "Billable minutes after free tier",
      "format": "number",
      "hint": null,
      "primary": false
    },
    {
      "id": "annualCost",
      "label": "Annualized cost",
      "format": "currency",
      "hint": null,
      "primary": false
    }
  ],
  "worked_example": {
    "inputs": [
      "Pipeline runs per month: 3000",
      "Average minutes per job: 8",
      "Matrix size (parallel job variants): 3",
      "Runner rate: 0.008 $/minute",
      "Free minutes per month: 3000"
    ],
    "outputs": [
      "Monthly CI/CD cost: $552.00",
      "Total runner minutes consumed: 72,000",
      "Billable minutes after free tier: 69,000",
      "Annualized cost: $6,624.00"
    ]
  },
  "how_to": {
    "title": "How to use this",
    "steps": [
      "Enter pipeline runs per month.",
      "Enter average minutes per job.",
      "Enter matrix size (parallel job variants).",
      "Enter runner rate ($/minute).",
      "Enter free minutes per month.",
      "Read your monthly ci/cd cost on the right — it updates as you type.",
      "Hit Share to keep the scenario or send it to someone."
    ]
  },
  "scenarios": [
    {
      "name": "Conservative",
      "description": "Lower-end numbers — what if things land soft?",
      "values": {
        "runsPerMonth": 1800,
        "jobMinutes": 4.8,
        "matrixSize": 2,
        "minuteRate": 0.0048,
        "freeMinutes": 1800
      }
    },
    {
      "name": "Typical",
      "description": "Defaults — the most common real-world setup.",
      "values": {
        "runsPerMonth": 3000,
        "jobMinutes": 8,
        "matrixSize": 3,
        "minuteRate": 0.008,
        "freeMinutes": 3000
      }
    },
    {
      "name": "Ambitious",
      "description": "Higher-end numbers — what if things really pop?",
      "values": {
        "runsPerMonth": 4800,
        "jobMinutes": 12.8,
        "matrixSize": 5,
        "minuteRate": 0.0128,
        "freeMinutes": 4800
      }
    }
  ],
  "limitations": [
    "Results are estimates before tax, fees, and inflation unless an input explicitly covers them.",
    "Rates are treated as fixed for the whole period — variable-rate products will drift from this projection.",
    "This is educational maths, not financial advice. Check anything contractual with the lender or your accountant."
  ],
  "faq": [
    {
      "q": "Why didn't parallelizing my pipeline lower the bill?",
      "a": "Parallel jobs cut wall-clock time (how long you wait for results) but each job still consumes and bills its own minutes, so splitting one 20-minute job into four 5-minute parallel jobs uses roughly the same total minutes, sometimes slightly more due to fixed per-job startup overhead. Parallelization is a speed optimization for developer wait time, not a cost optimization for the CI bill — use it for the build-minute cost calculator's context-switch savings, not this one."
    },
    {
      "q": "Are self-hosted runners actually cheaper?",
      "a": "Often yes at high volume — self-hosted runners on your own cloud VMs or bare metal avoid the platform's per-minute markup, which is typically priced well above the underlying compute cost, but you take on the operational burden of managing runner infrastructure, security patching, and auto-scaling. The crossover point is usually somewhere in the tens of thousands of billed minutes per month; below that, managed runners' convenience typically wins."
    },
    {
      "q": "How much does test suite caching actually save on CI minutes?",
      "a": "Dependency and build caching (avoiding re-downloading packages or re-compiling unchanged code every run) commonly cuts job duration 30-60% for typical web and backend projects, directly reducing billed minutes by the same proportion since cost scales linearly with job minutes. It's usually the highest-leverage, lowest-effort CI cost optimization available before considering infrastructure changes."
    }
  ],
  "related": [
    "https://www.revenuelab.fyi/toolbox/developer-build-minute-cost",
    "https://www.revenuelab.fyi/toolbox/serverless-invocation-cost",
    "https://www.revenuelab.fyi/toolbox/cloud-vm-monthly-cost"
  ],
  "license": "CC-BY-4.0",
  "citation": "RevenueLab — CI/CD Minutes Cost Calculator (https://www.revenuelab.fyi/toolbox/cicd-minutes-cost)"
}