<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Request Metrics</title>
    <description>The latest articles on Forem by Request Metrics (@requestmetrics).</description>
    <link>https://forem.com/requestmetrics</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F3084%2F12f6c095-d685-4fbd-86d6-155e79fd7d91.png</url>
      <title>Forem: Request Metrics</title>
      <link>https://forem.com/requestmetrics</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/requestmetrics"/>
    <language>en</language>
    <item>
      <title>Why Your Perfect Lighthouse Score Doesn't Mean Your Site is Fast</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Thu, 05 Jun 2025 15:46:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/why-your-perfect-lighthouse-score-doesnt-mean-your-site-is-fast-57b8</link>
      <guid>https://forem.com/requestmetrics/why-your-perfect-lighthouse-score-doesnt-mean-your-site-is-fast-57b8</guid>
      <description>&lt;p&gt;Great Lighthouse scores, but users still complain your site is slow? You're not alone.&lt;/p&gt;

&lt;p&gt;Here's a shocking reality check: &lt;strong&gt;Google's research found that 50% of websites with perfect Lighthouse scores still fail Core Web Vitals when measured with real user data.&lt;/strong&gt; Half!&lt;/p&gt;

&lt;p&gt;That means half the developers celebrating perfect synthetic scores are actually delivering poor performance to their real users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Synthetic Testing
&lt;/h2&gt;

&lt;p&gt;Lighthouse and PageSpeed Insights run in perfect, controlled environments. They simulate an "85th percentile user" — but their simulation is usually wrong for your specific audience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Real-world variables synthetic tests miss:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network packet loss and latency spikes&lt;/li&gt;
&lt;li&gt;Device thermal throttling during extended use&lt;/li&gt;
&lt;li&gt;Background apps competing for resources
&lt;/li&gt;
&lt;li&gt;Browser extensions affecting performance&lt;/li&gt;
&lt;li&gt;User behavior patterns (scrolling, multitasking)&lt;/li&gt;
&lt;li&gt;Third-party vendor outages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your developer-focused B2B app has completely different users than a consumer social platform, but Lighthouse treats them the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Real User Monitoring Actually Shows You
&lt;/h2&gt;

&lt;p&gt;Real User Monitoring (RUM) collects performance data from actual user sessions as they happen. Instead of guessing what your users experience, RUM shows you the reality.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RUM catches problems synthetic testing misses:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔍 &lt;strong&gt;Dynamic content issues&lt;/strong&gt; - Your personalization engine might be fast for new users but slow for power users with complex data&lt;/p&gt;

&lt;p&gt;📱 &lt;strong&gt;Device-specific problems&lt;/strong&gt; - That Android phone model struggling with your animations  &lt;/p&gt;

&lt;p&gt;💰 &lt;strong&gt;Business-critical scenarios&lt;/strong&gt; - Your checkout flow performing poorly during Black Friday traffic spikes&lt;/p&gt;

&lt;p&gt;🌍 &lt;strong&gt;Geographic variations&lt;/strong&gt; - Users in different regions experiencing network infrastructure problems&lt;/p&gt;

&lt;h2&gt;
  
  
  The Complete Strategy
&lt;/h2&gt;

&lt;p&gt;Don't abandon synthetic testing — use both tools strategically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; Use Lighthouse to catch obvious issues before shipping&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production:&lt;/strong&gt; Use RUM to see what actually needs fixing for real users
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigation:&lt;/strong&gt; When RUM spots problems, use synthetic testing to understand why&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation:&lt;/strong&gt; Confirm your fixes actually help real users with RUM&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why This Matters for Your Career
&lt;/h2&gt;

&lt;p&gt;Understanding real user performance isn't just about better metrics — it's about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixing problems that actually cost revenue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritizing work based on real user impact&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Making data-driven performance decisions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building faster experiences users actually notice&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;The fastest way to see the gap between your synthetic scores and real user experience? Install Real User Monitoring and prepare to be surprised by what you discover.&lt;/p&gt;

&lt;p&gt;Most developers find performance issues they never knew existed within their first week of real user monitoring.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want the full deep-dive? I wrote a comprehensive guide covering everything from RUM implementation to business impact analysis: &lt;a href="https://requestmetrics.com/web-performance/you-need-rum-to-understand-web-perf/" rel="noopener noreferrer"&gt;Why You Need Real User Monitoring to Really Understand Your Web Performance&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What's been your experience with synthetic vs. real user performance? Have you found gaps between your Lighthouse scores and actual user complaints? Share your stories in the comments! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>javascript</category>
      <category>performance</category>
    </item>
    <item>
      <title>HTTP Caching Deep Dive: Performance Optimization Patterns Every Developer Should Know</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Fri, 28 Feb 2025 17:00:08 +0000</pubDate>
      <link>https://forem.com/requestmetrics/http-caching-deep-dive-performance-optimization-patterns-every-developer-should-know-330e</link>
      <guid>https://forem.com/requestmetrics/http-caching-deep-dive-performance-optimization-patterns-every-developer-should-know-330e</guid>
      <description>&lt;p&gt;As web developers, we're often so focused on writing clean code that we overlook one of the most powerful performance tools at our disposal: HTTP caching. Let's explore some advanced caching patterns that can dramatically improve your application's performance without writing a single line of JavaScript.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Caching Mindset Shift 🧠
&lt;/h2&gt;

&lt;p&gt;Most performance optimization starts with the wrong question: "How can I make my site faster?" The better question is: "How can I avoid sending data altogether?" HTTP caching answers this beautifully.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# The magical one-liner that can cut load times in half
Cache-Control: public, max-age=31536000, immutable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simple header can transform your application's performance profile by telling browsers, "Don't even ask for this file again for a year."&lt;/p&gt;

&lt;p&gt;We recently wrote a &lt;a href="https://requestmetrics.com/web-performance/http-caching/" rel="noopener noreferrer"&gt;comprehensive guide to HTTP caching headers&lt;/a&gt; that breaks down the complete specification into practical recipes, but let's focus on some developer-specific implementation patterns here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resource-Specific Caching Strategies
&lt;/h2&gt;

&lt;p&gt;Not all resources are created equal. Strategic caching requires different approaches for different asset types:&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Assets (CSS/JS/Images)
&lt;/h3&gt;

&lt;p&gt;These should be cached aggressively with versioned filenames:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# Your browser's equivalent of "I'll remember this forever"
Cache-Control: public, max-age=31536000, immutable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;immutable&lt;/code&gt; directive is particularly powerful - it tells browsers not to revalidate the resource during page refresh, eliminating unnecessary network requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  HTML Documents
&lt;/h3&gt;

&lt;p&gt;These need more careful handling:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# Short cache time with validation
Cache-Control: public, max-age=300, must-revalidate
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cache Validation: The Unsung Hero
&lt;/h2&gt;

&lt;p&gt;While most developers focus on cache duration, validation headers are equally important. They determine what happens when cache expires:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;# Response includes:
ETag: "123abc987654"

# Later browser request includes:
If-None-Match: "123abc987654"

# Server responds with 304 Not Modified (no body!)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This validation dance is pure magic - your server sends only HTTP headers instead of full responses when content hasn't changed!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cache-Busting: The Deployment Superpower
&lt;/h2&gt;

&lt;p&gt;When you deploy changes, you need to invalidate caches. The cleanest approach is content-hashed filenames:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;styles.d41d8cd98f.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pattern enables aggressive caching while ensuring users always get the latest version after deploys. Most build tools (Webpack, Rollup, Parcel) handle this automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Pitfalls to Avoid
&lt;/h2&gt;

&lt;p&gt;I've seen these mistakes cause serious performance issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Over-caching dynamic content&lt;/strong&gt; - Accidentally caching personalized content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Under-caching static assets&lt;/strong&gt; - Missing massive performance gains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The dreaded &lt;code&gt;no-store&lt;/code&gt; directive&lt;/strong&gt; - Forcing full downloads on every page load&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confusing &lt;code&gt;no-cache&lt;/code&gt; with "don't cache"&lt;/strong&gt; - It actually means "revalidate before using"&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Real-World Impact
&lt;/h2&gt;

&lt;p&gt;On a recent project, implementing proper HTTP caching reduced page load times by 67% and cut bandwidth usage in half. The best part? It took just 30 minutes to configure.&lt;/p&gt;

&lt;p&gt;Remember: The fastest HTTP request is the one you never make. Proper caching ensures you only download what's necessary, when it's necessary.&lt;/p&gt;

&lt;p&gt;Want to learn more about HTTP caching? Check out our &lt;a href="https://requestmetrics.com/web-performance/http-caching/" rel="noopener noreferrer"&gt;comprehensive guide on Request Metrics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What caching strategies have you implemented in your projects? Share your experiences in the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>http</category>
      <category>caching</category>
    </item>
    <item>
      <title>GTMetrix Alternatives: Better Ways to Measure Web Performance</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Wed, 26 Feb 2025 16:46:35 +0000</pubDate>
      <link>https://forem.com/requestmetrics/gtmetrix-alternatives-better-ways-to-measure-web-performance-3cl6</link>
      <guid>https://forem.com/requestmetrics/gtmetrix-alternatives-better-ways-to-measure-web-performance-3cl6</guid>
      <description>&lt;p&gt;For years, GTMetrix was a go-to tool for checking website speed. But here’s the thing—&lt;strong&gt;paying for synthetic tests doesn’t make sense anymore&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;You’ve probably seen it before: GTMetrix tells you your site is fast, but your users are still complaining about slow load times. &lt;strong&gt;That’s because synthetic tests don’t tell the whole story&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;If you’re serious about web performance, you need &lt;strong&gt;more than just lab data&lt;/strong&gt;. That’s why we put together a &lt;a href="https://requestmetrics.com/web-performance/gtmetrix-alternatives/" rel="noopener noreferrer"&gt;full breakdown of the best GTMetrix alternatives&lt;/a&gt;—so you can find a tool that actually helps &lt;strong&gt;real visitors&lt;/strong&gt; experience a faster site.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Synthetic Tests Alone Aren’t Enough
&lt;/h2&gt;

&lt;p&gt;Synthetic tests, like the ones GTMetrix runs, generate &lt;strong&gt;lab-based results&lt;/strong&gt; in a controlled environment. That’s useful, but it &lt;strong&gt;doesn’t reflect how real users experience your site&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;A real-world user might:&lt;br&gt;&lt;br&gt;
✅ Load your site on a &lt;strong&gt;slow mobile network&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Have &lt;strong&gt;third-party scripts&lt;/strong&gt; blocking content&lt;br&gt;&lt;br&gt;
✅ Experience &lt;strong&gt;delayed interactions&lt;/strong&gt; because of render-blocking resources  &lt;/p&gt;

&lt;p&gt;If you’re &lt;strong&gt;only&lt;/strong&gt; looking at synthetic test scores, you might think your site is fine—when, in reality, your users are struggling.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Better Approach: Synthetic + Real User Monitoring (RUM)
&lt;/h2&gt;

&lt;p&gt;Modern performance tools &lt;strong&gt;combine synthetic tests with Real User Monitoring (RUM) and Google’s CrUX data&lt;/strong&gt; to give you &lt;strong&gt;a complete picture&lt;/strong&gt; of your site’s speed.  &lt;/p&gt;

&lt;p&gt;Here’s what each method measures:&lt;br&gt;&lt;br&gt;
🛠 &lt;strong&gt;Synthetic Testing&lt;/strong&gt; – Lab-based speed tests in a controlled environment&lt;br&gt;&lt;br&gt;
👥 &lt;strong&gt;Real User Monitoring (RUM)&lt;/strong&gt; – Performance data from &lt;strong&gt;actual visitors&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
📊 &lt;strong&gt;Chrome UX Report (CrUX)&lt;/strong&gt; – Aggregated Core Web Vitals from real Chrome users  &lt;/p&gt;

&lt;h2&gt;
  
  
  Best GTMetrix Alternatives Right Now
&lt;/h2&gt;

&lt;p&gt;If you want &lt;strong&gt;free&lt;/strong&gt; synthetic testing, you’re in luck—better tools exist:  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. PageSpeed Insights (Free &amp;amp; Simple)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhye6cyyf6180f4iay8b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhye6cyyf6180f4iay8b7.png" alt="PageSpeed Insights" width="800" height="938"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Free and easy to use&lt;br&gt;&lt;br&gt;
✅ Uses &lt;strong&gt;Google’s Core Web Vitals data&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
❌ No real user tracking  &lt;/p&gt;




&lt;h3&gt;
  
  
  2. WebPageTest (Advanced &amp;amp; Free)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54ued52oyv6apig0iptk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54ued52oyv6apig0iptk.png" alt="WebPageTest" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Advanced synthetic testing&lt;br&gt;&lt;br&gt;
✅ Test from &lt;strong&gt;multiple locations &amp;amp; devices&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
❌ No real user data, can be slow to run  &lt;/p&gt;




&lt;h3&gt;
  
  
  3. Request Metrics (RUM + Synthetic)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5wlpr5fg2ddagluqfta.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk5wlpr5fg2ddagluqfta.png" alt="Request Metrics" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Real User Monitoring + Synthetic Testing&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Live Core Web Vitals tracking&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Free plan available  &lt;/p&gt;

&lt;p&gt;💰 &lt;strong&gt;$88/month for full monitoring&lt;/strong&gt;  &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Learn more:&lt;/strong&gt; &lt;a href="https://requestmetrics.com/" rel="noopener noreferrer"&gt;Request Metrics&lt;/a&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  4. Pingdom ($130/mo)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44pgbevw40h7a5gi5m3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44pgbevw40h7a5gi5m3q.png" alt="Pingdom" width="650" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Uptime monitoring + RUM&lt;br&gt;&lt;br&gt;
❌ Limited synthetic testing  &lt;/p&gt;




&lt;h3&gt;
  
  
  5. Catchpoint (Enterprise)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9aboisee64pa03w5xy2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9aboisee64pa03w5xy2d.png" alt="Catchpoint" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;✅ Enterprise-grade &lt;strong&gt;synthetic + RUM&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ Deep historical tracking&lt;br&gt;&lt;br&gt;
❌ Expensive  &lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;GTMetrix was great when it was free, but &lt;strong&gt;paying for one-off synthetic tests just doesn’t make sense anymore&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;If you want a &lt;strong&gt;quick performance check&lt;/strong&gt;, use &lt;strong&gt;PageSpeed Insights&lt;/strong&gt; or &lt;strong&gt;WebPageTest&lt;/strong&gt;. But if you care about &lt;strong&gt;real user experience, Core Web Vitals, and SEO&lt;/strong&gt;, you need &lt;strong&gt;RUM + synthetic data&lt;/strong&gt; from tools like &lt;strong&gt;Request Metrics&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Read the full breakdown here:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://requestmetrics.com/web-performance/gtmetrix-alternatives/" rel="noopener noreferrer"&gt;GTMetrix Alternatives: The Best Tools for Website Performance&lt;/a&gt;  &lt;/p&gt;

</description>
      <category>webperf</category>
      <category>seo</category>
      <category>developers</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>How to Optimize Website Images for Faster Load Times</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Wed, 05 Feb 2025 16:24:40 +0000</pubDate>
      <link>https://forem.com/requestmetrics/how-to-optimize-website-images-for-faster-load-times-4m0d</link>
      <guid>https://forem.com/requestmetrics/how-to-optimize-website-images-for-faster-load-times-4m0d</guid>
      <description>&lt;p&gt;Images make the web more engaging, but they’re also &lt;strong&gt;one of the biggest performance killers&lt;/strong&gt;. A bloated, unoptimized image can slow down your site, tank your SEO, and drive users away. If you care about Core Web Vitals, conversion rates, or just having a &lt;strong&gt;fast&lt;/strong&gt; website, you need to optimize your images properly.  &lt;/p&gt;

&lt;p&gt;Here’s how to do it right.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Pick the Right Image Format&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Not all image formats are created equal. Using the wrong one can &lt;strong&gt;massively&lt;/strong&gt; bloat your file sizes:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JPG&lt;/strong&gt; – Best for photographs. Uses lossy compression for smaller files but loses some detail.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt; – Best for graphics, icons, and images with transparency. Lossless, but can be large.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebP&lt;/strong&gt; – A modern replacement for JPG and PNG. Smaller file sizes with high quality.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AVIF&lt;/strong&gt; – Even better compression than WebP, but not fully supported everywhere yet.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Best practice:&lt;/strong&gt; Use JPG/PNG for source files and serve WebP/AVIF using a CDN for modern browsers.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;2. Compress Images Without Destroying Quality&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Large images are slow images. Reduce their size using &lt;strong&gt;lossy or lossless compression&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lossy compression&lt;/strong&gt; (JPG, WebP, AVIF) removes detail to shrink file size.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lossless compression&lt;/strong&gt; (PNG, WebP) keeps quality but is less efficient.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Use tools like &lt;a href="https://tinypng.com/" rel="noopener noreferrer"&gt;TinyPNG&lt;/a&gt; or &lt;a href="https://github.com/imagemin/imagemin" rel="noopener noreferrer"&gt;ImageMin&lt;/a&gt; to compress images before uploading them.  &lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Lazy-Load Below-the-Fold Images&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Why load images that aren’t visible yet? Lazy-loading defers their download until needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image.jpg"&lt;/span&gt; &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Lazy-loaded image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the page fast and prevents Largest Contentful Paint (LCP) delays.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Serve Responsive Images
&lt;/h2&gt;

&lt;p&gt;Different devices need different image sizes. Avoid serving a giant desktop image to mobile users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;source&lt;/span&gt; &lt;span class="na"&gt;srcset=&lt;/span&gt;&lt;span class="s"&gt;"image-700.jpg 700w, image-1200.jpg 1200w"&lt;/span&gt; &lt;span class="na"&gt;sizes=&lt;/span&gt;&lt;span class="s"&gt;"100vw"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;img&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"image-1200.jpg"&lt;/span&gt; &lt;span class="na"&gt;alt=&lt;/span&gt;&lt;span class="s"&gt;"Responsive image"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser picks the best size for the user’s screen, reducing wasteful downloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Optimize for Mobile
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Resize images to fit mobile screens instead of shrinking huge ones with CSS.&lt;/li&gt;
&lt;li&gt;Adjust aspect ratios for better layout on small screens.&lt;/li&gt;
&lt;li&gt;Use a mobile-friendly CDN for fast delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Optimizing images isn’t just about making files smaller—it’s about making your website faster, smoother, and better for users.&lt;/p&gt;

&lt;p&gt;🚀 Want to go deeper? Read the &lt;a href="https://requestmetrics.com/web-performance/high-performance-images/" rel="noopener noreferrer"&gt;full guide to image optimization for the web here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>seo</category>
      <category>images</category>
    </item>
    <item>
      <title>How to Fix Long Animation Frames (LoAFs) and Speed Up Your Website</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Fri, 18 Oct 2024 15:30:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/how-to-fix-long-animation-frames-loafs-and-speed-up-your-website-nm1</link>
      <guid>https://forem.com/requestmetrics/how-to-fix-long-animation-frames-loafs-and-speed-up-your-website-nm1</guid>
      <description>&lt;p&gt;If your website has been feeling sluggish or unresponsive, there's a good chance it's suffering from &lt;strong&gt;Long Animation Frames (LoAFs)&lt;/strong&gt;. LoAFs happen when the browser takes too long to process an animation frame, leading to visual stuttering, delayed interactions, or a general feeling of “jankiness.” In my latest posts, I dive into the details of &lt;a href="https://requestmetrics.com/web-performance/long-animation-frame-loaf/" rel="noopener noreferrer"&gt;what are Long Animation Frames&lt;/a&gt;, why they matter, and very importantly, &lt;a href="https://requestmetrics.com/web-performance/fixing-long-animation-frame-loaf/" rel="noopener noreferrer"&gt;how to fix LoAFs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://requestmetrics.com/web-performance/long-animation-frame-loaf/" rel="noopener noreferrer"&gt;What are Long Animation Frames (LoAFs)?**&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;When your site processes user interactions, it draws each visual change in what’s called a &lt;strong&gt;frame&lt;/strong&gt;. A smooth experience usually means rendering around 20 frames per second. To achieve this, the browser has about 50 milliseconds to handle everything—JavaScript execution, DOM updates, layout recalculations, and more. When these tasks take longer than 50ms, the browser considers it a &lt;strong&gt;Long Animation Frame&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result? Your site feels sluggish and unresponsive to users. Every time the browser struggles to render a frame, animations stutter and the site feels “frozen.” LoAFs are particularly bad for mobile users, where less powerful hardware struggles even more with rendering. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do LoAFs Matter for Your Site?
&lt;/h2&gt;

&lt;p&gt;The real problem with LoAFs is how they affect &lt;strong&gt;user experience&lt;/strong&gt;, &lt;strong&gt;accessibility&lt;/strong&gt;, and even your &lt;strong&gt;search engine rankings&lt;/strong&gt;. LoAFs contribute directly to poor &lt;strong&gt;&lt;a href="https://requestmetrics.com/web-performance/inp-interaction-to-next-paint/" rel="noopener noreferrer"&gt;Interaction to Next Paint (INP)&lt;/a&gt;&lt;/strong&gt; scores, one of the critical metrics in Google’s &lt;strong&gt;&lt;a href="https://requestmetrics.com/core-web-vitals/" rel="noopener noreferrer"&gt;Core Web Vitals&lt;/a&gt;&lt;/strong&gt;. INP measures how long it takes for your site to respond to user inputs like clicking or typing. If your INP score is bad, it indicates long delays in interactions—which LoAFs are a direct contributor to.&lt;/p&gt;

&lt;p&gt;Since Core Web Vitals play a role in your site’s &lt;strong&gt;SEO ranking&lt;/strong&gt;, fixing LoAFs not only improves performance but also gives your site a better shot at ranking higher on Google.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Track and Fix LoAFs
&lt;/h2&gt;

&lt;p&gt;In my post, I break down how to track and fix LoAFs, starting with some of the key tools available. Tools like &lt;strong&gt;Request Metrics&lt;/strong&gt;, &lt;strong&gt;Chrome DevTools&lt;/strong&gt;, and &lt;strong&gt;Google’s web-vitals.js&lt;/strong&gt; library can all be used to track LoAFs in both &lt;strong&gt;lab environments&lt;/strong&gt; and &lt;strong&gt;real user monitoring (RUM)&lt;/strong&gt; scenarios.&lt;/p&gt;

&lt;p&gt;One of the most effective ways to fix LoAFs is by focusing on &lt;strong&gt;JavaScript execution&lt;/strong&gt;. Long-running JavaScript tasks block the browser’s main thread and cause delays in rendering frames. To fix this, you can break up long tasks into smaller chunks using techniques like &lt;code&gt;setTimeout&lt;/code&gt; to distribute work across multiple frames.&lt;/p&gt;

&lt;p&gt;Another major cause of LoAFs is &lt;strong&gt;forced synchronous layouts&lt;/strong&gt;, where a script forces the browser to recalculate the layout after every DOM change. This creates additional work that slows down rendering. Fixing this involves batching DOM reads and writes together to avoid recalculating the layout multiple times in a single frame.&lt;/p&gt;

&lt;p&gt;Lastly, for sites built using &lt;strong&gt;Single Page Applications (SPAs)&lt;/strong&gt; like React or Vue, LoAFs can be particularly challenging. SPAs tend to rely heavily on JavaScript for UI updates and transitions, which can easily trigger long frames if not optimized properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ready to Toast Your LoAFs?
&lt;/h3&gt;

&lt;p&gt;If you want to dive deeper into the technical details and practical strategies for reducing LoAFs on your site, check out the full post:&lt;br&gt;&lt;br&gt;
&lt;a href="https://requestmetrics.com/web-performance/fixing-long-animation-frame-loaf/" rel="noopener noreferrer"&gt;&lt;strong&gt;How to Fix Long Animation Frames and Improve Your Website&lt;/strong&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;You’ll learn all about the tools, tactics, and best practices for keeping your site running buttery smooth, with fewer LoAFs and faster interactions!&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>performance</category>
      <category>corewebvitals</category>
    </item>
    <item>
      <title>What is a 'Rage Click'?</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Tue, 29 Aug 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/what-is-a-rage-click-l80</link>
      <guid>https://forem.com/requestmetrics/what-is-a-rage-click-l80</guid>
      <description>&lt;p&gt;You know that thing where you are so angry at a broken website that you furiously click that button until it does what you want? Yea, we all do that. It's called a "Rage Click".&lt;/p&gt;

&lt;p&gt;It's also a fantastic way to detect user frustration.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Rage Click?
&lt;/h2&gt;

&lt;p&gt;A rage click is when a user repeatedly clicks on an element of a website or application out of frustration or annoyance, typically due to difficulty completing a task or finding information. It can indicate poor &lt;a href="https://en.wikipedia.org/wiki/User_experience" rel="noopener noreferrer"&gt;user experience design&lt;/a&gt; and lead to low engagement, negatively affecting a website's performance.&lt;/p&gt;

&lt;p&gt;Rage clicks suggest that the user is encountering misleading elements or experiencing usability issues on the website. These frustrating experiences can include dead links, broken elements, &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance/?utm_source=devto" rel="noopener noreferrer"&gt;slow web performance&lt;/a&gt;, or confusing design choices. By analyzing rage clicks, you can spot problem areas and improve customer experience, engagement, and even conversion rates.&lt;/p&gt;

&lt;p&gt;Understanding these usability issues is important because they are a powerful signal of user frustration. They highlight areas where the website doesn't meet user expectations. It allows you to optimize the user experience by fixing broken links, improving load times, enhancing usability, and streamlining navigation. It gives you a road map to boost customer satisfaction, improve conversion rates, and ultimately drive better business results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Do My Users Rage Click?
&lt;/h2&gt;

&lt;p&gt;Users rage click on a website when they find confusing things that slow them down, get in the way, or cause frustration. Poor user interface, slow loading times, broken links or buttons, unresponsive websites, difficulty completing tasks, and lack of clarity are the primary reasons for rage clicking. A confusing or cluttered user interface can lead to user frustration, as it makes it difficult for them to navigate and find what they are looking for.&lt;/p&gt;

&lt;p&gt;Slow web performance and loading times can trigger rage clicking, as users expect fast and seamless browsing experiences. Broken links or buttons that do not work as expected can be extremely frustrating, especially when users are trying to access important information or complete a task.&lt;/p&gt;

&lt;p&gt;Unresponsive websites, where interactive elements or buttons do not respond promptly to user input, can also trigger rage clicking. Difficulty completing tasks, such as a complicated checkout process or unclear instructions, can further exacerbate user frustration and lead to rage clicks. This unresponsiveness is measured by one of &lt;a href="https://requestmetrics.com/web-performance/monitoring-core-web-vital/?utm_source=devto" rel="noopener noreferrer"&gt;Google's Core Web Vital Metrics&lt;/a&gt;, the Interaction to Next Paint, or INP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are Rage Clicks so Bad?
&lt;/h2&gt;

&lt;p&gt;Rage clicks indicate a problem for both your website and your business. These events point towards a bad user experience and can lead to reduced user engagement, lower conversions, and ultimately hinder the overall success of a business.&lt;/p&gt;

&lt;p&gt;When users experience frustration and resort to rage clicking, it indicates a breakdown in the user's journey. Instead of smoothly navigating through a website, users encounter obstacles such as broken links, unresponsive buttons, or confusing elements. This creates a negative user experience that increases the likelihood of high bounce rates, where users leave a website without taking any desired actions.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: Define and track your important user journeys with funnels: a series of steps that you want your users to take. Funnels allow you to measure the effectiveness of your site, and understand which users fail to complete their journey--and why!&lt;/p&gt;




&lt;h2&gt;
  
  
  How Do I Track Rage Clicks?
&lt;/h2&gt;

&lt;p&gt;Rage clicks are super frustrating for both the user, and for you, the developer. They indicate usability issues and can negatively impact the overall user experience. If left unaddressed, rage clicks can lead to lower engagement and reduced conversion rates.&lt;/p&gt;

&lt;p&gt;There are two ways to track user rage clicks:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Session Replay Tools
&lt;/h3&gt;

&lt;p&gt;Session replay tools like Fullstory or Hotjar can point out when rage clicks and dead clicks are happening in a recording of the user's session. These videos can be a great way to learn about individual user sessions, but it's tedious to watch a lot of these, and it's hard to keep sensitive user data from ending up in these videos.&lt;/p&gt;

&lt;p&gt;You can also replay sessions with a log of user actions and events, like the &lt;a href="https://requestmetrics.com/feature/session-transcripts/?utm_source=devto" rel="noopener noreferrer"&gt;Session Transcript in Request Metrics&lt;/a&gt;. Transcripts let you quickly glance through a user journey, and also report on interesting events, like all the sessions with rage clicks, whether they are increasing, and what pages and elements they tend to happen on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n8eh57njgme89vzxns4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2n8eh57njgme89vzxns4.png" alt="Session Transcript" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whether you use a video or a transcript to understand the user journey, knowing the context of a rage click or a dead click is helpful to improve the usability and enhancing user experience. With this valuable information, businesses can make informed decisions about optimizing their websites, reducing user frustration, and ultimately improving conversion rates.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. JavaScript Events
&lt;/h3&gt;

&lt;p&gt;You can track Rage Clicks with any user analytics tool as well by listening for a JavaScript event. Once you discover these "rage click events", you can send it on to Google Analytics, Request Metrics, or whatever analytics tool you're using.&lt;/p&gt;

&lt;p&gt;Here's a quick example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="c1"&gt;// number of clicks before RAGE is assumed&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;LIMIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// time in ms to wait for cooldown&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;750&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// storing our state in the DOM&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;STATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;__rageClick&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Listen at the top for all clicks.&lt;/span&gt;
&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// increment counter and reset our cooldown&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// after cooldown, check if there was a rage&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;clear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;LIMIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;RM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Rage Click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;delete&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;STATE&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="nx"&gt;TIMEOUT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To track rage clicks on a website, you need to implement certain JavaScript events. The first event is the "click" event, which is triggered whenever a user clicks on an element on the web page. This event will be used to detect and capture all the clicks made by the user.&lt;/p&gt;

&lt;p&gt;Next, you need to create a variable to store all the click events as an array. This variable will be initialized when the page loads, and every click event will be pushed into this array. This allows you to keep track of all the clicks made by the user.&lt;/p&gt;

&lt;p&gt;To identify rage clicks, you need to define thresholds. These thresholds can be based on the number of clicks made within a timeframe on a specific element. For example, if a user makes more than 3 clicks within 750 milliseconds on the same element, it can be considered a rage click.&lt;/p&gt;

&lt;p&gt;To detect rage clicks within the defined thresholds, you can create functions that monitor the click events stored in the array. These functions can check if the number of clicks exceeds the defined threshold and if they occur within the specified timeframe.&lt;/p&gt;

&lt;p&gt;Once a rage click is detected, you can send it off to your analytics tool to be recorded and reported. This allows you to analyze and track the occurrence of rage clicks, helping you identify areas of frustration on your website and make necessary improvements to enhance the user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other User Frustration Signals
&lt;/h2&gt;

&lt;p&gt;There are lots of ways that users signal their frustration while interacting with your website. These signs indicate usability issues, poor web performance, or opportunities to improve your design. Here are some examples of user frustration signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rage clicks&lt;/strong&gt;, which is what we've been talking about, are repetitive and rapid clicks made by users out of frustration. They reflect a negative user experience and can be caused by confusing elements or poor design choices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dead clicks&lt;/strong&gt; occur when users futilely attempt to interact with non-clickable elements or broken elements on a web page. Dead clicks are frustrating experiences that often result in users abandoning the site, leading to poor conversion rates and customer churn.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Excessive scrolling&lt;/strong&gt; is when users find it difficult to navigate or locate the information they need, they tend to scroll more than necessary in an attempt to find what they are looking for. This especially happens when an "infinite list" UI pattern is implemented.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intense mouse movement&lt;/strong&gt; is another sign of user frustration. When users are unable to quickly and easily interact with elements on a website, they may begin to move their mouse rapidly across the screen in an attempt to find clickable or interactive elements.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rapid page reloading&lt;/strong&gt; is yet another behavior that indicates user frustration. If users repeatedly reload a page within a short period of time, it suggests that they are not satisfied with the content or functionality of the page. This can be a sign of usability issues such as slow loading times, broken elements, or confusing navigation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By recognizing these signs of user frustration, website owners and designers can identify potential usability issues and take steps to improve the overall user experience. Addressing these issues can lead to higher conversion rates, improved customer satisfaction, and ultimately, increased success for the website or online business.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Do I Fix Rage Clicks?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Okay okay okay. Rage clicks are bad. I get it. How do I prevent this from happening on my website?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That really depends what your site does, but implementing certain strategies can significantly enhance the overall user experience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Optimize Website/App Design&lt;/strong&gt;: Ensure an intuitive user interface design with clear navigation and easily discernible interactive elements. Use consistent and familiar design patterns to minimize confusion for users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improve Performance&lt;/strong&gt;: Address slow loading times and broken elements that may lead to user frustration. Optimize code, &lt;a href="https://dev.to/web-performance/high-performance-images/"&gt;compress images&lt;/a&gt;, and streamline server requests to improve website or app speed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Provide Clear Instructions&lt;/strong&gt;: Clearly communicate instructions and any necessary steps to complete tasks or find desired information. Avoid vague or ambiguous language that may confuse users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ensure Effective Search Functionality&lt;/strong&gt;: Implement search with accurate results to help users quickly find what they are looking for. Include filters and sorting options to refine search results further.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Conduct User Testing&lt;/strong&gt;: Regularly test your website or app with real users to identify any usability issues or points of frustration. Utilize session replay or transcript tools to gain insight into user behavior and areas for improvement.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitor User Experience&lt;/strong&gt;: You can't fix what you don't know. Use monitoring tools like Request Metrics to understand your funnels, user activity, performance, errors, and other frustrations, so that you can find and fix problems quickly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We spend tons of time helping folks like you understand how your web application is performing for your users, and how to make it better. With things like Error Tracking, Web Performance, and Session Transcripts, we can help you understand things and build better experiences for your users. &lt;a href="https://requestmetrics.com/?utm_source=devto" rel="noopener noreferrer"&gt;I bet we can help you too&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Addressing rage clicks is important for improving website usability and the overall user experience. By optimizing your design, improving performance, providing clear instructions, ensuring effective search functionality, and monitoring your web application, you can maximize user engagement and improve your conversion rates.&lt;/p&gt;

&lt;p&gt;However, identifying and understanding rage clicks can be challenging without the right tools. You'll need analytics tools that are powerful enough to capture real insights about your user's journey and frustrations, and simple enough that you'll actually understand and use them. That's exactly why we built &lt;a href="https://requestmetrics.com/?utm_source=devto" rel="noopener noreferrer"&gt;Request Metrics&lt;/a&gt;--a powerful client-side monitoring tool that distills the data into simple and discoverable reports. We can help you build a better, faster, and more effective web application that your users love and drives higher conversions.&lt;/p&gt;

&lt;p&gt;You and your business must understand rage clicks and address why they are happening to improve website usability and create a positive user experience. Using tools like Request Metrics will show you insights about user frustration and allow you to optimize your web applications effectively. By doing so, you can minimize user frustration, increase conversions, and have bragging rights for just how awesome your website is.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published as &lt;a href="https://requestmetrics.com/blog/ux/what-is-a-rage-click/?utm_source=devto" rel="noopener noreferrer"&gt;"What is a Rage Click?"&lt;/a&gt; on the Request Metrics Blog.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>rageclick</category>
      <category>ux</category>
      <category>ui</category>
      <category>design</category>
    </item>
    <item>
      <title>Our Super Friendly AI Sloth that Analyzes Your Observability Data</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 15 May 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/our-super-friendly-ai-sloth-that-analyzes-your-observability-data-41lh</link>
      <guid>https://forem.com/requestmetrics/our-super-friendly-ai-sloth-that-analyzes-your-observability-data-41lh</guid>
      <description>&lt;p&gt;Seems like everyone is building a ChatGPT thing right now, doesn’t it? Well we are too! Inspired by so many others, we decided to see what AI could do with our simplified analytics and observability data.&lt;/p&gt;

&lt;p&gt;Turns out, it can do quite a lot.&lt;/p&gt;

&lt;p&gt;I’m thrilled to share that &lt;a href="https://requestmetrics.com/feature/ai-analysis/" rel="noopener noreferrer"&gt;we’ve shipped our first AI insights chatbot, Professor Sloth&lt;/a&gt;. With this ChatGPT-powered AI Assistant, Request Metrics is taking data analysis to the next level by helping you spot anomalies, suggesting courses of action, and guiding you towards valuable insights.&lt;/p&gt;

&lt;p&gt;But this wasn’t without it’s challenges…&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompt Engineering Challenges
&lt;/h2&gt;

&lt;p&gt;Integrating OpenAI’s ChatGPT into Request Metrics proved to be an interesting challenge, particularly when it came to the emerging problem of &lt;em&gt;prompt engineering&lt;/em&gt;. To get &lt;em&gt;correct&lt;/em&gt; and interesting results, we had to talk to this supremely powerful AI like it was a first-grade math student. Phrases like &lt;em&gt;“go slow”&lt;/em&gt;, &lt;em&gt;“check your work”&lt;/em&gt;, and &lt;em&gt;“let’s take this step by step”&lt;/em&gt; litter our prompts.&lt;/p&gt;

&lt;p&gt;Without these statements, we found that ChatGPT would often outright lie to us, reporting median values that weren’t in the dataset, or reporting trends that were not statistically relevant. Much like guiding a young learner, it was essential to provide clear instructions and set expectations to ensure that ChatGPT could understand and analyze the data effectively.&lt;/p&gt;

&lt;p&gt;With a little care and patience, this approach allowed us to harness the power of AI while maintaining a high level of accuracy and relevance in the insights generated by Professor Sloth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Professor Sloth and Data Analysis
&lt;/h2&gt;

&lt;p&gt;Incorporating an AI Assistant like Professor Sloth into your data analysis workflow offers numerous advantages. Here are some benefits we’ve observed while using Professor Sloth:&lt;/p&gt;

&lt;h3&gt;
  
  
  Anomaly Detection
&lt;/h3&gt;

&lt;p&gt;Professor Sloth can quickly spot anomalies in your data, helping you identify potential issues and areas for improvement. This can save you time and effort by automating the initial data exploration process. Here’s an example where the professor found an &lt;a href="https://requestmetrics.com/feature/api-monitoring/" rel="noopener noreferrer"&gt;API Endpoint anomaly&lt;/a&gt;, and pointed out that they are all SVG file requests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3aquhufixzzufzt7hpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3aquhufixzzufzt7hpd.png" alt="Professor Sloth identifying an API Anomaly" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Actionable Recommendations
&lt;/h3&gt;

&lt;p&gt;Our ChatGPT-powered AI Sloth suggests courses of action based on the data it analyzes. This helps you make informed decisions on where to invest your resources and how to improve your website’s performance. Here’s an example where it found the largest &lt;a href="https://requestmetrics.com/feature/web-analytics/" rel="noopener noreferrer"&gt;web analytics sources of traffic&lt;/a&gt;, and recommended additional focus.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ld888kotqsv51ooml6n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ld888kotqsv51ooml6n.png" alt="Professor Sloth Recommending Analytics Focus" width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Guided Analysis
&lt;/h3&gt;

&lt;p&gt;Professor Sloth recommends additional data analysis steps to help you dive deeper into specific areas of interest. This can be particularly useful when you’re unsure where to start or need help identifying new avenues for exploration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaybfs0wy3j1fo9hknf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feaybfs0wy3j1fo9hknf3.png" alt="Professor Sloth Recommending Geographic Filters" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here, Professor Sloth suggested some geographic filters to get more relevant data, focusing on US and German traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ongoing Training for Professor Sloth
&lt;/h2&gt;

&lt;p&gt;Currently, Professor Sloth is available in a handful of locations throughout the Request Metrics UI. However, we have big plans for our AI Assistant. In the coming weeks, we’ll be expanding its presence within the platform and teaching it about more types of data.&lt;/p&gt;

&lt;p&gt;As the AI APIs continue to evolve, we hope to expand Professor Sloth’s chat capabilities, allowing you to ask further questions about your data and receive even more personalized insights. With this ChatGPT-powered feature, we aim to make data analysis more accessible, efficient, and enjoyable for all users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Professor Sloth shows off the power and potential of AI integration in data analysis. By overcoming the challenges of prompt engineering and leveraging the capabilities of OpenAI’s ChatGPT, we’ve created a valuable tool that can revolutionize the way you approach your website’s data.&lt;/p&gt;

&lt;p&gt;With Professor Sloth, you’ll gain access to anomaly detection, actionable recommendations, and guided analysis, all powered by cutting-edge AI technology. As we continue to expand and evolve this feature, we’re confident that Professor Sloth will become an indispensable asset in your quest for data-driven insights and website optimization.&lt;/p&gt;

&lt;p&gt;Ready to try it out? Check out our &lt;a href="https://app.requestmetrics.com/demo" rel="noopener noreferrer"&gt;live sandbox&lt;/a&gt; and see what Professor Sloth has to say about the data. Or &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;sign-up for Request Metrics free&lt;/a&gt; and get AI-powered insights on your own analytics and observability data!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>observability</category>
      <category>devops</category>
    </item>
    <item>
      <title>Expanding Our Vision: Unifying Client-Side Observability Data</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Thu, 11 May 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/expanding-our-vision-unifying-client-side-observability-data-5efo</link>
      <guid>https://forem.com/requestmetrics/expanding-our-vision-unifying-client-side-observability-data-5efo</guid>
      <description>&lt;p&gt;In 2021, we started Request Metrics as a simple and developer-friendly service to measure and &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance" rel="noopener noreferrer"&gt;improve web performance&lt;/a&gt;. We built an incredible platform that distilled complex data down into simple reports and recommendations. Lots of teams around the world found valuable insights in Request Metrics that they couldn’t get anywhere else.&lt;/p&gt;

&lt;p&gt;But web performance data can be very unpredictable—the web slows down in all sorts of ways. When one of our customer’s pages slowed down, or their &lt;a href="https://requestmetrics.com/core-web-vitals/" rel="noopener noreferrer"&gt;Core Web Vitals&lt;/a&gt; slipped, we ran into 2 big limitations:&lt;/p&gt;

&lt;p&gt;First, does this delay matter to my user? Did it cost me a sale? Do I need to fix it right now? We couldn’t answer these questions because we didn’t have enough context about what the user was trying to do.&lt;/p&gt;

&lt;p&gt;Second, what is causing this thing to be slow? We can’t always recreate the problem in our local environments, and we didn’t have deep enough data to debug individual sessions.&lt;/p&gt;

&lt;p&gt;To address these problems, we needed to think &lt;em&gt;bigger&lt;/em&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  A Challenge Beyond Web Performance
&lt;/h2&gt;

&lt;p&gt;The limitations we faced aren’t limited to web performance. When there’s a JavaScript error, how do we know if it has user impact? When an API is failing, does it halt the checkout flow? When a user is interacting, which components do they depend on?&lt;/p&gt;

&lt;p&gt;Today, this data is scattered across various kinds of tools, such as product analytics, error reporting, API observability, performance, and security monitoring. There is so much power to be unlocked by bringing this data together, and that’s exactly what Request Metrics is going to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Client-Side Observability Platform
&lt;/h2&gt;

&lt;p&gt;Our goal for Request Metrics is to bring these disparate pools of data together—to unify client-side data and reveal the correlations between user intent, product analytics, and system monitoring.&lt;/p&gt;

&lt;p&gt;Imagine getting an alert with this context:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;3 API endpoints are returning higher 500 responses than normal, and form submissions for impacted sessions are down by 75%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We are going to combine operational problems with user impact so that we can focus on the problems that really impact our users, and cut out the noisy background radiation of the web.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accelerating and Expanding Observability
&lt;/h2&gt;

&lt;p&gt;Many monitoring products need to understand your entire infrastructure—every service, database, and backend resource you depend on. To get that, you have to deploy agents, make code changes, or use specific platforms. It’s a huge upfront cost and many small teams can’t justify it. We’re approaching the problem differently.&lt;/p&gt;

&lt;p&gt;What if we approached observability from what the &lt;em&gt;real users&lt;/em&gt; see, instead of our infrastructure? And what if we made the setup so easy that any engineer could do it in 1 minute. What if you could copy-paste a single bit of JavaScript into your page and get visibility into everything the user touches? That’s what we’re building: turnkey analytics and observability from the client-side.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security and Privacy in Analytics
&lt;/h2&gt;

&lt;p&gt;Many security-focused organizations are unable to use cloud services for potentially sensitive data, and have been left behind by modern analytics and monitoring vendors.&lt;/p&gt;

&lt;p&gt;That’s why we’re making Request Metrics ready to be installed on-premise, or in your private cloud. A single install, package, and vendor to manage that can give you monitoring visibility across your teams.&lt;/p&gt;

&lt;p&gt;Oh, and because we don’t drop a cookie or track anything identifiable about the end user (dropping IP and user agent on ingest), we’re fully GDPR compliant and ready to use anywhere you need visibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Road Ahead
&lt;/h2&gt;

&lt;p&gt;We have an ambitious vision, and we’re diligently working to make it a reality over the remainder of this year. Today we’ve already shipped Session Analytics, with the ability to dive into a full session timeline for users. We’re expanding our performance tools into full &lt;a href="https://requestmetrics.com/feature/user-experience-monitoring/" rel="noopener noreferrer"&gt;User Experience monitoring&lt;/a&gt;, allowing you to dig all the way into individual load timings and waterfalls. As well as &lt;a href="https://requestmetrics.com/feature/api-monitoring/" rel="noopener noreferrer"&gt;API observability&lt;/a&gt;, tracking the traffic, responses, and performance of your first party and third-party API calls.&lt;/p&gt;

&lt;p&gt;Soon, you’ll see security and website integrity reports added, so we can tell you when naughty JavaScript sneaks into your code or tries to steal data from your users. We’ll also be bringing a JavaScript error reporting component, and expanding analytics to include custom events and user journeys. There is so much great stuff coming!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Request Metrics is a new kind of dev tool: focused on the &lt;em&gt;user experience&lt;/em&gt; of your site, doing more of the thinking for you, and exposing when weird things happen in your system. You shouldn’t have to feed your dev tools queries, it should just give you answers. We’re excited to make it happen and help you make better, faster software. Sign up for a &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;free trial of Client-Side Observability&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>observability</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Explaining Performance to Non-Technical Stakeholders</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Tue, 13 Sep 2022 08:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/explaining-performance-to-non-technical-stakeholders-4j7j</link>
      <guid>https://forem.com/requestmetrics/explaining-performance-to-non-technical-stakeholders-4j7j</guid>
      <description>&lt;p&gt;Whether you’re an e-commerce company, a SaaS provider, or a content publisher, understanding the performance of your website is important to &lt;em&gt;everyone&lt;/em&gt; on the team—not just the developers. Performance is a huge part of the user experience and directly tied to how well your website achieves its goals. But web performance is often measured in very technical terms, like &lt;a href="https://requestmetrics.com/web-performance/largest-contentful-paint" rel="noopener noreferrer"&gt;Largest Contentful Paint&lt;/a&gt;, that cause most business folk’s eyes to glaze over.&lt;/p&gt;

&lt;p&gt;This language gap is a big part of the reason why many websites are so slow. Many only consider performance from their own perspective—“it’s fast for me”—and leave it at that. We simply lack the vocabulary to talk about the problem.&lt;/p&gt;

&lt;p&gt;To effectively talk about web performance with everyone on the team, you have to break through the jargon and talk about what really matters: the experience of the real users and how that impacts the business. Here’s a few ways to do that:&lt;/p&gt;

&lt;h2&gt;
  
  
  Push what’s Important
&lt;/h2&gt;

&lt;p&gt;Performance is rarely top of mind, and it’s unlikely anyone will go looking for it unless a user is complaining. Most users don’t complain—they just leave.&lt;/p&gt;

&lt;p&gt;To keep your users, you need to know about performance before it gets bad. You need to know when it’s important.&lt;/p&gt;

&lt;p&gt;At Request Metrics, its our job to figure out what’s important and push the relevant information to you. We examine all your web performance data and push a summary to your inbox with what you need to know.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn791y3bhzm4cx8yxnky.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdn791y3bhzm4cx8yxnky.png" alt="User Experience Report" width="800" height="1135"&gt;&lt;/a&gt;&lt;br&gt;&lt;a href="https://requestmetrics.com/assets/images/webperf/explaining-performance/Desktop_UX_Report.pdf" rel="noopener noreferrer"&gt;Download the full report PDF.&lt;/a&gt;
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;And to make it sharable, we publish it as a PDF so that you can forward it on to your client, your boss, or the executives in charge.&lt;/p&gt;

&lt;h2&gt;
  
  
  BLUF: Bottom Line Up Front
&lt;/h2&gt;

&lt;p&gt;This old military acronym is about getting right to the most important information first—lives could depend on it!&lt;/p&gt;

&lt;p&gt;Your situation is (probably) not that dire, but the advice stands. If the most interesting performance anomalies are buried three clicks deep, it’s unlikely to be discovered.&lt;/p&gt;

&lt;p&gt;At Request Metrics,we expose the interesting things in plain language at the top of all of our reports and dashboards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6ql1s0t46kfck3on1at.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6ql1s0t46kfck3on1at.png" alt="Plain language descriptions of performance in Request Metrics" width="758" height="876"&gt;&lt;/a&gt;&lt;br&gt;Plain language descriptions of performance in Request Metrics.
&lt;br&gt;&lt;/p&gt;

&lt;p&gt;This takes the burden off the developer to interpret the data for their team. We can plainly state what’s happening, backed up with data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Describe Metrics as User Impact
&lt;/h2&gt;

&lt;p&gt;Web performance metrics are highly technical and confusing—even to developers. If you don’t understand what &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift/" rel="noopener noreferrer"&gt;Cumulative Layout Shift&lt;/a&gt; is measuring, its hard to care that the score isn’t good.&lt;/p&gt;

&lt;p&gt;Instead, start the conversation with the user impact of the metric, like “the website has a lot of frustrating shifting of content for 75% of our users”&lt;/p&gt;




&lt;p&gt;Performance can be a powerful way to make your websites better and more effective—but only if you know how to have the conversation. Remember to Push what’s important to your stakeholders, put the bottom line up front, and describe metrics in terms of user impact. If you have the real user data and reports from Request Metrics, that will help.&lt;/p&gt;

&lt;p&gt;Have a look at the &lt;a href="https://requestmetrics.com/assets/images/webperf/explaining-performance/Desktop_UX_Report.pdf" rel="noopener noreferrer"&gt;example performance report&lt;/a&gt; and see how it can help drive the performance conversation on your team.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>data</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Audit Google Ad Performance With Lighthouse</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 01 Aug 2022 08:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/audit-google-ad-performance-with-lighthouse-1a66</link>
      <guid>https://forem.com/requestmetrics/audit-google-ad-performance-with-lighthouse-1a66</guid>
      <description>&lt;p&gt;Implementing Google Ads can be complicated.  If done incorrectly, it &lt;a href="https://requestmetrics.com/web-performance/google-ads-are-slow" rel="noopener noreferrer"&gt;negatively impacts your website's performance&lt;/a&gt;.  Fortunately, there is a new &lt;a href="https://github.com/googleads/publisher-ads-lighthouse-plugin" rel="noopener noreferrer"&gt;Google Lighthouse plugin&lt;/a&gt; tailored specifically to find problems with your Google ad implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Publisher Ads Plugin
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Publisher Ads Audits for Lighthouse&lt;/strong&gt; is a plugin created to help surface issues with your Google ads setup.  It's open source and &lt;a href="https://github.com/googleads/publisher-ads-lighthouse-plugin" rel="noopener noreferrer"&gt;hosted on Github&lt;/a&gt;.  It's currently developed specifically for users of &lt;strong&gt;Google Ad Manager&lt;/strong&gt; and uses a series of automated audits to spot problems.&lt;/p&gt;

&lt;h4&gt;
  
  
  Running the Plugin From Chrome
&lt;/h4&gt;

&lt;p&gt;To get started simply open the Chrome Developer tools and navigate to the Lighthouse tab.  You'll find a (beta) Community Plugin called &lt;strong&gt;Publisher Ads&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kaayyat17xqz7h2v4bd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kaayyat17xqz7h2v4bd.png" alt="The Publisher Ads Audit" width="684" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It can be run like any other Lighthouse audit - either on its own or in combination with the other audits available.&lt;/p&gt;

&lt;h4&gt;
  
  
  Running the Plugin on the Web
&lt;/h4&gt;

&lt;p&gt;If you don't use Chrome, Google helpfully hosts a web page that can &lt;a href="https://developers.google.com/publisher-ads-audits/" rel="noopener noreferrer"&gt;run the Publisher Ads audits&lt;/a&gt; as well.  This is useful to get a second datapoint other than your own browser.  You can find it here: &lt;strong&gt;&lt;a href="https://developers.google.com/publisher-ads-audits/" rel="noopener noreferrer"&gt;https://developers.google.com/publisher-ads-audits/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Publisher Ads In Action
&lt;/h2&gt;

&lt;p&gt;When we &lt;a href="https://requestmetrics.com/web-performance/google-ads-are-slow" rel="noopener noreferrer"&gt;previously discussed Google ad performance impact&lt;/a&gt;, we looked at a few sites which saw a large slowdown when ads were enabled.  One of those was &lt;strong&gt;CNN.com&lt;/strong&gt;.  We decided to see what the plugin could tell us about the ad setup on their site.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN.com Audit Results
&lt;/h3&gt;

&lt;p&gt;Like most of the Lighthouse audits, the site is given an overall score, and then individual audit problems are surfaced below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3t1a163tg5rv45xmxgk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq3t1a163tg5rv45xmxgk.png" width="662" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Duplicate Tag Loads
&lt;/h4&gt;

&lt;p&gt;CNN is loading the exact same Google Publisher tag twice. This is needlessly wasteful of bandwidth and impacting load time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi77iiiwsastblbturax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyi77iiiwsastblbturax.png" width="666" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Parallel Bid Requests
&lt;/h4&gt;

&lt;p&gt;We also see that CNN is gathering bid requests in serial, and could potentially make both of those bid requests at the same time to speed things up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6dklx49oie6gjyy9mon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6dklx49oie6gjyy9mon.png" width="659" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Slow Requests Blocking Your Ads
&lt;/h4&gt;

&lt;p&gt;Ads aren't always slow because of ad providers alone.  Oftentimes other resources on your site will block the ad requests from doing their work.  The Publisher Ads plugin will also show you which resources are blocking your ads from completing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadho0bhxrtcjn5ww4911.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fadho0bhxrtcjn5ww4911.png" width="662" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Many Helpful Suggestions
&lt;/h4&gt;

&lt;p&gt;Publisher Ads contains over 20 audits in related to Google ads and common implementation mistakes.  Not only will it show you which audits fail, but also which pass, and by how much.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra8p5ulassr8njqtad3c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fra8p5ulassr8njqtad3c.png" width="666" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Publisher Ads Lighthouse audit is a great way to get started with optimizing your Google ads implementation.  It suffers from the &lt;a href="https://requestmetrics.com/web-performance/synthetic-testing-and-real-user-monitoring#synthetic-testing" rel="noopener noreferrer"&gt;same issues all synthetic tests have&lt;/a&gt;, but it should certainly be a part of your ongoing Google ad performance monitoring.&lt;/p&gt;

&lt;p&gt;Another part of your strategy should be monitoring your site's performance with &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;Request Metrics&lt;/a&gt;.  We'll tell you whether your changes are having a meaningful impact on your actual users, and not just in Google Lighthouse.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>lighthouse</category>
      <category>webperf</category>
      <category>devops</category>
    </item>
    <item>
      <title>How To Read Flame Charts and Percentiles</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 25 Jul 2022 08:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/how-to-read-flame-charts-and-percentiles-1mmc</link>
      <guid>https://forem.com/requestmetrics/how-to-read-flame-charts-and-percentiles-1mmc</guid>
      <description>&lt;p&gt;Charting can be complicated and intimidating, especially when dealing with web performance data, flame charts, and percentiles. There is so much data crammed together! Why are the numbers all different?! Let’s break down these charts, what they are good for, and when to use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flame Charts
&lt;/h2&gt;

&lt;p&gt;A flame chart uses a stacked colored bar chart to show both the number of users and their performance for a given time. It is usually a &lt;em&gt;histogram&lt;/em&gt;, showing how the data changes over time. Here’s an example of a flame chart from a Request Metrics page load performance report.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnm2xq9hgng067ldrfafl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnm2xq9hgng067ldrfafl.png" alt="Load Time Performance Flame Histogram Chart" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each bar (or flame) shows the total number of visits to the page. The relative size of each color shows the performance experienced by users. Cooler colors usually mean “faster” performance, while warmer colors are slower.&lt;/p&gt;

&lt;p&gt;Flame charts are useful to see big changes in your performance. For example, the flame chart below shows the last 90 days of load performance data for a page. The increasing size of the flames shows that the traffic is increasing each week. The flames are also getting warmer, with less blue and more red, telling us that the page is slowing down under the increased traffic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficiu2283amwn6hf8p4xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficiu2283amwn6hf8p4xj.png" alt="Slowing Trend in Load Time Performance Flame Chart" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flame Charts Are Bad for Small Changes
&lt;/h3&gt;

&lt;p&gt;Flame charts are a great tool for showing big trends, but it can be hard to spot subtle changes in them. It’s difficult for most people to spot small changes in a color distribution. Take this flame chart for instance. There was a performance improvement made around June 20th. Can you spot it? I can’t.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qmblsnlxidi3h3zksp4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3qmblsnlxidi3h3zksp4.png" alt="Subtle Change in Load Time Performance Flame Chart" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where &lt;em&gt;percentiles&lt;/em&gt; become really useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Percentiles
&lt;/h2&gt;

&lt;p&gt;Hang on, we’re going to channel some of that 7th grade math class you slept through. Let’s say you’ve gathered a bunch of time-to-load performance data. If you sort that data from fastest to slowest, it might look like like the table below.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Load Time&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.5s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.6s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Median&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2.2s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75th percentile&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4.1s&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;95th percentile&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The value that fits in the “middle” of the data, so that half of the data is faster and half is slower, is called the &lt;strong&gt;median&lt;/strong&gt; , or &lt;strong&gt;50th percentile&lt;/strong&gt;. This value is useful because it says, “half of my users had performance better than this”.&lt;/p&gt;

&lt;p&gt;The 75th percentile, or 75% of the data is faster, is very useful for web performance data because it shows you what &lt;em&gt;most&lt;/em&gt; users will see as the worst-case.&lt;/p&gt;

&lt;p&gt;The 95th percentile, where 95% of the data is faster, shows us what the slowest users experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not use the slowest data?
&lt;/h3&gt;

&lt;p&gt;A lot of crazy stuff happens on the web. The slowest data in most real-world reporting is usually unrealistically slow. It’s often bad data being reported from bots, bugs, or suspended pages: generally stuff you don’t care about. Using the 95th percentile trims off this bad data and gives you the slowest &lt;em&gt;realistic&lt;/em&gt; performance experience.&lt;/p&gt;

&lt;p&gt;Let’s look back at our “small change” example. If we chart the data as percentiles rather than a flame chart, we can see smaller patterns. In this example, load time performance gets a touch faster on June 20th.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevid70frtfua9bqcq0nh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fevid70frtfua9bqcq0nh.png" alt="Load Time Performance Percentiles" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This pattern is visible on all three charted percentiles, so the page got a touch faster for everyone. Nice work team.&lt;/p&gt;

&lt;h3&gt;
  
  
  The danger of averages
&lt;/h3&gt;

&lt;p&gt;When trying to interpret a pile of data, it is tempting to look at the averages, but this can be very misleading. Averages will smooth out interesting patterns and hide the true experiences of the fastest and slowest users.&lt;/p&gt;

&lt;p&gt;The average load time for the data is about 3.2 seconds, a time that doesn’t really reflect the fastest users, slowest users, or even the majority of users. Producing a few percentiles is much more informative.&lt;/p&gt;

&lt;p&gt;Check out more about the averages and performance statistics in &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance#chapter-2-web-performance-metrics" rel="noopener noreferrer"&gt;chapter 2&lt;/a&gt; of the &lt;a href="https://requestmetrics.com/web-performance/measure-web-performance" rel="noopener noreferrer"&gt;Definitive Guide to Measuring Web Performance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Why gather the data and do the math yourself though? This is what Request Metrics is made for! Let us &lt;a href="https://requestmetrics.com/" rel="noopener noreferrer"&gt;report on your end user performance&lt;/a&gt; and give you exactly the reports you need to make your website fast. I bet you’ll love it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>o11y</category>
      <category>webperf</category>
    </item>
    <item>
      <title>Google Ads Are Slowing You Down</title>
      <dc:creator>Todd H. Gardner</dc:creator>
      <pubDate>Mon, 18 Jul 2022 08:00:00 +0000</pubDate>
      <link>https://forem.com/requestmetrics/google-ads-are-slowing-you-down-4p4b</link>
      <guid>https://forem.com/requestmetrics/google-ads-are-slowing-you-down-4p4b</guid>
      <description>&lt;p&gt;Google has a well earned &lt;a href="https://requestmetrics.com/web-performance/performance-profiling-google" rel="noopener noreferrer"&gt;reputation&lt;/a&gt; for speed. At least on their own sites. It’s an entirely different story when it comes to their ad network. Google ads are slowing down thousands of sites across the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google Ads in Action
&lt;/h2&gt;

&lt;p&gt;Regardless of what you think of their content, CNN is one of the most popular sites on the internet - and they use Google Ads. There is a large Google-served banner advertisement at the top of the page. It often pops in seconds after the rest of the site has rendered. This ad dramatically slows page load and causes a large layout shift which irritates users and could &lt;a href="https://www.searchenginejournal.com/ranking-factors/core-web-vitals/" rel="noopener noreferrer"&gt;hurt their search rankings&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  CNN.com Banner Ad Example
&lt;/h3&gt;


        
    

&lt;h3&gt;
  
  
  Google Ads Are Everywhere
&lt;/h3&gt;

&lt;p&gt;It’s easy to pick on &lt;a href="https://cnn.com" rel="noopener noreferrer"&gt;cnn.com&lt;/a&gt;, but Google ads are ubiquitous. They’re served up everywhere, especially in the media industry, and they’re causing performance issues.&lt;/p&gt;

&lt;p&gt;For this post we’re going to focus on these major news sites: &lt;strong&gt;nytimes.com, cnn.com, foxnews.com, wsj.com, and espn.com&lt;/strong&gt;. Every one of them has at least one Google ad on the page.&lt;/p&gt;

&lt;p&gt;The goal is to find out what impact, if any, do Google ads have on their web performance?&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the Performance Impact of Google Ads
&lt;/h2&gt;

&lt;p&gt;The best way to measure the performance impact of Google ads on a site like &lt;strong&gt;cnn.com&lt;/strong&gt; would be to run A/B tests with Google ads on and off, over a diverse cross section of users. But we don’t work for CNN and don’t control their ads (the site would be faster if we did) so we have to use the tools available to us.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Test Setup
&lt;/h3&gt;

&lt;p&gt;In order to A/B test the web performance of sites with and without Google ads, we’re going to use &lt;a href="https://developers.google.com/web/tools/puppeteer" rel="noopener noreferrer"&gt;Puppeteer&lt;/a&gt;. This is a tool from Google that allows us to automate Chrome with code.&lt;/p&gt;

&lt;p&gt;To attempt some level of fairness, each site will be loaded 10 times with Google ads enabled, and 10 times with Google ads blocked. The browser’s cache will be disabled, and we’ll alternate between loading with ads, and loading without, in an attempt to smooth over any network hiccups.&lt;/p&gt;

&lt;p&gt;Rather than blocking all ads on the page (some of these sites are using more than one provider), we’re &lt;a href="https://www.netify.ai/resources/applications/google-ads" rel="noopener noreferrer"&gt;only going to block those domains belonging to Google&lt;/a&gt;. Puppeteer allows us to &lt;a href="https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pagesetrequestinterceptionvalue" rel="noopener noreferrer"&gt;inspect every outgoing request&lt;/a&gt;, and block it as we see fit.&lt;/p&gt;

&lt;p&gt;The load times of each page will be pulled directly from the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigation_timing_API" rel="noopener noreferrer"&gt;window.performance&lt;/a&gt; API in the browser. We’ll also grab the &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift" rel="noopener noreferrer"&gt;Cumulative Layout Shift&lt;/a&gt; to see if Google ads are having a negative effect on The Core Web Vitals as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  Slow Going
&lt;/h3&gt;

&lt;p&gt;After gathering data from all the sites - with ads and without - the results were clear. Google ads had a negative impact on the performance of every site tested. In most cases a sizably negative impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Performance Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;No Ads&lt;/th&gt;
&lt;th&gt;With Ads&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;espn.com&lt;/td&gt;
&lt;td&gt;2.9s&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.2x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;2.5s&lt;/td&gt;
&lt;td&gt;3.5s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.4x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cnn.com&lt;/td&gt;
&lt;td&gt;7.0s&lt;/td&gt;
&lt;td&gt;16.7s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.4x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;foxnews.com&lt;/td&gt;
&lt;td&gt;4.6s&lt;/td&gt;
&lt;td&gt;16.2s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.5x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wsj.com&lt;/td&gt;
&lt;td&gt;2.8s&lt;/td&gt;
&lt;td&gt;14.8s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.3x slower&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Load Times With and Without Google Ads&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;ESPN had the lowest impact from Google ads - seeing only a &lt;strong&gt;20% increase&lt;/strong&gt; in load time when ads were enabled. On the other end of the spectrum, load times for the Wall Street Journal were a whopping &lt;strong&gt;5.3x slower&lt;/strong&gt; with ads vs. without.&lt;/p&gt;

&lt;p&gt;CNN escaped with a medium impact score, but only because they notched &lt;strong&gt;the worst&lt;/strong&gt; absolute load times both with and without ads.&lt;/p&gt;

&lt;p&gt;Overall, it’s evident that running ads from Google on your site will slow things down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layouts are Shifting Too
&lt;/h2&gt;

&lt;p&gt;Have you ever tried to click a link on a website as its loading, only to see the link shift down and another element on the page get clicked in its place? This is called a &lt;a href="https://requestmetrics.com/web-performance/cumulative-layout-shift" rel="noopener noreferrer"&gt;layout shift&lt;/a&gt;, and it happens when new content forces existing elements to move and make space.&lt;/p&gt;

&lt;p&gt;Layout shifts are &lt;em&gt;very&lt;/em&gt; common on sites with advertising. Ads are often large, and loaded after part of the page has already rendered. The CNN video above shows a classic example of a large and user-hostile layout shift as the banner ad comes in.&lt;/p&gt;

&lt;p&gt;Google measures this behavior as a &lt;a href="https://web.dev/vitals/" rel="noopener noreferrer"&gt;Core Web Vital&lt;/a&gt; called Cumulative Layout Shift (CLS). In addition to measuring load performance impact, we wanted to see whether ads contributed to greater layout shifts by measuring their CLS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cumulative Layout Shift Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Site&lt;/th&gt;
&lt;th&gt;No Ads&lt;/th&gt;
&lt;th&gt;With Ads&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nytimes.com&lt;/td&gt;
&lt;td&gt;0.208&lt;/td&gt;
&lt;td&gt;0.031&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.7x better*&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;espn.com&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cnn.com&lt;/td&gt;
&lt;td&gt;0.102&lt;/td&gt;
&lt;td&gt;0.19&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.9x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wsj.com&lt;/td&gt;
&lt;td&gt;0.009&lt;/td&gt;
&lt;td&gt;0.087&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.6x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;foxnews.com&lt;/td&gt;
&lt;td&gt;0.021&lt;/td&gt;
&lt;td&gt;1.06&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;50x worse&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Cumulative Layout Shift With and Without Google Ads&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The results here aren’t as clear cut. ESPN does a great job limiting layout shift in both cases. The New York Times actually has a &lt;em&gt;better&lt;/em&gt; CLS score with ads enabled! (More on that below)&lt;/p&gt;

&lt;p&gt;However, three of the five sites still have a much worse layout shift score with ads enabled than without. So in general, layout shifts are something you’ll want to monitor if you’re using Google ads.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New York Times Has a Better CLS Score With Ads Enabled?
&lt;/h3&gt;

&lt;p&gt;The New York times website is reserving space using CSS for the large banner ad at the top of their site. When the ad pops in, it’s not causing any re-flow or layout shift because the space already exists for it.&lt;/p&gt;


        
    

&lt;p&gt;When ads are disabled, the placeholder collapses, causing a larger layout shift than if ads were enabled!&lt;/p&gt;

&lt;p&gt;One &lt;em&gt;could&lt;/em&gt; make an argument that no banner ad at all would be better, but then they probably wouldn’t have the cash to buy Wordle, so it’s pros and cons.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Improve Google Ad Performance
&lt;/h2&gt;

&lt;p&gt;In almost all cases the revenue generated by Google ads outweighs their performance costs, so removing them is probably not an option. There are still some things that can be done to mitigate their performance hit though.&lt;/p&gt;

&lt;h3&gt;
  
  
  Load Scripts Statically
&lt;/h3&gt;

&lt;p&gt;It’s not uncommon to see sites using dynamic script loading to inject the Google ad tags. You might see something like this on your site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://securepubads.g.doubleclick.net/tag/js/gpt.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;script&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentNode&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insertBefore&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of using a dynamic script loader, which can be delayed by other events and elements on the page, it’s better to use &lt;a href="https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags" rel="noopener noreferrer"&gt;statically defined async scripts&lt;/a&gt;, like the examples below.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Script Loading, Asynchronously
&lt;/h3&gt;

&lt;p&gt;Google suggests their scripts should be &lt;a href="https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags" rel="noopener noreferrer"&gt;loaded asynchronously&lt;/a&gt;, so as not to block page load.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Use of the async attribute on the script tag can help defer load --&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;&amp;lt;!-- For Adsense --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!--Or using the Google Publisher Tag--&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://securepubads.g.doubleclick.net/tag/js/gpt.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite this advice, many sites are still loading ad scripts with slow dynamic loaders, or synchronously loading static script tags.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lazy Load Ads Below The Fold
&lt;/h3&gt;

&lt;p&gt;There’s no sense is waiting for an ad to load that the user can’t even see. When possible, load ads below the fold lazily - preventing load blocking. Google has a &lt;a href="https://developers.google.com/publisher-tag/samples/lazy-loading" rel="noopener noreferrer"&gt;nice lazy load example&lt;/a&gt; if you’re using &lt;strong&gt;Google Publisher Tag&lt;/strong&gt;. Google even hosts a demo so you can &lt;a href="https://googleads.github.io/google-publisher-tag-samples/advanced/lazy-loading/demo.html" rel="noopener noreferrer"&gt;see it in action&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reserve Size For Above-the-Fold Ads
&lt;/h3&gt;

&lt;p&gt;Preventing layout shift is just as important as optimizing page load performance. The easiest way to prevent frustrating layout shifts for users is to reserve space for your ads, like the New York Times does. The simplest way to reserve space is using the &lt;code&gt;min-width&lt;/code&gt; and &lt;code&gt;min-height&lt;/code&gt; CSS properties to define a placeholder size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"banner-ad"&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"min-width: 600px; min-height: 200px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multiple Content Sizes
&lt;/h3&gt;

&lt;p&gt;Sometimes ads have multiple sizes, and in that case you’ll have a decision to make with regards to reserving space. Common strategies are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reserve space for the largest content size&lt;/li&gt;
&lt;li&gt;Reserve space for the smallest content size&lt;/li&gt;
&lt;li&gt;Reserve size for the most commonly served content size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google has &lt;a href="https://developers.google.com/publisher-tag/guides/minimize-layout-shift#minimize" rel="noopener noreferrer"&gt;more information regarding layout shifts&lt;/a&gt; and ad best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Ads may be necessary on a site, but it’s important to minimize performance impact as much as possible. If you’re using Google Ads, &lt;a href="https://app.requestmetrics.com/signup" rel="noopener noreferrer"&gt;give Request Metrics a try and improve your site’s performance&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Request Metrics will monitor Cumulative Layout Shift, load performance, and dozens of other metrics, for every user on your site. You’ll get up-to-date metrics that show you exactly how your site is performing. You’ll also get 90 days of historical data to see if things are trending in the right direction.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>advertising</category>
      <category>performance</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
