Performance Budget Calculator
A performance budget is a set of limits your pages must not exceed, such as kilobytes of JavaScript, total page weight or Total Blocking Time, plus a minimum Lighthouse score. This calculator suggests budget and goal values from PerfDelta's measurements of real websites, grouped by platform or industry, and turns them into a configuration for Lighthouse CI.
Set your performance budget
| Metric | Budget | Goal | Group median |
|---|---|---|---|
| Total page weight | 4,500 KB | 3,500 KB | 4,409 KB |
| JavaScript | 1,650 KB | 1,300 KB | 1,646 KB |
| Images | 1,050 KB | 800 KB | 1,036 KB |
| CSS | 90 KB | 70 KB | 90 KB |
| Fonts | 180 KB | 130 KB | 174 KB |
| Requests | 130 | 100 | 129 |
| Third-party services | 5 | 4 | 5 |
| Total Blocking Time | 800 ms | 200 ms | 771 ms |
| LCP (lab) | 4,000 ms | 2,500 ms | Google threshold |
| CLS (lab) | 0.25 | 0.10 | Google threshold |
| Lighthouse score (minimum) | 40 | 90 | 42 |
Weights from all websites, Total Blocking Time and score from the industry.
PerfDelta monitoring tracks third-party services. Lighthouse CI counts requests rather than services, so the files leave this value out.
Source: website speed statistics, period 2026-10, 4,108 websites, mobile Lighthouse runs.
lighthouserc.json for Lighthouse CI (Lighthouse 12 and later)
{
"ci": {
"assert": {
"assertions": {
"resource-summary:total:size": [
"error",
{
"maxNumericValue": 4608000
}
],
"resource-summary:script:size": [
"error",
{
"maxNumericValue": 1689600
}
],
"resource-summary:image:size": [
"error",
{
"maxNumericValue": 1075200
}
],
"resource-summary:stylesheet:size": [
"error",
{
"maxNumericValue": 92160
}
],
"resource-summary:font:size": [
"error",
{
"maxNumericValue": 184320
}
],
"resource-summary:total:count": [
"warn",
{
"maxNumericValue": 130
}
],
"largest-contentful-paint": [
"error",
{
"maxNumericValue": 4000
}
],
"total-blocking-time": [
"error",
{
"maxNumericValue": 800
}
],
"cumulative-layout-shift": [
"error",
{
"maxNumericValue": 0.25
}
],
"categories:performance": [
"error",
{
"minScore": 0.4
}
]
}
}
}
}
budget.json (up to Lighthouse 11)
[
{
"path": "/*",
"timings": [
{
"metric": "largest-contentful-paint",
"budget": 4000
},
{
"metric": "total-blocking-time",
"budget": 800
},
{
"metric": "cumulative-layout-shift",
"budget": 0.25
}
],
"resourceSizes": [
{
"resourceType": "total",
"budget": 4500
},
{
"resourceType": "script",
"budget": 1650
},
{
"resourceType": "image",
"budget": 1050
},
{
"resourceType": "stylesheet",
"budget": 90
},
{
"resourceType": "font",
"budget": 180
}
],
"resourceCounts": [
{
"resourceType": "total",
"budget": 130
}
]
}
]
Performance budget vs. goal: two numbers with different jobs
A budget and a goal answer different questions. The goal is where you want to be, for example an LCP under 2.5 seconds or a home page under 1 MB. The budget is the line you refuse to cross on the way there. Tammy Everts of SpeedCurve recommends setting the budget at the worst value of the last two to four weeks plus a small buffer. That way it catches regressions from day one instead of failing every build until the big refactoring is done. Once the page gets faster, you tighten the budget and repeat.
The calculator follows the same logic. Without your own numbers it uses the median of the comparison group as the budget, because being heavier than the typical site on the same platform is a clear warning sign. The goal sits 20 percent below it. If you enter your current values, the budget becomes your value plus 5 percent, and the goal stays tied to the benchmark.
Which metrics belong in a performance budget
Fewer is better. SpeedCurve calls it a minimum viable budget: a handful of metrics the team actually looks at, instead of twenty limits nobody reads. Start with size limits per resource type. They catch accidental regressions early, such as a new carousel library or an uncompressed hero image, long before the change shows up in field data. JavaScript deserves the strictest limit, because every kilobyte has to be downloaded, parsed and executed on the main thread.
Timing limits tie the budget to what visitors experience. In the lab, Total Blocking Time is the best stand-in for INP, and the lab LCP shows whether the largest element still renders in time. A minimum Lighthouse score works as a single number for dashboards, but it reacts to many factors at once, so it should never be the only limit. Field data from the Chrome UX Report moves over a 28-day window, which makes it better suited for alerts than for blocking a build.
How the calculator sets budget and goal values
The numbers come from PerfDelta's own measurements. Every site in the monthly statistics was tested with Lighthouse on a mobile profile, and the medians are calculated per platform and per industry. Page weight is the transfer size, split into JavaScript, images, CSS and fonts as the Lighthouse resource summary reports it. Where an industry sample is still too small for a stable median per resource type, the weights come from all sites, and a note below the table says so.
The timing budgets follow Google's thresholds: 4 seconds for LCP and 0.25 for CLS mark the start of the poor range, 2.5 seconds and 0.1 the good range, which makes them the goal. All values are rounded to steps of 5, 10, 50 or 100, because a team discusses 500 KB more easily than 487 KB.
Lighthouse CI budgets: budget.json and lighthouserc.json assertions
Lighthouse CI runs Lighthouse in your build pipeline and fails the build when a limit is exceeded. For years the standard format was budget.json, with resource sizes in kilobytes and timings in milliseconds. Lighthouse 12, released in April 2024, removed budget support from Lighthouse itself, and the budgetsFile option of Lighthouse CI depends on that removed audit. With current versions, budgets are written as assertions in lighthouserc.json instead: resource-summary:script:size limits JavaScript with a value in bytes, and categories:performance sets the minimum score.
The calculator outputs both. Use lighthouserc.json for current pipelines and budget.json for older setups and tools that still read the format. The page type sets the path. Article and product templates load different scripts and images than the home page, so each page type deserves a budget of its own.
Keeping the budget: alerts, tightening and ownership
A budget only works if someone hears about a breach. Run Lighthouse CI on every pull request and test the live site on a schedule as well, because tag managers and CMS content change pages without any deployment. Paul Calvano's advice is to alert on field data and diagnose with lab data: the field shows that visitors are affected, the lab run shows which file caused it.
Review the budget every few weeks. If a metric has stayed well below its limit for a month, lower the limit to the new level, otherwise the next feature quietly uses up the headroom you gained. Also agree on who owns each budget and what happens when a release breaks it, whether the change gets reverted or accepted with a ticket.
On the paid plans, PerfDelta's monitoring checks your budgets automatically: limits per project or URL, an email when a metric goes over budget and when it is back within it, and a pass/fail status through the API and MCP for your CI pipeline. Plans and limits are on the pricing page.
FAQ
What is a performance budget?
A set of limits for metrics that drive page speed, such as total page weight, JavaScript size, Total Blocking Time or the Lighthouse score. A change that exceeds a limit fails the build or triggers an alert, so a slower page is caught before visitors notice it.
What is a good performance budget for page weight?
There is no universal number. Start with the median of sites on your platform from the calculator above, and do not set the budget below your current weight plus a small buffer. Then lower it step by step. Under 1 MB is lean for a whole page, and JavaScript is the most expensive resource per kilobyte.
Does Lighthouse still support budget.json?
Lighthouse removed budgets in version 12 in April 2024. In Lighthouse CI you can express the same limits as assertions in lighthouserc.json, for example resource-summary:script:size with a value in bytes. The calculator generates both formats.
Should I set budgets for mobile or desktop?
Mobile first. The benchmark values come from mobile Lighthouse runs, where a slower CPU and network make heavy pages stand out. Desktop budgets can follow later, based on your own measurements.
See also: Core Web Vitals Monitoring.
Guides for every metric and finding are in the Website Speed Optimization.
PerfDelta is built by Christian Schreiber, who has been working on SEO and web performance for more than 15 years.
A free account saves your tests and shows how your values change from one test to the next. Daily monitoring with field data and alerts starts with the Solo plan.