---
title: "Set performance budgets that block speed regressions before they cost rankings"
description: "Choose budget metrics, enforce them in CI with Lighthouse CI and webpack, set limits per template, and build the process that keeps budgets honored."
canonical: "https://scalewithsearch.com/articles/performance-budgets-seo"
date: "2026-03-20"
modified: "2026-09-25"
---
## Site navigation

- [Scale With Search](https://scalewithsearch.com/)
- Real estate
  - Real estate
    - [Real estate](https://scalewithsearch.com/for/real-estate)
- Work
  - Start here
    - [Send your brief](https://scalewithsearch.com/work#send-your-brief)
    - [Prepare your six-question brief](https://scalewithsearch.com/work#prepare-your-six-question-brief)
  - Build
    - [Site build, content library with SEO, signal desk](https://scalewithsearch.com/work)
- For your business
  - Trades and home services
    - [Auto body and collision shops](https://scalewithsearch.com/for/auto-body-and-collision-shops)
    - [Foundation and home repair contractors](https://scalewithsearch.com/for/foundation-and-home-repair)
    - [Garage door and fencing contractors](https://scalewithsearch.com/for/garage-door-and-fencing-contractors)
    - [HVAC contractors](https://scalewithsearch.com/for/hvac-contractors)
    - [Janitorial and commercial cleaning companies](https://scalewithsearch.com/for/janitorial-and-commercial-cleaning)
    - [Locksmiths](https://scalewithsearch.com/for/locksmiths)
    - [Moving companies](https://scalewithsearch.com/for/moving-companies)
    - [Pest control companies](https://scalewithsearch.com/for/pest-control-companies)
    - [Plumbing and electrical contractors](https://scalewithsearch.com/for/plumbing-and-electrical-contractors)
    - [Restoration and water or fire damage companies](https://scalewithsearch.com/for/restoration-and-water-fire-damage)
    - [Roofing companies](https://scalewithsearch.com/for/roofing-companies)
    - [Towing companies](https://scalewithsearch.com/for/towing-companies)
    - [Tree services and landscaping companies](https://scalewithsearch.com/for/tree-services-and-landscaping)
    - [Solar installers](https://scalewithsearch.com/for/solar-installation)
    - [General contractors](https://scalewithsearch.com/for/general-contractors-and-construction)
    - [Paving, concrete, and flooring contractors](https://scalewithsearch.com/for/paving)
  - Practices and professional services
    - [Bookkeeping and tax practices](https://scalewithsearch.com/for/bookkeeping-and-tax-practices)
    - [Dental practices](https://scalewithsearch.com/for/dental-practices)
    - [Family and criminal defense law firms](https://scalewithsearch.com/for/family-and-criminal-defense-law-firms)
    - [Med spas and aesthetics practices](https://scalewithsearch.com/for/med-spas-and-aesthetics)
    - [Personal injury law firms](https://scalewithsearch.com/for/personal-injury-law-firms)
    - [Veterinary clinics](https://scalewithsearch.com/for/veterinary-clinics)
    - [Gyms and fitness studios](https://scalewithsearch.com/for/fitness)
    - [Therapy and outpatient health practices](https://scalewithsearch.com/for/therapy-and-outpatient-health)
    - [Medical billing companies](https://scalewithsearch.com/for/medical-billing)
    - [Insurance agencies](https://scalewithsearch.com/for/insurance-agencies)
    - [Financial advisors](https://scalewithsearch.com/for/financial-advisors)
    - [Property management companies](https://scalewithsearch.com/for/property-management)
    - [Recruiting and staffing agencies](https://scalewithsearch.com/for/recruiting-and-staffing)
    - [Architects and interior designers](https://scalewithsearch.com/for/architects-and-interior-designers)
    - [Logistics and supply chain companies](https://scalewithsearch.com/for/logistics-and-supply-chain)
  - Agencies, MSPs, and manufacturing
    - [IT and managed service providers](https://scalewithsearch.com/for/it-and-managed-service-providers)
    - [Machine shops and precision manufacturers](https://scalewithsearch.com/for/machine-shops-and-precision-manufacturing)
    - [Marketing agencies and freelancers](https://scalewithsearch.com/for/marketing-agencies-and-freelancers)
    - [SEO agencies and consultants](https://scalewithsearch.com/for/seo-agencies-and-consultants)
    - [Small manufacturers and fabricators](https://scalewithsearch.com/for/small-manufacturers-and-fabricators)
  - Restaurants, shops, studios, and nonprofits
    - [Restaurants and hospitality businesses](https://scalewithsearch.com/for/restaurants-and-hospitality)
    - [Retail stores and ecommerce sellers](https://scalewithsearch.com/for/retail-and-ecommerce)
    - [Photographers, event planners, and travel agents](https://scalewithsearch.com/for/photographers)
    - [Churches and nonprofits](https://scalewithsearch.com/for/churches-and-nonprofits)
  - [All industries](https://scalewithsearch.com/for/)
- Learn
  - For your office
    - [Office job guides](https://scalewithsearch.com/guides/)
    - [Browser calculators](https://scalewithsearch.com/tools/)
  - Start here
    - [How it works](https://scalewithsearch.com/how-it-works)
    - [Free Starter Kit](https://scalewithsearch.com/kit/business-memory-starter-kit.zip)
    - [Synthetic specimen](https://scalewithsearch.com/specimen/working-session-specimen.zip)
  - Guides
    - [The Complete Guide to Business Memory for AI Agents](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [The Complete Small-Business Guide to AI Agent Governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [The Complete Guide to Leaving Vendor AI Memory](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - Articles by cluster
    - [Business memory](https://scalewithsearch.com/articles/business-memory-for-ai-agents-guide)
    - [Agent governance](https://scalewithsearch.com/articles/ai-agent-governance-guide-small-business)
    - [Migration and ownership](https://scalewithsearch.com/articles/leaving-vendor-ai-memory-guide)
  - For machines
    - [llms.txt](https://scalewithsearch.com/llms.txt)
    - [llms-full.txt](https://scalewithsearch.com/llms-full.txt)
    - [Machine view](https://scalewithsearch.com/?view=machine)
- Company
  - Evidence
    - [Proof](https://scalewithsearch.com/proof)
  - Company
    - [About](https://scalewithsearch.com/about)

# Set performance budgets that block speed regressions before they cost rankings.

A site launches with good Core Web Vitals. Rankings climb and organic traffic grows. Six months later, Google Search Console reports widespread speed failures. No single release caused it. Dozens of small regressions, each acceptable alone, added up.

Every feature, third-party integration, and design change adds weight. A performance budget sets numeric limits on page weight, load time, and resource counts. When a change exceeds a limit, an automated check raises an alert or blocks the deployment. Performance work moves from firefighting after rankings drop to prevention before code ships.

This guide is for engineering managers and tech leads. It covers what to budget, how to enforce it automatically, where to be strict, and the team process that decides whether budgets get honored.

## Know why speed decays without a budget

Performance decay follows five predictable paths.

**Feature accumulation.** Each feature adds JavaScript, CSS, API calls, and render work: a carousel, a video player, a chat widget, a personalization engine. Product managers judge features by user value, not by performance cost. Without a limit, the feature wins every time.

**Third-party creep.** Marketing asks for analytics, sales for lead forms, support for chat, and legal for consent management. Each team adds its tool on its own. A site that launched with 2 third-party scripts can load 15 a year later. The extra scripts can add 500 KB or more and two or more seconds of load time.

**Unoptimized images.** A designer uploads a 2,000 × 1,500 PNG. A developer ships it as is. Nobody notices until mobile users on slow connections wait eight seconds for the hero. Repeat that across a catalog, and average Largest Contentful Paint (LCP) crosses into "poor".

**Technical debt.** Legacy code stays because it works. CSS frameworks carry unused styles, outdated libraries stay in the bundle, and modules duplicate dependencies. The codebase gets heavier each sprint unless someone prunes it.

**Moving standards.** Lighthouse changed its scoring weights between versions 6 and 10. Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) as a Core Web Vital in March 2024. A site that passed in 2021 can fail today without any change of its own.

### See why nobody links the traffic loss to speed

When organic traffic falls 15 to 20 percent in a quarter, teams blame algorithm updates, competitors, and seasonality before speed. Three reasons hide the link.

The decline is gradual. LCP does not jump from 2.0 to 4.5 seconds overnight. It creeps from 2.0 to 2.3 to 2.7 seconds across months, until it crosses a threshold.

Field data lags. Search Console's Core Web Vitals report uses a rolling 28-day window of real-user data. A regression takes weeks to show fully, so today's traffic loss reflects releases from four to six weeks ago.

The loss is erosion, not a crash. A page slides from position 3 to 5, then 7, then 9. Each step costs part of its traffic. Across 200 pages, small declines add up to a large, unexplained loss.

## Choose what to budget

Budget the inputs you control so that the outputs, the Core Web Vitals, stay good.

| Budget | Content pages | Heavier pages | Why it matters |
|---|---|---|---|
| Total page weight | Under 500 KB on mobile landing pages | Under 1 MB for application pages; up to 1.5 MB for media-heavy product pages | All bytes compete for the first seconds of bandwidth |
| JavaScript | Under 150 KB | Under 300 KB for interactive applications | Parse and execution time block interactions and hurt INP |
| Images | Under 200 KB | Under 500 KB for ecommerce photography | Usually the largest share of page weight |
| CSS | Under 50 KB | Under 50 KB | Frameworks imported for 5 percent use can reach 100 to 200 KB |
| Third-party code | Under 100 KB and at most 3 domains | Same | Each extra domain adds DNS and TLS setup, often 100 to 300 ms |
| Requests on first load | Under 50 | Under 50 | Each request adds overhead and can lengthen the waterfall |

Mobile devices parse and run JavaScript several times slower than desktops, often three to five times. Set the JavaScript budget for the phone, not the laptop.

For CSS, inline only the critical styles. About 14 KB of compressed data fits in the first round trip of a new TCP connection. A critical CSS block under that size can render without an extra round trip. Defer the rest.

HTTP/2 multiplexing reduces the cost of many requests. Bundling and icon sprites still help when the waterfall is long.

The output metrics are the Core Web Vitals, measured at the 75th percentile of real visits:

| Metric | Good | Needs improvement | Poor |
|---|---|---|---|
| LCP | 2.5 s or less | 2.5 s to 4.0 s | Over 4.0 s |
| INP | 200 ms or less | 200 ms to 500 ms | Over 500 ms |
| CLS | 0.1 or less | 0.1 to 0.25 | Over 0.25 |

The [page speed optimization guide for developers](/articles/page-speed-optimization-developers) covers the fixes when a budget fails.

## Enforce budgets automatically

A budget that code review enforces by hand gets honored sometimes. Put it in the pipeline.

### Lighthouse CI

Lighthouse CI runs Lighthouse audits during the build and fails the check when a budget is exceeded.

```bash
npm install -g @lhci/cli
```

Configure it in `lighthouserc.json`:

```json
{
  "ci": {
    "collect": {
      "numberOfRuns": 3,
      "url": ["http://localhost:3000/"]
    },
    "assert": {
      "preset": "lighthouse:recommended",
      "assertions": {
        "categories:performance": ["error", {"minScore": 0.9}],
        "resource-summary:script:size": ["error", {"maxNumericValue": 153600}],
        "resource-summary:image:size": ["error", {"maxNumericValue": 204800}],
        "total-byte-weight": ["error", {"maxNumericValue": 512000}]
      }
    }
  }
}
```

This file fails the build when the performance score drops below 90 or JavaScript exceeds 150 KB. It also fails when images exceed 200 KB or total page weight exceeds 500 KB. The [Lighthouse in GitHub Actions guide](/articles/lighthouse-github-actions-seo) shows how to run it on every pull request.

### Webpack performance hints

webpack can fail a build when an asset or entry point exceeds a size. Set it in `webpack.config.js`:

```javascript
module.exports = {
  performance: {
    maxAssetSize: 200000,      // 200 KB per asset
    maxEntrypointSize: 300000, // 300 KB per entry point
    hints: 'error'             // fail the build on a violation
  }
};
```

### Custom checks

Write small scripts for limits the standard tools do not cover. Examples are third-party domain count, font file count, or an application metric. This Node.js script fails when the built homepage references more than three external domains:

```javascript
const fs = require('fs');
const path = require('path');

const buildDir = './dist';
const maxThirdParties = 3;

// Collect every domain referenced in the built HTML.
const html = fs.readFileSync(path.join(buildDir, 'index.html'), 'utf8');
const domains = [...new Set(
  [...html.matchAll(/https?:\/\/([^\/"']+)/g)].map(m => m[1])
)];

const externalDomains = domains.filter(d => !d.includes('yourdomain.com'));

if (externalDomains.length > maxThirdParties) {
  console.error(`FAIL: third-party budget exceeded: ${externalDomains.length}/${maxThirdParties}`);
  console.error('Domains:', externalDomains);
  process.exit(1);
}

console.log(`PASS: third-party budget: ${externalDomains.length}/${maxThirdParties}`);
```

The regular expression also counts domains in plain links and structured data. Add an allow list for those. Run the script in CI with the other checks. The [SEO testing guide for CI/CD pipelines](/articles/seo-testing-ci-cd-pipeline) shows where it fits among other automated checks.

## Set limits by template

Pages do different jobs, so one budget does not fit all.

| Template | Strictness | Example limits |
|---|---|---|
| Homepage | Strictest | Under 400 KB total, under 100 KB JavaScript, LCP under 2.0 s |
| Landing pages for ads, email, and social | Strict | Close to the homepage; visitors from ads leave fast |
| Product and service pages | Moderate | 800 KB to 1.2 MB, with image optimization and lazy loading enforced |
| Blog and content pages | Moderate to strict | Under 500 KB; lazy-load all embedded media below the first screen |
| Checkout and conversion flows | Interaction first | Up to 300 KB JavaScript, with minimal main-thread work so INP stays low |
| Admin and internal tools | Relaxed | No SEO stake, but slow tools still cost staff time |

Mobile budgets should be stricter than desktop. Slower processors and connections leave less margin, and desktop can often carry 20 to 30 percent more weight. Google indexes the mobile page, so meet the mobile budget first.

Count A/B testing tools inside the JavaScript budget. If the budget is 150 KB and the testing script takes 30 KB, the application has 120 KB.

## Make budgets stick

Tools enforce budgets. People decide whether the budgets survive.

**Executive sponsorship.** When a product manager pushes a feature that breaks the budget, someone with authority must make the trade-off. An engineering director or CTO must treat performance as a requirement.

**Education.** Designers, marketers, and product owners often do not see the cost of their requests. Short sessions that show how a 2 MB unoptimized design export becomes a six-second mobile load change behavior at the source.

**Visibility.** Show performance metrics where people already look: a Slack channel, an office status board, the executive report. When the whole company sees the Core Web Vitals numbers, performance becomes a shared responsibility.

**A documented exception path.** Rigid budgets without exceptions get ignored. Define the override:

1. Write a justification.
2. Get explicit approval from the named stakeholders.
3. Ship, and flag the page as needing optimization.
4. Schedule the remediation with a date.

Track every exception. If exceptions pile up without cleanup, the budget means nothing. For a critical feature, a phased rollout helps: ship to 10 percent of users while you optimize, then expand.

**Incentives.** Put performance into team goals, for example "Keep LCP under 2.5 s on 95 percent of pages" or "Zero budget violations in production". The [SEO OKRs guide for executives](/articles/seo-okrs-executives) shows how to phrase such goals.

## Watch field data between releases

Lab checks catch regressions before merge. Real user monitoring (RUM) catches what reaches users. Use SpeedCurve, Sentry, or GA4 with the `web-vitals` library.

Set alerts on thresholds, for example:

- LCP at the 75th percentile above 2.8 s for three days in a row;
- median CLS above 0.12;
- average page weight above 550 KB.

These alerts fire weeks before the 28-day Search Console report shows the problem.

Plot the metrics by sprint or release. A steady rise means enforcement is too weak or new features are not optimized. Review the budgets each quarter. Better image tooling may let you tighten the image budget. Architecture work may free room for new features.

## Avoid the five ways budgets fail

**Unrecorded exceptions.** Every unrecorded exception erodes credibility. Inconsistent enforcement is worse than none, because nobody knows the real standard.

**Manual enforcement.** Budgets enforced in code review are honored now and then. Automate them, or expect violations to ship.

**Unreachable targets.** A 200 KB total budget for a feature-rich SaaS product guarantees failure and abandonment. Start from current performance and tighten over several sprints.

**No explanation.** State the link to revenue, rankings, and user experience when you set each limit. A budget with no stated reason reads as gatekeeping, and teams work around it.

**No owner.** Name an engineering lead or performance champion. That person monitors compliance, coordinates fixes, and speaks for performance in planning.

A budget catches a regression in development, when the fix is one pull request. Without a budget, the work starts after rankings and traffic have already dropped.

## Budget third-party code separately

You do not control third-party code. It changes without notice, and non-technical teams often require it. Give it its own rules:

- **Domain count.** Cap third-party domains at three to five per page. A tag manager reduces the count but concentrates the risk in one script.
- **Size.** Set a size limit per vendor. If an analytics script exceeds 50 KB, evaluate alternatives. A heavy script must return value in proportion.
- **Execution time.** Measure main-thread blocking per vendor in WebPageTest or the Chrome DevTools Performance panel. A chat widget that blocks for 400 ms breaks the INP budget.
- **Containment.** Load third parties after the first interaction or after the `load` event, or isolate them in iframes or Web Workers.
- **Quarterly audits.** Find scripts that grew, scripts for tools you no longer use, and scripts whose value no longer covers their cost.

----

```text
                  .|########||.                                       .|########||.                                       .|########||.
               |##||.      .||##|.                                 |##||.      .||##|.                                 |##||.      .||##|.
             |#|.              .|#|.                             |#|.              .|#|.                             |#|.              .|#|.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
        .#.                          .#|                    .#.                          .#|                    .#.                          .#|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
      |#             ......             #|                |#             ......             #|                |#             ......             #|
     .#           ||#########|           #|              .#           ||#########|           #|              .#           ||#########|           #|
    .#.         |######||######|.        .#.            .#.         |######||######|.        .#.            .#.         |######||######|.        .#.
    #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#            #.        .##|###|##|#|######|        .#
   ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||          ||        |##|#||||||||||||#||#|        ||
   #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.         #        |#||||||||||||||||||||#|        #.
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #        #       .#||||||||||||||||||||||||#|       #
 ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||      ||   ....|||#||||||##|#|||#|#||##||||....|. ||
 #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#      #.  .  ....|#  ....#|||   ||| .#|||  ....#. .#
 #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.     #   .  ||||#| .#####||  . .#| .#|||  ||||#   #.
.|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||    .|   |||||  #. |#|||||. ||  #. |#||. .|||||   ||
||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||    ||   |....  #. ....|#.      |. ...|. ....||   ||
#.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#    #.  .||||||##||||||##||####|||||||#||||||#|   .#
#    .||####|###########################|.     #    #    .||####|###########################|.     #    #    .||####|###########################|.     #
#      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #    #      .#||||||.#.|| # |. ..# #| #|||||#|      #
#      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #    #      .#|||||| ..  |# ## |#| ...#|#|||#|      #
#      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #    #      .#|||#|# .# .#| #| ##|.#..#|||||#|      #
#      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #    #      .#||||||############|######|||||#|      #
#   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #    #   |...||#||||||#||||#|#||||||#|||||#||| |.|  #
#. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#    #. .. ||||# .|||##|.  |#| .|| || .|||#. #|  # .#
|| |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||    || |  ...||  ...##| |  #| .|. |. #####  .. .| ||
|| ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||    || ||||| || ||||#|  .  |. |. |#. ||||| |#| || ||
.# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.    .# |.....#|....|#.||||.|||##.|#|....||.#||.#. #.
 #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#      #.|||||||#############################| ||| .#
 ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||      ||       ##||#||#||||||#||#||#||#||##.      ||
  #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #        #       .#|||||||||#||#|||||||||||#|       #
  ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||        ||       |#||||||||||||||||||||||#|       ||
  .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.        .#        |#||||||||||||||||||||#|        #.
   ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||          ||        |#||||||||||||||||||#|        ||
    #.        .######|#|#########|        .#            #.        .######|#|#########|        .#            #.        .######|#|#########|        .#
    .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.            .#.         |#####||||#####|         .#.
     |#           ||########||           #.              |#           ||########||           #.              |#           ||########||           #.
      |#             ......             #|                |#             ......             #|                |#             ......             #|
       |#.                            .#|                  |#.                            .#|                  |#.                            .#|
        |#.                          .#.                    |#.                          .#.                    |#.                          .#.
         .#|                        |#.                      .#|                        |#.                      .#|                        |#.
           |#|                    |#|                          |#|                    |#|                          |#|                    |#|
            .|#|.              .|#|.                            .|#|.              .|#|.                            .|#|.              .|#|.
               |##||.      .||##|                                  |##||.      .||##|                                  |##||.      .||##|
                 .||########||.                                      .||########||.                                      .||########||.

Scale With Search  2026  [scalewithsearch.com](https://scalewithsearch.com)
```
