---
title: web_performance
description: >-
  Reference for the ShopifyQL `web_performance` table. Every metric and
  dimension, paired with worked example queries.
api_version: 2026-07
source_url:
  html: >-
    https://shopify.dev/docs/api/shopifyql/latest/schemas/sessions_and_behavior/web_performance
  md: >-
    https://shopify.dev/docs/api/shopifyql/latest/schemas/sessions_and_behavior/web_performance.md
api_name: shopifyql
---

# web\_​performance

The `web_performance` [schema](https://shopify.dev/docs/api/shopifyql/latest/schemas) captures online store page-load and Core Web Vitals reporting. It supports performance views by page, storefront, device, browser, and the page elements associated with measured web-vital events.

### Use cases

* **Page loads**: Group [`page_loads`](#webperformancemetric-propertydetail-pageloads) by [`page_type`](#webperformancedimension-propertydetail-pagetype), [`page_path`](#webperformancedimension-propertydetail-pagepath), or [`device_type`](#webperformancedimension-propertydetail-devicetype) to see where load volume concentrates.
* **Visual stability**: Compare [`cls_good_view_count`](#webperformancemetric-propertydetail-clsgoodviewcount), [`cls_okay_view_count`](#webperformancemetric-propertydetail-clsokayviewcount), and [`cls_poor_view_count`](#webperformancemetric-propertydetail-clspoorviewcount) to split views by layout-shift band.
* **LCP percentiles**: Show LCP percentile metrics such as [`lcp_p50_ms`](#webperformancemetric-propertydetail-lcpp50ms) by [`browser_family`](#webperformancedimension-propertydetail-browserfamily) or [`storefront_id`](#webperformancedimension-propertydetail-storefrontid) to see how load speed varies across browsers and storefronts.
* **Web-vital targets**: Use target fields like [`largest_contentful_paint_target`](#webperformancedimension-propertydetail-largestcontentfulpainttarget) and [`cumulative_layout_shift_target`](#webperformancedimension-propertydetail-cumulativelayoutshifttarget) to identify which page elements are associated with measured web-vital events.

Examples

### Examples

* ####

  ##### Description

  Track daily \`lcp\_p75\_ms\` over the last 30 days against the prior 30. This example pairs \[\`PERCENT\_CHANGE\`]\(/docs/api/shopifyql/latest/syntax/with#percent-change-columns) with \[\`COMPARE TO previous\_period\`]\(/docs/api/shopifyql/latest/syntax/compare-to) to measure each day against the same day 30 days earlier.

  ##### ShopifyQL

  ```shopifyql
  FROM web_performance
    SHOW lcp_p75_ms, lcp_distribution
    TIMESERIES day WITH TOTALS, PERCENT_CHANGE
    SINCE startOfDay(-30d) UNTIL endOfDay(-1d)
    COMPARE TO previous_period
    ORDER BY day ASC
  VISUALIZE lcp_p75_ms TYPE line
  ```

* ####

  ##### Description

  Show the 25 pages with the slowest \`lcp\_p75\_ms\` this quarter, with load counts. This example uses \[\`HAVING\`]\(/docs/api/shopifyql/latest/syntax/having) \`page\_loads > 10\` to filter out rarely-visited pages.

  ##### ShopifyQL

  ```shopifyql
  FROM web_performance
    SHOW page_loads, lcp_p75_ms, lcp_poor_view_count
    GROUP BY page_type, page_path
    HAVING page_loads > 10
    DURING this_quarter
    ORDER BY lcp_p75_ms DESC
    LIMIT 25
  VISUALIZE lcp_p75_ms TYPE horizontal_bar
  ```

* ####

  ##### Description

  Track daily view counts rated good, okay, and poor on layout shift over the last 30 days. This example uses \[\`SINCE startOfDay(-30d) UNTIL endOfDay(-1d)\`]\(/docs/api/shopifyql/latest/syntax/since-until-during) to bound the range to the last 30 full days.

  ##### ShopifyQL

  ```shopifyql
  FROM web_performance
    SHOW cls_good_view_count, cls_okay_view_count, cls_poor_view_count
    TIMESERIES day WITH TOTALS
    SINCE startOfDay(-30d) UNTIL endOfDay(-1d)
    ORDER BY day ASC
  VISUALIZE cls_poor_view_count TYPE bar
  ```

* ####

  ##### Description

  Rank \`page\_loads\` by \`device\_type\` last month. This example uses \[\`GROUP BY\`]\(/docs/api/shopifyql/latest/syntax/group-by) \`device\_type\` to split page loads across device types.

  ##### ShopifyQL

  ```shopifyql
  FROM web_performance
    SHOW page_loads
    GROUP BY device_type WITH TOTALS
    DURING last_month
    ORDER BY page_loads DESC
    LIMIT 10
  VISUALIZE page_loads TYPE horizontal_bar
  ```

***

## Metrics

Counts and calculations that let you track key business indicators. Metrics show up as the columns when queried.

Metrics you can use when querying `FROM web_performance`.

* **cls\_​distribution**

  **ARRAY\<INTEGER>**

  A breakdown of page loads by Cumulative Layout Shift, which measures how much content moves unexpectedly while the page loads. The values show measured loads, then good (0.1 or lower), needs improvement (above 0.1 through 0.25), and poor (above 0.25). Use [`cls_distribution`](#webperformancemetric-propertydetail-clsdistribution) to see how layout stability is spread across visits.

* **cls\_​good\_​view\_​count**

  **INTEGER**

  The number of page load events with a good Cumulative Layout Shift score. Good CLS means the score is 0.1 or lower. Use [`cls_good_view_count`](#webperformancemetric-propertydetail-clsgoodviewcount) to track stable page loads over time or by [`page_type`](#webperformancedimension-propertydetail-pagetype).

* **cls\_​okay\_​view\_​count**

  **INTEGER**

  The number of page load events with a Cumulative Layout Shift score that needs improvement. This covers CLS scores above 0.1 through 0.25. Use [`cls_okay_view_count`](#webperformancemetric-propertydetail-clsokayviewcount) to find pages where layout stability may need attention.

* **cls\_​poor\_​view\_​count**

  **INTEGER**

  The number of page load events with a poor Cumulative Layout Shift score. Poor CLS means the score is above 0.25. Use [`cls_poor_view_count`](#webperformancemetric-propertydetail-clspoorviewcount) to spot pages with noticeable unexpected movement.

* **fcp\_​distribution**

  **ARRAY\<INTEGER>**

  A breakdown of page loads by First Contentful Paint, which measures how quickly the first visible content appears. The values show measured loads, then good (1.8 seconds or faster), needs improvement (above 1.8 through 3 seconds), and poor (slower than 3 seconds). Use [`fcp_distribution`](#webperformancemetric-propertydetail-fcpdistribution) to see how early loading speed is spread across visits.

* **fcp\_​good\_​view\_​count**

  **INTEGER**

  The number of page load events with a good First Contentful Paint score. Good FCP means the first content appeared in 1.8 seconds or less. Use [`fcp_good_view_count`](#webperformancemetric-propertydetail-fcpgoodviewcount) to track fast initial loading over time or by [`page_type`](#webperformancedimension-propertydetail-pagetype).

* **fcp\_​okay\_​view\_​count**

  **INTEGER**

  The number of page load events with a First Contentful Paint score that needs improvement. This covers first content appearing after 1.8 seconds through 3 seconds. Use [`fcp_okay_view_count`](#webperformancemetric-propertydetail-fcpokayviewcount) to find pages where initial loading could be faster.

* **fcp\_​p50\_​ms**

  **MILLISECOND\_DURATION**

  The median First Contentful Paint time, in milliseconds. Half of measured page loads had first content appear at or below this value. Use [`fcp_p50_ms`](#webperformancemetric-propertydetail-fcpp50ms) to track typical initial loading speed.

* **fcp\_​p75\_​ms**

  **MILLISECOND\_DURATION**

  The 75th percentile First Contentful Paint time, in milliseconds. Most measured page loads had first content appear at or below this value. Use [`fcp_p75_ms`](#webperformancemetric-propertydetail-fcpp75ms) to monitor the loading experience for a broad share of visitors.

* **fcp\_​p90\_​ms**

  **MILLISECOND\_DURATION**

  The 90th percentile First Contentful Paint time, in milliseconds. This shows the initial loading time that 90% of measured page loads met or beat. Use [`fcp_p90_ms`](#webperformancemetric-propertydetail-fcpp90ms) to watch slower loading experiences.

* **fcp\_​p99\_​ms**

  **MILLISECOND\_DURATION**

  The 99th percentile First Contentful Paint time, in milliseconds. This shows the initial loading time that nearly all measured page loads met or beat. Use [`fcp_p99_ms`](#webperformancemetric-propertydetail-fcpp99ms) to investigate the slowest experiences.

* **fcp\_​poor\_​view\_​count**

  **INTEGER**

  The number of page load events in which the first visible content appeared after more than 1.8 seconds.

* **inp\_​distribution**

  **ARRAY\<FLOAT>**

  A breakdown of page loads by Interaction to Next Paint, which measures how quickly a page responds after visitor interactions. The values show measured loads, then good (200 milliseconds or faster), needs improvement (above 200 through 500 milliseconds), and poor (slower than 500 milliseconds). Use [`inp_distribution`](#webperformancemetric-propertydetail-inpdistribution) to see how responsiveness is spread across visits.

* **inp\_​good\_​view\_​count**

  **INTEGER**

  The number of page load events with a good Interaction to Next Paint score. Good INP means the page responded in 200 milliseconds or less. Use [`inp_good_view_count`](#webperformancemetric-propertydetail-inpgoodviewcount) to track responsive experiences over time or by [`page_type`](#webperformancedimension-propertydetail-pagetype).

* **inp\_​okay\_​view\_​count**

  **INTEGER**

  The number of page load events with an Interaction to Next Paint score that needs improvement. This covers response times above 200 through 500 milliseconds. Use [`inp_okay_view_count`](#webperformancemetric-propertydetail-inpokayviewcount) to find pages where interactions may feel delayed.

* **inp\_​p50\_​ms**

  **MILLISECOND\_DURATION**

  The median Interaction to Next Paint time, in milliseconds. Half of measured page loads responded to interactions at or below this value. Use [`inp_p50_ms`](#webperformancemetric-propertydetail-inpp50ms) to track typical page responsiveness.

* **inp\_​p75\_​ms**

  **MILLISECOND\_DURATION**

  The 75th percentile Interaction to Next Paint time, in milliseconds. Most measured page loads responded to interactions at or below this value. Use [`inp_p75_ms`](#webperformancemetric-propertydetail-inpp75ms) to monitor responsiveness for a broad share of visitors.

* **inp\_​p90\_​ms**

  **MILLISECOND\_DURATION**

  The 90th percentile Interaction to Next Paint time, in milliseconds. This shows the response time that 90% of measured page loads met or beat. Use [`inp_p90_ms`](#webperformancemetric-propertydetail-inpp90ms) to watch slower interaction experiences.

* **inp\_​p99\_​ms**

  **MILLISECOND\_DURATION**

  The 99th percentile Interaction to Next Paint time, in milliseconds. This shows the response time that nearly all measured page loads met or beat. Use [`inp_p99_ms`](#webperformancemetric-propertydetail-inpp99ms) to investigate the slowest interaction experiences.

* **inp\_​poor\_​view\_​count**

  **INTEGER**

  The number of page load events with a poor Interaction to Next Paint score. Poor INP means the page responded after more than 500 milliseconds. Use [`inp_poor_view_count`](#webperformancemetric-propertydetail-inppoorviewcount) to spot pages where interactions may feel slow.

* **lcp\_​distribution**

  **ARRAY\<INTEGER>**

  A breakdown of page loads by Largest Contentful Paint, which measures how quickly the largest visible content appears. The values show measured loads, then good (2.5 seconds or faster), needs improvement (above 2.5 through 4 seconds), and poor (slower than 4 seconds). Use [`lcp_distribution`](#webperformancemetric-propertydetail-lcpdistribution) to see how main content loading speed is spread across visits.

* **lcp\_​good\_​view\_​count**

  **INTEGER**

  The number of page load events with a good Largest Contentful Paint score. Good LCP means the largest visible content appeared in 2.5 seconds or less. Use [`lcp_good_view_count`](#webperformancemetric-propertydetail-lcpgoodviewcount) to track fast main content loading over time or by [`page_type`](#webperformancedimension-propertydetail-pagetype).

* **lcp\_​okay\_​view\_​count**

  **INTEGER**

  The number of page load events with a Largest Contentful Paint score that needs improvement. This covers the largest visible content appearing after 2.5 seconds through 4 seconds. Use [`lcp_okay_view_count`](#webperformancemetric-propertydetail-lcpokayviewcount) to find pages where main content could load faster.

* **lcp\_​p50\_​ms**

  **MILLISECOND\_DURATION**

  The median Largest Contentful Paint time, in milliseconds. Half of measured page loads had the largest visible content appear at or below this value. Use [`lcp_p50_ms`](#webperformancemetric-propertydetail-lcpp50ms) to track typical main content loading speed.

* **lcp\_​p75\_​ms**

  **MILLISECOND\_DURATION**

  The 75th percentile Largest Contentful Paint time, in milliseconds. Most measured page loads had the largest visible content appear at or below this value. Use [`lcp_p75_ms`](#webperformancemetric-propertydetail-lcpp75ms) to monitor main content loading for a broad share of visitors.

* **lcp\_​p90\_​ms**

  **MILLISECOND\_DURATION**

  The 90th percentile Largest Contentful Paint time, in milliseconds. This shows the main content loading time that 90% of measured page loads met or beat. Use [`lcp_p90_ms`](#webperformancemetric-propertydetail-lcpp90ms) to watch slower loading experiences.

* **lcp\_​p99\_​ms**

  **MILLISECOND\_DURATION**

  The 99th percentile Largest Contentful Paint time, in milliseconds. This shows the main content loading time that nearly all measured page loads met or beat. Use [`lcp_p99_ms`](#webperformancemetric-propertydetail-lcpp99ms) to investigate the slowest loading experiences.

* **lcp\_​poor\_​view\_​count**

  **INTEGER**

  The number of page load events with a poor Largest Contentful Paint score. Poor LCP means the largest visible content appeared after more than 4 seconds. Use [`lcp_poor_view_count`](#webperformancemetric-propertydetail-lcppoorviewcount) to spot pages with slow main content loading.

* **p50\_​cls**

  **UNITLESS\_SCALAR**

  The median Cumulative Layout Shift score, which measures unexpected movement while the page loads. Half of measured page loads had a CLS score at or below this value. Use [`p50_cls`](#webperformancemetric-propertydetail-p50cls) to track typical layout stability.

* **p75\_​cls**

  **UNITLESS\_SCALAR**

  The 75th percentile Cumulative Layout Shift score, which measures unexpected movement while the page loads. Most measured page loads had a CLS score at or below this value. Use [`p75_cls`](#webperformancemetric-propertydetail-p75cls) to monitor layout stability for a broad share of visitors.

* **p90\_​cls**

  **UNITLESS\_SCALAR**

  The 90th percentile Cumulative Layout Shift score, which measures unexpected movement while the page loads. This shows the CLS score that 90% of measured page loads met or beat. Use [`p90_cls`](#webperformancemetric-propertydetail-p90cls) to watch less stable page experiences.

* **p99\_​cls**

  **UNITLESS\_SCALAR**

  The 99th percentile Cumulative Layout Shift score, which measures unexpected movement while the page loads. This shows the CLS score that nearly all measured page loads met or beat. Use [`p99_cls`](#webperformancemetric-propertydetail-p99cls) to investigate the least stable experiences.

* **page\_​loads**

  **INTEGER**

  Total number of page load events

* **percent\_​of\_​page\_​loads**

  **PERCENT**

  The share of page load events represented by each row in your query results, shown as a percentage. Use [`percent_of_page_loads`](#webperformancemetric-propertydetail-percentofpageloads) with groupings like [`page_type`](#webperformancedimension-propertydetail-pagetype), [`page_path`](#webperformancedimension-propertydetail-pagepath), or [`device_type`](#webperformancedimension-propertydetail-devicetype) to see how page loads are split.

* **ttfb\_​distribution**

  **ARRAY\<INTEGER>**

  A breakdown of page loads by Time to First Byte, which measures how quickly the server starts responding. The values show measured loads, then good (800 milliseconds or faster), needs improvement (above 800 through 1,800 milliseconds), and poor (slower than 1,800 milliseconds). Use [`ttfb_distribution`](#webperformancemetric-propertydetail-ttfbdistribution) to see how server response time is spread across visits.

* **ttfb\_​good\_​view\_​count**

  **INTEGER**

  The number of page load events with a good Time to First Byte score. Good TTFB means the server started responding in 800 milliseconds or less. Use [`ttfb_good_view_count`](#webperformancemetric-propertydetail-ttfbgoodviewcount) to track fast server responses over time or by [`page_type`](#webperformancedimension-propertydetail-pagetype).

* **ttfb\_​okay\_​view\_​count**

  **INTEGER**

  The number of page load events with a Time to First Byte score that needs improvement. This covers server response times above 800 through 1,800 milliseconds. Use [`ttfb_okay_view_count`](#webperformancemetric-propertydetail-ttfbokayviewcount) to find pages where server response time may need attention.

* **ttfb\_​p50\_​ms**

  **MILLISECOND\_DURATION**

  The median Time to First Byte, in milliseconds. Half of measured page loads had the server start responding at or below this value. Use [`ttfb_p50_ms`](#webperformancemetric-propertydetail-ttfbp50ms) to track typical server response time.

* **ttfb\_​p75\_​ms**

  **MILLISECOND\_DURATION**

  The 75th percentile Time to First Byte, in milliseconds. Most measured page loads had the server start responding at or below this value. Use [`ttfb_p75_ms`](#webperformancemetric-propertydetail-ttfbp75ms) to monitor server response time for a broad share of visitors.

* **ttfb\_​p90\_​ms**

  **MILLISECOND\_DURATION**

  The 90th percentile Time to First Byte, in milliseconds. This shows the server response time that 90% of measured page loads met or beat. Use [`ttfb_p90_ms`](#webperformancemetric-propertydetail-ttfbp90ms) to watch slower server responses.

* **ttfb\_​p99\_​ms**

  **MILLISECOND\_DURATION**

  The 99th percentile Time to First Byte, in milliseconds. This shows the server response time that nearly all measured page loads met or beat. Use [`ttfb_p99_ms`](#webperformancemetric-propertydetail-ttfbp99ms) to investigate the slowest server responses.

* **ttfb\_​poor\_​view\_​count**

  **INTEGER**

  The number of page load events with a poor Time to First Byte score. Poor TTFB means the server started responding after more than 1,800 milliseconds. Use [`ttfb_poor_view_count`](#webperformancemetric-propertydetail-ttfbpoorviewcount) to spot pages with slow server response times.

### ARRAY

A list of values. The element type appears inside angle brackets, such as ARRAY\<STRING>.

```ts
```

### INTEGER

A whole number without decimal places, used for counts, quantities, and other discrete numeric values.

```ts
```

### MILLISECOND\_DURATION

A duration measured in milliseconds.

```ts
```

### FLOAT

A floating-point number used for measurements, rates, and other continuous numeric values.

```ts
```

### UNITLESS\_SCALAR

A numeric scalar value without a unit.

```ts
```

### PERCENT

A percentage value represented as a decimal, where 0.25 represents 25%.

```ts
```

***

## Dimensions

Attributes of your data that let you look more granularly at aspects of the data. Group and filter by dimensions to shape the rows your query returns.

Dimensions you can use when querying `FROM web_performance`.

* **browser\_​family**

  **STRING**

  Type of web browser used for the session

* **cumulative\_​layout\_​shift\_​target**

  **STRING**

  Asset for which cumulative layout shift is measured

* **day**

  **DAY\_TIMESTAMP**

  Day (timestamp) the data was recorded

* **day\_​of\_​week**

  **DAY\_OF\_WEEK**

  The day of week a page load happened, with values Monday through Sunday.

* **device\_​type**

  **STRING**

  Values are Mobile and Desktop.

* **hour**

  **HOUR\_TIMESTAMP**

  Hour (timestamp) the data was recorded

* **hour\_​of\_​day**

  **HOUR\_OF\_DAY**

  The hour of day a page load happened, with values 0 through 23.

* **interaction\_​to\_​next\_​paint\_​target**

  **STRING**

  Asset for which interaction to next paint is measured

* **largest\_​contentful\_​paint\_​target**

  **STRING**

  Asset for which largest contentful paint is measured

* **micro\_​session\_​id**

  **IDENTITY**

  Shopify identifier for the online store session

* **minute**

  **MINUTE\_TIMESTAMP**

  Minute (timestamp) the data was recorded

* **month**

  **MONTH\_TIMESTAMP**

  Month (timestamp) the data was recorded

* **month\_​of\_​year**

  **MONTH\_OF\_YEAR**

  The month of year a page load happened, with values 1 through 12.

* **page\_​path**

  **STRING**

  Values are URL paths that begin with `/`, without the domain.

* **page\_​type**

  **STRING**

  The kind of online store page that loaded. Values are page categories such as Product, Collection, Cart, and Search. You can group or filter by [`page_type`](#webperformancedimension-propertydetail-pagetype) to compare performance across parts of your store.

* **quarter**

  **QUARTER\_TIMESTAMP**

  Quarter (timestamp) the data was recorded

* **second**

  **SECOND\_TIMESTAMP**

  Second (timestamp) the data was recorded

* **shop\_​id**

  **IDENTITY**

  The unique Shopify identifier for your store. Use [`shop_id`](#webperformancedimension-propertydetail-shopid) with [`shop_name`](#webperformancedimension-propertydetail-shopname) to show readable store labels.

* **storefront\_​id**

  **IDENTITY**

  The identifier for the storefront that served the page load. The regular online store uses the value online\_store. You can filter by [`storefront_id`](#webperformancedimension-propertydetail-storefrontid) to focus on a specific Hydrogen storefront or online store traffic.

* **week**

  **WEEK\_TIMESTAMP**

  Week (timestamp) the data was recorded

* **week\_​of\_​year**

  **WEEK\_OF\_YEAR**

  The week of year a page load happened, with values 1 through 53.

* **year**

  **YEAR\_TIMESTAMP**

  Year (timestamp) the data was recorded

* **shop\_​name**

  **STRING**

  Name of your store

### STRING

A sequence of characters representing text data.

```ts
```

### DAY\_TIMESTAMP

A date value truncated to day precision.

```ts
```

### DAY\_OF\_WEEK

A day within a week, used for weekday-based grouping and filtering.

```ts
```

### HOUR\_TIMESTAMP

A timestamp truncated to hour precision.

```ts
```

### HOUR\_OF\_DAY

An hour within a day, typically represented as an integer from 0 to 23.

```ts
```

### IDENTITY

A unique identifier for a Shopify resource such as a customer, product, or order.

```ts
```

### MINUTE\_TIMESTAMP

A timestamp truncated to minute precision.

```ts
```

### MONTH\_TIMESTAMP

A date value representing the start of a month.

```ts
```

### MONTH\_OF\_YEAR

A month number within a year.

```ts
```

### QUARTER\_TIMESTAMP

A date value representing the start of a fiscal quarter.

```ts
```

### SECOND\_TIMESTAMP

A timestamp truncated to second precision.

```ts
```

### WEEK\_TIMESTAMP

A date value representing the start of a week.

```ts
```

### WEEK\_OF\_YEAR

A week number within a year.

```ts
```

### YEAR\_TIMESTAMP

A date value representing the start of a year.

```ts
```

***

## Related schemas

* [`sessions`](https://shopify.dev/docs/api/shopifyql/latest/schemas/sessions_and_behavior/sessions): Session-level behavior to pair performance with shopper engagement.
* [`searches`](https://shopify.dev/docs/api/shopifyql/latest/schemas/sessions_and_behavior/searches): Search activity for shopper intent alongside page performance.
* [`sales`](https://shopify.dev/docs/api/shopifyql/latest/schemas/sales_revenue/sales): Revenue data to tie performance regressions back to sales impact.

***
