Audit Results
https://techcrunch.com/
WordPressLighthouse 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
TechCrunch homepage performs well for real users — all CrUX p75 values (LCP 1238ms, CLS 0.03, INP 112ms) are within the "good" thresholds per Web Vitals standards. However, lab data reveals significant waste from GTM container bloat (54 tags, 13 paused, 39 unused variables), duplicate Facebook Pixel (inline + GTM), duplicate GA4 event tags, and 4 heavyweight third-party scripts firing eagerly. The gap between lab TBT (2198ms) and field INP (112ms) is large — real users aren't severely impacted yet, but the excessive third-party load is a latent risk that will degrade INP as traffic patterns or scripts change.
- 1Remove duplicate Facebook Pixel — inline copy wastes ~95KB and double-fires events
- 2Delete 13 paused GTM tags and 39 unused variables to reduce container bloat
- 3Defer non-critical GTM third-party scripts (HelloBar, Zendesk, ScoreCard, BrandMetrics)
- 4Preload the LCP hero image and set fetchpriority="high"
- —Convert Facebook Pixel from Custom HTML to native GTM template
- —Convert hero JPEG image to WebP/AVIF format
- —Investigate and defer suspicious goddesslamps.com third-party script
LCP: 1238ms → ~1000ms, CLS: 0.03 → ~0.01, INP: 112ms → ~90ms. All three CWV metrics solidly in the "good" zone with comfortable headroom. GTM container size reduced by ~20%, duplicate tracking data fixed across Facebook and GA4.
Recommendations
Remove duplicate Facebook Pixel — inline copy wastes ~95KB and double-fires events
header.php or a plugin injecting into wp_head), search for the fbevents.js script tag and remove it entirely.PageView event on all pages, and "Facebook Pixel — Purchase" fires only on conversion.<!-- In header.php or via plugin output -->
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
</script><!-- REMOVED: Facebook Pixel is now managed exclusively via GTM container GTM-M24PKK8 -->
Delete 13 paused GTM tags and 39 unused variables to reduce container bloat
silo61.p7cloud.net/as1.js (likely a defunct ad/tracking vendor)__cvt_105965535_19 — find via GTM → Tags → filter Status: Paused → look for this custom template typeDefer non-critical GTM third-party scripts (HelloBar, Zendesk, ScoreCard, BrandMetrics)
gtm.timer, Interval: 3000, Limit: 1.Preload the LCP hero image and set fetchpriority="high"
<img>. Meanwhile, 18 CSS/JS resources load first with High priority.
Without a preload hint, the browser only starts fetching this image after parsing the HTML and discovering the <img> tag, adding unnecessary delay. Adding <link rel="preload"> in <head> lets the preload scanner discover it immediately, and fetchpriority="high" ensures it gets bandwidth priority over non-critical resources. <head> via functions.php or the theme's header.php.<img> element itself, add fetchpriority="high" and ensure it does NOT have loading="lazy" — lazy-loading an LCP image delays it by 500–2000ms.fetchpriority="high" on only this one image — applying it to multiple images creates network contention that negates the benefit.<img src="/wp-content/uploads/2026/03/Pokemon_Pokopia_Screenshot_5.jpeg?resize=768,432" alt="..." />
<!-- In <head> --> <link rel="preload" as="image" href="/wp-content/uploads/2026/03/Pokemon_Pokopia_Screenshot_5.jpeg?resize=768,432" fetchpriority="high" /> <!-- On the element --> <img src="/wp-content/uploads/2026/03/Pokemon_Pokopia_Screenshot_5.jpeg?resize=768,432" alt="..." fetchpriority="high" loading="eager" />
Consolidate 13 render-blocking CSS files into fewer bundles
wp_enqueue_style issue — each block and plugin enqueues its own small stylesheet (1–21KB each). While HTTP/2 multiplexes these requests, each file still has per-request overhead (header processing, scheduling) and prevents first paint until all are downloaded and parsed.
The theme already uses some concatenation (_static/?? combo URLs), but many files are still separate. <head>. WP Rocket has a "Remove Unused CSS" option that generates per-page critical CSS.autoenqueue/css/) is configured to load only CSS for blocks actually used on the page — WordPress 6.x supports this natively via wp_enqueue_block_style().Convert Facebook Pixel from Custom HTML to native GTM template
fbevents.js script runs synchronously on the main thread. GTM's native Facebook/Meta Pixel tag template is sandboxed, loads asynchronously, and is optimized by GTM's internal SDK loader — saving 80–120ms of main thread blocking time. facebook.com/tr).Fix layout shifts from top promotional banner and hero card content
min-height. If it's dismissible, use position: fixed or position: sticky so dismissal doesn't shift content..loop-card__title and .loop-card__cat-group: add CSS size-adjust, ascent-override, descent-override on the fallback @font-face to match Yellix and NB International Pro metrics. Use the fontaine or fontpie tool to auto-generate these values.min-height: 90px matching the IAB leaderboard ad size./* No fallback font metrics */
@font-face {
font-family: 'Yellix';
src: url('/fonts/Yellix-ExtraBold.woff2') format('woff2');
font-display: swap;
}/* Matched fallback to reduce CLS on swap */
@font-face {
font-family: 'Yellix Fallback';
src: local('Arial Black'), local('Arial');
size-adjust: 105%;
ascent-override: 95%;
descent-override: 22%;
line-gap-override: 0%;
}
.loop-card__title {
font-family: 'Yellix', 'Yellix Fallback', sans-serif;
}
/* Reserve space for ad banner */
.wp-block-techcrunch-ad-slot--leaderboard {
min-height: 90px;
}Optimize font loading — preload critical weights and use font-display: optional for body
@font-face declarations, adding a waterfall chain.
The body text font (NB International Pro) should use font-display: optional — if the font doesn't load within ~100ms (e.g., from cache), the browser uses the system fallback for the entire session and caches the custom font for the next navigation. This guarantees zero CLS from body text font swap. The heading font (Yellix) can keep font-display: swap since headings are 1–2 lines and less likely to cause significant shifts. font-display: optional on NB International Pro @font-face declarations.font-display: swap on Yellix but add fallback font metrics (see CLS recommendation).<!-- No font preloads --> <link rel="stylesheet" href="/themes/tc-24/dist/blocks/...css" />
<!-- Preload 2 critical font files --> <link rel="preload" as="font" type="font/woff2" crossorigin href="/wp-content/themes/tc-24/assets/fonts/nb-international-pro/nbinternationalprolig-webfont.woff2" /> <link rel="preload" as="font" type="font/woff2" crossorigin href="/wp-content/themes/tc-24/assets/fonts/yellix/Yellix-ExtraBold.woff2" /> <!-- In CSS: --> <!-- @font-face for NB International Pro: font-display: optional; --> <!-- @font-face for Yellix: font-display: swap; (with size-adjust fallback) -->
font-display: optional eliminates body text CLS entirely. CrUX LCP p75 1238ms → ~1050ms.Consolidate duplicate GA4 purchase and registration event tags
purchase event to the same GA4 property
- 2 event_registration_start tags: "#1" and "#2" — same event, same property
- 2 event_registration_complete tags: "#1" and "#2" — same event, same property
Duplicate event tags cause double/triple-counted conversions in GA4 reports AND add unnecessary main thread work (each event tag fires gtag('event', ...) with serialization and network beacon). purchase — compare the 3 tags' triggers and parameters.event_registration_start and event_registration_complete.Investigate and defer suspicious goddesslamps.com third-party script
goddesslamps.com. It may be injected by an ad network, header bidding partner, or WordPress plugin.requestIdleCallback).