> ## Documentation Index
> Fetch the complete documentation index at: https://help.trfyx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How fast pages load for real visitors

> Turn on web vitals in Performance settings, then read LCP, INP, CLS, FCP and TTFB, the experience score, and breakdowns by page and device.

The **Performance** tab shows how fast pages load and respond for real visitors. It uses Core Web Vitals from the visitor's browser, not a lab test. This page matches what you see at **Performance** in the sidebar (Traffic), including the Web vitals settings behind the gear.

![Trfyx Performance metrics: Core Web Vitals tracking, experience score rating, and per-page breakdowns](https://mintcdn.com/trfyx/ON_ToGBXGcHrAkrG/images/performance-marketing.png?fit=max\&auto=format\&n=ON_ToGBXGcHrAkrG\&q=85\&s=1986f2c07ff08dde25c13f72cb50ec2b)

## Turn measurement on

Nothing is collected until you enable it. The tracker already on your site does the rest. You do not add another snippet.

**1. Open Performance**

In the dashboard sidebar, under Traffic, click **Performance**.

**2. Turn on web vitals**

If the page says web vitals are not turned on, click **Turn on web vitals**. Or open the gear, titled **Web vitals**, and switch on **Measure web vitals**. That adds one small request per page load.

**3. Wait for real visits**

Visitors' browsers start measuring within a few minutes. The experience score stays on **Collecting data** until the selected range has **50 or more** measured loads and all five metrics have a value.

You need permission to configure the site to change the toggle. The date range, granularity, and filters in the header work the same way as on other reports.

> [!NOTE]
>
> Skip measurement on one page by adding `data-disable-web-vitals="true"` to the tracking script on that page. Pages without `fetch` or `PerformanceObserver` are skipped automatically.

## How a load is measured

After web vitals are on, the existing tracker asks `/api/vitals/{websiteId}/config`. If `enabled` is true, it loads `/vitals.js` from the same host as `script.js` (your [managed proxy](https://help.trfyx.com/managed-proxy.md) hostname if that is Active).

The collector records five numbers only. It never sends page content.

| When | What happens |
| - | - |
| A visitor loads a page | The script prepares LCP, INP, CLS, FCP, and TTFB |
| The tab is hidden or the page unloads | One beacon is sent to `/api/vitals/{websiteId}` |
| The visitor clicks around a single-page app | That load is not measured again |
| There was no interaction | INP can be empty. The other metrics can still store |

Bots are ignored. [Exclusions](https://help.trfyx.com/exclusions.md) are ignored. The Trfyx dashboard itself is never measured. The beacon attaches to the same visit as the pageview. If that pageview is still in flight, the collector retries once.

Readings older than **400 days** are dropped.

## The five metrics

The top band shows the five timings at the percentile you pick (default **p75**, which is how Core Web Vitals are judged). Click a metric to drive the chart and the table's share and change columns.

| Shown as | Full name | Role | Good | Poor |
| - | - | - | - | - |
| LCP | Largest Contentful Paint | Core Web Vital. When the largest thing in view appears. | 2.5s or faster | slower than 4s |
| INP | Interaction to Next Paint | Core Web Vital. Time from a click, tap, or key to the next paint. | 200ms or faster | slower than 500ms |
| CLS | Cumulative Layout Shift | Core Web Vital. How much visible content jumps while loading. | 0.1 or less | more than 0.25 |
| FCP | First Contentful Paint | Supporting. When the first content appears. | 1.8s or faster | slower than 3s |
| TTFB | Time to First Byte | Supporting. Time until the first byte of the response. | 800ms or faster | slower than 1.8s |

Each cell is rated **Good**, **Needs improvement**, or **Poor** with those limits. A circle, square, or triangle sits next to the words so the rating still reads without colour. The line under the value is the share of loads that were good. **Loads measured** is how many beacons landed in the range, and what share of pageviews that is.

## Experience score

The card under the band folds the five **p75** timings into one number from 0 to 100.

* **90 or more**: Great experience
* **50 to 89**: Needs improvement
* **Below 50**: Poor experience

Weights: LCP 30%, INP 30%, FCP 15%, CLS 15%, TTFB 10%. A metric at its Good limit scores 90. At its Poor limit it scores 50. A value of 0 scores 100. Twice the Poor limit scores 0.

Until there are 50 measured loads in the range, or any metric is still empty, the ring shows a dash and the title stays **Collecting data**.

Try the same math the dashboard uses:

Same weights and cut-offs as the Performance tab. Move a slider to see the score change.

The experience score is a weighted mix of the five p75 values: LCP 0.3, INP 0.3, FCP 0.15, CLS 0.15, TTFB 0.1. Each metric scores 100 at 0, 90 at the Good limit, 50 at the Poor limit, and 0 at twice the Poor limit, in straight lines between those points. The card is hidden until 50 loads and every metric has a p75.

## Chart and comparison

**Compare** is **Previous period** or **No comparison**. Previous period uses the matching range before the one in the header. Timing deltas treat up as worse (red). Loads treat up as better (green). A change under 0.05% is hidden.

The percentile tabs (**p50**, **p75**, **p90**, **p99**) change the band, the table, and the map. The chart can plot any mix of those four. p50, p75, and p90 start on. Dashed lines mark Good and Poor for the selected metric. A time bucket with no loads is a gap, not a zero.

## Breakdowns

The table under the chart has tabs: **Pages**, **Countries**, **Regions**, **Map**, **Devices**, **Browsers**, **Operating systems**.

* Each row shows all five metrics at the selected percentile, how many loads were good for the selected metric (the tick on the bar is 75%), optional change versus the previous period, and load count.
* Click a row name to filter the whole Performance view. Click again to remove the filter. A page filter applies to the measured path. Other filters apply to the visit.
* On Pages, the external-link icon opens `https://{your-domain}{path}`.
* The icons at the end of a row open **Sessions** or **Replay** with the same filter and date range.
* The table paginates 10 rows at a time. Sort by a metric or by loads.

**Map** colours countries by the selected metric and percentile: green good, amber needs improvement, red poor. Click a country to filter by it.

## If the page is empty

| You see | What to check |
| - | - |
| Web vitals aren’t turned on | Use **Turn on web vitals** or the gear toggle |
| Collecting data | Wait for 50 measured loads in this range, with all five metrics present |
| No performance data | Widen the date range or remove a filter. Confirm the tracker is on the pages you care about |
| Script still not measuring | Confirm the snippet is installed. Tracking is off on localhost unless the script has `data-allow-localhost="true"`. A Content Security Policy must allow `/vitals.js` and `/api/vitals/` on the script's host |

## Next steps

* [Install tracking](https://help.trfyx.com/install-tracking.md) if the main script is not on the site yet.
* [Managed proxy](https://help.trfyx.com/managed-proxy.md) if you serve the script from your own subdomain. Vitals follow that host.
* [Exclusions](https://help.trfyx.com/exclusions.md) if your own visits should not be measured.
* [Session replay](https://help.trfyx.com/session-replay.md) to watch a slow page.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.