---
updatedAt: 2025-11-13T03:49:38.000Z
agentTools:
  projectIndex: https://support.speedcurve.com/llms.txt
---

# Performance budgets

How to create and edit performance budgets for your RUM and Synthetic metrics

## Why use performance budgets?

[Performance budgets](https://www.speedcurve.com/web-performance-guide/complete-guide-performance-budgets/) are essential for monitoring web performance. They help you stay on top of your RUM and Synthetic metrics by alerting you when a metric exceeds or recovers from a defined threshold.

## Why alerts matter?

SpeedCurve [alerts](https://support.speedcurve.com/docs/alerts) you when performance budgets are crossed—either above or below the threshold. Alerts are sent via email or webhook (e.g., Slack). This dual-directional alert system notifies you when a performance issue occurs and also helps you confirm when fixes resolve performance issues.

To reduce noise, SpeedCurve only alerts you when the status of a budget changes (e.g., from under to over budget). Repeated overages do not trigger repeated alerts.

## Creating a performance budget

To create a budget:

* Go to the **Budgets** section in SpeedCurve.
* Click **Add Budget**.
* Complete the **Budget Settings** form.

<Image align="center" border={false} src="https://files.readme.io/7326c96c3f3c865677970f9ed72d60d668a99a46d6248f784de9d7317ce975ff-Screenshot_2025-05-28_at_11.52.20_AM.png" />

Each budget consists of the following components, that you define in the **Budget Settings** form:

### 1. Metric

Choose a metric to monitor (including Custom Metrics). Also select the corresponding statistic (e.g., average, p75).

### 2. Filters

Apply filters to focus the budget on a specific:

* Site
* Page Label
* Region
* Browser

Use the **Each** option to apply the budget across all supported values within a filter without needing to create multiple budgets.

### 3. Threshold type and value

Choose one:

* **Absolute threshold**: A fixed value (e.g., Largest Contentful Paint < 2.5s)
* **Rate of change threshold**: A relative change compared to previous values

As you set your threshold for your performance budget you'll notice the **Preview** above the **Budget settings** form updating. Use this preview as a visual guide to tune your performance budget.

**Absolute threshold preview:** A red line appears in the preview chart.

<Image align="center" border={false} src="https://files.readme.io/d3d3dd28b5ef9f367dfe5e5b023cc52f63222cc4d6749bdd038f55a2f4c5a0cc-Screenshot_2025-05-28_at_11.54.13_AM.png" />

**Rate of change threshold preview:** Red and green zones indicate acceptable/unacceptable changes.

<Image align="center" border={false} src="https://files.readme.io/53bb6ef570029a1176c9b92393b5da835cf44bcc4a2a7f10ddaea16460d1063c-Screenshot_2025-05-28_at_12.03.56_PM.png" />

(See How thresholds work below.)

### 4. Alert settings

Enable alerts and configure how often they trigger. You can delay alerts until a threshold is crossed multiple times, helping to reduce false alarms.

### 5. Name and description

Optional, but recommended for clarity—especially in team settings.

Click **SAVE** when done.

## How thresholds work

### Absolute thresholds

A metric is:

* **Over** budget if it exceeds the threshold.
* **Under** budget if it's equal to or below the threshold.

Visualized as a red line in the chart:

<Image align="center" border={false} src="https://files.readme.io/847d4aa4b64444376b41040b5d2512068cbbb526c72a524e206c5fcfef736834-Screenshot_2025-05-28_at_12.14.58_PM.png" />

### Rate of change (relative) thresholds

A metric crosses:

* **Over** budget when it increases beyond the acceptable percentage.
* **Under** when it improves beyond the acceptable range.
* No Crossing when it is within the acceptable rate of change.

Red = negative change.\
Green = positive change.

For example, in the chart below the rate of change threshold is threshold is **50%**. The most recent value on the chart was 33kb and a **36%** change from the previous value. This means the most recent value is within the 50% rate of change threshold. So it is not considered **over** or **under** budget. We call this budget status **no crossing**. But if we look at the value on the 12th of May it was 100kb and a **185%** change from the previous value. You can see the metric line has run into the red zone. We call this budget status **over**, because it's above (or over) our acceptable rate of change of **50%**.

<Image align="center" border={false} src="https://files.readme.io/3876ea633c82ae9383a6d7a45e59b043532a05ee3ad03543a7738627d198ebb1-Screenshot_2025-05-28_at_1.20.54_PM.png" />

### Larger evaluation durations

The alert evaluation duration is how many tests (Synthetic) or hours (RUM) must consecutively cross the threshold before triggering an alert. This is adjusted using the **Alert after** input within **Budget settings** form.

Example:

* Threshold: 20%
* Alert after: 3\
  An alert is sent only if all 3 latest values exceed the 20% change from the previous 3 values.

<Image align="center" border={false} src="https://files.readme.io/4ed03d2d2d217c987438331a9476a3576b7aa5853866aa35832e7660f9e21f95-relative-budget-alert-bucket-size.png" />

## Default Performance Budgets

SpeedCurve provides default budgets when you sign up (follow the links to learn why we think they're good metrics to consider):

| Metric                         | Metric Type | Threshold Type | Threshold Value |
| ------------------------------ | ----------- | :------------- | --------------- |
| Backend (TTFB)                 | Synthetic   | Absolute       | 1s              |
| Backend (TTFB)                 | Synthetic   | Rate of Change | 20%             |
| Start Render                   | Synthetic   | Absolute       | 2s              |
| Start Render                   | Synthetic   | Rate of Change | 20%             |
| Largest Contentful Paint (LCP) | Synthetic   | Absolute       | 2.5s            |
| Largest Contentful Paint (LCP) | Synthetic   | Rate of Change | 20%             |
| Cumulative Layout Shift (CLS)  | Synthetic   | Absolute       | 0.1             |
| Cumulative Layout Shift (CLS)  | Synthetic   | Rate of Change | 20%             |
| JS Total Blocking Time (TBT)   | Synthetic   | Absolute       | 200ms           |
| JS Total Blocking Time (TBT)   | Synthetic   | Rate of Change | 20%             |

Use these as starting points and customize them based on your site needs. See our full [guide to performance budgets](https://www.speedcurve.com/web-performance-guide/complete-guide-performance-budgets/) for recommendations.

## Configuring alerts

[Budget alerts](https://support.speedcurve.com/docs/alerts) are sent to the email addresses and webhooks that are configured in your settings.

You can define [budget alert](https://support.speedcurve.com/docs/alerts) recipients in two places:

### 1. Account settings

Go to the **Alerts** section of your account to manage team-wide email and webhook recipients.

<Image align="center" border={false} width="1358px" src="https://files.readme.io/d5b5efa-Screen_Shot_2023-08-09_at_11.42.09_AM.png" />

### 2. Budget settings

Within each budget, define:

* **Team alert preferences** (default)
* Or, **Custom emails/webhooks** for that budget

<Image align="center" border={false} src="https://files.readme.io/5ae057427e8c75e4054e59733c81299b87e4fdfb521c8679099cf0a815ba5ce6-Screenshot_2025-05-28_at_1.41.30_PM.png" />

### Webhooks

* [Send to Slack](https://support.speedcurve.com/docs/alerts#slack)
* [Send to Microsoft Teams](https://support.speedcurve.com/docs/alerts#microsoft-teams)
* [Other webhook setups](https://support.speedcurve.com/docs/alerts#webhooks)

## Tuning budgets to reduce alert noise

If your metrics frequently fluctuate around the threshold, you may get too many alerts. Adjust the Alert After setting to only trigger alerts after sustained threshold crossings.

Example:

* Set “Alert After” to **3 hours** for RUM
* Now alerts only trigger if the threshold is crossed for 3 consecutive hours

<Image align="center" border={false} src="https://files.readme.io/9d558d2dbbbecf7137ec717e1f2f8cd2c394f6246c2d42dca6d5fa8e78150814-Screenshot_2025-05-28_at_1.51.11_PM.png" />

This helps prevent over-alerting while ensuring significant regressions are still caught.

<Image align="center" border={false} src="https://files.readme.io/ed66b0e6b7212c13f597fd0aa30bc1d13573fc1614a527e00e05c3b3d6d93095-Screenshot_2025-05-28_at_1.55.59_PM.jpg" />

<br />

### Case study: [See how Zillow uses SpeedCurve to create and enforce performance budgets](https://www.zillow.com/engineering/bigger-faster-more-engaging-budget/)