First Input Delay (FID): The metric Google retired (and why)
FID is deprecated as of March 2024
Google replaced FID with Interaction to Next Paint (INP) because FID was too easy to game and missed real responsiveness problems. If you're optimising Core Web Vitals now, ignore FID. Focus on INP.
FID measured the delay before your browser could respond to the first click. Sounds useful. Except it only checked the first interaction, ignored visual feedback, and gave perfect scores to sites that felt sluggish. Google killed it for good reason.
What was FID (and why it failed)?
FID measured input delay. The time between a user's first click and when the browser's main thread could start processing it. It didn't measure rendering, visual feedback, or any interaction after the first one.
The fatal flaw: You could have terrible buttons throughout your entire site, but if the first click was fast, you passed. Users experienced sluggish interactions on every form field, every menu click, every button. But FID reported "Good." This made it useless for measuring real responsiveness.
FID thresholds (historical)
What FID measured
User clicks button at time 0ms
↓
Main thread busy executing JavaScript
↓
Event handler starts at 150ms ← This is FID
↓
Event handler executes (not measured by FID)
↓
Browser paints visual feedback (not measured by FID)
FID only measured the delay, not the full interaction time.Why Google deprecated FID in favour of INP
FID had fundamental limitations that made it a poor indicator of overall responsiveness. INP addresses all of these issues.
1. Only measured first interaction
FID ignored all subsequent interactions. A page could have terrible responsiveness after load but still score well on FID because the first click happened to be fast.
INP improvement: Measures all interactions throughout the page lifecycle and reports the worst one.
2. Didn't measure processing time
FID only measured the delay before the event handler started. It ignored how long the handler took to execute and how long it took to paint the result.
INP improvement: Measures the full interaction latency from input to next paint, capturing the complete user experience.
3. Easy to game
Sites could optimise for fast first interaction while having slow interactions everywhere else. FID didn't represent real-world responsiveness.
INP improvement: Can't be gamed because it measures the worst interaction, not just the first or average.
4. Not representative of user experience
Most sites had good FID scores (>90% of pages scored "good") even when users experienced significant interaction delays throughout their session.
INP improvement: More challenging metric that accurately reflects perceived responsiveness across the entire session.
Why FID mattered (historically)
Despite its limitations, FID was the first interactivity metric in Core Web Vitals. It brought attention to JavaScript blocking and main thread performance.
Ranking signal
From 2021-2024, FID was a Google ranking factor. Sites with poor FID could see lower search rankings, especially on mobile.
JavaScript awareness
FID forced developers to think about main thread blocking, long tasks, and input responsiveness during page load.
Foundation for INP
FID's limitations directly informed the design of INP, which is a much more comprehensive responsiveness metric.
How to measure FID (historical reference)
Most tools now report INP instead of FID
Chrome UX Report, PageSpeed Insights, and Search Console have transitioned to INP. FID data is still available for historical comparison but INP is the focus going forward.
Field data (Real users)
FID could only be measured with real user data because it required actual user interaction:
- Chrome UX Report - Historical FID data through March 2024
- Google Search Console - Transitioned from FID to INP reporting
- Real User Monitoring - Most RUM tools now track INP instead of FID
Measure FID programmatically (legacy code)
Install the web-vitals library if you still need to track FID:
npm install web-vitalsLegacy FID tracking (most tools now use INP instead):
import {onFID} from 'web-vitals';
onFID((metric) => {
console.log('FID:', metric.value);
analytics.track('fid', {
value: metric.value,
rating: metric.rating
});
});
// Modern replacement: Use INP
import {onINP} from 'web-vitals';
onINP((metric) => {
console.log('INP:', metric.value);
analytics.track('inp', {
value: metric.value,
rating: metric.rating,
interaction_type: metric.entries[0]?.name
});
});FID vs INP: Key differences
| Aspect | FID (Deprecated) | INP (Current) |
|---|---|---|
| What it measures | Input delay only | Full interaction latency (input delay + processing + paint) |
| Which interactions | First interaction only | All interactions (reports worst) |
| Threshold (good) | ≤100ms | ≤200ms |
| Threshold (poor) | >300ms | >500ms |
| Scope | Page load only | Entire page lifecycle |
| Event types | Click, tap, key press | Click, tap, key press |
| Processing time | Not measured | Measured |
| Paint time | Not measured | Measured |
| Lab measurement | Not possible | Not possible (field only) |
| Ranking factor | Was (2021-2024) | Is (March 2024+) |
Example: Same interaction, different scores
Scenario: User clicks button
Timeline:
- 0ms: User clicks
- 80ms: Main thread becomes free (FID = 80ms ✓ Good)
- 80-350ms: Event handler executes (270ms)
- 350-400ms: Browser paints update (50ms)
- 400ms: User sees visual feedback (INP = 400ms ✗ Poor)
FID score: 80ms (Good)
INP score: 400ms (Poor)
FID missed the slow handler and paint time.
INP captured the full user experience.Migrating from FID to INP
1. Update your monitoring
// Old: Track FID
import {onFID} from 'web-vitals';
onFID((metric) => {
sendToAnalytics({
metric_name: 'FID',
value: metric.value
});
});
// New: Track INP
import {onINP} from 'web-vitals';
onINP((metric) => {
sendToAnalytics({
metric_name: 'INP',
value: metric.value,
// INP provides more context
interaction_type: metric.entries[0]?.name,
target_element: metric.entries[0]?.target?.tagName
});
});2. Adjust your performance budgets
Old FID budgets:
- Good: ≤100ms
- Target P75: 80ms
New INP budgets:
- Good: ≤200ms
- Target P75: 150ms
INP thresholds are higher because it measures more:
- FID: Just input delay
- INP: Input delay + processing + paint
Your optimisation target is harder, but more meaningful.3. Focus on total interaction latency
Optimisations that improved FID still help INP, but you need to go further:
- FID strategy: Reduce main thread blocking during page load
- INP strategy: Reduce main thread blocking throughout the session + optimise event handlers + minimise DOM work
See our comprehensive INP optimisation guide for:
- Breaking up long tasks to yield to the browser
- Optimising event handler performance
- Minimising DOM manipulation during interactions
- Using web workers for heavy computation
- Debouncing expensive operations
4. Test beyond initial load
FID testing: Click once during page load
✓ Fast first click
✗ Didn't test scrolling, filtering, form submission
INP testing: Interact throughout the session
✓ Click all buttons
✓ Type in forms
✓ Use filters and search
✓ Navigate menus
✓ Trigger modals
Test the worst interactions, not just the first.5. Update your dashboards and alerts
- Replace FID charts with INP charts in your analytics
- Update alert thresholds: FID <100ms → INP <200ms
- Track new dimensions: Interaction type, target element, page state
- Historical comparison: Keep FID data for reference but focus on INP trends
FID to INP migration checklist
Ready to optimise for INP?
FID is history. INP is the future of responsiveness measurement. We can help you transition your performance strategy and achieve great INP scores. Read our INP guide or get in touch for expert help.
Optimise for INP instead
FID is deprecated. We can help you optimise for INP, the new responsiveness metric that better captures user experience.