INP Is Now an Equal Ranking Signal and 'Good' LCP Dropped to 2.0s: A React Engineer's Fix List
In short
As of 18 March 2026, Google made INP a co-equal ranking signal and lowered the "Good" LCP bar to 2.0s. The fixes are React architecture work: mark non-urgent updates with useTransition, break long tasks with scheduler.yield(), turn on the React Compiler, stream the LCP element server-side, and put third-party scripts on a hard budget. Measure with field data from CrUX, not lab tools. If a page is badly tangled, that is the kind of thing I fix through app rescue and optimization.

On this page
- What changed on 18 March 2026 and why it matters more for React?
- How is INP different from FID, and why does my React app fail it?
- What are the React-specific INP fixes, in priority order?
- Does the React Compiler actually help INP?
- How do I hit the new 2.0s LCP bar with React?
- What is a realistic third-party script budget?
- How do I measure INP correctly before and after a fix?
- The triage order I actually follow
As of 18 March 2026, Google Search Central confirmed two changes that hit React apps hard: INP (Interaction to Next Paint) is now an equal ranking signal alongside LCP and CLS, and the threshold for a "Good" LCP score dropped from 2.5s to 2.0s. If your React app passed Core Web Vitals last quarter, there is a real chance it does not anymore. The fix is not a config flag. It is JS-architecture work: breaking up long tasks, deferring non-urgent state updates, cutting hydration cost, and putting third-party scripts on a budget.
I have spent the last few years pulling slow React and Next.js apps out of the red, and INP is the metric that exposes lazy front-end engineering more than any other. Here is the triage list I actually run.
What changed on 18 March 2026 and why it matters more for React?
Google made INP a co-equal ranking signal with LCP and CLS, and lowered the "Good" LCP bar from 2.5s to 2.0s. For React specifically this matters because INP measures interaction responsiveness, and interaction responsiveness is exactly where heavy client-side JavaScript and hydration cost show up.
INP replaced FID (First Input Delay) as a Core Web Vital back in March 2024, but until now it sat slightly behind LCP in how Google weighted it in practice. Treating it as an equal signal means a slow interaction can drag a page down even when it paints fast. Around 43% of sites still fail the 200ms "Good" INP threshold, and React-heavy sites are over-represented in that group because the framework does a lot of work on the main thread per interaction.
Here are the current thresholds after the change:
| Metric | Good | Needs improvement | Poor | What it measures |
| LCP | <= 2.0s | 2.0s to 4.0s | > 4.0s | Largest content paint |
| INP | <= 200ms | 200ms to 500ms | > 500ms | Worst interaction latency |
| CLS | <= 0.1 | 0.1 to 0.25 | > 0.25 | Layout shift |
| Script type | Loading strategy | INP cost | ||
| Analytics (GA, etc.) | next/script strategy afterInteractive or worker | Low if deferred | ||
| Chat / support widget | Lazy load on scroll or click intent | High if eager | ||
| A/B testing | Inline only the assignment, defer the rest | High, causes CLS too | ||
| Tag manager | Audit contents, set a hard tag limit | Very high |
In Next.js, push non-critical scripts down with the Script component and consider Partytown for the heaviest offenders so they run in a web worker instead of the main thread:
import Script from 'next/script';
<Script src="https://example.com/analytics.js" strategy="afterInteractive" />
Measure the cost before and after with the Long Animation Frames API or the performance panel. If a script adds 80ms to your worst interaction, it is buying its way out of "Good" INP, and you get to decide whether that vendor is worth a ranking drop.
How do I measure INP correctly before and after a fix?
Use field data (real users) as the source of truth and lab data only to reproduce and debug. INP is a field metric, and lab tools cannot replay the messy multi-interaction sessions where it actually fails.
Pull your real-user numbers from the Chrome User Experience Report (CrUX) or the Search Console Core Web Vitals report, segmented by mobile and desktop, because mobile main threads are slower and fail INP first. For local debugging, the web-vitals library attributes which element and interaction caused your worst INP, which is what you actually need to fix it:
import { onINP } from 'web-vitals/attribution';
onINP((metric) => {
console.log(metric.value, metric.attribution.interactionTarget);
}, { reportAllChanges: true });
That interactionTarget tells you the exact DOM node that caused the slow interaction, so you stop guessing. The same field-versus-lab discipline matters for AI visibility too, since the way pages are structured and served changes what gets cited, which I covered in what query fan-out means for page structure ↗.
When a CWV failure is tangled up with bundle size, dead client components, and years of accumulated re-renders, that is the kind of mess I take on as a focused engagement through my app rescue and optimization ↗ work. If you want a second pair of eyes on a specific failing page, my contact page ↗ is open and I usually reply within a day.
The triage order I actually follow
If I had to compress the whole list into the sequence I run on a real app:
- Pull field INP and LCP from CrUX or Search Console, mobile first.
- Confirm the new 2.0s LCP bar did not silently flip you to "Needs improvement."
- Attribute your worst INP interaction with
web-vitals/attribution. - Wrap expensive non-urgent updates in
useTransition/useDeferredValue. - Break any long task over 50ms with
scheduler.yield(). - Clean up Rules of React violations and turn on the React Compiler.
- Move the LCP element into the server tree and stream it with Suspense.
- Put third-party scripts on a hard budget and defer or worker-load them.
INP being a co-equal signal is good news for engineers who care about how their apps actually feel. The same work that fixes your ranking fixes the snappiness your users notice. The teams that treated FID as a freebie are the ones with work to do now, and most of that work is the React architecture they kept putting off.
FAQ
Is INP now an equal Core Web Vitals ranking signal?
Yes, as of Google Search Central's 18 March 2026 update, INP is weighted as a co-equal ranking signal alongside LCP and CLS.
What is the new 'Good' LCP threshold?
Google lowered the 'Good' LCP threshold from 2.5s to 2.0s, so pages between 2.0s and 2.5s now fall into 'Needs improvement'.
What is the 'Good' INP threshold for React apps?
An INP of 200ms or less is 'Good', and roughly 43% of sites still fail that threshold, with React-heavy sites over-represented.
Does the React Compiler improve INP?
Yes, the React Compiler auto-memoizes components and values at build time, which cuts the wasted re-render work that drives most React INP failures.
Should I use lab or field data to measure INP?
Use field data from CrUX or Search Console as the source of truth, since INP is a real-user metric that lab tools cannot reliably reproduce.
Working on something like this?
I build web apps, AI features, and mobile products for clients. If this article matches a problem you have, tell me about it.
Start a conversationMalik Hamza Shabbir · Full-Stack & AI Engineer
I build full-stack and AI products solo: a reputation SaaS in production, RAG pipelines, and React Native apps. I write from what I ship, not from documentation summaries.
Related articles
React Compiler 1.0: Do You Still Need useMemo in 2026?
For referential equality, no: React Compiler 1.0 handles it. I profiled a production dashboard to show what you still hand-memoize and what breaks.
Patch Now: The React Server Components RCE (CVE-2025-55182) and the May 2026 13-CVE Release — A Version-by-Version Upgrade Map
CVE-2025-55182 is a CVSS 10.0 remote code execution flaw in the React Server Components deserialization path. If your app renders RSC payloads, you are exposed even without Server Functions. Here is the exact patched version for every react-server-dom line and Next.js release, plus WAF rules to buy time.
RAG, Fine-Tune, or Just Prompt? A 2026 Decision Tree for Million-Token Context Windows
Cheaper long context in 2026 broke the old always-RAG advice. Here is the decision tree I use: when full-context prompting beats a pipeline, when RAG is mandatory, when fine-tuning earns its keep, plus the hybrid stack and a cost and latency comparison.