All Guides
Technical Performance

Fix First Input Delay

FID is deprecated. Here’s what replaced it and what to do about it.

What this covers: FID is deprecated. Here’s what replaced it and what to do about it, including fid → inp, what causes slow interactions.

Who it’s for: Site owners and developers who want their website to load faster.

Key outcome: You’ll have first input delay (fid) is deprecated — inp has replaced it as the core web vital for responsiveness, and interaction to next paint (inp) is under 200ms across all page templates.

Time to read: 5 minutes

Part of: Technical Performance series

FID → INP

Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) in March 2024. The fixes are similar, but INP is stricter.

Metric Measures Good Score
FID (deprecated) First interaction only ≤100ms
INP (current) All interactions ≤200ms

What Causes Slow Interactions

JavaScript blocking the main thread. When JS runs, the browser can’t respond to clicks.

Find the Problem

First Input Delay measures how quickly your page responds to user interactions like clicks and taps, which directly impacts how professional and trustworthy your site feels. Users notice slow responses immediately, and Google uses this metric as a ranking factor.

Start by identifying what’s actually wrong.

  1. Open Chrome DevTools → Performance tab
  2. Click Record, interact with the page
  3. Look for long tasks (red corners = over 50ms)

Fix It

1. Break Up Long Tasks


// Bad: one long task
processAllItems(items);

// Good: chunked processing
function processChunk(items, index) {
  const chunk = items.slice(index, index + 100);
  chunk.forEach(process);

  if (index + 100 < items.length) {
    setTimeout(() => processChunk(items, index + 100), 0);
  }
}

2. Defer Non-Critical JavaScript







3. Use requestIdleCallback


// Run when browser is idle
requestIdleCallback(() => {
  // Non-urgent work here
});

4. Move Work Off Main Thread


// Heavy computation in a Web Worker
const worker = new Worker('heavy-task.js');
worker.postMessage(data);
worker.onmessage = (e) => updateUI(e.data);

Common Culprits

These are the usual causes.

  • Large JavaScript bundles (split them)
  • Third-party scripts (defer or remove)
  • Synchronous XHR (use fetch with async)
  • Complex DOM manipulation (batch updates)

Third-Party Script Audit

Third-party scripts are the most common INP killer, and most sites have no idea how many they’re loading. Run this audit:

  1. Inventory every script: Open Chrome DevTools → Network tab → filter by JS. Sort by domain. Every domain that isn’t yours is a third-party script. Count them—most sites have 8-15.
  2. Measure individual impact: Block each third-party domain one at a time using DevTools → Network → Block request domain. Re-run Lighthouse after each block. The TBT delta tells you exactly what each script costs.
  3. Categorize by necessity: Essential (payment processing, auth), important (analytics, error tracking), nice-to-have (heatmaps, chat widgets, social embeds). Defer or remove anything in the third category that adds more than 50ms of TBT.

Framework-Specific Patterns

React: Use React.lazy() and Suspense for code splitting. Wrap non-critical state updates in startTransition() to prevent them from blocking interactions. Avoid synchronous setState in event handlers that trigger expensive re-renders.

WordPress: Dequeue unused plugin scripts with wp_dequeue_script(). Move jQuery-dependent scripts to the footer with wp_enqueue_script() using the in_footer parameter set to true. Use wp_script_add_data($handle, 'async', true) for non-critical scripts.

Vue/Nuxt: Use async components with defineAsyncComponent(). Lazy-load routes. Avoid large computed properties that run on every interaction—use shallowRef for complex objects that don’t need deep reactivity.

Check Core Web Vitals Monthly

Run PageSpeed Insights and expand the INP section. It shows exactly which interactions are slow.

Confirming INP Is Under 200ms

  • INP (replaced FID) is under 200ms in PageSpeed Insights
  • Long tasks in DevTools are under 50ms
  • Interactions feel instant with no perceptible delay

Sources

First Input Delay & INP Questions Answered

What replaced First Input Delay as a Core Web Vital?

Interaction to Next Paint (INP) replaced First Input Delay (FID) as the official Core Web Vital responsiveness metric in March 2024. INP measures the latency of all user interactions throughout the entire page lifecycle and reports the worst case, making it a more comprehensive responsiveness metric than FID.

What causes high First Input Delay or INP?

The primary cause is long JavaScript tasks that block the browser’s main thread. Common culprits include large third-party scripts (analytics, ads, chat widgets), unoptimized JavaScript bundles over 100KB, synchronous API calls during page load, and complex DOM manipulations triggered by user interactions.

What is a good INP score?

An INP of 200 milliseconds or less is considered good. Between 200-500ms needs improvement. Above 500ms is poor. The median website scores around 250ms on mobile. Focus on breaking up long tasks (over 50ms) using requestIdleCallback, web workers, or yield-to-main-thread patterns.

How do you measure First Input Delay in the field?

Use the Chrome User Experience Report (CrUX) via PageSpeed Insights or BigQuery for real-user FID/INP data. Google Search Console’s Core Web Vitals report also shows field data. For debugging, use the Web Vitals JavaScript library (web-vitals npm package) to log INP attribution data identifying which specific interactions are slow.

✓ Your Site Passes Core Web Vitals for Interactivity

  • First Input Delay (FID) is deprecated — INP has replaced it as the Core Web Vital for responsiveness
  • Interaction to Next Paint (INP) is under 200ms across all page templates
  • Total Blocking Time (TBT) in Lighthouse is under 200ms on mobile throttling
  • No single JavaScript task on the main thread exceeds 50ms (no long tasks during page load)

Test it: Run PageSpeed Insights on your highest-traffic page and confirm INP shows a green “Good” scores in the field data section.