# Page views explore

The Page views explore has one row for every page view on your sites and apps.
Each row carries the page and its page type, the visit it belongs to and how that visit arrived, where the visitor was, the device they used, how far they scrolled and how fast the page loaded.

It is the most detailed explore, and the base of several others.
Clicks, Swipes, Friction, Checkout, Data layer events and Items share its dimensions, so you can slice their rows the same way.

## Good to know

- Bot traffic, and page views from visitors who did not consent, are left out.
- A visitor is a device.
  **Unique visitors** counts device cookies, which Safari clears after 7 days without a visit, so it reads high on Safari.
- **Sessions** are visits: a visit ends after 30 idle minutes and is shared across tabs.
- Campaign fields come in two kinds.
  **Campaign source** and its siblings are read from the page view's own URL, while **Session campaign source** and **Channel** carry how the visit arrived onto every page view in it, so group by those to see where visits came from.
- **Event time** is the time to chart by.
  **Ingest time**, when Kontala received the event, is the one to filter on when a query reads too much data.
- Data layer events are counted in their own explore, [Data layer events](/docs/analytics/data-layer-events).

<!-- GENERATED: everything below is written by scripts/explore-reference.mjs from autocapture 69662e2. Edit the explanation above it, and rerun the script to refresh this part. -->

## Used on dashboards

Charts on these [dashboards](/docs/analytics/dashboards) are built on the Page views explore:

- **Overview**
- **Engagement: Do they stick?**: Engagement and Pages
- **Product and app usage**: Usage, Friction and Speed

## Dimensions

The Page views explore has 113 dimensions.

### Time

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Event time | Timestamp | When the event happened, by the visitor's device, kept between 30 days before and 24 hours after Kontala received it. The default time axis. Time intervals: Raw, Hour, Day, Week, Month, Quarter, Year, Hour of day (number), Day of the week (index), Day of the week (name). |
| Ingest time | Timestamp | When Kontala received the event. A filter on it narrows how much data a query reads. Time intervals: Raw, Day, Week, Month. |
::

### The visitor

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Visitor type | String | Whether this device had been seen before today. Bounded by the 400 days Kontala keeps and by the device cookie's life, so it reads a visitor Safari has forgotten as new. |
| Days since first visit | Number | Whole days between this device's first page view and this one: 0 on the day it first came. Group it into bins to compare visitors by tenure. Bounded by the 400 days Kontala keeps and by the device cookie's life, which Safari cuts to 7 days, so long tenures read short. |
| Is entrance | Boolean | True on the first page view of a visit: the page the visit started on. |
::

### The visit

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Entrance page | String | The path this visit began on, on every page view of the visit: the page people entered on. Not the Landing page type, which says what kind of page a page is. |
| Entrance hostname | String | The hostname this visit began on, for a property that spans more than one website. |
| Page number in session | Number | Where this page view sits in its visit: 1 for the entrance, 2 for the page after it, and so on across every tab of the visit. |
| Time on page (s) | Number | Seconds from this page view to the visit's next one, in whichever tab. Empty on the visit's last page, whose time nothing measures. |
| Is exit | Boolean | True on the last page view of a visit: the page the visit ended on. |
| Session page views | Number | How many page views this visit had, on every one of its rows: group by it to split visits by depth, never sum it, since each visit repeats it once per page view. |
| Single-page session | Boolean | Whether this visit had exactly one page view: what Bounces and Bounce rate count. |
| Session number | Number | Which visit of this device this is: 1 for its first, 2 for its second, and so on. Bounded by the 400 days Kontala keeps and by the device cookie's life, which Safari cuts to 7 days, so a returning Safari visitor starts again from 1. |
::

### Scroll depth

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Scroll depth (%) | Number | How far down the page the visitor got: the deepest point seen, as a percentage of the page's height, 100 at the bottom. On a click, a swipe or a pushed event, that of the page view it happened in, over the whole view rather than at that moment. Empty where the property does not capture scroll, or the view ended before its first reading. |
| Scroll depth band | String | Scroll depth in five bands: 0-24%, 25-49%, 50-74%, 75-89% and 90-100%, the last meaning the visitor reached the end of the page, or all of it but the footer. Empty where Scroll depth is. |
::

### Page speed

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| LCP (ms) | Number | Largest Contentful Paint: how long the page took to show its largest text or image, in milliseconds. The document's first view's, and a route's only where Chrome reports soft navigations. Empty where the property does not capture friction or nothing was measured. |
| LCP rating | String | Largest Contentful Paint rated as web.dev rates it: Good at 2.5 seconds or less, Poor over 4 seconds, Needs improvement between. |
| INP (ms) | Number | Interaction to Next Paint: how long the page took to answer the visitor's slowest clicks, taps and key presses, in milliseconds, as web-vitals measures it. Empty for a view nobody interacted with, and in browsers that cannot measure it. |
| INP rating | String | Interaction to Next Paint rated as web.dev rates it: Good at 200 milliseconds or less, Poor over 500, Needs improvement between. |
| CLS | Number | Cumulative Layout Shift: how much the page's content moved under the visitor without being asked to, a score from 0. Chromium browsers alone measure it. |
| CLS rating | String | Cumulative Layout Shift rated as web.dev rates it: Good at 0.1 or less, Poor over 0.25, Needs improvement between. |
| FCP (ms) | Number | First Contentful Paint: how long the page took to show anything at all, in milliseconds. |
| FCP rating | String | First Contentful Paint rated as web.dev rates it: Good at 1.8 seconds or less, Poor over 3 seconds, Needs improvement between. |
| TTFB (ms) | Number | Time to First Byte: how long the server took to start answering the page's request, in milliseconds. A document load's alone. |
| TTFB rating | String | Time to First Byte rated as web.dev rates it: Good at 800 milliseconds or less, Poor over 1.8 seconds, Needs improvement between. |
| Speed rating | String | The worst of the view's LCP, INP and CLS ratings, of those it measured: Good only where each is good, as the Core Web Vitals pass a page. |
| Load or route | String | Page load for a document's first view, whose LCP, FCP and TTFB are measured; Route change for a single-page app's later view, which measures INP and CLS, and LCP only where Chrome reports soft navigations. |
| LCP element | String | The element the page's Largest Contentful Paint was, such as img#hero or h1: what to make faster first. |
| INP element | String | The element of the interaction the INP was: what was slowest to answer. |
::

### Friction

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Friction measured | Boolean | Whether the view was measured for speed and friction: its property captures friction and the visitor consented. Every friction and speed rate is over measured views. |
| Quick back | Boolean | Whether the visitor went back to the page before within 10 seconds of this page view: by a page view, a return from the back/forward cache, or the browser's back button. A page view only. |
::

### Page

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Path | String | Decoded and redacted. High-signal segments are replaced with :redacted, so the segment count survives and paths still group. |
| Section | String | The path's first segment, such as /blog or /products; / for the home page. |
| Subsection | String | The path's first two segments, such as /blog/2026. Empty for a path with fewer than two. |
| Page title | String | The page's title. On a back or forward navigation the tag waits for the title before capturing, so this is the page arrived at, not the previous one. Empty on a Shopify store's checkout and thank-you pages, which Kontala's Shopify pixel reports without a title: Page type names them. |
| Hostname | String | The host the page was served from. One visitor can move between subdomains, so use Site, not Hostname, to tell your properties apart. |
| Site domain | String | The registrable domain of Hostname, so www. and shop. of one site group together. A host with no public suffix, such as localhost or an IP address, reads as itself, and so does an app's, its bundle id or package name. |
| Query string | String | Allowlisted parameters only. |
| Navigation type | String | load \| pushstate \| replacestate \| popstate \| hashchange. 'load' is a real document load; the rest are client-side route changes. An app's screen reads in the same words, its launch as load and a push, a tab or a link as pushstate, and as resume when a visit starts on the screen on show. Empty on a Shopify store's checkout and thank-you pages, which Kontala's Shopify pixel reports, not the tag. |
| From URL | String | The previous page in this document, as its scheme, host and path only: the query string and fragment are dropped, and the path is redacted as Path is. Empty on the first page view of a visit, which has no previous page. |
| Referrer host | String | The host of the page that linked here, such as news.google.co.uk. Referring domain groups such hosts into one source. |
| Referring domain | String | The registrable domain (eTLD+1) of the referrer, so www.google.co.uk and news.google.co.uk are one source and m., l. and lm.facebook.com are one source. Null where there is no public suffix to find, which is how localhost and a bare IP read - Referrer host still carries those. |
::

### Attribution

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Campaign source | String | utm_source from this page view's own URL, verbatim and case-sensitive: Google and google are two values, because that is what the links carry. Null on every page after the landing one - use Session campaign source to attribute a whole visit. |
| Campaign medium | String | utm_medium from this page view's own URL. Drives Channel, below. |
| Campaign | String | utm_campaign from this page view's own URL. Session campaign groups a visit by the campaign that started it. |
| Campaign term | String | The paid keyword, where the network writes one. Usually null. |
| Campaign content | String | The creative or placement variant, where the link carries one. |
| Click ID source | String | Which click identifier the URL carried: gclid, gbraid and wbraid are Google Ads, dclid is Display & Video 360 or Campaign Manager 360, msclkid is Microsoft Advertising, oppref is OpenAI's, on ChatGPT's ads, and the rest name their ad network, except two that are not on ads alone. srsltid is Merchant Center's, on free product listings and, since August 2024, on organic results, and fbclid is Meta's, on links followed out of Facebook, Instagram and Messenger, organic posts included. So Null is the normal state, and a value does not by itself make a visit paid: Channel says whether it was. A URL carrying two reads its last, because a network adds its id when the link is clicked, so an id before it came with the link. A click id exists only on a row written AFTER the collector started keeping that parameter, unlike the campaign dimensions above. |
| Has click ID | Boolean | Whether the URL carried a click identifier. That is not the same as a paid click, because srsltid and fbclid are on unpaid links too: Channel says whether a visit was paid. Splits into two bars and never a third unknown one, the way Signed in does. |
::

### Attribution carried across the visit

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Session campaign source | String | The campaign source that started this visit, carried onto every page view in it. This is the dimension to group by for acquisition; Campaign source answers the narrower question of which page view physically carried the parameter. |
| Session campaign medium | String | The campaign medium that started this visit, carried onto every page view in it. |
| Session campaign | String | The campaign that started this visit, carried onto every page view in it. |
| Session click ID source | String | The click identifier the URL that started this visit carried, carried onto every page view in it. Click ID source says which ad network each one is. |
| Session referring domain | String | The registrable domain that started this visit. Null for a visit that began without a referrer, which is what Direct means. |
| Session referrer host | String | The host of the page that started this visit, subdomain and all, where Session referring domain is its registrable domain. Null for a visit that began without a referrer. |
| Session campaign term | String | The paid keyword of the campaign that started this visit, where the network writes one. |
| Session campaign content | String | The creative or placement variant of the campaign that started this visit. |
| Channel | String | How this visit arrived, from its first page view: the click id, the campaign medium and the referrer, in that order of trust. Every page view of a visit reads the same channel. Organic Search is a link from the host a search engine serves its results on, such as www.google.co.uk, so a link from Gmail, Google's sign-in or Google's other products reads as any other site's does. A click id says which network, not that the visit was paid: Meta adds fbclid to organic posts and shares as well as ads, so a Meta ad reads Paid Social only when its link carries a paid utm_medium such as cpc or paid_social, and Google's srsltid, on free product listings and organic results, reads Organic Search. Other Campaign is a tagged visit no other rule places, display ads' dclid included. AI Assistants is a visit an AI assistant sent: a link from ChatGPT, Perplexity, Gemini, Copilot, Claude, DeepSeek or Grok, known by its referrer or by ChatGPT's own utm_source=chatgpt.com, its shopping cards included, or any link tagged utm_medium=ai-assistant. An ad shown in an assistant stays paid, a ChatGPT ad by the oppref OpenAI appends to it, which reads Paid Search, and a link an assistant's app opens with no referrer and no tag reads Direct. Direct means no referrer at all, which covers an app and an https-to-http hop rather than only a typed URL. Internal is a visit that began from a page on this same site. Empty for a visit with no page view. |
::

### First touch

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| First-touch channel | String | The channel of this device's first visit, read as Channel reads a visit: how the visitor first arrived, whichever visit this is. Empty for a device with no page view. |
| First-touch source | String | The campaign source of this device's first visit. |
| First-touch medium | String | The campaign medium of this device's first visit. |
| First-touch campaign | String | The campaign of this device's first visit. |
| First-touch referring domain | String | The registrable domain that sent this device's first visit. Null for a first visit without a referrer. |
::

### Event

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Event name | String | What the row is: page_view, click, swipe or data_layer_event. A Shopify store's checkout and thank-you pages are page views and its checkout steps clicks, as the collector stores what Kontala's Shopify pixel reports; Event type says what each was sent as. |
| Event type | String | The type the event was sent as. On a row of a Shopify checkout, what Kontala's Shopify pixel sent it as: checkout-started, checkout-step or purchase. |
::

### Geo

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Country | String | The visitor's country as a two-letter code, such as GB, from their IP address. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Country name | String | The country's name in English, as the Unicode CLDR gives it, read from Country's code; a code CLDR does not name reads as itself. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Continent | String | One of seven continents, read from Country by the UN's regions: North America includes Central America and the Caribbean. Russia is Europe; Turkey, Cyprus, Georgia, Armenia and Azerbaijan are Asia, as the UN files them. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Region | String | The visitor's region, such as a state or county, from their IP address. IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| City | String | IP Geolocation by DB-IP (https://db-ip.com/), CC-BY 4.0. A dashboard showing this must display that attribution. |
| Geo source | String | edge \| mmdb. Provenance of the COUNTRY only; the city is always the local database. |
::

### Network

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| ISP | String | Group on this, never asn_org: one carrier holds dozens of ASNs under varying spellings. |
| ASN | Number | Origin AS. Join on this; group on ISP. Null when unresolved - AS0 is reserved, so any value here is real. |
| Datacenter traffic | Boolean | Whether the visitor's IP address belongs to a data centre. This traffic is kept on purpose. False means a residential address; empty means it could not be checked. |
| Cellular | Boolean | Whether the visitor was on a mobile network. True is reliable; false means not recognised as mobile, not a fixed-line connection. |
::

### Browser environment

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Language | String | The browser's language as it reports it, such as en-GB. Language code and Language name group its variants. |
| Language code | String | The language alone, such as en for en-GB, en-US and en-GB-oxendict alike. Empty where the browser reports no language code. |
| Language name | String | The language's name in English, as the Unicode CLDR gives it, read from Language code: English for en-GB, en-US and en alike, Chinese for zh-Hans-CN. A code CLDR does not name reads as itself; empty where the browser reports no language code. |
| Device class | String | Bucketed from window width, not from the User-Agent. A narrow desktop window reads as mobile, which is the honest answer for a layout question; Device type answers the hardware one. |
| Screen resolution | String | The screen's width x height in CSS pixels, such as 1920x1080. The whole screen, however large the browser window on it. |
| Viewport size | String | The browser window's inner width x height in CSS pixels when the page was viewed: what the page actually had to lay itself out in. |
| Timezone offset (min) | Number | The device's offset from UTC in minutes, with the sign inverted, as browsers report it: UTC+02:00 is -120. It is an offset, not a named time zone. |
::

### The visitor's own clock

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| UTC offset | String | The visitor's UTC offset when the page was viewed, such as UTC+02:00 or UTC-05:00. UTC+00:00 also covers a page that sent no offset. |
| Local hour of day | Number | The hour on the visitor's own clock, 0 to 23, whatever timezone they were in: when people browse. Event time's hour is the same moment in UTC. |
| Local day of week | String | The weekday on the visitor's own clock, such as Monday. Sort by Local day of week number to put the days in order. |
| Local day of week number | Number | The weekday on the visitor's own clock as a number, 1 for Monday to 7 for Sunday, for putting days in order. |
::

### Browser, operating system and device

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Browser | String | The browser, from the User-Agent header. A browser built on Chromium that does not name itself there, such as Brave, Arc or a desktop app, reads as Chrome. A page opened inside an app reads as the app where it names itself, such as Instagram or the Google app, and as In-app browser where it does not. An app's own screens, from Kontala's SDK, read as App. |
| Browser version | String | The browser and its major version, such as Chrome 131 or Safari 18. Empty for an in-app browser, whose numbers are the app's rather than the browser's, for an app's own screens, whose version is App version's, for DuckDuckGo, whose User-Agent carries no version of its own, and for Other. |
| Operating system | String | The operating system, from the User-Agent header; iOS includes iPadOS. There is no version beside it, because browsers freeze theirs: Windows 11 reports Windows 10 and every Mac reports macOS 10.15. An iPad asking for desktop sites, as Safari on iPad does by default, reads as macOS, and many Android tablets read as Linux the same way. |
| Device type | String | Desktop, mobile, tablet or smart tv, from the User-Agent header, and unknown where it names no platform: the hardware, where Device class is the layout the window's width gives. A tablet asking for desktop sites, as Safari on iPad does by default, reads as desktop. |
| User agent | String | The User-Agent header verbatim, which Browser, Operating system and Device type are read from. One value per browser build, so it is for looking into what they read as Other rather than for charting. |
::

### An app

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Platform | String | Web, iOS, Android or App web view: whether the row came from a website, through Kontala's tag or the Events API, from an app on Kontala's SDK, or from a page of a website an app showed in a WebView it attached to Kontala, whose rows are the app's visitor and visit. iOS includes iPadOS. |
| Shown in app | String | The app whose WebView showed the page, by its id as the app's own rows name it, such as com.example.shop, for a page an app attached to Kontala. Empty for a page in a browser, and on an app's own rows. |
| App version | String | The app's version, such as 3.2.0, as the store shows it. Empty on the web. |
| App build | String | The app's build number, which tells two builds of one version apart. Empty on the web. |
| OS version | String | An app's operating system and its version, such as iOS 18.1 or Android 14, as the device reports it. Empty on the web, whose browsers freeze the version they write. |
| Device model | String | The device an app runs on, by its machine identifier, such as iPhone16,1 or Pixel 8. Empty on the web. |
| SDK version | String | What sent an Events API row and its version: Kontala's SDK, kontala-flutter 0.2.0, or a backend's own library. Empty on the tag's rows, whose version is Tag version's. |
::

### Data source and quality

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Tenant | String | Your organisation, read from the key the event was sent with. |
| Site | String | The property the event was sent to, read from the key it was sent with. |
| Allowed origin | Boolean | Whether the page's origin is one its property allows. False marks a development server, a staging copy or another site carrying the snippet, so filter on true for real traffic. A property that lists no allowed origins allows every one. |
| Origin | String | The origin the browser said the request came from, such as https://www.example.com or http://localhost:5173: which site, development server included, sent the row. null on a row of Kontala's Shopify pixel, whose sandboxed frame has no origin: Allowed origin reads its page's instead. |
| Tag | String | What sent the row: page-tracker, the tag, on the site's own pages; shopify-custom-pixel, Kontala's Shopify pixel, on a Shopify store's checkout and thank-you pages; or events-api, the Events API, from an app on Kontala's SDK or a site's own backend, which SDK version names. |
| Tag version | String | A literal compiled into the bundle, so a stale cached tag misreports itself - which is itself worth being able to see. |
| Collector version | String | The version of Kontala's collector that received the event. |
| Delivery mode | String | envelope \| bare for the tag, api for the Events API. MUST be filtered on in any seq-gap query, or bare and api rows, with null seq, collapse into one bogus group. |
::

### Signed-in user

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Signed in | Boolean | Whether this page view carried a signed-in user's id. False on a public page is normal, not a tracking failure. Organisation is checked on its own, so it can still be set when Signed in is false. |
| Organisation | String | Application organisation id. The account-level rollup key: the primary B2B question is which ORGANISATIONS adopt a feature, not which people. Null before sign-in. |
| Company domain | String | The company a signed-in user's id names when the id is an email address: the registrable domain after its @, so acme.co.uk for jane@eng.acme.co.uk. Empty for an id that is no address and for a mailbox anyone can open, such as gmail.com, from Kontala's list of free providers; a provider not on it reads as a company, and so does a mistyped domain, since a login names what was typed. |
| Global Privacy Control | Boolean | Sec-GPC. Legally binding under CCPA and several state laws. |
| Scrubbed parameters | Number | How many query parameters were removed from the URL, without storing what they were. Not comparable across 22 September 2026: a dozen ad-network click identifiers stopped being removed that day, so the count steps down without any change in traffic. |
::

### Page type

::field-table
| Dimension | Type | Description |
| --- | --- | --- |
| Page type | String | What kind of page the view was: the type the site declared, or Kontala's Shopify pixel for a store's checkout and order confirmation, else what Shopify says a storefront page is (its own page type, or on a store its product, collection and search URLs), else the first of the page type rules confirmed in Kontala to match, else the answer of the page type model where the property lets it answer. Unclassified when none says. |
| Page type source | String | Where Page type came from: Declared by the site, by Kontala's Shopify pixel or by Shopify, the kind of rule that matched - Data layer, Platform, URL, Structured data or Page markers - or Model. None when nothing did. |
::

## Metrics

The Page views explore has 64 metrics.

### Main metrics

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| Page views | Count | Page views. Bot traffic and page views without consent are already left out, and data layer events are counted in their own explore. |
| Unique visitors | Count distinct | Distinct device cookies. Systematically optimistic on Safari, where ITP clamps script-written cookies to 7 days and a returning visitor churns weekly. |
| Sessions | Count distinct | Distinct visits. A visit ends after 30 idle minutes and is shared across tabs, so this is not a count of page loads. |
| Document loads | Count distinct | One per document instance, so unlike sessions this does separate two tabs. |
| Entrances | Count | Visits that began on the page in question: its page views that were the first of their visit. |
| Entrance rate | Ratio (%) | The share of page views that began a visit. Grouped by Path, how often a page is where people arrive rather than somewhere they go. |
| Bounces | Count | Visits with a single page view. Grouped by a page, the visits that entered there and saw nothing else. |
| Bounce rate | Ratio (%) | The share of visits with a single page view. Grouped or filtered by a page, the share of the visits that entered on it. |
| Exits | Count | Visits that ended on the page in question: its page views that were the last of their visit. |
| Exit rate | Ratio (%) | The share of a page's views that were the last of their visit. |
| Avg. session duration (s) | Average | Seconds from a visit's first page view to its last, averaged over visits; a one-page visit counts as 0. Grouped or filtered by a page, the visits that entered on it. |
| Avg. time on page (s) | Average | Seconds from a page view to its visit's next one, averaged over the page views that had a next one: a visit's last page is left out, since nothing measures it. |
| Avg. scroll depth (%) | Average | How far down their pages visitors got, averaged over the page views that measured it: 100 would be every visitor reaching the bottom. A page view with no reading - scroll capture off, or a view that ended before its first - is left out rather than counted as 0. |
| Page views with a scroll depth | Count | Page views that measured how far down their visitor got: what the scroll reach counts are out of. None where the property does not capture scroll. |
| Reached 25% | Count | Page views whose visitor saw at least the first quarter of the page, the first screen included. |
| Reached 50% | Count | Page views whose visitor saw at least half the page. |
| Reached 75% | Count | Page views whose visitor saw at least three quarters of the page. |
| Reached the end | Count | Page views whose visitor saw 90% of the page or more: the end, or all of it but the footer, the depth GA4 counts as reaching the end. |
| Read to the end | Ratio (%) | The share of page views that measured a scroll depth whose visitor reached 90% of the page or more. Empty where the property does not capture scroll. |
::

### Page speed

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| LCP, 75th percentile (s) | 75th percentile | Largest Contentful Paint at the 75th percentile, in seconds: three in four measured page views showed their largest text or image at least this fast. Good at 2.5 or less, Poor over 4. |
| INP, 75th percentile (ms) | 75th percentile | Interaction to Next Paint at the 75th percentile, in milliseconds, over the page views that had an interaction. Good at 200 or less, Poor over 500. |
| CLS, 75th percentile | 75th percentile | Cumulative Layout Shift at the 75th percentile, over the page views a Chromium browser measured. Good at 0.1 or less, Poor over 0.25. |
| FCP, 75th percentile (s) | 75th percentile | First Contentful Paint at the 75th percentile, in seconds. Good at 1.8 or less, Poor over 3. |
| TTFB, 75th percentile (s) | 75th percentile | Time to First Byte at the 75th percentile, in seconds, over document loads. Good at 0.8 or less, Poor over 1.8. |
| Page views with an LCP | Count | Page views that measured their Largest Contentful Paint. |
| Page views with an INP | Count | Page views that measured their Interaction to Next Paint: those with an interaction, in a browser that can. |
| Page views with a CLS | Count | Page views that measured their Cumulative Layout Shift, which Chromium browsers alone do. |
| Page views with a TTFB | Count | Page views that measured their Time to First Byte: document loads. |
| Page views with a speed | Count | Page views that measured at least one of LCP, INP and CLS. |
| Page views rated good | Count | Page views whose LCP, INP and CLS, of those they measured, were each good. |
| Good page views | Ratio (%) | The share of page views that measured a speed whose LCP, INP and CLS were each good, of those they measured: the Core Web Vitals' pass rate. |
| LCP: Good | Ratio (%) | The share of page views that measured their LCP whose LCP was good. |
| LCP: Needs improvement | Ratio (%) | The share of page views that measured their LCP whose LCP needed improvement. |
| LCP: Poor | Ratio (%) | The share of page views that measured their LCP whose LCP was poor. |
| INP: Good | Ratio (%) | The share of page views that measured their INP whose INP was good. |
| INP: Needs improvement | Ratio (%) | The share of page views that measured their INP whose INP needed improvement. |
| INP: Poor | Ratio (%) | The share of page views that measured their INP whose INP was poor. |
| CLS: Good | Ratio (%) | The share of page views that measured their CLS whose CLS was good. |
| CLS: Needs improvement | Ratio (%) | The share of page views that measured their CLS whose CLS needed improvement. |
| CLS: Poor | Ratio (%) | The share of page views that measured their CLS whose CLS was poor. |
::

### Friction

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| Page views measured | Count | Page views the friction plugin measured: on a property that captures friction, with the visitor's consent. |
| Page views measured | Ratio (%) | The share of page views measured for speed and friction: how much of the traffic the speed and friction figures speak for. |
| Page views with a JavaScript error | Count | Measured page views during which the page threw an uncaught error or left a promise's rejection unhandled. |
| Page views with an error | Ratio (%) | The share of measured page views with a JavaScript error. |
| Page views with a rage click | Count | Measured page views in which the visitor clicked three times or more within a second, in one spot. |
| Page views with a rage click | Ratio (%) | The share of measured page views with a rage click. |
| Page views with a dead click | Count | Measured page views in which a click on something that looked clickable got no answer within a second. |
| Page views with a dead click | Ratio (%) | The share of measured page views with a dead click. |
| Quick backs | Count | Measured page views the visitor went back from within 10 seconds. |
| Quick backs | Ratio (%) | The share of measured page views the visitor went back from within 10 seconds: a page that was not what they wanted. |
::

### An app's frames

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| Slow frame rate | Ratio (%) | The share of an app's frames that missed the display's budget, which a visitor sees as jank. Out of the frames of the screens measured; empty on the web. |
| Frozen frame rate | Ratio (%) | The share of an app's frames that took over 700ms, which a visitor sees as the app hanging. Out of the frames of the screens measured; empty on the web. |
::

### Engaged time

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| Avg. engaged time (s) | Average | Seconds a screen was on show while its app was in the foreground, averaged over the screen views that measured it, the last of a visit included. Empty on the web. |
| Distinct pages | Count distinct | How many different pages were viewed, each hostname and path once. |
| New visitors | Count distinct | Devices whose first-ever page view was on the day in question. Over a range of days this and Returning visitors overlap, so they do not sum to Unique visitors. |
| Returning visitors | Count distinct | Devices seen on an earlier day than the one in question. A lower bound: Safari's ITP drops the device cookie after 7 days, and a visitor who loses it returns as new. |
| Signed-in users | Count distinct | Distinct application user ids. Unlike unique_visitors this does NOT churn under Safari's ITP - it comes from the application session, not a cookie - so the two diverge and the gap between them is itself informative. |
| Active organisations | Count distinct | Distinct accounts with at least one page view in range. |
| Pages per session | Ratio | Page views per session. |
| Views per visitor | Ratio | Page views per unique visitor. |
| Sessions per visitor | Ratio | How many visits each device made in range. Understated on Safari, where the device cookie lasts 7 days and one returning visitor counts as several. |
::

### An app's devices

::field-table
| Metric | Calculation | Description |
| --- | --- | --- |
| Phones | Count distinct | Distinct phones an app ran on, by the platform's own id for the device: IDFV on iOS, Android ID on Android. Fewer than Unique visitors where an app was reinstalled, which makes a new visitor on the same phone. Only rows a visitor consented to carry one. |
| Ad tracking allowed | Ratio (%) | The share of an app's visitors whose ad tracking was allowed: authorized in iOS's App Tracking Transparency, or not limited on Android. Out of the visitors whose app said either way. |
| Median clock skew (ms) | Median | The median gap between when Kontala received an event and when the device says it sent it: a data-quality check that device clocks agree with Kontala's closely enough for Event time to be trusted. |
::

## Your own fields

When your organisation maps data layer fields in Data Capture, they appear in the Page views explore too: the standard fields under **Standard fields** and your own under **Data layer**.
Each one can carry the metrics chosen when it was mapped, named after it, such as **Order value (total)**: a total, average, lowest, highest or median for a number, a count of distinct values for text, and a count of true for a true-or-false field.
They are left out of the lists above, because every organisation maps its own.
