Sign inConnect your agent
infochanged

Cloudflare Web Analytics - Web Analytics improves soft navigation measurement for Single Page Applications (SPAs)

Announced
Effective
Tags
Cloudflare-Web-Analytics
Severity
info, set by reef/rss-rule-v1
Source
https://developers.cloudflare.com/changelog/post/2026-08-21-improved-soft-navigation-measurement-for-single-page-applications/

<p>Cloudflare Web Analytics (Real User Monitoring) is rolling out accuracy improvements to client-side soft navigations. <strong>Update: this update is complete as of 2026-09-04.</strong></p> <p><strong>This change may alter the volume of reported pageviews and visits in the dashboard and GraphQL API. The reported Largest Contentful Paint (LCP) metric may also fluctuate.</strong> The extent of these variances depend on your front-end architecture and visitor traffic patterns.</p> <p>Single Page Applications (SPAs)—such as websites built with React, Angular, Vue, or Svelte—predominantly use soft navigations. Soft navigations avoid fully unloading the current page and rendering the next one from scratch as visitors navigate.</p> <p>Any client-side navigation counts as a soft navigation, including navigations intercepted by <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API" target="_blank" rel="noopener">the Navigation API<span class="external-link"> ↗︎</span></a> or triggered by <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API" target="_blank" rel="noopener">the History API<span class="external-link"> ↗︎</span></a>. This means a non-SPA website can have soft navigation activity if its implementation uses these APIs.</p> <p>The main improvement comes from <a href="https://developer.chrome.com/docs/web-platform/soft-navigations" target="_blank" rel="noopener">Google Chrome's new Soft Navigation API<span class="external-link"> ↗︎</span></a>. It natively measures <a href="https://developers.cloudflare.com/web-analytics/data-metrics/core-web-vitals/#core-web-vitals-metrics">Largest Contentful Paint (LCP)</a> on soft navigations, removing a blind spot in perceived loading speed across pageviews.</p> <p>We've extended our <code>navigationType</code> values to segment these different types of navigations:</p> <div class="table-scroll" tabindex="0" role="region" aria-label="Table"><table> <thead> <tr> <th><code>navigationType</code></th> <th>New?</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td><code>navigate</code></td> <td>❌</td> <td>Hard navigations that traditional websites (or "Multi Page Applications") perform when clicking links or submitting forms</td> </tr> <tr> <td><code>soft-navigation</code></td> <td>✅</td> <td>Where <a href="https://developer.chrome.com/docs/web-platform/soft-navigations" target="_blank" rel="noopener">the new Soft Navigation API<span class="external-link"> ↗︎</span></a> is available and a visitor makes a client-side navigation, we record these events</td> </tr> <tr> <td><code>routing-apis</code></td> <td>✅</td> <td>Where the native Soft Navigation API is unavailable (e.g. Safari, Firefox, older Chromium-based browsers), we fallback to measuring soft navigations using <a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_API" target="_blank" rel="noopener">the Navigation API<span class="external-link"> ↗︎</span></a> or <a href="https://developer.mozilla.org/en-US/docs/Web/API/History_API" target="_blank" rel="noopener">History API<span class="external-link"> ↗︎</span></a>. We cannot collect LCP for these, but the other Core Web Vitals are present.</td> </tr> </tbody> </table></div> <p>Prior to this change, we only used History API and all navigations were bucketed into <code>navigate</code>.</p> <p>For more information, refer to the <a href="https://developers.cloudflare.com/web-analytics/data-metrics/dimensions/#navigation-types">Navigation Types</a> and <a href="https://developers.cloudflare.com/web-analytics/get-started/web-analytics-spa/">Web Analytics SPA</a> documentation pages.</p>

The text above is the source's. reef added the severity, the dates it could read from the text, and the endpoints and scopes named in code.