fastmon Docs
Web Vitals

Experience Score

One 0–10 number from the Web Vitals and the first-party error rate, with a letter grade.

The Experience Score condenses LCP, INP, CLS, FCP, TTFB, and the first-party error rate into one 0–10 number with a letter grade.

What's a good score?

Scores round to one decimal. Letter grades:

ScoreGrade
≥ 9.5A+
≥ 9.0A
≥ 8.0B
≥ 7.0C
≥ 5.0D
< 5.0F

A score of 10 means every metric was at or below its "good" threshold for the bulk of your traffic. A score of 5 means metrics are sitting around the "poor" boundary on average. Below that, several metrics are well into the red.

How the score is computed

Each metric is mapped to a 0–10 sub-score by linear interpolation against its good / poor thresholds:

  • value ≤ good → 10
  • value at poor → 5
  • value at 2 × poor or worse → 0
MetricGoodPoorWeight
LCP≤ 2,500 ms> 4,000 ms25 %
INP≤ 200 ms> 500 ms20 %
CLS≤ 0.1> 0.2515 %
FCP≤ 1,800 ms> 3,000 ms15 %
First-party error rate≤ 1 %> 5 %15 %
TTFB≤ 800 ms> 1,800 ms10 %

The weighted sum of sub-scores is the Experience Score. If a metric is missing for a segment (e.g. INP when no one interacted), its weight is redistributed proportionally across the metrics that do have values.

The cutoffs are the ones GET /metric-thresholds serves. The error rate is the share of pageviews with a JavaScript error from the site's own code. Errors of foreign scripts, failed resource loads, and page load time carry no weight.

Rated metrics

GET /metric-thresholds lists every metric fastmon rates, with good and poor cutoff, unit, and source. The dashboard rates from it and keeps no cutoffs of its own. A value at or below good is good, a value above poor is poor, and a value exactly on the poor cutoff needs improvement.

Beyond the score metrics it rates TBT, DNS lookup, and TCP connect. Page load time, transfer size, error_rate, third_party_error_rate, and the cache, CDN, and origin hit rates show their value without a rating.

When the score is computed

Per page-view, when the page is hidden. That's the same trigger that finalizes the underlying metrics. Aggregate scores you see in the dashboard are averages over your selected time range.

How to see the Experience Score in fastmon

The headline number lives on the Performance dashboard. Below it you'll see the breakdown (which sub-score is dragging the total down) and a trend chart over the selected window.

Useful slices:

  • By URL: group by URL. Find which pages dominate the average.
  • By release: compare_to with a release, see Compare releases.
  • By country / device: group by country or device_type. Regional or device-class regressions are usually invisible in the global score.

How to improve a low score

The composite is only as healthy as its weakest part:

  1. Open the breakdown and identify the worst sub-score.
  2. Read the linked metric page (LCP, INP, CLS, FCP, TTFB) and apply the highest-leverage fix listed there.
  3. Recheck after a release with compare_to.

Don't try to optimize everything at once. The improvements often trade against each other: fixing LCP by adding more JavaScript can regress INP, and reserving space for ads to fix CLS can push LCP later.

Common surprises

  • The score can drop without any single metric crossing a threshold. A small regression in two metrics can move the composite by half a point while each metric still says "Good."
  • A single deploy can create a permanent score gap. Once a regression ships, every subsequent page-view contributes the worse number to the average. Catching it on the day of the deploy matters.
  • Pages with low interaction count have inflated scores. If visitors never interact, INP is excluded; the score then rests on the other five metrics.
  • Internal vs external traffic skews the composite. Office traffic on warm caches and fast laptops scores great; real visitors on mobile in a tunnel score worse. Filter internal traffic out at the source to keep the number honest; see Filter internal traffic.

What's next

On this page