All posts
Web Vitals|6 min read

INP replacing FID: what frontend teams need to know

Interaction to Next Paint replaced First Input Delay in March 2024. Here is what changed, why it matters, and how to optimize for it.

S

Sarah Chen

Staff Engineer, PagePulse · April 15, 2025

In March 2024, Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) as a Core Web Vital. The change was significant. FID measured only the first interaction on a page and only the input delay portion of it. INP measures every interaction throughout the page lifecycle and the full processing time, including event handlers and rendering.

Why the change matters

FID was a forgiving metric. Most pages passed FID because the first interaction usually happened after the page had finished loading, when the main thread was idle. INP is much stricter. It captures the slowest interactions on the page, which often happen later, when the user is actively interacting with the app and the main thread is busy.

If your FID was good but your INP is poor, you are not alone. Most teams saw their Core Web Vitals score drop when INP replaced FID. The good news is that the fixes for INP are well understood.

Common INP offenders

  • 01Long tasks on the main thread, usually from third-party scripts.
  • 02Synchronous event handlers that do too much work.
  • 03Heavy client-side rendering, especially in React and Next.js apps.
  • 04Large JavaScript bundles that take a long time to parse and compile.
  • 05Heavy use of requestAnimationFrame for non-visual work.

How to optimize INP

The general principle is to keep the main thread idle. Break long tasks into smaller chunks using scheduler.yield or setTimeout. Defer non-critical work out of event handlers using scheduler.postTask. Move heavy computation to a Web Worker. Lazy-load third-party scripts, especially analytics and tag managers.

typescript
// Before: long task blocks the main thread
button.addEventListener('click', () => {
  updateUI();
  trackAnalytics();
  saveToLocalStorage();
  sendBeacon();
});

// After: critical work runs immediately, rest is deferred
button.addEventListener('click', async () => {
  updateUI();
  await scheduler.yield();
  trackAnalytics();
  saveToLocalStorage();
  sendBeacon();
});

Measure INP on real users

INP is highly sensitive to device class, browser, and network. A synthetic test from a fast laptop on cable will not reveal the INP problems that real users on mid-range Android phones are experiencing. Use real user monitoring to capture INP for every pageview, then slice the data by device, browser, and country to find the worst offenders.

Ready to ship
faster pages?

Join thousands of frontend teams monitoring Core Web Vitals with PagePulse. Install in 2 minutes, see results today.

No credit card required