Monitoring Core Web Vitals with SpeedCurve: LCP, CLS, FID, INP
Core Web Vitals are Google's standardized metrics for measuring real-world user experience. They directly influence search rankings and reflect what users actually feel when they load your site. SpeedCurve tracks all Core Web Vitals in both Synthetic and Real User Monitoring modes, giving you a complete picture: controlled lab data for debugging, field data for understanding real impact.
This guide explains how each Core Web Vital is measured in SpeedCurve, how to set up dashboards for ongoing monitoring, how to use competitive benchmarking, and how to translate the data into a prioritized list of fixes.
The Core Web Vitals: What SpeedCurve Measures
LCP — Largest Contentful Paint
LCP measures how long it takes for the largest visible element to fully load. This is almost always the main content — a hero image, a large heading, or a video thumbnail. Google's thresholds:
- Good: < 2.5 seconds
- Needs Improvement: 2.5s – 4.0s
- Poor: > 4.0 seconds
In Synthetic testing, SpeedCurve captures LCP precisely using the browser's PerformanceObserver API. You can see exactly which element triggered the LCP event — this appears in the test detail view alongside the waterfall and filmstrip.
In RUM (LUX), LCP is collected from real user sessions. Because real users are on different devices, networks, and locations, the distribution of LCP values is much wider than Synthetic. SpeedCurve shows you percentile breakdowns (p50, p75, p95) so you understand both typical and worst-case experience.
What drives LCP:
- Server response time (slow TTFB delays everything)
- Render-blocking resources (CSS and scripts that block the browser)
- Large image files without proper optimization or preloading
- Client-side rendering that delays the main content
CLS — Cumulative Layout Shift
CLS measures visual stability — how much the page layout shifts unexpectedly as it loads. A high CLS score means elements are moving around while the user is trying to interact, causing mis-clicks and a disorienting experience.
- Good: < 0.1
- Needs Improvement: 0.1 – 0.25
- Poor: > 0.25
CLS is notoriously hard to catch without automated monitoring. Layout shifts often happen within the first 2–3 seconds of page load — during the window when ads, web fonts, images without dimensions, and dynamically injected content can all shift the layout.
SpeedCurve's Filmstrip view makes CLS visible: you can see frames where layout shifts occur, and the test detail shows a breakdown of individual shift events with their scores.
In RUM, CLS is harder to aggregate because it depends on user interaction — long session CLS (measuring shifts throughout the page lifecycle) can be different from initial load CLS. SpeedCurve's LUX handles this correctly, following the same measurement approach as Chrome's web-vitals library.
What drives CLS:
- Images without explicit
widthandheightattributes - Ads that expand after load
- Web fonts causing FOUT (Flash of Unstyled Text) that shifts surrounding elements
- Dynamically injected content above existing content
- Animations that affect layout (use
transforminstead oftop/left)
FID — First Input Delay (Deprecated)
FID measured the delay between a user's first interaction (click, tap, keypress) and the browser's response to that interaction. Google deprecated FID in favor of INP in March 2024.
SpeedCurve still reports FID in RUM data for historical comparison, but INP is now the authoritative interaction metric. Synthetic monitoring cannot measure FID or INP naturally (there's no real user clicking), though SpeedCurve uses Total Blocking Time (TBT) as a Synthetic proxy.
INP — Interaction to Next Paint
INP replaced FID as a Core Web Vital in March 2024. Where FID only measured the first interaction, INP measures all interactions throughout the page session and reports the worst-case latency.
- Good: < 200ms
- Needs Improvement: 200ms – 500ms
- Poor: > 500ms
INP is purely a field metric — it requires real user interactions to measure. SpeedCurve's LUX snippet collects INP from real sessions. In Synthetic, TBT serves as a proxy: a high TBT indicates the main thread is frequently blocked, which tends to produce high INP.
What drives INP:
- Long tasks on the main thread (JavaScript execution > 50ms)
- Excessive DOM size making updates expensive
- Unnecessary work triggered by user interactions (event handlers that recalculate layout)
- Third-party scripts blocking the main thread during interactions
Setting Up Core Web Vitals Dashboards in SpeedCurve
SpeedCurve provides pre-built dashboard templates for Core Web Vitals, but you can also customize your own.
Using the Core Web Vitals Dashboard Template
After adding your site, go to Dashboards and select Add Dashboard. SpeedCurve offers a "Core Web Vitals" template that pre-populates with:
- LCP trend chart across all URLs and profiles
- CLS trend chart
- TBT trend chart (Synthetic proxy for interaction metrics)
- Per-URL breakdown showing which pages are Good / Needs Improvement / Poor
This is a solid starting point. Customize it by filtering to your most critical URLs and adding a competitive benchmark overlay.
Building a Custom Dashboard
For more control, create a custom dashboard with individual metric panels:
Panel: LCP by Page Type Add a chart with LCP grouped by URL. Sort descending to see your worst-performing pages first. Hover over any point to see the full test details.
Panel: CLS Trend with Deploy Annotations Configure this chart to show CLS over the last 90 days with deploy markers enabled. Layout shift regressions are often introduced by specific deploys — the annotation makes the correlation obvious.
Panel: Synthetic vs. RUM Comparison Place your Synthetic LCP chart next to your RUM LCP p75 chart for the same page. If Synthetic shows LCP at 1.8s but RUM shows p75 at 4.2s, you have a real-world performance problem that your lab setup isn't capturing — likely a device or network mix issue.
Panel: Core Web Vitals Pass/Fail Summary SpeedCurve can show a green/amber/red status for each URL across all three Core Web Vitals. This is the single most useful view for a weekly team review — it immediately shows where you stand and which pages need attention.
Setting Dashboard Refresh and Sharing
SpeedCurve dashboards can be set to auto-refresh (useful for a team TV display or NOC view) and shared as read-only links with stakeholders who don't need full account access.
Monitoring Core Web Vitals in Synthetic vs. RUM
Understanding when to use each data source is critical for effective Core Web Vitals monitoring.
| Dimension | Synthetic | RUM (LUX) |
|---|---|---|
| LCP | ✓ | ✓ |
| CLS | ✓ | ✓ |
| FID | ✗ (can't simulate) | ✓ (historical) |
| INP | ✗ (use TBT as proxy) | ✓ |
| Reproducible | ✓ | ✗ |
| Real user conditions | ✗ | ✓ |
| Long-tail variability | ✗ | ✓ |
| Debug detail (waterfall, filmstrip) | ✓ | ✗ |
| Available before launch | ✓ | ✗ |
Use Synthetic to:
- Catch regressions before or immediately after deploy
- Debug exactly which resource or script is responsible for slow LCP
- Monitor competitors under identical conditions
- Test pages that require login or specific state
Use RUM to:
- Understand actual user experience across all device/network combinations
- Identify geographic regions with worse performance
- Measure INP and long-session CLS
- Prioritize which pages impact the most users
Reconciling Synthetic and RUM Discrepancies
It's common for Synthetic and RUM to disagree. Possible reasons:
- Device mix: Your Synthetic tests may run on fast desktop hardware, but most of your users are on mid-range mobile devices. Run Synthetic on a 3G mobile profile and compare.
- Geographic mismatch: Your Synthetic test location may not match where your users are. Add test locations that match your user geography.
- Third-party scripts: Some third-party scripts behave differently in automated browser sessions (they detect bots and load lighter versions). What your Synthetic test doesn't load, RUM does.
- Page state: Synthetic tests a cold cache, no login state. RUM captures returning users with warm caches, potentially logged in, with different content loading.
When you see a significant gap, first align your Synthetic profile to match your median real user's conditions. If the gap persists, the remaining difference is likely third-party script behavior or content personalization.
Competitive Benchmarking for Core Web Vitals
One of SpeedCurve's most powerful features is competitor benchmarking. Under identical test conditions, you can see how your Core Web Vitals compare against competitors.
Adding Competitors
In Settings > Sites > [Your Site], add competitor URLs. SpeedCurve tests these under the same profile (browser, network, location) as your own pages.
For a meaningful comparison, align your pages with equivalent competitor pages:
- Your homepage vs. their homepage
- Your product listing page vs. their equivalent
- Your checkout flow entry vs. their equivalent
Comparing your homepage to their product page is noise; comparing equivalent pages is signal.
Interpreting Competitive Data
Once competitors are configured, they appear alongside your data in trend charts and the competitive benchmark table. SpeedCurve shows:
- Side-by-side LCP, CLS, TBT values
- Filmstrip comparisons (visually see who renders content faster)
- Score ranking across all sites in the comparison group
Strategic uses of competitive data:
- Identifying the achievable: If a competitor's LCP is 1.6s on the same network profile as your 3.2s, you know 1.6s is achievable — they're solving the same fundamental problem.
- Catching competitor improvements: If a competitor's performance suddenly improves significantly, they may have shipped a meaningful optimization. Investigate what changed.
- Benchmarking for stakeholders: "Our LCP is 2.4s; our three main competitors average 3.1s" is a much more compelling story than a raw number.
Filmstrip Comparison
The filmstrip comparison tool is SpeedCurve's most visually compelling feature for competitive analysis. Navigate to Compare > Filmstrip and select your page against a competitor's equivalent.
The filmstrip shows screenshots at 100ms intervals as each page loads. Even when the raw LCP numbers are close, the filmstrip often reveals qualitative differences:
- Does the competitor show meaningful content earlier?
- Does your page have a longer blank white screen at the start?
- Does a layout shift in the competitor's page make it harder to use?
This visual comparison is ideal for executive presentations and for illustrating the user impact of performance improvements.
Using Core Web Vitals Data to Prioritize Fixes
Data without action is just noise. Here's how to translate SpeedCurve's Core Web Vitals data into an actionable fix priority list.
Step 1: Identify Your Worst Pages
Sort all monitored URLs by LCP (descending). The bottom performers are your highest-impact targets — not necessarily because they're most broken, but because they're usually high-traffic pages where poor LCP is hurting the most users and (if in Google Search results) search rankings.
Step 2: Diagnose the Root Cause
For each underperforming page, open the test detail in SpeedCurve:
For high LCP:
- Check the waterfall: is TTFB slow? That's a server or CDN problem.
- Is there a large render-blocking CSS or JS file loading before the LCP element?
- Is the LCP element an image? Check if it's being lazy-loaded (it shouldn't be for above-the-fold content) and whether it has
fetchpriority="high". - Is the image large and unoptimized? Check the content download size in the waterfall.
For high CLS:
- Review the filmstrip frame-by-frame and identify when shifts occur
- Check the shift breakdown in the test detail for which elements are shifting
- Common fixes: add explicit dimensions to images, reserve space for ads with CSS
min-height, usefont-display: optionalor preload fonts
For high TBT (INP proxy):
- Open the Chrome DevTools trace link from SpeedCurve to see which scripts are causing long tasks
- Look for large JavaScript bundles executing during page load
- Identify third-party scripts that are blocking the main thread
Step 3: Estimate Impact Before Building
Before writing code, use SpeedCurve to model the expected improvement. You can do this by:
- Creating a test against a branch/staging URL with the fix applied
- Comparing the result against production using SpeedCurve's comparison view
- Projecting the improvement against your RUM distribution to estimate how many users move from "Needs Improvement" to "Good"
This estimate helps prioritize: a fix that moves LCP from 4s to 2.4s on a page with 10,000 daily sessions is worth more than a fix that moves LCP from 2.6s to 2.4s on a low-traffic admin page.
Step 4: Validate After Deploy
After shipping a fix, use SpeedCurve to confirm the improvement:
- Check the Synthetic trend chart — the improvement should appear immediately in post-deploy tests
- Mark the deploy in SpeedCurve's deploy annotation feature
- Monitor RUM data over the following 48–72 hours to see if the field metrics improve (RUM changes appear more slowly as traffic accumulates)
Core Web Vitals and Search Rankings
Google uses Core Web Vitals as a ranking signal through the Page Experience update. SpeedCurve helps you maintain good rankings by:
- Alerting you to regressions before Google's crawlers pick them up
- Providing trend data that shows whether you're trending toward "Good" or "Poor" thresholds
- Enabling competitive monitoring so you know when competitors improve their scores
Google's ranking signal is based on field data from the Chrome User Experience Report (CrUX), not Synthetic lab data. Your SpeedCurve RUM data is a closer approximation of what Google sees than Synthetic results. If your LUX data shows consistent "Good" ratings for LCP and CLS, your Page Experience signal is likely positive.
Conclusion
SpeedCurve's Core Web Vitals monitoring combines the reproducibility of Synthetic testing with the real-world accuracy of RUM — giving you both the diagnostic precision to find problems and the user-impact data to prioritize which problems matter most.
The most effective teams use SpeedCurve as a continuous feedback loop: Synthetic tests catch regressions at deploy time, RUM data confirms real-user impact, competitive benchmarks show where to aim, and performance budgets prevent silent backsliding. Together, they make Core Web Vitals an engineering discipline rather than a periodic audit.
Start by building your Core Web Vitals dashboard, add one or two competitors for context, and set LCP and CLS budgets at Google's "Good" thresholds. Then let the data guide you toward the fixes that will have the biggest impact on your users.