Performance Budgets: Setting Limits That Keep Your Site Fast

· 8 min readPerformance

A performance budget is a speed limit for your website. It defines how much weight, delay, and rendering work a page is allowed before the team treats it as a problem. Without a budget, site speed usually gets worse in small steps. One tracking script, one larger hero image, one chat widget, one extra font weight, and suddenly a page that felt instant takes four seconds to become useful.

The point of a performance budget is not to block every marketing idea or make developers chase tiny wins that users will never notice. The point is to make speed visible before it becomes expensive to fix. If Core Web Vitals matter to your SEO, conversion rate, and customer experience, then performance cannot be something you check only after a redesign goes live. It needs guardrails.

Start with the pages that actually matter

Do not begin by setting one global budget for the whole site. A homepage, blog post, product page, local landing page, pricing page, dashboard, and checkout flow have different jobs. They also have different performance risks. Start with the templates that drive organic traffic, leads, revenue, or signups.

For most sites, that means auditing five to ten representative URLs. Include the homepage, the highest traffic content page, one important service or product page, one conversion page, and one page that tends to be heavy because it contains maps, reviews, video, filters, or third party widgets. These pages become your baseline set. If they stay healthy, the rest of the site is much easier to manage.

Use field data before lab data when you have it

Performance budgets should be grounded in what real users experience. Lab tools such as Lighthouse, WebPageTest, and Chrome DevTools are excellent for diagnosis, but field data tells you whether visitors on real devices and networks are having a good experience. Use Google Search Console Core Web Vitals, Chrome UX Report, analytics, or real user monitoring if you have it.

Field data is especially important because your test machine is probably better than your average user's phone. A page that feels acceptable on a fast office connection may be frustrating on a mid range Android device over mobile data. If your budget only reflects ideal conditions, it will not protect the users who need performance improvements most.

Set budgets for outcomes and inputs

A good performance budget includes both outcome metrics and input limits. Outcome metrics describe what users feel. Input limits describe the technical choices that usually cause the outcome. You need both because a Core Web Vitals score can move slowly, while a new 300 KB script can be caught immediately in a pull request.

Useful outcome budgets include Largest Contentful Paint under 2.5 seconds for most page loads, Interaction to Next Paint under 200 milliseconds, and Cumulative Layout Shift under 0.1. Those are Google's good thresholds, but do not stop there. Also track Time to First Byte, First Contentful Paint, total blocking time in lab tests, and whether the main content appears without waiting for client side JavaScript.

Useful input budgets include total JavaScript transfer size, unused JavaScript, render blocking CSS, image weight above the fold, number of third party requests, font files, DOM size, and total requests during initial load. These numbers are easier for teams to act on because they connect directly to design, content, and engineering decisions.

Pick limits that are strict enough to change behavior

A budget that nobody can fail is decoration. A budget that every page fails is noise. The useful middle ground is a limit that your current good pages can meet and your risky pages have to work toward. Start with your baseline measurements, then set budgets slightly better than the current median for each key template.

For example, if your service pages currently ship 420 KB of JavaScript and the fastest page ships 280 KB, do not set the first budget at 100 KB unless you have a funded performance project. Set it at 350 KB, then lower it after cleanup. Progress beats fantasy. The goal is to create a ratchet effect where performance gets better over time and cannot quietly slide backward.

Create separate budgets for page types

One number rarely works across a real site. A long educational article should not have the same image budget as a visual portfolio page. A checkout flow may need more application JavaScript than a static blog post. A local landing page with a map has different constraints than a glossary definition.

Create template budgets instead. A blog post might allow very little JavaScript, a small CSS footprint, one or two font files, and tightly compressed images. A product page might allow more image weight but stricter interaction rules. A homepage might get a modest animation allowance, but only if the LCP image and main heading remain fast. This approach is more realistic and harder for teams to dismiss.

Watch third party scripts like a separate category

Third party scripts deserve their own budget because they are easy to add and hard to control. Analytics, heatmaps, chat tools, A/B testing platforms, ad pixels, review widgets, consent banners, and embedded forms can all add network requests, main thread work, layout shifts, and privacy prompts.

List every third party on your key templates. Record what it does, who owns it, where it loads, whether it is needed before interaction, and whether it appears on every page. Then set a limit for third party transfer size and request count. More importantly, require an owner for each script. If nobody owns a tag, it is probably safer to remove it than to let it tax every visitor forever.

Make images part of the budget

Images are often the easiest performance budget win because the fix is concrete. Set limits for above the fold image bytes, hero image dimensions, format, compression, and lazy loading behavior. The LCP image should be discoverable early, sized correctly, and served in a modern format such as WebP or AVIF when appropriate.

Do not let content editors upload a 4000 pixel stock photo and rely on the browser to shrink it visually. Build image rules into the CMS or deployment pipeline. Require width and height attributes, responsive sizes, reasonable quality settings, and lazy loading for below the fold media. If an image does not help the page's purpose, it should not consume the performance budget.

Automate checks where they fit

Manual audits are useful, but budgets work best when they run automatically. Add Lighthouse CI, WebPageTest scripts, bundle analysis, or framework specific build checks to your workflow. At minimum, track JavaScript bundle size, CSS size, route level assets, and Lighthouse performance changes for important templates.

Automation should inform decisions, not create blind bureaucracy. A small budget failure on a low traffic page may be acceptable if the feature is valuable. A large regression on a high traffic landing page should stop the release or trigger a rollback. The rule should be simple: if a change makes important pages meaningfully slower, the team needs to know before users do.

Assign ownership before problems appear

Performance budgets fail when everyone agrees speed matters but nobody owns the tradeoffs. Decide who approves new scripts, who reviews image heavy campaigns, who watches Core Web Vitals, and who can make the call when a release breaks the budget. This is as much process as technology.

Marketing should know the cost of a new tag. Design should know the cost of another custom font or autoplay video. Engineering should know which templates have no room for extra client side work. Leadership should know that speed is a product quality metric, not a nice technical bonus.

Review the budget monthly

A performance budget is not finished after the spreadsheet is created. Review it every month or after major releases. Look for pages that are trending worse, scripts that were added temporarily and never removed, images that grew after a campaign, or templates where Core Web Vitals are slipping.

Keep a short changelog of performance decisions. If the team accepts a heavier feature, write down why and when it should be revisited. If a cleanup project reduces JavaScript by 30 percent, record the win. This makes performance feel like an ongoing business habit rather than a mysterious technical complaint.

The practical next step

Choose five important URLs and measure LCP, INP, CLS, TTFB, JavaScript transfer size, CSS transfer size, image weight above the fold, font files, and third party requests. Set first pass budgets for each template based on that data. Then add one automated check that catches the easiest regression, such as bundle size or Lighthouse changes on key pages.

A good performance budget does not make a website fast by itself. It keeps the team honest. It turns speed from a one time cleanup into a standard every new page, feature, and campaign has to respect. That is how you protect Core Web Vitals after launch, not just during the week someone is watching Lighthouse.

Ready to audit your site?

Run a free SEO scan and get actionable recommendations in seconds.

Start Free Scan →