SpeedCurve Blog https://www.speedcurve.com/blog/ Speed matters. Get the latest on how the areas of design and performance overlap with a focus on creating great user experiences. NEW! SpeedCurve RUM for your Magento projects https://www.speedcurve.com/blog/real-user-monitoring-magento <p><span class="large-para">Now you can integrate robust real user monitoring into your Magento project in minutes!</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/549/magento-social.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>As a product manager, I have to say there are few things more flattering than having our users build apps that empower other folks to use our product.</p> <p>Hot on the heels of our <a href="https://www.speedcurve.com/blog/speedcurve-rum-shopify/">SpeedCurve RUM for Shopify app</a> is a new open‑source Magento module &ndash; from Jesper Ingels and the awesome team at <a href="https://www.bluebirdday.nl/">Bluebird Day</a> &ndash; that lets you integrate SpeedCurve real user monitoring into your Magento project in minutes &ndash; no coding required!</p> <p>Keep reading to learn the benefits of gathering real user data and how to get started.</p><p>The <a href="https://github.com/bluebirdday/speedcurve-magento">SpeedCurve Magento 2 module</a> is designed for standard Magento 2 front-end themes (Luma-based or custom themes using Layout XML, RequireJS, etc.).</p> <p>With this module, you can:</p> <ul> <li>Enter your SpeedCurve RUM ID (available on your Settings page) and the RUM script loads automatically on your pages</li> <li>Configure all settings via the Magento Admin Panel, including RUM ID, page labels, and cookie consent handling.</li> <li>Manage page labels for product and category pages</li> <li>Insert the RUM script only <em>after</em> the visitor accepts cookies (privacy‑proof!)</li> <li>Immediately start tracking <a href="https://www.speedcurve.com/web-performance-guide/get-started-with-core-web-vitals/">Core Web Vitals</a> and other critical RUM metrics</li> <li>Measure the <a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">impact of page slowdowns on your business</a></li> <li>Fight regressions with <a href="https://www.speedcurve.com/web-performance-guide/complete-guide-performance-budgets/">performance budgets and alerts</a></li> <li>Get <a href="https://support.speedcurve.com/docs/test-details#/">detailed recommendations</a> for fixing performance issues</li> </ul> <p>If you've tried the module, we'd love to hear your thoughts! Send us a note at support@speedcurve.com.</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/549/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Thu, 19 Jun 2025 00:00:00 +1200 How to enable SpeedCurve in your Shopify store https://www.speedcurve.com/blog/how-to-use-speedcurve-in-shopify <p><span class="large-para">SpeedCurve now has a Shopify app to make installing and using SpeedCurve in your Shopify store much easier. With this app, you can quickly set up real user monitoring &ndash; no coding required.</span>&nbsp;</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-how-to-hero.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>Here's how to install the SpeedCurve RUM app in your Shopify store, along with troubleshooting and next steps.</p><p>In ecommerce, speed isn&rsquo;t just nice to have &ndash; it&rsquo;s a competitive advantage. Slow websites lead to frustrated users, lost sales, and damaged brand trust. With the <a href="https://www.speedcurve.com/blog/speedcurve-rum-shopify/">SpeedCurve RUM app for Shopify</a>, you can track metrics like Core Web Vitals, identify performance issues, measure the impact of site speed on conversion rates, and stay ahead of page slowdowns &ndash; no coding required.</p> <h2>How to install and use SpeedCurve RUM</h2> <h3>1. Create your SpeedCurve account</h3> <p>If you don't already have an account, it's easy to <a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=shopify">create a free 30-day trial</a>. (No credit card required!)&nbsp;</p> <h3>2. Install the SpeedCurve RUM Shopify app&nbsp;</h3> <p>If you haven't yet done this, <a href="https://apps.shopify.com/speedcurve">install the SpeedCurve Shopify app</a>.</p> <h3>3. Connect the Shopify app to your SpeedCurve account&nbsp;</h3> <p>First, copy your SpeedCurve RUM ID from your SpeedCurve settings. It will be listed under "RUM", near the bottom of the settings page.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-rum-settings.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>Then open the SpeedCurve app in your Shopify Admin Dashboard. Go to the Settings page and and paste in your RUM ID (step 2 in the image below). Click the 'Save RUM ID' button.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-settings-1.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>4. Enable SpeedCurve in your theme</h3> <p>Shopify app embed blocks are not automatically enabled, so you will have to enable it manually. The easiest way to do this is to click the magic link button from that settings page to open the embed block:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-2-3.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>This will open the theme editor with the embed block selected. The last step is to toggle the embed to true:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-2-4-new.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>Optional automatic page labels</h3> <p>Most stores will want to keep the automatic page labels enabled, which is the default setting. However, if you&rsquo;re an existing customer with page labels already set up or you have more complex page labeling requirements, you can disable this setting under the advanced settings:&nbsp;</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/shopify-2-5.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>If you disable automatic page labels, you will need to set up your own. For the documentation on setting up page labels, see <a href="https://support.speedcurve.com/docs/rum-page-labels">RUM page labels and URL rules</a>.</p> <h2>Troubleshooting</h2> <p>The most common issue is no data being collected. This could be caused by:&nbsp;</p> <ul> <li><strong>Your RUM ID may not be saved correctly in the app.</strong> Make sure you follow step 3 above, ensuring the correct RUM ID is saved. You can confirm this is the case if you are able to open up the browser console on your store and see the message &ldquo;SpeedCurve RUM error 160: Invalid `id` parameter specified in lux.js URL.&rdquo;&nbsp;</li> <li><strong>The app embed block may be disabled.</strong> Follow step 4 above to make sure the app embed block is enabled (toggled to the right).</li> </ul> <p>You can see&nbsp;<a href="https://support.speedcurve.com/docs/rum-missing-data">RUM troubleshooting topics</a>&nbsp;if you have additional issues, or email us for support at support@speedcurve.com.&nbsp;</p> <h2>Next steps</h2> <p>You may want to collect additional custom data that is available from Shopify. For more details, see <a href="https://support.speedcurve.com/docs/capturing-server-timing-headers-from-shopify">Capturing custom data from Shopify</a>.</p> <p>The&nbsp;<a href="https://www.speedcurve.com/web-performance-guide/web-performance-for-retailers/">Web Performance Guide for Retailers</a> is your resource for understanding web performance and how to optimize for increased conversions.</p> <p>Questions or feedback? Don&rsquo;t hesitate to reach out at support@speedcurve.com.</p> <p style="color: #1f1f1f; font-family: Gotham, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;">&nbsp;</p> <p style="color: #1f1f1f; font-family: Gotham, sans-serif; font-size: 16px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; white-space: normal; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;"><em><a style="text-decoration: underline; color: #35a2d3; background: #bfe6ff;" href="https://sia.codes/">Sia Karamalegos</a>&nbsp;is a web performance engineer and consultant, creative technologist, and systems thinker. At Shopify, she enhanced merchant sites and the Shopify platform for Core Web Vitals performance. She is&nbsp;a Google Developer Expert in Web Technologies, as well as a Cloudinary Media Developer Expert.</em></p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/547/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Thu, 12 Jun 2025 00:00:00 +1200 NEW! SpeedCurve RUM for your Shopify store https://www.speedcurve.com/blog/speedcurve-rum-shopify <p><span class="large-para">If you run a Shopify store, you already know how critical it is to provide a seamless shopping experience. That's why I was so excited when the folks at SpeedCurve asked me to draw on my Shopify experience to build their new RUM app for Shopify storefronts. Now I'm here to let you know how it works and why it's an important part of your UX toolset.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/548/shopify-hero.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>In ecommerce, speed isn&rsquo;t just nice to have &ndash; it&rsquo;s a competitive advantage. Slow websites lead to frustrated users, lost sales, and damaged brand trust.</p> <p>With the SpeedCurve RUM app, you can track metrics like Core Web Vitals, identify performance issues, measure the impact of site speed on conversion rates, and stay ahead of page slowdowns &ndash; no coding required.</p><p><a href="https://www.speedcurve.com/blog/how-to-use-speedcurve-in-shopify/"><strong>&gt; How to enable SpeedCurve RUM in your Shopify store</strong></a></p> <h2>Site speed is critical in ecommerce</h2> <p>Before we dig into the new SpeedCurve RUM details, let&rsquo;s cover why front-end web performance is so important for online stores.</p> <h3>Poor performance increases bounce rate</h3> <p>Shoppers are impatient. A delay of just one or two seconds can cause potential customers to abandon your site.</p> <p>In the SpeedCurve correlation chart below, we can see that when websites take longer to start showing content in the browser (AKA Start Render), users are more likely to bounce.&nbsp; Lower bounce rates mean more opportunities to convert.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/548/shopify-1-1.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>For this data set of visits from mobile users, bounce rate is lowest (5%) when render starts within 0.4 seconds. It climbs almost linearly until 2.5 seconds, which has a 38% bounce rate.</em>&nbsp;</p> <h3>Poor performance decreases conversions</h3> <p>Performance improvements directly correlate with sales. For example:&nbsp;</p> <p style="padding-left: 30px;"><em>&ldquo;Carpe improved Largest Contentful Paint by 52% and Cumulative Layout Shift by 41% and saw a 10% increase in traffic, a 5% increase in online store conversion rate, and a 15% increase in revenue.&rdquo; </em></p> <p style="padding-left: 30px;">~ Mateusz Krzeszowiak, Web Performance Technical Architect at Shopify (<a href="https://performance.shopify.com/blogs/blog/how-carpe-achieved-record-breaking-sales-by-focusing-on-performance-optimization">source</a>)</p> <p>Speed isn&rsquo;t just about improving user experience. It&rsquo;s about increasing conversions, and ultimately revenue.&nbsp;<span style="color: #000000;">This SpeedCurve correlation chart shows conversion rate peaking at a start render time of 0.6 seconds. As user sessions get slower, conversions decline.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/548/shopify-1-2.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>The cohort of mobile users who experienced Start Render times of 0.6 seconds had the highest conversion rate (13%). As pages get slower for this site, conversion rate quickly decreases. At 1.9 seconds, conversion rate plateaus at about 2%.</em></p> <h3>Slowdowns can cost more than downtime</h3> <p>Downtime gets all the attention, but <a href="https://www.speedcurve.com/blog/downtime-vs-slowtime/">&ldquo;slowtime&rdquo; is often just as damaging</a> and harder to notice. Visitors rarely wait around when pages load at a crawl.&nbsp;</p> <h2>How real user monitoring (RUM) with SpeedCurve can help you</h2> <p>SpeedCurve is uniquely positioned to give you a full picture of your web performance and how it affects user behavior.&nbsp;<a href="https://www.speedcurve.com/web-performance-guide/synthetic-vs-real-user-monitoring/">By combining synthetic testing and real user monitoring</a>, you can learn exactly how long your pages are taking to load for real users and then get the optimization recommendations you need to diagnose and improve performance.&nbsp;</p> <p>Until now, if you were a Shopify merchant without a developer, you probably relied on synthetic testing like Lighthouse or PageSpeed Insights. With the new SpeedCurve RUM app, you can easily add real user monitoring, which unlocks the full potential of SpeedCurve.</p> <p>RUM gives you visibility into how your actual customers experience your site. With RUM, you can:</p> <ul> <li><strong>Correlate key business metrics with performance</strong>&nbsp;&ndash;&nbsp;Out of the box, SpeedCurve RUM shows you <a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">correlation charts</a>&nbsp;(like those used above) between your performance and bounce rates. <a href="https://www.speedcurve.com/blog/web-performance-conversions/">With a little extra setup</a>, you can also create correlation charts for conversion rate, cart size, A/B tests, and more.</li> <li><strong>Pinpoint problems with data</strong> &ndash; Without data, optimizing your site feels like guesswork. RUM provides real, actionable insight into where performance breaks down on real user devices, so you can fix it faster and more confidently.</li> <li><strong>Segment web performance data by page type, device, and more</strong> &ndash; SpeedCurve gives you the power to <a href="https://support.speedcurve.com/docs/sessions-dashboard">segment data</a>, track performance trends over time, and see exactly how different parts of your site perform for different users.&nbsp;</li> <li><strong>Track improvements and spot new issues</strong> &ndash; Once you've addressed current issues, SpeedCurve helps you stay ahead with <a href="https://support.speedcurve.com/docs/reports">weekly reports</a> and <a href="https://support.speedcurve.com/docs/performance-budgets-and-alerts">real-time alerts</a>, set according to your notification preferences. Never miss a performance regression again!</li> </ul> <h2>Easy setup, no developer required</h2> <p>You no longer need to dive into code or wait for a web or theme developer to set up performance monitoring for you. The new Shopify app makes RUM setup as simple as a few clicks.</p> <h3>No developer required</h3> <p>The installation is non-technical. Here's <a href="https://www.speedcurve.com/blog/how-to-use-speedcurve-in-shopify/">how to install SpeedCurve RUM in just four steps</a>.</p> <h3>Get useful data immediately</h3> <p>Once the app is installed, SpeedCurve begins collecting real user data right away, giving you insights within minutes.</p> <h3>Friendly support when you need it</h3> <p>Whether you hit a snag or just want advice, SpeedCurve's super-friendly performance experts are there to help. Just send them a note at support@speedcurve.com.</p> <h2>Add RUM to your Shopify store &ndash; for free</h2> <p>It&rsquo;s free to install and explore the SpeedCurve Shopify app. Start collecting real user performance data today and unlock new ways to improve speed, conversion, and user experience.&nbsp;</p> <p><strong>If you're already a SpeedCurve Synthetic user</strong> &ndash; Install the SpeedCurve RUM app via your Shopify dashboard, and then connect the app to your SpeedCurve account. <a href="https://www.speedcurve.com/blog/how-to-use-speedcurve-in-shopify/">Here's how to get setup in minutes.</a></p> <p><strong>If you're not a SpeedCurve user yet</strong> &ndash; <a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials">Sign up for your free trial</a>&nbsp;and then <a href="https://www.speedcurve.com/blog/how-to-use-speedcurve-in-shopify/">install the app</a>.</p> <p><em><a href="https://sia.codes/">Sia Karamalegos</a> is a web performance engineer and consultant, creative technologist, and systems thinker. At Shopify, she enhanced merchant sites fand the Shopify platform for Core Web Vitals performance. She is&nbsp;a Google Developer Expert in Web Technologies, as well as a Cloudinary Media Developer Expert.</em></p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><em><img class="blog-img" src="https://blog-img.speedcurve.com/img/548/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></em></a></p> Thu, 12 Jun 2025 00:00:00 +1200 The Definitive Guide to Long Animation Frames (LoAF) https://www.speedcurve.com/blog/guide-long-animation-frames-loaf <p><span class="large-para">With Long Animation Frames (commonly referred to as LoAF, pronounced 'LO-aff') we finally have a way to understand the impact of our code on our visitors' experiences.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/long-animation-frame-new.png?auto=format,compress&amp;fit=max&amp;w=2000" /></p> <p style="text-align: center;"><em>Long Animation Frame &ndash; a frame that took longer then 50ms from its start to when it started painting</em></p> <p>LoAF allows us to understand how scripts and other tasks affect both hard and soft navigations, as well as how scripts affect interactions. <strong>Using the data LoAF provides, we can identify problem scripts and target changes that improve our visitors' experience.</strong> We can also finally start to quantify the impact of third-party scripts as they execute in our visitors' browsers.</p> <p>Keep reading to learn:</p> <ul> <li>Why animation frame rate matters</li> <li>Anatomy of a Long Animation Frame</li> <li>Key LoAF milestones and what we can do with milestone data</li> <li>Script attribution (and why script details might sometimes be unavailable)</li> <li>How to match script data to Interaction to Next Paint, including sub-parts</li> <li>How to capture LoAF entries</li> <li>Getting started with LoAF</li> <li><a href="https://www.speedcurve.com/blog/long-animation-frames-support/">LoAF support in SpeedCurve</a></li> </ul><h2>Where we've come from</h2> <p>Performance isn't just about the download size of our pages and their components, or how a quickly the browser can fetch components from a server. Yet this is where we often start looking when we want to improve site speed.</p> <p>It's not surprising that network performance is often the main focus. Historically, we've lacked APIs that provide data on the runtime costs of the code we ship as it executes in our visitors' browsers.</p> <p>The&nbsp;<a href="https://www.w3.org/TR/longtasks-1/">Long Tasks API</a>&nbsp;was a first attempt at providing runtime data. It generates entries for any task longer than 50ms, but it doesn't provide any attribution so it's hard to understand what's causing the Long Tasks.</p> <p>This is why Long Animation Frames are an evolutionary next step.</p> <h2>Why does animation frame rate matter?</h2> <p>In an ideal world, we want the browser to be able to paint at 60 frames per second &ndash; in other words, a frame every 16.66ms.&nbsp;<strong>A Long Animation Frame takes longer than 50ms from its start to when it begins painting.</strong></p> <p>The&nbsp;<a href="https://w3c.github.io/long-animation-frames/">Long Animation Frames (LoAF) API</a>&nbsp;is a modern attempt to provide data on what's consuming the browser's processing time. It uses an animation frame-based approach rather than a&nbsp;task-based one.</p> <h2>Anatomy of a LoAF</h2> <p>With the LoAF API, not only do we get data for each LoAF, we also get data on which scripts executed during the LoAF. We finally have a way to begin to understand the impact that the code we're shipping has on our visitors' experiences.</p> <h3>Long Animation Frame (LoAF)</h3> <p>A LoAF measures from the&nbsp;point in time where a browser starts a new frame to the point where paint operations for that frame start.</p> <p>It's important to note that the work to paint the frame, send it to the GPU, and finally show (present) it to the visitor are NOT included in the LoAF, as shown below.</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/loaf-timestamps-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Timeline showing the portion of a frame that's measured by a LoAF" /></p> <p style="text-align: center;"><em>Relationship between a Long Animation Frame and how frames are presented to the visitor</em></p> <p style="text-align: left;">More things to note:</p> <ul> <li style="text-align: left;">LoAF entries are only created for visible pages.</li> <li style="text-align: left;">A LoAF may have zero, one, or more scripts associated with it.</li> <li style="text-align: left;">A LoAF may or may not correspond with an interaction.</li> </ul> <h3 style="text-align: left;">Script Timing</h3> <p>Script Timing gives you details of a script that executed for longer than 5ms during a Long Animation Frame. Timing information isn't available for all script tasks. For example, there's no data exposed for extension scripts and garbage collection.&nbsp;</p> <h3 style="text-align: left;">Long Task</h3> <p>A Long Task API entry is generated for main-thread activities that are longer than 50ms. They are generated for hidden and visible pages. There's no direct way to link them to a LoAF.</p> <h2>What does a LoAF entry look like?</h2> <p>A LoAF entry contains some metadata and a mixture of timestamps and durations. It also includes an array of Script Timing entries for any scripts that executed for longer than 5ms during the LoAF.</p> <pre><code class="language-json">{ "name": "long-animation-frame", "entryType": "long-animation-frame", "navigationId": "508afc4b-f812-456f-a22a-4938478e4e1b", "startTime": 2899, "duration": 143, "renderStart": 3035, "styleAndLayoutStart": 3035.4000000059605, "paintTime": 3042, "presentationTime": 3044, "firstUIEventTimestamp": 0, "blockingDuration": 87.524, "scripts": [ // Array of PerformanceScriptTiming Entries ] }</code></pre> <h2>Key LoAF milestones</h2> <p>There are several key milestones within a Long Animation Frame:</p> <p><code class="language-js code--heading">startTime</code><br />Start of the frame.</p> <p><code class="language-js code--heading">renderStart</code><br />Start of the rendering process. Sometimes the Style and Layout phase starts at the same time as rendering, but this is the point where requestAnimationFrame handlers, ResizeObservers, etc. execute, so they may delay the start of the style and layout phase.</p> <p><code class="language-js code--heading">styleAndLayoutStart</code><br />When the browser starts the final style and layout operations for the frame. This might not be the only style and layout work in the frame &ndash; for example a script might force style and layout by querying the size or styles of an element or a browser may sometimes choose to recalculate them mid-frame.</p> <p><code class="language-js code--heading">endTime</code><br />The point in time when the browser starts paint tasks for the frame. Calculated as startTime + duration.</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/loaf-timestamps-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Key LoAF timing points" /><br /><em>Key milestones during a Long Animation Frame</em></p> <h2>What can we do with this milestone data?</h2> <p>With just this data we can begin to get an understanding of how a page is performing. We can:</p> <ul> <li>Count how many LoAFs there were</li> <li>Calculate their total time</li> <li>Identify the longest LoAF</li> <li>Get an indication of how much time is spent in style and layout tasks</li> </ul> <p>If you're familiar with DevTools profiling, LoAF maps onto the main thread activities something like this simplified visualisation:</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/loaf-vs-main-thread-new.png?auto=format,compress&amp;fit=max&amp;w=2000" /><br /><em>LoAF milestones vs main thread activity</em></p> <p>I used Chrome Canary &ndash; which has the experimental&nbsp;<a href="https://w3c.github.io/paint-timing/#painttimingmixin">PaintTimingMixin</a>&nbsp;enabled &ndash; to generate the JSON example above. This mixin adds two more timestamps to the LoAF entry:</p> <p><code class="language-js code--heading">paintTime</code><br />When the browser starts paint operations for the frame.</p> <p><code class="language-js code--heading">presentationTime</code><br />When the frame is actually displayed to the visitor.</p> <p>Although these timestamps are part of the LoAF entry, they occur after the end of the LoAF, i.e. <code class="language-js">startTime + duration &lt; paintTime &lt; presentationTime</code></p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/loaf-paint-timing-mixin-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Timestamps added by the PaintTiming Mixin" /></p> <p style="text-align: center;"><em>Timestamps added by the PaintTimingMixin</em></p> <p style="text-align: left;">If the frame wasn't painted or presented, then both these timestamps will be zero.</p> <p>Some browsers can't capture a&nbsp;<code>presentationTime</code>, as the work of displaying the frame is handed off to the operating system and&nbsp;<code>paintTime</code>&nbsp;is aimed to provide a interoperable timestamp across browsers.</p> <p>Finally there are two other time related properties included in the LoAF entry:</p> <p><code class="language-js code--heading">blockingDuration</code><br />The length of time the browser could not respond quickly to a visitor&rsquo;s interactions (taps, clicks, or keypresses).</p> <p><code class="language-js code--heading">firstUIEventTimestamp</code><br />If the visitor interacted with the page and the event was handled within this LoAF, then the timestamp will be non-zero and will be before the startTime for this LoAF.</p> <h2>Summarising LoAFs</h2> <p>Much of the focus on LoAF has been around scripts. Understanding which scripts contribute to slow interactions &ndash; but summarising the higher level data &ndash; can provide an overview of our runtime costs.</p> <p>Some examples of summary metrics I've experimented with:</p> <ul> <li><strong>Count of LoAFs</strong> &ndash; How many frames were delayed by longer than 50ms?</li> <li><strong>Total LoAF Duration</strong> &ndash; What was the total time of all Long Animation Frames?</li> <li><strong>Total Blocking Duration</strong> &ndash; What was the total length of time the browser could not respond quickly to a visitor&rsquo;s interactions, for example, taps, clicks or keypresses?</li> <li><strong>Longest LoAF Duration</strong> &ndash; If a visitor tries to interact with the page during a LoAF, then their interaction won't be handled until the frame is presented. Measuring the longest LoAF might indicate how bad INP could potentially be. There's normally at least one LoAF entry before First Contentful Paint (FCP). As visitors are less likely to interact before content is shown, any LoAFs that occur before FCP should probably be excluded from this metric.</li> </ul> <h2>Script attribution</h2> <p>If a script executes for longer than 5ms within a LoAF, then a PerformanceScriptTiming entry is generated.</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/loaf-script-timing-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="How Script Timing entries relate to a LoAF" /><br /><em>Relationship between LoAF and Script Timing entries</em></p> <p>Script attribution is probably the part of LoAF that has attracted the most interest. We can finally measure which scripts are slow and when they execute. Using this data, we can begin to understand what proportion of any script performance issues are due to third-party tags and what's due to our own code.</p> <p>(Spoiler: For many of the sites I've looked at, the first party code is often as big a source of problems as the third-party code.)</p> <p>A typical Script Timing entry might look like this:</p> <pre><code class="language-json">{ "name": "script", "entryType": "script", "navigationId": "13b594a2-ca64-4812-ae67-139617da01fb", "windowAttribution": "self", "startTime": 4286.5, "duration": 319, "executionStart": 4370.29999999702, "forcedStyleAndLayoutDuration": 0, "pauseDuration": 0, "invoker": "https://example.com/assets/vendor/jquery/jquery.min.js?v=3.7.1", "invokerType": "classic-script", "sourceURL": "https://example.com/assets/vendor/jquery/jquery.min.js?v=3.7.1", "sourceFunctionName": "", "sourceCharPosition": 0 }</code></pre> <p><strong>Timing</strong></p> <p><code class="language-js code--heading">startTime</code><br />When the script was invoked.</p> <p><code class="language-js code--heading">duration</code><br />How long the script execution took.</p> <p><code class="language-js code--heading">executionStart</code><br />A script might not execute immediately. For example, a classic script might need to be compiled before it can be executed, in which case executionStart might be later than startTime. Due to security and privacy concerns, compilation time isn't exposed for third-party scripts and executionStart will be the same as startTime.</p> <p><code class="language-js code--heading">forcedStyleAndLayoutDuration</code><br />If a script queries the size, position or CSS properties of an element then the browser may need to recalculate these before it can return the data.</p> <p><code class="language-js code--heading">pauseDuration</code><br />How long a script was paused while a synchronous operation took place, e.g., showing an alert box, or making a synchronous XHR call</p> <p><strong>Invoker</strong></p> <p><code class="language-js code--heading">invoker</code><br />In the case of a classic script or a module, this will be the URL of the script. If the execution was triggered by an event handler, then it will be the event handler type combined with the element the handler was attached to, e.g. BODY.onclick</p> <p><code class="language-js code--heading">invokerType</code><br />Why the script was executed. This should be one of classic-script, module-script, event-listener, user-callback, resolve-promise, reject-promise.</p> <p><b>Script details</b></p> <p><code class="language-js code--heading">sourceURL</code><br />URL of the script source file. This can be overridden using the //# sourceURL= directive, which can be useful if the script names are hashed. Inline scripts are attributed to the HTML page they are in, but they can also be explicitly named using the //# sourceURL= directive. For example, the entry generated by the snippet below would be have a sourceURL of "Use-the-sourceURL-Luke".</p> <pre><code class="language-js">document.body.addEventListener("click", function() { for (var a = Date.now() + 2E3; Date.now();); }); //# sourceURL=Use-the-sourceURL-Luke</code></pre> <p><code class="language-js code--heading">sourceFunctionName</code><br />Name of the top level function that executed, i.e., the entry point of the script. This is often empty. Even when it's populated it's commonly a minified function name, so I've not found it that useful.</p> <p><code class="language-js code--heading">sourceCharPosition</code><br />Character position of the script entry point within the source file.</p> <h2>Why script details might be unavailable</h2> <p>Sometimes details of the script that executed aren't available. This can be for privacy reasons and/or due to gaps in the API that have yet to be closed.</p> <p>From a privacy perspective, browser extensions often install content scripts. These scripts execute within the context of our pages. Although they may cause performance problems, we have no right to know what our visitors have installed. Hopefully we can get opaque attribution for these, so at least we'll know an extension script was the source of the issue.</p> <p>Inline handlers injected by third parties, such at Google Tag Manager, are also a&nbsp; common source of missing attribution.</p> <h2>Summarising script data</h2> <p>There are multiple ways to summarise the Script Timing data.<br /><br />In the table below I've grouped the data by <code>scriptURL</code> and summed the durations. (Alternatively, it could also be grouped by eTLD + 1 to distinguish first- versus third-party domains or by invokerType to understand what's triggering the scripts.)</p> <p>Summarising the entries while the page loads can help to quickly identify that, in this case, most of the long scripts are first party ones and so within the site owner's control.</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/total-script-execution.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table summarising script execution on Selfridges " /><br /><em>Summary of script execution on Selfridges (captured at 6x CPU slowdown)</em></p> <p>The summary could be refined further to focus on just the scripts that executed before First Contentful Paint or Largest Contentful Paint.</p> <p>The data could also be grouped by multiple dimensions, such as scriptURL and invoker. One thing to keep in mind is that, as data becomes more granular, it can be harder to see the patterns in it.</p> <h2>Matching script data to INP</h2> <p>We can also use LoAF data to understand which scripts were executed during Interaction to Next Paint (INP) and &ndash; perhaps more interesting &ndash; which scripts executed during which INP phase/sub-part.</p> <p>There's no explicit link between the Event Timing entries that are used to calculate INP and any corresponding LoAF entries, so they need to be matched using timestamps.</p> <p>In the diagram below, there are three LoAF entries that overlap with INP:</p> <ol> <li>A frame was already in progress when the visitor interacted and the browser needs to complete this frame before the interaction can be handled.</li> <li>The visitor's interaction is handled in this frame.</li> <li>Once the current frame has been sent to the GPU for presentation, the browser's main thread is free to start the next frame. This LoAF is actually generated by the next frame.</li> </ol> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/inp-and-loaf-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="How LoAFs might overlap with INP" /><br /><em>LoAFs overlapping with INP</em></p> <p>We can follow this process to attribute the scripts, or parts of a script, to the different phrases of INP:</p> <ol> <li>When a LoAF overlaps with the start of an interaction, only the portion of the script that executes after the interaction is applicable to INP.</li> <li>If a LoAF wholly intersects with INP, then all the scripts executed are relevant to this INP.</li> <li>When a LoAF finishes after the INP presentation time, then it's the next frame, so the LoAF and its scripts can be discounted.</li> </ol> <p style="text-align: left;">So in this example only the portions of JS coloured in dark gold are applicable to INP:</p> <p style="text-align: left;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/inp-and-loaf---applicable-scripts-new.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Calculating which scripts can be attributed to INP phases" /></p> <p style="text-align: center;"><em>Attributing LoAF and Script Timing entries to INP phases / sub-parts</em></p> <p>Once we've identified the relevant scripts and identified which phase of INP they belong to, we can summarise the data and use it to identify the common sources of Input Delay, Processing Time, or Presentation Delay.<br /><br /><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/inp-scripts-by-phase.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table of INP Scripts by Phase" /></p> <p style="text-align: center;"><em>Breakdown of script execution by INP phase</em></p> <h2>There are at least two ways to calculate INP phases</h2> <p><strong>The simplest approach</strong> uses Input Delay, Processing Time and Presentation Delay as calculated from the Event Timing entry that corresponds to INP. <br /><br /><strong>The more complex method</strong> looks at all the Event Timing entries that end in the same frame and calculates the phases as follows:</p> <ul> <li>Input Delay = start of the first Event Timing entry to the earliest Processing Time across all entries</li> <li>Processing Time = start of the earliest Processing Time to the end of the latest Processing Time across all entries</li> <li>Presentation Delay = end of the latest Processing Time to end of the frame across all entries</li> </ul> <p>Chrome and web-vitals.js use the second of these approaches.</p> <h2>How to capture LoAF entries</h2> <p>As with other performance APIs, LoAF entries can be captured in a couple of ways.</p> <p><strong>Indirectly, using PerformanceObserver</strong></p> <pre><code class="language-js">const observer = new PerformanceObserver((list) =&gt; { for (const entry of list.getEntries()) { console.log(entry); } }); observer.observe({ type: "long-animation-frame", buffered: true });</code></pre> <p><strong>Directly, by querying the Performance Timeline</strong></p> <pre><code class="language-js">console.log(performance.getEntriesByType("long-animation-frame"));</code></pre> <p>The number of LoAF and ScriptTiming entries generated depends on how much work the page demands of the browser or the capabilities of the device being used. Pages that use more scripts or are visited by people who have slower devices will often generate more LoAF entries than pages with fewer scripts or those that are visited by people with faster devices.</p> <h2>Exploring LoAF in DevTools</h2> <p>Chrome DevTools doesn't currently visualise Long Animation Frame or Script Timing entries. LoAF can generate a lot of data and one of the challenges I faced was matching its data to my understanding of how browsers work and how this is visualised in the DevTools Performance panel.<br /><br />To help close this gap, I created a Chrome extension (<a href="https://github.com/andydavies/perf-timeline-to-devtools-profile">available on GitHub</a>) that adds a Custom Track to the Performance panel. This visualises LoAF and any corresponding script entries alongside the usual main thread view.<br /><br />To use it, you'll need to enable Developer Mode and load it as an unpacked extension. By default it injects a content script for all pages, so I tend to only install it in a separate Chrome profile.</p> <p>This first example is for a fresh page load of Selfridges at 4x CPU slowdown:</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/example-of-loaf-entries-generated-during-page-load.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Example of LoAF and Script Entries generated during page load" /><br /><em>Example of custom performance track showing LoAF, Script Timing and Long Task Entries (<a href="https://trace.cafe/t/Yb89gdcu2S">view trace</a>)</em></p> <p>In this second example, I profiled opening the menu. The slow interaction is due to SnapChat's tag querying a DOM element. This can be seen in both the trace and the LoAF data. By collecting LoAF data from visitors using RUM, Selfridges would be able to identify how commonly SnapChat contributes to INP.</p> <p style="text-align: center;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/example-of-loaf-entries-generated-during-an-interation.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="Example of Custom Performance Track showing LoAF and Script Timing Entries created during an Interaction" /><br /><em>Example of LoAF and Script Timing entries created during an interaction (<a href="https://trace.cafe/t/zIeEvgsDJb">view trace</a>)</em></p> <p>Using the extension, it's also possible to see the gaps in the LoAF API &ndash; the impact of Garbage Collection or Extension scripts &ndash; and visualise where the Long Tasks API differs from LoAF. It's also helped me find a couple of Chrome bugs.</p> <h2>Getting started with LoAF</h2> <p>We've captured and exposed Long Tasks in SpeedCurve RUM for many years. One of the most common questions we've had from customers is "Can you tell me what causes these Long Tasks?"<br /><br />Finally, thanks to the Long Animation Frames API, we can say: <strong><a href="https://www.speedcurve.com/blog/long-animation-frames-support/">Yes! SpeedCurve now supports monitoring LoAFs and drilling down into attributions.</a></strong></p> <p>LoAF allows us to understand how scripts and other tasks affect both hard and soft navigations, as well as how scripts affect interactions. Using the data it provides, we can identify problem scripts and target changes that improve our visitors' experience. We can also finally start to quantify the impact of third-party scripts as they execute in our visitor browsers.</p> <p>A <a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials">free trial of SpeedCurve RUM</a> will allow you to start to measure how scripts are affecting your visitors' experience. It will also help you track changes to <a href="https://www.speedcurve.com/web-performance-guide/get-started-with-core-web-vitals/">Core Web Vitals</a> and <a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">visitor behaviour</a> as you make code improvements.&nbsp;</p> <p>If you have any questions or comments about this post, you can <a href="https://bsky.app/profile/andydavies.me">find me on Bluesky</a>.</p> <p>I'd also like to say a very big thank you to <a href="https://bsky.app/profile/tunetheweb.com">Barry Pollard</a>, <a href="https://bsky.app/profile/nomster.bsky.social">Noam Rosenthal</a> and <a href="https://bsky.app/profile/mmocny.com">Michal Mocny</a>&nbsp;for their patient answers to my many questions about LoAF.</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/527/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Mon, 19 May 2025 00:00:00 +1200 NEW! Monitor Long Animation Frames and get to the bottom of your JavaScript issues https://www.speedcurve.com/blog/long-animation-frames-support <p><span class="large-para">CPU consumption by the browser is one of the main causes &ndash; if not the number one cause &ndash; of a poor user experience. The primary culprit? JavaScript execution. Now you can use SpeedCurve to monitor Long Animation Frames (LoAFs) and fix the third parties and other scripts that are hurting your page speed.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/sessiondetails1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Detailed view examining a session with long LoAF" /></p> <p>Until recently, we've had little evidence from the field that <em>definitively</em> attributes the root cause of rendering delays. While&nbsp;<a href="https://support.speedcurve.com/docs/metrics-glossary#javascript-long-tasks-synthetic-and-rum---chrome-spa">JavaScript Long Tasks</a>&nbsp;gave us a good indication that there were blocking tasks affecting metrics such as&nbsp;<a href="https://support.speedcurve.com/docs/metrics-glossary#interaction-to-next-paint-rum---chrome-spa">Interaction to Next Paint</a> and&nbsp;<a href="https://support.speedcurve.com/docs/metrics-glossary#largest-contentful-paint-synthetic-and-rum---chrome-firefox-spa">Largest Contentful Paint</a>, there was no way to attribute the work or understand how it was ultimately affecting rendering.&nbsp;<br /><br />Fortunately, we've gotten a lot of help from Chrome in improving the attribution &ndash; and ultimately the actionability &ndash; of the data we collect in the field with RUM. The introduction of the&nbsp;<a href="https://www.speedcurve.com/blog/guide-long-animation-frames-loaf/">Long Animation Frames API</a>&nbsp;(LoAF) not only gives us better methods for understanding what's happening on the browser's main thread, in some cases it also gives us attribution to both first- and third-party scripts that occur during a LoAF.&nbsp;</p> <p>This has been a highly anticipated addition to SpeedCurve, which is available for all our RUM users today. This post covers what's new in the product and points you to a few new resources to help you get up to speed on all things related to LoAF.</p><h2>What's new in your SpeedCurve dashboards?</h2> <p>Despite the complexity that comes with measuring script-related performance in the wild, our LoAF release is relatively straightforward.</p> <p>In short, we've:</p> <ul> <li>Added new metrics and made them available throughout the product</li> <li>Created helpful new data visualizations in three of your dashboards</li> <li>Added a valuable new visualization to your RUM waterfall</li> </ul> <h2>New metrics</h2> <p>The LoAF API allows us to derive <a href="https://support.speedcurve.com/docs/metrics-glossary#long-animation-frames-rum-chrome-spa-beta">several useful metrics</a>&nbsp;that are powerful tools in your monitoring toolkit.</p> <h3>Total Blocking Duration (TBD)</h3> <p>The most notable addition is <a href="https://support.speedcurve.com/docs/metrics-glossary#loaf-total-blocking-duration-rum-chrome-spa-beta">Total Blocking Duration</a>, currently considered experimental. The intent of TBD is to give us a similar summary metric to <a href="https://support.speedcurve.com/docs/metrics-glossary#total-blocking-time-synthetic">Total Blocking Time</a>, which is available in our synthetic tool. Total Blocking Time is often used as a synthetic proxy for understanding how JavaScript execution interrupts the user experience by introducing delays causing slow interactions, slow loading hero images, or other user frustration such as 'jank' during scroll.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/tbd_vitals.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Summary of Web Vitals Metrics" /></p> <p>Total Blocking Duration (TBD) is different from Total Blocking Time (TBT) in a few ways:</p> <ul> <li>LoAFs that contribute to TBD are measured from the beginning of the page load for 60 seconds or until the user leaves the page (whichever occurs first).</li> <li>TBT measures the sum of Long Tasks, while TBD measures the blocking duration for all LoAFs measured as described above. LoAFs are fundamentally different from Long Tasks.&nbsp;</li> </ul> <p>If you're a RUM user, you'll see Total Blocking Duration throughout your dashboards, most notably featured as a hero metric in your Vitals dashboard (as shown above).</p> <h3>Other new metrics</h3> <p>We've also added these metrics, which will help you dig into LoAF in a number of nuanced ways:</p> <ul> <li><strong>LoAF Total Duration</strong> &ndash; Total duration of ALL LoAFs measured</li> <li><strong>LoAF Entries</strong> &ndash; Total count of ALL LoAFs measured</li> <li><strong>LoAF Style and Layout Duration</strong> &ndash; Time spent calculating style and layout for the frame</li> <li><strong>LoAF Work Duration</strong> &ndash; Total duration of non-rendering phases across ALL LoAFs</li> <li><strong>LoAF Script Total Duration</strong> &ndash; Total duration of scripts that executed across all LoAF entries</li> </ul> <p>You'll be able to track all these metrics in <a href="https://support.speedcurve.com/docs/custom-charts-dashboards">custom charts</a> in your Favorites dashboards.</p> <h2>Vitals dashboard updates</h2> <p>The Vitals dashboard has been updated in a few areas. As mentioned earlier, Total Blocking Duration is a Beta metric that appears for RUM users in place of Total Blocking Time. Additionally, in the TBD section we've added a table for Execution Duration by dimension.</p> <p>In this example, we can quickly see which page groups are most heavily affected by total Execution Duration:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/tbd_heatmap1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table heat map displaying long animation frame timings by page label" /></p> <p>A secondary table shows you scripts that are attributed to Long Animation Frames. These scripts are both first-party scripts (origin) as well as third-party scripts (external vendors). You can see the total duration for the script (note, this is inclusive of blocking but not <em>exclusively</em> blocking duration) as well as any forced style and layout attributed to that script.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/tbd_heatmap2.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table showing LoAF timings attributed to JavaScript" /></p> <p>In the Interaction to Next Paint (INP) section of the Vitals dashboard, you have a new table that shows scripts attributed during the INP phase.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/inp_heatmap1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="TAble listing scripts attributed to INP" /></p> <p>You can also filter this table to scripts that occurred during the different <a href="https://support.speedcurve.com/docs/metrics-glossary#interaction-to-next-paint-subpart-timings-rum---chrome-spa">INP subparts</a>: Input Delay, Processing Time, and Presentation Delay.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/inp_heatmap2.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Same table as above with drop down highlighting other options for filtering" /></p> <h2>RUM JavaScript dashboard updates</h2> <p>The Execution Duration by Script shown earlier in the Total Blocking Duration Vitals section also appears at the top of the JavaScript dashboard. Additionally, dimension tables for Page Labels, Device Types, and Browsers have been updated to included LoAF Entries, LoAF Total Duration, and LoAF Total Blocking Duration.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/js_heatmap1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table showing top scripts contributing to LoaFs" /></p> <h2>Home dashboard updates</h2> <p>Your Home dashboard now includes a table for the slowest scripts and their total execution duration.</p> <p><img class="blog-img-md" src="https://blog-img.speedcurve.com/img/543/hometable.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Table showing the slowest scripts impacting your site" /></p> <h2>Drilling into your RUM waterfall</h2> <p>When you're diagnosing an issue, you can&nbsp;<a href="https://support.speedcurve.com/docs/investigate-rum-sessions">drill into a set of sessions</a> for further interrogation. This is useful when investigating a spike or a baseline change to a metric in a time series chart, or if you simply want to learn more about the demographics and see some example sessions that meet the chosen criteria.</p> <p>Clicking on a time series chart gives you a few options. Click on 'View Sessions' to drill in further.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/tbd_drill1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Time series chart with cursor highlighting an option to view sessions" /></p> <p>The 'Sessions' section of the dashboard lists individual sessions you can explore. In this case, we're looking at an example of a session where INP was high.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/sessions.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="TAble showing sessions that have poor INP" /></p> <p>Clicking on the session gives us details for each page in the user's session. We've introduced a new visualization that shows you Long Animation Frames (the red bars) aligned with the waterfall chart above, which lets you see when the LoAF occurred during the rendering timeline.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/sessiondetails1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Detailed view examining a session with long LoAF" /></p> <p>Hovering over each red LoAF gives more attribution detail, listing scripts that executed during the LoAF. In this example, we can see attributed scripts and their duration (important, this is not <em>just</em> blocking duration). You'll also see Unattributed time, which can't be attributed to a specific script.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/session-details2.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Session details showing scripts attributing to long LoAF" /></p> <h2>More resources</h2> <p>This is a complex topic. While we've done our best to simplify how you think about and monitor LoAF, there are a few resources that go much deeper and provide a lot of understanding that may be useful.</p> <p>My colleague Andy Davies provides a wealth of information in his latest post, a <a href="https://www.speedcurve.com/blog/long-animation-frames-loaf">detailed guide to understanding LoAF</a>. Andy has also created a great <a href="https://www.speedcurve.com/blog/debugging-interaction-to-next-paint-inp/">debugging guide for investigating INP</a>.</p> <p>Our <a href="https://support.speedcurve.com/docs/welcome">Support Hub</a> is a good resource for everything from understanding <a href="https://support.speedcurve.com/docs/measuring-javascript-impact">how to navigate JavaScript-related issues</a> in SpeedCurve to interpreting <a href="https://support.speedcurve.com/docs/metrics-glossary">what all these metrics mean</a></p> <h2>Get started!</h2> <p>Interested in tackling your JavaScript issues, but don't have RUM? <a href="https://support.speedcurve.com/docs/metrics-glossary">Start a free trial today!</a>&nbsp;</p> <p>If you're already a SpeedCurve customer but you're not using RUM yet, <strong>send us a note at support@speedcurve.com</strong> and we'll enable your RUM trial and help you get started.</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/543/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Mon, 19 May 2025 00:00:00 +1200 Why you need to know your site's performance plateau (and how to find it) https://www.speedcurve.com/blog/web-performance-plateau <p style="text-align: left;"><span class="large-para">Have you ever wondered why your site got faster, but your business and user engagement metrics didn't improve? The answer might lie on the performance plateau.</span></p> <p style="text-align: left;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/performance-plateau-clv.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: left;">Have you ever asked yourself these questions?</p> <p style="text-align: left; padding-left: 30px;"><em>"I made my pages faster, but my business and user engagement metrics didn't change. WHY???"</em></p> <p style="text-align: left; padding-left: 30px;"><em>"How do I know how fast my site should be?"</em></p> <p style="text-align: left; padding-left: 30px;"><em>"How can I demonstrate the business value of page speed to people in my organization?"</em></p> <p>The answers might lie with identifying and understanding the performance plateau for your site.</p><h2>What is the "performance plateau"?</h2> <p>The performance plateau is the point at which changes to your website&rsquo;s rendering metrics (such as Start Render and Largest Contentful Paint) cease to matter because you&rsquo;ve bottomed out in terms of business and user engagement metrics.</p> <p>In other words,&nbsp;<strong>if your page speed metrics are on the performance plateau, making them a couple of seconds faster probably won't help your business</strong>.</p> <p style="font-size: 16px;"><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-3-lcp.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>A <a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">correlation chart</a> is an essential tool for identifying your performance plateau. This chart shows that, for this site, bounce rate dramatically worsens when LCP time slows from 0.1s to 0.4s. After that, bounce rate plateaus &ndash; it remains at around 75% for all sessions with LCP times slower than 0.4s.&nbsp;</em></p> <p style="font-size: 16px;">The concept of the performance plateau isn't new. I first encountered it more than ten years ago, when I was looking at data for a number of sites. I noticed that not only was there a correlation between performance metrics and business/engagement metrics, there was also a noticeable plateau in almost every correlation chart I looked at.&nbsp;</p> <p style="font-size: 16px;">A few months ago someone asked me if I've done any recent investigation into the performance plateau, to see if the concept still holds true. When I realized how much time has passed since my initial research, I thought it would be fun to take a fresh look.</p> <p style="font-size: 16px;">In this post, I'll show how to use your own data to find the plateau for your site, and then what to do with your new insights.</p> <h2>Background</h2> <p>For this investigation, I selected four sites that experience a significant amount of user traffic. For each site, I used a month's worth of RUM (real user monitoring) data to generate correlation charts.</p> <p><a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">Correlation charts</a> show the relationship between performance metrics &ndash; in these instances, Start Render and Largest Contentful Paint (LCP) &ndash; and user engagement (measured as bounce rate)<strong>.</strong> They're a great tool for showing non-technical folks how performance affects the business.</p> <p>(You can also create correlation charts that show&nbsp;<a href="https://support.speedcurve.com/docs/conversion-rates">the relationship between performance metrics and business metrics</a>, such as conversion rate and cart size, but bounce rate is easier to measure right out of the box with most RUM tools.)</p> <p><span style="font-size: 35px; color: #000000;">Results</span></p> <p>The correlation charts below show the distribution of all visits, with each yellow bar representing a cohort of visits that experienced a given Start Render or LCP time. The blue bar represents the change in bounce rate across all cohorts.</p> <p>In each of the correlation charts below, I've highlighted:</p> <ul> <li><strong>Optimal speed</strong>&nbsp;&ndash; The cohort of sessions that correlated with the lowest (aka best) bounce rate for that site</li> <li><strong>Beginning of the performance plateau</strong>&nbsp;&ndash; The cohort of sessions where the bounce rate begins to plateau</li> <li><strong>Median measurement</strong>&nbsp;for all visits represented in the chart</li> </ul> <p>Keep reading for observations and takeaways.</p> <h3>Site A</h3> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-1-start-render.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-1-lcp.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>Site B</h3> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-2-start-render.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-2-lcp.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>Site C</h3> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-3-start-render.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-3-lcp.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>Site D</h3> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-4-start-render.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-4-lcp.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h2>Observations</h2> <h3>1. A clear performance plateau emerged for each site</h3> <p>Each site experienced a plateau at which business metrics remained more or less the same as performance continued to degrade.</p> <h3>2. Plateaus emerged for both Start Render and Largest Contentful Paint</h3> <p>While it's great to see Largest Contenful Paint validated as a meaningful page speed metric, I'm even happier to see Start Render receive validation. That's because Start Render is widely available across browsers, while LCP still has limited browser availability.&nbsp;</p> <h3>3. The plateau emerges surprisingly quickly in some cases</h3> <p>For example, Site C's performance plateau starts at 400 milliseconds. That's early!</p> <h3>4. There's a lot of variability in the distance between the optimal bounce rate and the plateau</h3> <p>For some sites, you can see a much steeper incline in the curve from optimal to plateau. For some sites (such as Site C), the difference was as little as 300 milliseconds. For others (such as Site A), the gap was as long as 9 seconds.</p> <h3>5. The plateau sometimes started later when looking at LCP</h3> <p>Creating correlation charts in both Start Render and LCP generated interesting results. In two of the four sites I looked at, the charts were roughly comparable. For the other two sites, the plateau started later for LCP than it did for Start Render. This could be attributed to the fact that LCP measures when the largest visual element has completely finished rendering, so it can occur much later than Start Render.</p> <h3>6. For some sites the performance plateau starts well before the median</h3> <p>Predictably, the optimal bounce rate generally correlated to the cohort of sessions that is much faster than the median. A bit more surprisingly, for some sites the performance plateau started well before the median. This could come as a scary revelation for some site owners, because it means that the bulk of your user sessions are occurring on the plateau.</p> <h2>How to measure the performance plateau for your own site</h2> <p>I can't emphasize enough that the examples I've shared are illustrative, not prescriptive. The performance plateau for your site will be different from the plateau for another site. <strong>You need to look at your own real user data. </strong>(If you're new to performance, you might be interested in&nbsp;<a href="https://support.speedcurve.com/docs/synthetic-vs-real-user-monitoring-rum">this synthetic and real user monitoring explainer</a>.)</p> <p>Fortunately, the process for identifying the low end of your site&rsquo;s performance threshold is fairly straightforward. All you need is access to a statistically significant amount of your RUM data, plus whatever analytics tool you use for tracking business or user engagement metrics.&nbsp;</p> <h3>Step 1: Identify the metrics you want to measure</h3> <p>As mentioned above, bounce rate is a good metric to start with, because it's already gathered automatically by most real user monitoring tools.</p> <p>If you have access to other data sources, then you can create a variety of correlation charts, If run an ecommerce site, then you can measure revenue, cart size, and conversion rate. If you work on a media site, then page views, session depth, and bounce rate matter.</p> <h3>Step 2: Gather lots of real user data</h3> <p>To ensure that you get statistically relevant results, the more data you can gather, the better. If your dataset is too small, you could get wonky results. When I conducted my investigation, I aggregated millions of transactions that took place over a single month. (If you're interested in trying real user monitoring, you can start a <a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials">free RUM trial</a> in SpeedCurve.)</p> <h3>Step 3: Create correlation charts</h3> <p>I've demonstrated how I like to show bounce rate (or whatever business/engagement metric you're plotting) across the distribution of sessions. (If you're a SpeedCurve user, <a href="https://support.speedcurve.com/docs/create-correlation-charts">here's how to create correlation charts</a>.)</p> <p><span style="font-size: 35px; color: #000000;">What to do with your findings</span></p> <p>After you've finished your own investigation, you can do a few things with the results:</p> <h3>1. Share your findings within your organization</h3> <p><a href="https://www.speedcurve.com/blog/site-speed-business-correlation/">Correlation charts</a> are a powerful tool for showing stakeholders the impact that site speed has on the business. Even if your results aren't what you hoped they would be, you can use this data to prove the value of continuing to invest in performance.</p> <h3>2. Understand why your business metrics are not improving despite your efforts</h3> <p>This might seem a bit demoralizing, but when you think about it, it's actually helpful to know. When you know where your performance pleateau begins, you can answer the question "Why don't my business or user engagement metrics improve when I make my site faster?" If you improve Start Render from 5 seconds to 3 seconds, but the performance plateau for your site starts at 2 seconds, you haven't yet made Start Render fast enough.&nbsp;</p> <h3>3. Change your performance goals</h3> <p>Set targets for moving more of your users into the cohorts that experience faster Start Render or LCP times. Ideally, improving key site speed metrics for more of your users should improve bounce rate (or whatever user engagement or business metric you're tracking) for more of your users. Ultimately, this is good for your business.</p> <p>You can use your performance plateau to set goals. Continuing with the example in point 1, above, if you know that the plateau starts at 2 seconds, you can create a Start Render target of 1.5 seconds to work toward.</p> <h3>4. Or DO NOT change your performance goals</h3> <p>In the Site C example, the optimal bounce rate occurs for the 100-millisecond LCP cohort, and the plateau starts just 300 milliseconds later. With a huge amount of work, you might succeed in delivering faster LCP times to more sessions, but would the effort be worth it?</p> <p>As the close-up view of the chart below shows, the bulk of sessions have speedy LCP times that are at the beginning of the performance plateau. In this case, the chart shows that perhaps you can be satisfied with your efforts, and your focus should be on fighting regressions and staying fast.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/site-c-closeup.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <h3>5. Create a baseline to measure against</h3> <p>Repeat this exercise periodically &ndash; perhaps monthly, or semi-annually, or after a deploy where you've made a number of performance improvements &ndash; and compare the correlation charts over time. Ideally, you'll see more of your sessions fall into the faster section of the distribution, before the performance plateau.</p> <h2>Questions? Feedback?</h2> <p>If you experiment with creating correlation charts and plotting the performance plateau for your site, I'd love to hear about your results!</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/443/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Tue, 15 Apr 2025 00:00:00 +1200 Performance Hero: Alex Russell https://www.speedcurve.com/blog/performance-hero-alex-russell <p><span class="large-para">Our newest performance hero is passionate, provocative, and unapologetically honest. While he's a true champion for web performance, his impact can be measured more broadly across the web. Join us in celebrating Alex Russell!</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/alex-hero.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p><a href="https://infrequently.org/">Alex Russell</a>&nbsp;has been a strong voice in the web community for as long as I can remember. He's currently a Partner PM at Microsoft, working on Edge. Before that, he spent several years working at Google on Chrome, web standards, and much more.</p> <p>Not only is Alex an accomplished engineer, he's also an amazing speaker and writer. I last saw Alex on stage at performance.now() in November, where he delivered&nbsp;<a href="https://youtu.be/0XwWVjQOmyg?si=7600So9o2KzMiCKF">this inspiring talk</a>&nbsp;that got a lot of attendees talking.</p><p>After reaching out to Alex for this interview, I was pleased to see how thoughtful he was in his response. Not only did he provide great insights, he was quick to point out a handful of colleagues at Microsoft he felt more deserving of recognition, including <a href="https://www.linkedin.com/in/amiya-gupta">Amiya Gupta</a>, <a href="https://www.linkedin.com/in/ingrid-caldas-4b131823/">Ingrid Caldas</a>, and <a href="https://www.linkedin.com/in/pauljroy/">Paul Roy</a>.</p> <p>Alex's passion for the web platform &ndash; and making it accessible for all &ndash; carries through in his writing, his talks, and fortunately for us, his email responses! Here's our email interview.</p> <h3>How did you begin your journey in web performance?</h3> <p>"My work in the past decade on performance has been an exercise in working backwards from strategy to tactics.&nbsp;</p> <p>"The web has relatively few advantages versus its competitors (who are also, not coincidentally, also major browser vendors), but one of the most misunderstood advantages is perspective: we get to step back from the frothy churn of early capability introduction on native OSes and (if we're doing our job right) ride the 80/20 line to add capabilities that are important at about the same rate that they become commodities, but with the benefit of mistakes made by native competitors.&nbsp;</p> <p>"That digestion procession often gets weaponised (or worse, fetishised,&nbsp;&agrave;&nbsp;la TC39 and CSSWG) as "thoughtful deliberation" by internal enemies of the web, but when it's working as intended, competition and urgency to ship creates a diversity of views about how to introduce a capability without having explain their fundamental value.</p> <p>"But all of that value is contingent. If the web is a safer way, for example, to configure your brand-new IoT device versus downloading some app from a store &ndash; but the user experience sucks &ndash; no CEO or PM worth their salt will want to associate their brand with our platform.</p> <p>"The same is true all the way down the capability spectrum: the web's potential to introduce safe, privacy-respecting ways of accessing the full potential of your devices is only as realistic as the willingness of decision makers to bet on the experience of the web. And if that experience is, in general, bollocks... why offer it on the menu?</p> <p>"Make no mistake: Apple's work to kill the web is a two-front war. First, they are denying critical capabilities that they give every Tom, Dick, and Harry willing to pay $99 a year to put something in their store. Simultaneously, they are deeply committed to undermining the reliability of foundational experiences like tapping, swiping, and typing. If those feel like tosh on the web via the phones of CEOs and board members, would anyone invest in a web-based pitch? And why?</p> <p>"The web is not what it promises. The web is what it does.</p> <p>"And this strategy logic plays out in Android-land, where there are huge teams at Google that have no higher goal than to get folks that are happy making web apps to put something native in the Play Store instead. They haven't been quite as successful in keeping the Chromies down as Apple did the WebKittens, but the net effect of various management and political games should be read with not insignificant scepticism. Why, for example, is Google still withholding the ability for competing browsers to ship real PWAs on Android (a.k.a. WebAPKs)? This stuff matters, and if you only read public blogs, you might think it's just a random walk of technology futures explored and abandoned, but it's very much not that.</p> <p>"Web developers need to wake up.&nbsp;</p> <p>"Native ecosystems want to eat your lunch. They're doing so in an ongoing way, and to the extent that the web is a shitty, underpowered experience on most of the world's devices across most of the world's networks, we are handing our enemies a gift. I can't make you care about the web, but I can suggest that if you do, you should pay attention to the real and present dangers it faces; no matter how slow-moving they appear."</p> <h3>As a Partner PM at Microsoft, what are your primary responsibilities?</h3> <p>"MSFT is a... unique... place, and I learned pretty quickly after joining that my title is more like a partner in the law or audit firm sense. It's a description of generic seniority with a specialization attached, but at the level of Partner, the specialization is mostly about "How many reports do you have?" I have none (which is good for everyone involved).</p> <p>"I do a weird job &ndash; roughly speaking, <a href="https://infrequently.org/2024/10/platforms-are-competitions/">platform strategy on behalf of the web</a>&nbsp;&ndash; and it's not one that anyone hires for. That means everyone who does this job hides out in their orgs doing something else on paper. For my 12+ years at Google, I passed as a co-TL for large-scale projects inside the web platform org, and at MSFT that's nominally a product management job. But what I care about, and what I work on regardless of which domain it's in, is in making the web a success versus its extremely potent and vicious competitors; adversaries that are threatening to extinguish it entirely on mobile.</p> <p>"An incredibly small community of people do this work. In one way or another, we've all found ourselves working in and around Chromium. That's a little disconcerting, but it also makes sense: Blink is the only engine whose funders have made space to pursue an even moderately web-forward agenda in the era of entirely proprietary mobile OSes, and the Blink Launch Process has an explicit bias towards progress when sufficient need can be demonstrated. Nobody does this work at Apple or Mozilla; the folks who work in platform strategy at Apple are entirely on the other side (trying to extinguish the web, often weaponizing standards and standards-adjacent processes in the process) and Mozilla... well, the less said the better.</p> <p>"So what the heck does that have to do with performance?</p> <p>"First, I help lead an effort called Project Sidecar within the Edge team. We're a virtual team of volunteers that consult with anyone in the company that wants help with the web. That is a general-purpose offer, and our goal is to learn about problems that folks are experiencing all over the system, but today the effort mostly focuses on performance because of the dire place that many teams find themselves in. Large swaths of our org bought into the dogmas and prescriptions of the current JavaScript community, and that's just a recipe for pain whenever React is involved.&nbsp;</p> <p>"Next, I keep the flame alive for a rebirth of the mobile web. Microsoft isn't heavily invested in that future today, but they let me work on it in ways that I think will matter.</p> <p>"Lastly, a huge fraction of Edge's UI surfaces are web-based. Improving our own understanding of, and alignment with, the modern web is a surefire way to make Edge a faster, more competitive product offering for users on devices across the spectrum. And making things great for users at the margins is what I care most about."</p> <h3>You launched the 'Performance Inequality Gap' series in 2017 and have consistently provided updates since then. What is the outlook for 2025?</h3> <p>"Decidedly mixed. Apologies for the screenshots of SVG charts, but it helps to tell the story visually.</p> <p>"We're starting to turn the corner on process nodes filtering down from the wealthy to the less-well-off, and that was basically frozen in amber until 2022:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/img1.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Line chart showing performance per dollar for major phone manufacturers. Trend is upward, increasing steadily with a closing gap in 2024 between the segments." /></p> <p>"That nets out at improvements across the board in the past two years for perf per dollar, but not real-world performance:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/img2.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Line chart showing single-core scores over time increasing steadily, with a clear division between high-end and low-end devices." /></p> <p>"Average selling prices are also stagnant, which creates real tension. Premium buyers are still heavily segmented versus the rest of the market:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/img3.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Line chart showing that prices for phones are very stagnant, with a large gap between high-end and low-end devices." /></p> <p>"And of course the one thing that hasn't changed &ndash; and the primary reason Apple still dominates in the metrics that matter most to web performance &ndash; is that every single Android SoC vendor continues to skimp on cache sizing:</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/img4.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="Line chart showing major phone providers cache sizing over time. iPhone is an order of magnitude higher than the others." /></p> <h3>What projects are you currently involved in, and what are you most enthusiastic about?</h3> <p>"Some I can talk about, lots I can't, sadly.</p> <p>"I'm incredibly excited about <a href="https://github.com/MicrosoftEdge/MSEdgeExplainers/blob/main/PerformanceControlOfEmbeddedContent/explainer.md">the work my colleagues Nishita and Luis are doing</a> to bring some of the ideas behind "Never-Slow Mode" to a contemporary context.</p> <p>"We've experienced many teams being relatively ambivalent about performance... until they find their app embedded in the context of some other site that objects to their bulk. That interplay tends to deliver results, and the more the browser can serve as the mediator (and de-personalise the conversation) the better. So we're hoping to tier up from that work to a more expansive view of embedder and self-declared performance controls over time.</p> <p>"A ton of work has been happening in our V8 and tooling teams to facilitate better memory attribution. That's exciting to me because as teams become more advanced in their understanding of their own performance, they start to care more about these aspects. Having better tools helps there, and Sulekha Kulkarni's V8 team within Edge is doing great work to make that more legible.</p> <p>"Renewed energy around tools that will let us remove code from userland is always exciting, so I'm enthusiastic about customisable &lt;select&gt; (now that Apple has relented after a dozen years of blocking it) and energy around future-looking additions to Web Components.</p> <p>"I also think it's finally time for us to create separate read and write phases in the DOM for style readback. I need to get those ideas on paper, but I hope for some progress there this year. Exciting times."</p> <h3>Looking ahead to 2025, what do you anticipate will be the main challenges and opportunities in the field of performance?</h3> <p>"Web performance faces two main challenges today:</p> <ul> <li>&nbsp;The strength of the cult that has formed around React</li> <li>&nbsp;The failure of browser vendors to push back forcefully</li> </ul> <p>"<a href="https://www.speedcurve.com/web-performance-guide/get-started-with-core-web-vitals/">Core Web Vitals</a> are a shadow of what's possible. We need to imagine a world where browsers take the user's side much more aggressively (and always in an even-handed, privacy-preserving way). That's possible, and when browsers get there, it will do a lot to deflate the React bubble, which I think will be cathartic for businesses and developers trapped in a shockingly inefficient local minima."</p> <p><strong><em>Thank you, Alex! Your continued work on behalf of the web platform extends far beyond performance. Thank you for being such a strong voice in our community.&nbsp;</em></strong></p> <p><strong><em>Do you have someone you'd like to recognize as a Performance Hero? Let us know at support@speedcurve.com!</em></strong></p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><em><img class="blog-img" src="https://blog-img.speedcurve.com/img/539/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></em></a></p> Tue, 08 Apr 2025 00:00:00 +1200 Correlation charts: Connect the dots between site speed and business success https://www.speedcurve.com/blog/site-speed-business-correlation <p><span class="large-para">If you could measure the impact of site speed on your business, how valuable would that be for you? Say hello to correlation charts &ndash; your new best friend.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/social-world-best-correlation-chart.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>Here's the truth: <strong>The business folks in your organization probably don't care about page speed metrics.</strong> But that doesn't mean they don't care about page speed. It just means you need to talk with them using metrics they already care about &ndash; such as conversion rate, revenue, and bounce rate.</p> <p>That's why correlation charts are your new best friend.</p><h2>What is a correlation chart?</h2> <p>A correlation chart is a powerful data visualization that shows you <strong>the relationship between your page speed metrics and your business and user engagement metrics</strong>.</p> <p>Correlation charts are generated using&nbsp;<a href="https://www.speedcurve.com/features/performance-monitoring/">real user monitoring (RUM)</a> data. They give you a histogram view of all your&nbsp;user&nbsp;traffic, broken out into cohorts based on performance metrics, such as Start Render, Largest Contentful Paint, Interaction to Next Paint, and more. Each cohort shows you the median time for whatever metric you're tracking for the session. (Those cohorts are represented in the yellow columns in the chart below.)</p> <p>The next layer of the chart is where things get really interesting.</p> <p>You also get an overlay (the blue line in the chart below) that shows you the business or user engagement metric &ndash; commonly conversion rate or bounce rate, but there are many more &ndash; that correlates to each of these cohorts. This lets you see at a glance how closely your business/engagement metric aligns with the speed of your site.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/worlds-best-correlation-chart.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>As pages get slower for this site, conversion rate (predictably) decreases. The cohort of users who experienced Largest Contentful Paint times of 1.1 second also had the highest conversion rate &ndash; more than 6 percent!&nbsp;</em></p> <p>You can also see how quickly conversions drop off as LCP time degrades. At 2.5 seconds &ndash; which is Google's recommended threshold&nbsp; for LCP &ndash; the conversion rate is well under 3 percent. That's a huge drop!</p> <h2>Communicate to a broad audience</h2> <p>Correlation charts let even the most non-technical stakeholder easily see the connection between performance and the business KPIs they care about.</p> <p>In my experience with talking about performance to a&nbsp;wide variety of audiences, <strong>correlation charts can be extremely effective in winning performance buy-in from key people in your organization</strong>. Not everyone understands the nuances of Core Web Vitals. But everyone understands revenue and bounce rate.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/business-folks.jpg?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: right;"><sup><a href="https://www.freepik.com/free-photo/happy-successful-business-team-posing_6447849.htm#fromView=search&amp;page=1&amp;position=7&amp;uuid=99557297-ad29-44ec-a0a5-551616396529&amp;query=business+people">Image by pch.vector on Freepik</a></sup></p> <h2>Identify the performance plateau for your site</h2> <p>If you've ever made your pages faster but didn't see any changes in your business or user engagement metrics, you were probably frustrated &ndash; and understandably so.&nbsp;<strong>When setting page speed goals for your site, you need to understand your performance plateau. </strong>To do this, you first need to create a correlation chart.</p> <p>The&nbsp;<a href="https://www.speedcurve.com/blog/web-performance-plateau/">performance plateau</a>&nbsp;is the point at which changes to your pages' rendering metrics (such as Start Render and Largest Contentful Paint) cease to matter because you&rsquo;ve bottomed out in terms of business and user engagement metrics.&nbsp;</p> <p>In other words, if your performance metrics are on the performance plateau, making them a couple of seconds faster probably won't help your business.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/performance-plateau-clv.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>A correlation chart is an essential tool in identifying your performance plateau. For this site, the conversion rate plateaus at 2.8 seconds. To improve conversions, you would need to move more traffic to the higher-converting side of the chart &ndash; as close to 1.1 seconds as possible.</em></p> <h2>Validate your metrics</h2> <p>You don't want to waste time optimizing metrics that ultimately don't move the needle for your business or users. <strong>Correlation charts help you validate the performance metrics you're tracking and optimizing.&nbsp;</strong></p> <p>For example, when Google was in the process of evaluating Interaction to Next Paint (INP) as the new interactivity metric in Core Web Vitals, <a href="https://www.speedcurve.com/blog/INP-user-experience-correlation/">we conducted an independent analysis to validate that INP is a meaningful page speed metric</a>. (By our definition, a meaningful metric is one that can be demonstrated to affect business or user engagement KPIs.)</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/inp-vs-conversion-correlation-chart.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>In this correlation chart, the fastest INP time (48ms) correlates to a 9% conversion rate for this retail site. An INP degradation of just 50ms correlates to a 7.6% conversion rate &ndash; a significant drop!</em></p> <p>My fellow SpeedCurver Cliff Crocker looked at RUM data for several sites &ndash; and specifically focused on correlation charts for each site. Cliff determined that, yes, having a faster Interaction to Next Paint Time typically does correlate to better conversion rates. Knowing this, most people should feel confident that optimizing INP is a smart move.</p> <h2>Spot&nbsp;performance-blocking trends&nbsp;</h2> <p>You can even use correlation charts to see the relationship between page-construction metrics &ndash; like blocking JavaScript, blocking CSS, and number of image requests &ndash; with your other metrics! <strong>This lets you spot trends on your pages that could be hurting performance and your business.</strong>&nbsp;</p> <p style="text-align: center;"><img style="max-width: 1200px;" src="https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress" sizes="(max-width: 1200px) 100vw, 60vw" srcset=" https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=250&amp;auto=format,compress 250w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=682&amp;auto=format,compress 682w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=972&amp;auto=format,compress 972w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=1188&amp;auto=format,compress 1188w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=1200&amp;auto=format,compress 1200w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=1250&amp;auto=format,compress 1250w, https://blog-img.speedcurve.com/img/lux-start-render-vs-bounce-rate-02.png?w=1689&amp;auto=format,compress 1689w" alt="Load Time vs Bounce Rate" width="100%" /></p> <p>For example, in the chart above, you can see that while there are fewer blocking resources on the faster pages, this number takes a sharp upturn starting with the cohort of pages that&nbsp;have a start render time&nbsp;of&nbsp;1.1&nbsp;seconds.</p> <p>If your goal is to deliver faster start render times to more users (and 1.1 seconds is a pretty good goal to shoot for), then this might trigger you to do an audit of your pages to analyze how your scripts and stylesheets are being executed.&nbsp;</p> <h2>Get started</h2> <p>We care about more than just showing you all your real user data. We want to show you the&nbsp;<em>most important</em>&nbsp;data. And we want to make it easy for you to share that data with people throughout your organization.&nbsp;</p> <p><strong>If you&rsquo;re already a SpeedCurve RUM user:</strong>&nbsp;Simple correlation charts are available at the top of your RUM &gt; Users dashboard. We capture bounce rate by default, so you'll see a correlation chart that shows you the relationship between Start Render and bounce rate.</p> <p>You can easily <a href="https://support.speedcurve.com/docs/create-correlation-charts">create custom correlation charts</a> in your Favorites dashboard. You can also <a href="https://support.speedcurve.com/docs/conversion-rates">add your own conversion rate data</a> &ndash; as well as <a href="https://support.speedcurve.com/docs/customer-data">other data</a> like cart size and revenue.&nbsp;</p> <p>Questions? Send us a note at support@speedcurve.com.</p> <p><strong>If you're&nbsp;a SpeedCurve Synthetic user, but haven't tried RUM yet:</strong>&nbsp;Start your free trial any time! All you have to do is grab the RUM ID for your team &ndash; on the RUM page visible in the main navbar when you log in &ndash; and&nbsp;<a href="https://support.speedcurve.com/docs/setup-guide#step-5--configuring-rum">install the RUM JS snippet on your site</a>. Email us at support@speedcurve.com if you have any questions!</p> <p><strong>If you&rsquo;re not a&nbsp;SpeedCurve user: </strong><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials">Sign up for your free trial</a>&nbsp;and get these powerful charts for your own site.</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/52/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Wed, 02 Apr 2025 00:00:00 +1300 Downtime vs slowtime: Which costs you more? https://www.speedcurve.com/blog/downtime-vs-slowtime <p><span class="large-para">Comparing site outages to page slowdowns is like comparing a tire blowout to a slow leak. One is big and dramatic. The other is quiet and insidious. Either way, you end up stranded on the side of the road.</span></p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/amazon-outage.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>Downtime is horrifying for any company that uses the web as a vital part of its business (which is to say, most companies). Some of you may remember the Amazon outage of 2013, when the retail behemoth went down for 40 minutes. The incident made headlines, largely because&nbsp;<a href="https://venturebeat.com/business/amazon-website-down/">those 40 minutes were estimated to have cost the company $5 million in lost sales</a>.</p> <p>Downtime makes headlines:</p> <ul> <li>2015 &ndash; <a href="https://www.macobserver.com/news/app-store-spending-christmas-eve-new-years-eve/">12-hour Apple outage cost the company $25 million</a></li> <li>2016 &ndash; <a href="https://money.cnn.com/2016/09/07/technology/delta-computer-outage-cost/">5-hour outage caused an estimated loss of $150 million for Delta Airlines</a></li> <li>2019 &ndash; <a href="https://www.ccn.com/facebooks-blackout-90-million-lost-revenue/">14-hour outage cost Facebook an estimated $90 million</a></li> </ul> <p>It's easy to see why these stories capture our attention. These are big numbers! No company wants to think about losing millions in revenue due to an outage.&nbsp;</p> <h2>Page slowdowns can cause as much damage as downtime</h2> <p>While Amazon and other big players take pains to avoid outages, these companies also go to great effort to manage the day-to-day performance &ndash; in terms of page speed and user experience &ndash; of their sites. <strong>That&rsquo;s because these companies know that page slowdowns can cause at least as much damage as downtime.</strong></p><p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/lenny-rachitsky-quote2.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>There are three metrics that are hit hard by slow page load times:</p> <ul> <li>Abandonment rate</li> <li>Revenue</li> <li>Brand health</li> </ul> <p>Let&rsquo;s take a deeper dive into the data behind each of these metrics.</p> <h2>Visitors may be more likely to permanently abandon slow sites than unavailable sites</h2> <p>If a website is temporarily down, there&rsquo;s a reasonable chance you&rsquo;ll try again later &ndash; assuming that you&rsquo;re reasonably motivated to track down whatever it was you were interested in finding on that site.</p> <p>But if a website or app is consistently laggy (read: many popular media sites), eventually, you just sort of drift away.</p> <p>Anecdotally, this makes sense &ndash; and there&rsquo;s research to back it up.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/abandonment-slow-vs-down2.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" />In one of the only studies (if not the only study) of the impact of outages versus slowdowns on abandonment rates, Akamai found that sites that went down experienced, on average, a permanent abandonment rate of 9 percent. <strong>Sites that suffered from slow performance experienced a 28% abandonment rate.</strong></p> <p>This isn&rsquo;t to say that site outages are nothing to be concerned about. A 9% permanent abandonment rate is extremely bad for your business. But a 28% abandonment rate is even worse.</p> <h2>Slow pages could have up to 2X more impact on revenue than downtime</h2> <p>This finding comes from a study that, to the best of my knowledge, is the only study that compares revenue losses due to downtime with losses due to page slowness.</p> <p>TRAC Research surveyed 300 companies and found that the average revenue loss for an hour of downtime was $21,000. For the same set of companies, average revenue loss due to an hour of performance slowdown (which was defined as response times exceeding 4.4 seconds) was much less &ndash; just $4,100.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/average-revenue-loss-per-hour.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" />Looking at just these two sets of numbers, outages seem like a bigger source of concern. But wait.</p> <p>According to the same survey, <strong>website slowdowns occurred 10X more frequently than outages</strong>. This changes the numbers considerably.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/average-revenue-loss-total.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" />In other words, according to this research, <strong>slow-loading pages could have twice the impact on revenue that site failures do</strong>.</p> <p>Bear in mind, this is just one survey of 300 companies. The results cited here should definitely not be taken as a prediction of how your own site could fare. The most important takeaway from this study is that it forces us to ask ourselves:</p> <ul> <li>How do I calculate losses due to slowness on my site?</li> <li>How do these losses compare to downtime losses?</li> <li>Am I at risk of prioritizing one performance issue (downtime) over another equally critical issue (slowness)?</li> </ul> <h2>Slow sites may suffer more damage to brand health</h2> <p>Unless your site experiences frequent and noticeable outages, occasional failures won&rsquo;t undermine your brand. (In fact, remember back when Twitter made outages cute with the fail whale?)</p> <p>Most users accept sporadic downtime as part of the reality of using the web. They&rsquo;re less forgiving, however, if your site is routinely slow.</p> <p>First impressions matter &ndash; and they happen faster than you might think. According to <a href="https://fastspring.com/blog/first-impressions-matter-comes-website/#:~:text=We%20all%20make%20snap%20judgments,That's%200.05%20seconds.">one study</a>, <strong>we form our opinion of a website within the first 50 milliseconds</strong>. And once we&rsquo;ve formed that opinion, it colours how we feel about a site&rsquo;s credibility and usability, ultimately affecting whether or not we choose to make a purchase on that site.</p> <p>A few years ago, I directed a neuroscientific research project in which participants were asked to complete transactions on an e-commerce site using mobile devices. Some participants experienced normal speeds, while others experienced load times that were artificially throttled with a 500-millisecond network delay. Participants believed they were participating in a standard usability/brand perception study, so they had no idea that speed was a factor in the tests.</p> <p>After each set of tests, the research team conducted exit interviews with the subjects. Our subjects were asked to give their general impressions of each site and company. The results were revealing.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/fast-vs-slow-word-clouds.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p>Some participants picked up on the slight deterioration in performance (calling the slower site &ldquo;slow&rdquo; and &ldquo;sluggish&rdquo;), but those who used the slower site also developed negative perceptions of areas unrelated to speed:</p> <ul> <li>Content (&ldquo;boring&rdquo;)</li> <li>Visual design (&ldquo;tacky&rdquo; and &ldquo;confusing&rdquo;)</li> <li>Ease of navigation (&ldquo;frustrating&rdquo; and &ldquo;hard to navigate&rdquo;)</li> </ul> <p>In other words, <strong>the slower pages affected people&rsquo;s perception of three important aspects of the site that are closely aligned with brand perception</strong>.</p> <h2>Calculating the cost of "slowtime"</h2> <p>Calculating downtime loss is pretty straightforward. If your site averages $100,000 per hour in revenue, and you suffer a three-hour outage, you can estimate that you lost $300,000.</p> <p>Calculating losses due to slowdowns is not as straightforward, but you can still get an idea of what those losses might be.</p> <h3>1. Create a correlation chart for your site</h3> <p>Using your real user monitoring (RUM) data, create a <a href="https://support.speedcurve.com/docs/create-correlation-charts">correlation chart</a> for your site. A correlation chart gives you a histogram view (represented in the yellow bars in the chart below) of all your user traffic, broken out into cohorts based on performance metrics (such as Start Render and Largest Contentful Paint).</p> <p>The chart includes an overlay (represented in the blue line) that shows you a user engagement metric or business metric &ndash; such the bounce rate or conversion rate &ndash; that correlates to each of these cohorts. This lets you see at a glance the relationship between performance, user engagement, and your business.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/worlds-best-correlation-chart.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>This correlation chart shows that the highest conversion rate &ndash; slightly more than 6% &ndash; correlates with a 1.1s LCP time. As the LCP time gets slower, conversion rate worsens.&nbsp;</em></p> <h3>2. Identify the performance plateau for your site</h3> <p>The <a href="https://www.speedcurve.com/blog/web-performance-plateau/">performance plateau</a> is the point at which changes to your website&rsquo;s rendering metrics (such as Start Render and Largest Contentful Paint) cease to matter, because you&rsquo;ve bottomed out in terms of business and user engagement metrics.</p> <p>In other words, if your performance metrics are on the performance plateau, making them a couple of seconds faster probably won't help your business.</p> <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/performance-plateau-clv.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></p> <p style="text-align: center;"><em>At 2.8 seconds, the conversion rate for this site plateaus. In other words, improving LCP times within the plateau zone&nbsp; &ndash; for example, from 4 seconds to 3 seconds &ndash; will probably not help conversion rate.&nbsp;</em></p> <h3>3. Identify your cohort of users who drop off the performance plateau&nbsp;</h3> <p>Using the above data, you can easily calculate the number of users who experience the performance plateau, just by adding up all sessions in the cohorts from 2.8 seconds to 4.5 seconds.&nbsp;</p> <h3>4. Identify average customer lifetime value for your business</h3> <p>Your repeat customers are arguably your most valuable customers. That's why it's helpful to know the average customer lifetime value (CLV) for your business.</p> <p>CLV is a metric that projects the total average value of your customer based on past spending. Your accounting or finance teams will have this data. Calculating CLV can be complicated (and that complexity goes beyond the purposes of this post), but here's a simple way to approach it:</p> <ul> <li>Segment your customers based on their purchase recency, frequency, and monetary value</li> <li>Determine average order value</li> <li>Figure out average purchase frequency&nbsp;</li> <li>Calculate customer value</li> <li>Multiply customer value by average lifetime value</li> </ul> <p>For example, if you know that&nbsp;<span style="color: #000000;">the median spend of a returning customer over the past three years is $1,000, then predicted future value for the next three years is $1,000. Total customer lifetime value is $2,000.</span></p> <h3>5. Calculate the lost CLV</h3> <p>Using the stat that 28% of the customers who fall off your performance plateau will permanently abandon a site that is consistently slow, identify the lost CLV.</p> <h3>Example CLV calculation</h3> <p>For example:</p> <ul> <li>If the median value of a returning customer over the past three years is $1,000, then predicted future value for the next three years is $1,000.&nbsp;</li> <li>Your current converting user base is 100,000 customers. They have a collective CLV of $200 million. Their projected collective spend over the next three years is $100 million.</li> <li>10% of those customers (10,000) experience Largest Contentful Paint times at the poor end of the performance plateau.</li> <li>28% of those customers (2,800) will not return.</li> <li><strong>Your projected lost CLV is $2.8 million.</strong></li> </ul> <p>As said, this is a simplistic calculation, but it's a good starting point to calculate your own formula that you can use for your site and your users.</p> <p>Also note that this formula focuses only on lost CLV. It doesn't consider the immediate lost revenue from customers who abandon their transaction due to slowness.&nbsp;</p> <h2>Preventing outages is just one piece of the performance pie</h2> <p>If your business is reliant on your site, then you most definitely should care about preventing outages. You should, of course, conduct load testing and availability testing, and you should have effective load balancing and failover systems in place wherever possible.</p> <p>But protecting your site from failure is just one piece of the performance pie. It&rsquo;s a big piece, to be sure, but there are others. You also need to:</p> <ul> <li><strong>Track</strong> your site&rsquo;s performance using synthetic monitoring (AKA lab testing) and real user monitoring (AKA field data)</li> <li><strong>Correlate</strong> performance metrics (such as Start Render, LCP, INP) with business and user engagement metrics (conversions, bounce rate, etc.) using your real user monitoring tool</li> <li><strong>Integrate</strong>&nbsp;synthetic&nbsp;testing with your CI/CD process to catch regressions in your staging environment</li> <li><strong>Create</strong> performance budgets to get real-time alerts when key pages slow down</li> <li><strong>Drill down</strong>&nbsp;into your synthetic/lab data to resolve performance issues as they occur</li> <li><strong>Look</strong> for opportunities to further optimize your pages (hint: images and third parties are a great place to start)</li> </ul> <p>SpeedCurve lets you fight regressions from multiple angles of attack, so you can keep your site fast and your users happy &ndash; and your business successful.&nbsp;<a href="https://www.speedcurve.com/signup/">Give us a try!</a></p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/538/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Tue, 18 Mar 2025 00:00:00 +1300 NEW! Synthetic test agent updates: Chrome, Firefox and Lighthouse https://www.speedcurve.com/blog/new-synthetic-test-agent-updates-chrome-and-lighthouse <p><img class="blog-img" src="https://blog-img.speedcurve.com/img/536/logos.gif?auto=format,compress&amp;fit=max&amp;w=2000" alt="Logos for Chrome, Firefox and Lighthouse" /></p> <p>This month, we've made some updates to our synthetic testing agents. In addition to upgrading the underlying operating system, we've added support for:</p> <ul> <li>Lighthouse 12.3.0 (previously 10.4.0)</li> <li>Chrome 133 (previously 126)</li> <li>Firefox 135 (previously 128)</li> </ul><h2>What has changed?</h2> <p>We understand the sensitivity related to changes in your performance data.</p> <p>Synthetic updates are known to cause baseline changes due to hardware changes, browser optimization or in the case of Lighthouse, changes to the methodology.</p> <p>Here is a rundown of what's changed in this update:</p> <h3>Chrome</h3> <p>Moving from Chrome 126 to 133 should not have a huge impact on your metrics.</p> <p>As of Chrome 130, <a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/speed/metrics_changelog/2024_10_lcp.md#exclude-transparent-text-from-lcp">transparent text is no longer eligible to be considered for Largest Contentful Paint</a>&nbsp;(LCP) but this change doesn't appear to affect a larger number of sites.&nbsp;<br /><br />There were a <a href="https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/speed/metrics_changelog/inp.md">number of updates to Chrome</a>, which may affect Interaction to Next Paint (INP) introduced between 126 and 130, but as we don't measure INP with synthetic, there is no impact to your metrics (only your RUM data).</p> <h3><span style="color: #1f1f1f; font-size: 17px; font-weight: 400;">scheduler.yield was introduced in Chrome 129 and this may reduce Total Blocking Time (TBT) for some sites.</span></h3> <h3>Firefox</h3> <p>There was no identified impact to metrics between versions 128-135.</p> <p>See full release history <a href="https://www.mozilla.org/en-US/firefox/releases/">here</a>.&nbsp;</p> <h3>Lighthouse</h3> <p>There were no significant changes to the Performance category of Lighthouse.</p> <p>However, there were several updates to the Accessibility and SEO categories that included new audits and improved weighting. Additionally, the PWA category has been removed entirely.</p> <p>You can learn more about those changes from the resources below:</p> <ul> <li><a href="https://developer.chrome.com/blog/lighthouse-11-0/">What's new in Lighthouse 11</a></li> <li><a href="https://github.com/googlechrome/lighthouse/releases">Lighthouse 12.3.0 release notes</a></li> <li><a href="https://github.com/GoogleChrome/lighthouse/compare/v10.4.0...v12.3.0">Change log comparison between 12.3.0 and 10.4.0</a></li> </ul> <h3>OS update</h3> <p>The operating system our agents use has been upgraded to Ubuntu 24.04. This upgrade was overdue and will allow us to rollout updates to our agent more quickly in the future.<br /><br />The OS update has had an impact on some metrics, and during extensive testing, we've observed that Total Blocking Time (TBT) has improved due to this change.</p> <h2>Impact on metrics</h2> <p>To provide a baseline when upgrading browsers, Lighthouse, or other components of our agents, we regularly measure the speed of more than 200 sites in both our production and pre-production environments.&nbsp;</p> <p>During this upgrade, we've found that most metrics have remained reasonably consistent between the new and existing versions of the agent, but that Total Blocking Time (TBT) has improved significantly.</p> <p>Across the corpus of sites we're testing, we've observed that <strong>Total Blocking Time (TBT) has improved by&nbsp;approximately 16%</strong> at the 75th percentile.&nbsp;</p> <p>After investigating, we've identified this improvement is due to the OS upgrade to Ubuntu 22.04</p> <p>Largest Contentful Paint (LCP) and Cumulative Layout Shift (CLS) have remained largely unchanged.</p> <h2>What should you do next?</h2> <p>Our observations on how the upgrade affects metrics are based on the sites in our test corpus, and every site is different.<br /><br /><strong>While Total Blocking Time might be the only expected change, there is always a chance your metrics will change based on the optimizations discussed above.</strong><br /><br />Over the next few weeks, we recommend reviewing your performance budgets and checking that they are still appropriate for your site and then adjusting them if necessary.<br /><br />This is a practice we recommend doing on a regular basis as part of a <strong>'get fast, stay fast' methodology</strong>, which you can learn more about in our <a href="https://www.speedcurve.com/web-performance-guide/complete-guide-performance-budgets/">Web Performance Guide to Performance Budgets</a>.&nbsp;</p> <h2>Private agents</h2> <p>For customers who host their own <a href="https://support.speedcurve.com/docs/private-agents">private SpeedCurve agents</a>: We're planning to release an updated version of the Docker container in the next few weeks.</p> <p>If you have any questions about the upgrade, its impact on your metrics, or any questions about SpeedCurve in general, you can reach us at support@speedcurve.com.</p> <p><a href="https://www.speedcurve.com/signup/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=blog-trials"><img class="blog-img" src="https://blog-img.speedcurve.com/img/536/customer-logos-free-trial-banner.png?auto=format,compress&amp;fit=max&amp;w=2000" alt="" /></a></p> Sun, 02 Mar 2025 00:00:00 +1300