Post on X Share on LinkedIn
Portfolio 24hrs Services White Label Free Tools Blog FAQ Contact Get on Call
Back to Blog
SEO

INP Replaced FID - Why Your React App Probably Fails Core Web Vitals

Interaction to Next Paint replaced First Input Delay in March 2024, and most React apps quietly stopped passing Core Web Vitals. Here is what changed and how to fix it.

INP Replaced FID - Why Your React App Probably Fails Core Web Vitals

Google replaced First Input Delay with Interaction to Next Paint as a Core Web Vital in March 2024. FID measured one thing: the delay before your first user input was processed. INP measures every interaction across the entire page visit and reports the worst one. The change broke most React apps quietly. Many sites that passed Core Web Vitals comfortably under FID dropped into the failing tier within weeks of the switch.

The threshold that matters: 200 milliseconds at the 75th percentile. If three quarters of your users experience an interaction faster than 200ms, you pass. If not, your Core Web Vitals report turns red and your rankings start sliding. Most React apps we audit in 2026 score between 250 and 450ms before optimization. Here is why and what to do about it.

Why React apps fail INP so consistently

FID had a generous failure mode for SPAs. The browser tracked the first input. If hydration finished before the user clicked, FID was effectively zero. Users who waited a beat before interacting got a passing measurement even on apps with terrible runtime performance.

INP closes that escape hatch. Every click, every input, every keystroke is measured. The slowest one across the page visit becomes your reportable score. React apps now show their real cost: the dropdown that re-renders 200 components, the form input that runs validation against the entire form on every keystroke, the dashboard widget that recomputes a derived selector every time state changes anywhere in the tree.

The three patterns that cause most failures

Across the audits we have run on React apps in the past year, three patterns account for the majority of INP failures.

Fix 1 - Defer hydration with React Server Components or selective hydration

If your framework supports React Server Components (Next.js App Router, Remix's recent versions, Waku), use them for the parts of the page that do not need interactivity. The components ship as pre-rendered HTML and never hydrate. Your hydration cost drops by whatever percentage of the page does not need event handlers.

If you are still on Pages Router or a non-RSC framework, use selective hydration through React.lazy and Suspense boundaries. Wrap the heavy interactive widgets so they hydrate only when they enter the viewport or when the user starts interacting near them. The first-paint hydration tree shrinks, and INP for the first interaction drops by 100-200ms on typical layouts.

Fix 2 - Slice context and use selectors

The fix for context-driven re-renders is structural. Split the single big context into many small ones, or replace context with a state library that supports selectors (Zustand, Jotai, Redux Toolkit with reselect). The principle is the same: components should subscribe only to the slice of state they actually use.

If you cannot refactor the context shape, wrap the consumer with React.memo and pass only the specific values it needs as props. The optimization is fragile (it depends on referential equality) but it is a quick win when the right structural fix is weeks away.

Fix 3 - Move work out of the interaction path

Heavy work that does not need to block the user response should run in useTransition or in a Web Worker.

  1. useTransition for in-React work. Wrap state updates that drive expensive renders in startTransition. The browser paints the urgent update first and processes the transition during idle time. INP for the urgent click drops dramatically.
  2. Web Workers for parsing and computation. JSON parsing of large payloads, search index construction, image manipulation, encryption. Move them to a worker with Comlink and your main thread stays responsive even while the work runs.
  3. requestIdleCallback for analytics and tracking. Most analytics SDKs run their queue flush on every event. Wrap them in requestIdleCallback with a long timeout and your INP improves on every page that fires events during interaction.

INP is the metric that exposes how an app feels in real use. Lab tests pass while users complain. The fix is almost always architectural rather than a single optimization.

Debugging INP in production

You cannot fix what you cannot measure. Three tools we install on every site we ship that needs to track INP in production.

Web Vitals JS library, sending real-user metrics to your analytics. Set it up with the onINP callback and tag each measurement with the user agent and device class. The aggregated data tells you which devices are failing, not just whether you are failing on average. Chrome DevTools Performance panel for local debugging, with the new Interactions track that highlights the slowest interactions across a session. PageSpeed Insights with field data, which surfaces the actual 75th percentile from real users hitting your site over the past 28 days.

What to ship this week

The action that pays back fastest is measuring before fixing. Add Web Vitals tracking, let it run for 7 days, then look at which interactions are slow. Most teams discover that one or two specific components account for the majority of bad measurements. Fix those first. The architectural rewrites can come later.

If your SEO performance is sliding and you have not audited Core Web Vitals since FID was retired, that is the single most likely cause. We run technical SEO audits that include INP debugging across the slowest 10 pages on the site, with concrete patches the dev team can ship rather than vague recommendations.

Common Questions

Frequently Asked Questions

How does Interaction to Next Paint (INP) differ from First Input Delay (FID) and why did it replace it as a Core Web Vital?

INP measures the latency of every user interaction across an entire page visit, reporting the slowest one, whereas FID only measured the delay of the *first* input. Google replaced FID with INP in March 2024 because FID offered a "generous failure mode" for Single Page Applications (SPAs), often showing zero delay if hydration completed before the first click. INP provides a more accurate picture of real-world user experience by tracking all interactions, exposing performance issues like slow re-renders that FID missed.

What is the target INP score for a React application to pass Core Web Vitals, and what happens if it consistently fails?

A React application needs an INP score of 200 milliseconds or less at the 75th percentile to pass Core Web Vitals. If three-quarters of your users experience interactions faster than 200ms, your site passes. Consistently failing this threshold means your Core Web Vitals report will turn red, potentially leading to lower search engine rankings and a degraded user experience. Many React apps audited in 2026 score between 250-450ms before optimization, indicating a common challenge for modern web development.

What immediate steps can a development team take to improve INP scores for an existing React application?

The fastest immediate step to improve INP is to first measure which specific interactions are slow using real-user monitoring tools. After identifying the slowest components or interactions, teams can apply targeted fixes like deferring hydration with `React.lazy` and Suspense boundaries for heavy widgets, or refactoring large contexts into smaller ones. For quick wins, consider wrapping context consumers with `React.memo` and passing specific props to reduce uncontrolled re-renders. This often accounts for the majority of bad measurements. If your SEO performance is sliding, a technical SEO audit including INP debugging is highly recommended.

When should I use `useTransition` or Web Workers to optimize expensive operations for better INP in React?

You should use `useTransition` for in-React work that can be deferred, and Web Workers for heavy computations that would otherwise block the main thread. Wrap state updates that drive expensive renders in `startTransition` to prioritize urgent UI updates, allowing the browser to paint first and process the transition during idle time. For tasks like JSON parsing of large payloads, search index construction, or image manipulation, move them to a Web Worker using libraries like Comlink to keep your main thread responsive. This significantly improves INP by moving work out of the critical interaction path.