This is a demo report. Want one for your site?

Analyze Your Site Free

Audit Results

https://techcrunch.com/

WordPress

Lighthouse Lab Data

Measured in a simulated environment. Values may differ from real user experience.
66
Performance Score
Largest Contentful Paint
2.2 s
Cumulative Layout Shift
0.0753
Interaction to Next Paint
879 ms
Good (90–100)Needs Improvement (50–89)Poor (0–49)

Field Data — Mobile (Real Users)

Core Web Vitals Poor

Chrome UX Report — p75 values from real mobile user experiences over the last 28 days

Largest Contentful Paint (LCP)
1.2 sNeeds Improvement
90.9%
Interaction to Next Paint (INP)
112 msNeeds Improvement
90.3%
Cumulative Layout Shift (CLS)
0.03Needs Improvement
92.8%
Time to First Byte (TTFB)
617 msGood
78.3%
12.0%
9.7%
GoodNeeds ImprovementPoor
~

Summary

Needs improvement

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.

Must do
  • 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"
Can defer
  • 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
Expected outcome

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

1mediuminpBoth

Remove duplicate Facebook Pixel — inline copy wastes ~95KB and double-fires events

Facebook Pixel is loaded three times: once as an inline script (connect.facebook.net/en_US/fbevents.js, 94.5KB, loaded at 2304ms), once via GTM Custom HTML tag "Facebook Pixel SDK", and again via "Facebook Pixel — Purchase" GTM tag. The inline copy competes with LCP resources for bandwidth and adds ~95KB of redundant JS. Both instances also fire the same events, corrupting Facebook Ads attribution data with double-counted conversions. Remove the inline Facebook Pixel from the WordPress template. Keep the GTM-managed version for centralized control.
1In the WordPress theme (likely header.php or a plugin injecting into wp_head), search for the fbevents.js script tag and remove it entirely.
2If it's injected by a plugin (e.g., "Facebook for WordPress" or "PixelYourSite"), deactivate that plugin since GTM already manages the pixel.
3Verify in GTM that "Facebook Pixel SDK" fires the base PageView event on all pages, and "Facebook Pixel — Purchase" fires only on conversion.
4Test in Facebook Events Manager → Test Events to confirm events still arrive correctly.
Before
<!-- 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>
After
<!-- REMOVED: Facebook Pixel is now managed exclusively via GTM container GTM-M24PKK8 -->
Google Tag Manager · GTM-M24PKK82 tags
Facebook Pixel SDK
html· facebook.com/tr
KEEP
Facebook Pixel — Purchase
html
KEEP
Expected impact
Eliminates 94.5KB of redundant JavaScript and ~100ms main thread time on mobile. Fixes double-counted Facebook conversion events. CrUX INP p75 112ms → ~100ms.
2mediuminpBoth

Delete 13 paused GTM tags and 39 unused variables to reduce container bloat

GTM container GTM-M24PKK8 has 13 paused tags and 39 unused variables (out of 79 total). Paused tags are still included in the container JS bundle — the browser downloads, parses, and evaluates their code even though they never fire. Similarly, unused variables add to container size and parsing time. Open GTM container GTM-M24PKK8 and delete the following paused tags:
1Custom Tag (__cvt_WR44P) — paused, unknown purpose
2GA4 Event (paused) — generic paused GA4 event tag
3Script: silo61.p7cloud.net — paused Custom HTML loading silo61.p7cloud.net/as1.js (likely a defunct ad/tracking vendor)
43 × Google Ads Conversion (unidentifiable) — find via GTM → Tags → filter Status: Paused → look for Google Ads Conversion type tags
54 × Paused Tag (unidentifiable) of type __cvt_105965535_19 — find via GTM → Tags → filter Status: Paused → look for this custom template type
64 × Custom HTML (unidentifiable) — find via GTM → Tags → filter Status: Paused → look for Custom HTML type tags
72 × Custom Image (Pixel) (unidentifiable) — find via GTM → Tags → filter Status: Paused → look for Custom Image type tags Then clean up unused variables: Go to GTM → Variables → review all User-Defined Variables. Delete the 39 unreferenced ones, including: author, post_type, publish_date, post_modified, category, gtm.elementClasses, gtm.triggers, gtm.elementUrl, transactionProducts, iframe.transactionProducts, iframe.tickets, iframe.pageData.url, Custom JavaScript #29, Event #1, URL #2, and 24 more. Also delete 12 orphaned triggers referenced by no active tags.
Google Tag Manager · GTM-M24PKK87 tags
Custom Tag (__cvt_WR44P)
paused
DELETE
GA4 Event
paused
DELETE
Script: silo61.p7cloud.net
paused· silo61.p7cloud.net/as1.js
DELETE
3 × Google Ads Conversion (unidentifiable)
paused
DELETE
4 × Paused Tag (unidentifiable)
paused
DELETE
4 × Custom HTML (unidentifiable)
paused
DELETE
2 × Custom Image (Pixel) (unidentifiable)
paused
DELETE
Expected impact
Reduces GTM container JS bundle by an estimated 15–25%, saving ~50–80ms of parse/evaluate time on mobile. CrUX INP p75 112ms → ~105ms.
3mediuminpBoth

Defer non-critical GTM third-party scripts (HelloBar, Zendesk, ScoreCard, BrandMetrics)

Four Custom HTML tags in GTM load heavyweight third-party scripts that are not needed for initial page render or core user experience: - Script: static.zdassets.com — Zendesk chat widget. Chat widgets typically load 300–800KB of JS, CSS, and an iframe just for a small icon. Use a facade pattern: show a CSS-only chat icon, load the real widget only on click. - Script: my.hellobar.com — promotional bar tool. Not needed at page load. - Script: sb.scorecardresearch.com — comScore tracking beacon. Pure analytics. - Script: cdn.brandmetrics.com — brand measurement script. Pure analytics. In GTM, change the triggers for these 4 tags from their current triggers to a Timer trigger set to fire 3–5 seconds after page load. This removes them from the critical rendering path while preserving measurement accuracy — users who leave before 3 seconds wouldn't perform meaningful actions anyway.
1In GTM → Triggers → create new Timer trigger: "Delay 3s" → Event Name: gtm.timer, Interval: 3000, Limit: 1.
2Update the trigger on each of the 4 tags above to use this new timer.
3For Zendesk specifically, consider a facade: replace the GTM tag with a lightweight CSS chat bubble that loads Zendesk only on user click.
Google Tag Manager · GTM-M24PKK84 tags
Script: static.zdassets.com
html· static.zdassets.com/snippet.js
MODIFY
Script: my.hellobar.com
html· my.hellobar.com
MODIFY
Script: sb.scorecardresearch.com
html· sb.scorecardresearch.com/beacon.js
MODIFY
Script: cdn.brandmetrics.com
html· cdn.brandmetrics.com/TechCrunch.js
MODIFY
Expected impact
Removes ~500KB+ of JS from the critical path. Estimated 200–400ms reduction in main thread blocking. CrUX INP p75 112ms → ~95ms.
4mediumlcpBoth

Preload the LCP hero image and set fetchpriority="high"

The LCP element is the hero article image Pokemon_Pokopia_Screenshot_5.jpeg (55.4KB, 768×432). In the waterfall it loads at position #19 with Low priority — the browser discovers it late because it's set as a background or lazy-evaluated <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.
1Add a preload link in the WordPress <head> via functions.php or the theme's header.php.
2On the <img> element itself, add fetchpriority="high" and ensure it does NOT have loading="lazy" — lazy-loading an LCP image delays it by 500–2000ms.
3Use fetchpriority="high" on only this one image — applying it to multiple images creates network contention that negates the benefit.
Before
<img src="/wp-content/uploads/2026/03/Pokemon_Pokopia_Screenshot_5.jpeg?resize=768,432" alt="..." />
After
<!-- 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" />
Expected impact
LCP image starts loading ~300ms earlier on mobile. CrUX LCP p75 1238ms → ~1000ms (pushing it further into the "good" zone).
5mediumlcpMobile

Consolidate 13 render-blocking CSS files into fewer bundles

The waterfall shows 13 separate CSS requests (requests #1–#13) all loading in parallel with High priority between 2765–2766ms. This is a classic WordPress 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.
1Use a CSS concatenation plugin like Autoptimize or WP Rocket to merge these into 1–2 CSS files. In WP Rocket: Settings → File Optimization → Combine CSS files.
2Extract critical CSS for above-the-fold content and inline it in <head>. WP Rocket has a "Remove Unused CSS" option that generates per-page critical CSS.
3Ensure the TC-24 theme's block-based CSS enqueue (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().
Expected impact
Reduces render-blocking time by ~100–150ms on mobile by eliminating per-request overhead. CrUX LCP p75 1238ms → ~1100ms.
6mediuminpBoth

Convert Facebook Pixel from Custom HTML to native GTM template

The "Facebook Pixel SDK" tag in GTM uses Custom HTML, which means the full 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.
1In GTM → Tags → find "Facebook Pixel SDK" (search by script hint: facebook.com/tr).
2Create a new tag using the Community Template Gallery → search for "Facebook Pixel" by Meta.
3Configure it with the same Pixel ID currently in the Custom HTML code.
4Set the trigger to the same trigger as the existing tag.
5Pause the old Custom HTML tag, publish, verify events in Facebook Events Manager → Test Events.
6Once verified, delete the old Custom HTML tag.
Google Tag Manager · GTM-M24PKK81 tags
Facebook Pixel SDK
html· facebook.com/tr
MODIFY
Expected impact
Saves 80–120ms main thread time per page load. CrUX INP p75 112ms → ~100ms.
7mediumclsBoth

Fix layout shifts from top promotional banner and hero card content

Lab CLS is 0.075 with 6 layout shifts detected. The two largest shifts (score 0.064 each) come from: - main#wp--skip-link--target > div.wp-block-group.alignfull.top-hero-package — the hero section shifting - header.wp-block-template-part--header-homepage > div.wp-block-techcrunch-site-header — the homepage header Two smaller shifts (score 0.012 each) affect the featured card title and category label (h3.loop-card__title and div.loop-card__cat-group). These likely shift when custom fonts (Yellix ExtraBold for headings, NB International Pro for body) swap in with different metrics than the fallback. The "Founder Summit 2026" promotional banner at the very top of the page is a common CLS culprit — if it loads dynamically after initial paint, it pushes everything down.
1For the top promotional banner: render it server-side in the initial HTML with a reserved min-height. If it's dismissible, use position: fixed or position: sticky so dismissal doesn't shift content.
2For font-swap CLS on .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.
3For the ad slot below the header (Microsoft/NVIDIA banner): ensure the container has a fixed min-height: 90px matching the IAB leaderboard ad size.
Before
/* No fallback font metrics */
@font-face {
  font-family: 'Yellix';
  src: url('/fonts/Yellix-ExtraBold.woff2') format('woff2');
  font-display: swap;
}
After
/* 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;
}
Expected impact
CrUX CLS p75 0.03 → ~0.01, reducing font-swap and banner shifts. Lab CLS 0.075 → ~0.02.
8mediumlcpBoth

Optimize font loading — preload critical weights and use font-display: optional for body

Four font files load between 3152–3202ms after CSS is parsed (requests #37–#40): three weights of NB International Pro (21.6KB + 21.3KB + 22.2KB) and Yellix ExtraBold (42.2KB). These fonts are discovered only after the browser parses the CSS containing their @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.
1Preload only the 2 most critical font files (Regular body weight + ExtraBold heading weight).
2Set font-display: optional on NB International Pro @font-face declarations.
3Keep font-display: swap on Yellix but add fallback font metrics (see CLS recommendation).
Before
<!-- No font preloads -->
<link rel="stylesheet" href="/themes/tc-24/dist/blocks/...css" />
After
<!-- 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) -->
Expected impact
Fonts start loading ~300ms earlier. font-display: optional eliminates body text CLS entirely. CrUX LCP p75 1238ms → ~1050ms.
9mediuminpBoth

Consolidate duplicate GA4 purchase and registration event tags

GTM container GTM-M24PKK8 has duplicate GA4 event tags sending the same events to measurement ID G-KJR3C2ZQN6: - 3 purchase tags: "GA4 Event — purchase #1", "#2", "#3" — all send 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).
1Open GTM → Tags → search for Event Name: purchase — compare the 3 tags' triggers and parameters.
2Consolidate into one purchase tag with the correct trigger(s). If different triggers are needed, use a single tag with multiple trigger conditions via an OR group.
3Do the same for event_registration_start and event_registration_complete.
4Verify in GA4 → Realtime → Events that event counts don't double.
Google Tag Manager · GTM-M24PKK87 tags
1 × GA4 Event — event_registration_start
GA4 Event — event_registration_start· GTM → Tags → Status: Paused
KEEP
1 × GA4 Event — event_registration_complete
GA4 Event — event_registration_complete· GTM → Tags → Status: Paused
KEEP
GA4 Event — purchase #1
gaawe· GTM: G-KJR3C2ZQN6
KEEP
GA4 Event — purchase #2
gaawe· GTM: G-KJR3C2ZQN6
DELETE
GA4 Event — purchase #3
gaawe· GTM: G-KJR3C2ZQN6
DELETE
GA4 Event — event_registration_start #2
gaawe· GTM: G-KJR3C2ZQN6
DELETE
GA4 Event — event_registration_complete #2
gaawe· GTM: G-KJR3C2ZQN6
DELETE
Expected impact
Eliminates 5 redundant event tag executions, saving ~50ms main thread time on conversion pages. Fixes inflated GA4 conversion data.
10lowinpMobile

Investigate and defer suspicious goddesslamps.com third-party script

Request #34 in the waterfall loads goddesslamps.com/bundles/qfjjrffj_oomp.index.js (33.6KB) starting at 3069ms with a total load duration of 1649ms — the slowest single resource in the waterfall. The obfuscated file name and domain suggest this is an ad-tech or tracking script. This script loads with High priority and blocks the main thread during execution. Since field INP is already good at 112ms, this isn't causing user-facing issues yet, but it's a risk.
1Identify what this script does — search your codebase and GTM for goddesslamps.com. It may be injected by an ad network, header bidding partner, or WordPress plugin.
2If it's an ad script, defer it to load after the LCP paint (3-second delay or requestIdleCallback).
3If it's unknown/orphaned, remove it entirely.
Expected impact
Removing or deferring saves ~33.6KB download and an estimated ~200ms main thread blocking time. Marginal CrUX INP improvement.

This is a demo report. Want one for your site?

Analyze Your Site Free
Techcrunch — CWV Audit Report | FixMyCWV