Audit Results
https://www.nytimes.com/2026/02/24/business/paramount-netflix-warner-bros-discovery.html
Lighthouse Lab Data
Measured in a simulated environment. Values may differ from real user experience.Field Data — Mobile (Real Users)
Core Web Vitals PoorChrome UX Report — p75 values from real mobile user experiences over the last 28 days
Summary
The NYT article page has a catastrophic CLS problem — field p75 CLS is 0.95 (poor threshold is 0.25), primarily caused by the app-download banner (#bottom-wrapper) inserting into document flow during scroll (0.82 shift score) and ad slots without reserved dimensions. Lab CLS is only 0.0025 because Lighthouse doesn't measure scroll-triggered shifts — this is a massive blind spot. INP (180ms) and LCP (2,060ms) are both in the needs-improvement zone, driven by 1.5MB of first-party JS, ~500KB of third-party scripts loading before LCP, and two bloated GTM containers with 49 paused tags and 595 unused variables.
- 1Fix catastrophic CLS from #bottom-wrapper (0.82 shift score in lab, drives field CLS to 0.95)
- 2Reserve space for ad containers to eliminate scroll-triggered CLS (0.088 shift scores)
- 3Reduce 1.5MB of first-party JavaScript blocking the main thread
- 4Defer third-party scripts: DataDog RUM, media.net, and ad scripts by 3 seconds
- —Optimize font loading: 6 font files create a sequential chain adding 400ms+ render delay
- —Delete duplicate Google Ads and TikTok Pixel trackers in GTM
- —Defer non-critical GraphQL API calls that fire before LCP
LCP: 2,060ms → ~1,700ms (needs-improvement → borderline good), CLS: 0.95 → ~0.05 (poor → good), INP: 180ms → ~120ms (needs-improvement → good), TTFB: 412ms → ~150ms (needs-improvement → good)
Recommendations
Reserve space for ad containers to eliminate scroll-triggered CLS (0.088 shift scores)
min-height on all ad slot containers before GPT fills them.
For mid-article ad slots, use standard IAB sizes — 300×250 for mobile inline ads is the most common NYT placement./* Ad container has no reserved dimensions */
#after-story-ad-3,
[id*="google_ads_iframe"] {
/* height determined by ad creative loading */
}/* Reserve space for standard mobile ad sizes */
.ad-slot--inline,
#after-story-ad-3 {
min-height: 250px;
min-width: 300px;
display: flex;
align-items: center;
justify-content: center;
background: #f7f7f7;
}
/* Collapse gracefully if no ad fills */
.ad-slot--inline:empty {
min-height: 0;
transition: min-height 0.3s ease;
}Reduce 1.5MB of first-party JavaScript blocking the main thread
import() on user interaction or after LCP.Defer third-party scripts: DataDog RUM, media.net, and ad scripts by 3 seconds
Consolidate 2 GTM containers into 1 — each extra container adds ~80-150KB payload
GTM-N5P6T9S → delete that <script> block and the <noscript> iframe.gtm.js request appears.Delete 49 paused tags and 595 unused variables from GTM containers
Enable HTML edge caching to reduce field TTFB from 412ms
proxy_cache configuration for article URLs.curl -sI https://www.nytimes.com/2026/02/24/business/... | grep -i cache-control — should show the new header.# Current response header Cache-Control: no-cache, must-revalidate
# nginx reverse proxy config for article pages
location ~ ^/\d{4}/\d{2}/\d{2}/ {
proxy_pass http://gunicorn_upstream;
proxy_cache article_cache;
proxy_cache_valid 200 300s;
proxy_cache_use_stale updating error timeout;
add_header Cache-Control "public, max-age=60, stale-while-revalidate=300";
add_header X-Cache-Status $upstream_cache_status;
}Optimize font loading: 6 font files create a sequential chain adding 400ms+ render delay
<head>.
2. Defer non-critical font weights (Franklin 500, 600) to load after LCP via font-display: optional.
3. Consider using font-display: optional for body text fonts to guarantee zero CLS from font swap (field CLS is 0.95 — font swaps may contribute).<!-- No preloads for fonts in <head> -->
<link rel="preload" as="font" type="font/woff2" crossorigin href="https://g1.nyt.com/fonts/family/cheltenham/cheltenham-italic-700.f99a0459024509f157a3.woff2"> <link rel="preload" as="font" type="font/woff2" crossorigin href="https://g1.nyt.com/fonts/family/franklin/franklin-normal-300.a6479a5200f9a6352bdb7158.woff2">
Delete duplicate Google Ads and TikTok Pixel trackers in GTM
Defer non-critical GraphQL API calls that fire before LCP
requestIdleCallback or after the load event.Fix catastrophic CLS from #bottom-wrapper (0.82 shift score in lab, drives field CLS to 0.95)
/* Current: banner inserted dynamically in normal flow */
#bottom-wrapper {
/* no positioning — causes CLS when injected */
}/* Fix: use fixed positioning so insertion causes zero CLS */
#bottom-wrapper {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 999;
}
/* Add padding to body to prevent content overlap */
body {
padding-bottom: 80px; /* match banner height */
}