<?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>DEV Community: Legal Web Agency</title>
    <description>The latest articles on DEV Community by Legal Web Agency (@tech_andusama_d03fc626b1).</description>
    <link>https://dev.to/tech_andusama_d03fc626b1</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4153296%2F501f1f2f-ecd4-4d2e-bc46-d770c786d610.png</url>
      <title>DEV Community: Legal Web Agency</title>
      <link>https://dev.to/tech_andusama_d03fc626b1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tech_andusama_d03fc626b1"/>
    <language>en</language>
    <item>
      <title>A 91 PageSpeed score failed Core Web Vitals. A 51 passed. Notes from testing 14 law firm websites</title>
      <dc:creator>Legal Web Agency</dc:creator>
      <pubDate>Fri, 30 Oct 2026 23:42:03 +0000</pubDate>
      <link>https://dev.to/tech_andusama_d03fc626b1/a-91-pagespeed-score-failed-core-web-vitals-a-51-passed-notes-from-testing-14-law-firm-websites-3fd2</link>
      <guid>https://dev.to/tech_andusama_d03fc626b1/a-91-pagespeed-score-failed-core-web-vitals-a-51-passed-notes-from-testing-14-law-firm-websites-3fd2</guid>
      <description>&lt;p&gt;I build websites for law firms, so in September I ran 14 well-known US law firm homepages through PageSpeed Insights: national personal injury brands, Big Law, and a few regional firms. I expected the big-budget sites to win. They didn't, and the lab score turned out to be a poor predictor of who passed.&lt;/p&gt;

&lt;p&gt;Full write-up with every site and number: &lt;a href="https://legalwebagency.com/core-web-vitals-law-firm-websites/" rel="noopener noreferrer"&gt;Core Web Vitals for law firm websites (14 sites tested)&lt;/a&gt;. This post is the developer version: what surprised me and what I'd fix first.&lt;/p&gt;

&lt;h2&gt;
  
  
  The headline: lab score and field result disagree
&lt;/h2&gt;

&lt;p&gt;Google ranks on &lt;strong&gt;field data&lt;/strong&gt; (real Chrome users, 28-day window, from CrUX), not on the lab score you see at the top of PageSpeed Insights.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One site scored &lt;strong&gt;91&lt;/strong&gt; in the lab and &lt;strong&gt;failed&lt;/strong&gt; Core Web Vitals in the field. The culprit was layout shift (CLS 0.38), which a single lab run barely registered.&lt;/li&gt;
&lt;li&gt;Another scored around &lt;strong&gt;51&lt;/strong&gt; in the lab and &lt;strong&gt;passed&lt;/strong&gt; comfortably.&lt;/li&gt;
&lt;li&gt;Two Big Law sites had &lt;strong&gt;lab LCP of 30-45 seconds&lt;/strong&gt; on the simulated slow phone, yet field LCP of about &lt;strong&gt;1.5 seconds&lt;/strong&gt; and a pass. Their real visitors are on fast hardware and fast networks. The lab simulates a mid-range phone on slow 4G; the field reports what actually happened.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So if you're auditing a site, look at the "Discover what your real users are experiencing" section first. The big circle is a diagnostic, not a verdict.&lt;/p&gt;

&lt;h2&gt;
  
  
  5 of 13 failed, and no two failed for the same reason
&lt;/h2&gt;

&lt;p&gt;13 of the 14 sites had field data. Five failed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Failing metric&lt;/th&gt;
&lt;th&gt;What it looked like&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INP 295 ms&lt;/td&gt;
&lt;td&gt;A heavy homepage where taps on the menu felt sticky&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CLS 0.38&lt;/td&gt;
&lt;td&gt;Content jumping as late elements loaded (the 91-score site)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP 2.6 s&lt;/td&gt;
&lt;td&gt;Just over the 2.5 s line on a big hero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP 2.7 s + CLS 0.88&lt;/td&gt;
&lt;td&gt;The worst of the set; lab score 38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LCP 3.1 s&lt;/td&gt;
&lt;td&gt;Slow hero image on mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That spread is the useful lesson: "make it faster" isn't a plan. Each failure needs a different fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one problem almost everyone shared
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;10 of 14 sites&lt;/strong&gt; (including my own agency site, which scored 67 in the lab) had &lt;strong&gt;render-blocking resources&lt;/strong&gt; as the top opportunity. That's CSS and synchronous scripts in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; that the browser must download and parse before it paints anything.&lt;/p&gt;

&lt;p&gt;On WordPress builds it's usually the same suspects: page-builder CSS for every widget on every page, font loaders, analytics and chat widgets loaded synchronously, and slider libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix order I use now
&lt;/h2&gt;

&lt;p&gt;Ranked by how much each usually moves the field result:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Render-blocking resources (LCP).&lt;/strong&gt; Inline critical CSS, defer the rest, &lt;code&gt;defer&lt;/code&gt; non-essential scripts, and stop loading builder assets on pages that don't use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layout shift sources (CLS).&lt;/strong&gt; Set &lt;code&gt;width&lt;/code&gt;/&lt;code&gt;height&lt;/code&gt; (or &lt;code&gt;aspect-ratio&lt;/code&gt;) on every image and embed, reserve space for cookie banners and chat bubbles, and use &lt;code&gt;font-display: optional&lt;/code&gt; or size-matched fallbacks for web fonts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The hero image (LCP).&lt;/strong&gt; Serve WebP/AVIF at the size actually displayed, add &lt;code&gt;fetchpriority="high"&lt;/code&gt;, and never lazy-load the LCP image (a surprisingly common WordPress default).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party JavaScript (INP).&lt;/strong&gt; Chat widgets, call tracking and review carousels are the usual INP killers. Load them on interaction or after idle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server response time (everything).&lt;/strong&gt; Page caching plus a CDN. It rarely decides pass or fail alone, but it raises the floor for the other four.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One caveat from my own site: aggressive "delay JavaScript" settings in caching plugins can break things in ways a speed test won't show. On mine, it silently killed page-builder widgets for logged-out visitors. Always test as a logged-out user after changing optimization settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking a site in five minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;a href="https://pagespeed.web.dev/" rel="noopener noreferrer"&gt;PageSpeed Insights&lt;/a&gt; on the mobile tab.&lt;/li&gt;
&lt;li&gt;Read the field section first. Pass or fail is decided there.&lt;/li&gt;
&lt;li&gt;If field data fails, note &lt;em&gt;which&lt;/em&gt; metric, then scroll to the diagnostics that map to it (render-blocking and LCP element for LCP, layout shift culprits for CLS, long tasks for INP).&lt;/li&gt;
&lt;li&gt;Fix one metric at a time, then wait. Field data is a rolling 28-day window, so a fix takes up to four weeks to fully show.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want the full per-site breakdown, including which firms passed and why, it's in the &lt;a href="https://legalwebagency.com/core-web-vitals-law-firm-websites/" rel="noopener noreferrer"&gt;original article&lt;/a&gt;. I also put the fix list into a free &lt;a href="https://legalwebagency.com/free-website-scan/" rel="noopener noreferrer"&gt;website scan tool&lt;/a&gt; for law firms.&lt;/p&gt;

&lt;p&gt;Curious whether others see the same lab-vs-field gap on their client sites. My guess is it's widest on B2B and Big Law sites whose audiences are mostly on desktop and fast connections.&lt;/p&gt;

</description>
      <category>webperf</category>
      <category>webdev</category>
      <category>wordpress</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
