
AI Summary
INP optimization fixes the responsiveness metric Google uses for ranking. To pass INP, keep every interaction under 200ms at the 75th percentile by breaking long tasks, deferring third-party scripts, reducing DOM size, and yielding to the main thread inside click handlers. This guide walks through diagnosis with Chrome DevTools and CrUX, framework-specific fixes (React, Next.js), and a 30-day plan to move your INP score from poor to good.
The Short Answer: How to Fix INP in 2026
INP optimization is the work of cutting the latency between a user interaction and the next paint to under 200 milliseconds at the 75th percentile. The fastest path: identify slow interactions in real-user data, break their JavaScript work into chunks that yield to the main thread, and remove or defer the third-party scripts crowding your event loop.
Most sites that fail INP fail for the same five reasons—long JavaScript tasks, heavy third-party scripts, hydration overhead, oversized DOMs, and synchronous event handlers. Fix those and your INP score moves from "poor" to "good" inside 30 days.
INP Thresholds (Google Official):
- • Good: 200ms or less (passes Core Web Vitals)
- • Needs Improvement: 200ms – 500ms
- • Poor: over 500ms (fails Core Web Vitals)
Source: web.dev INP documentation. Measured at the 75th percentile of real-user interactions per URL group.
What Is Interaction to Next Paint?
Interaction to Next Paint (INP) measures the full latency from a user input—click, tap, or key press—to the next frame painted to the screen. It captures input delay, processing time, and presentation delay as one number, then reports the worst (or near-worst at high traffic) interaction across the page lifecycle.
INP became a stable Core Web Vital on March 12, 2024, replacing First Input Delay (FID). Google made the swap because FID only measured the delay before the first interaction was processed—not the time to update the UI, and not subsequent interactions. INP gives a far more honest picture of how responsive a page feels.
The Three Phases of an Interaction
- 1. Input Delay: Time between the user's action and when the event handler starts running. Caused by main-thread tasks already in flight.
- 2. Processing Time: Time the event handlers (and their callbacks) take to execute. This is where most of your INP budget gets spent.
- 3. Presentation Delay: Time between the handlers finishing and the next frame painting to the screen. Driven by style, layout, and paint work.
Adding all three together gives you a single interaction's latency. Page-level INP is then the worst interaction at typical traffic, or roughly the 98th percentile interaction at very high traffic. The Chrome User Experience Report (CrUX) aggregates this across all your visitors and reports it back to Search Console.
Does INP Affect SEO Rankings?
Yes—INP is a confirmed Google ranking signal as part of the page experience update. Google uses field data from CrUX to evaluate Core Web Vitals, and pages that pass all three metrics (LCP, INP, CLS) get a tiebreaker advantage in competitive search results. Our Core Web Vitals guide covers the broader ranking math.
The data backs the priority: according to HTTP Archive's Core Web Vitals Technology Report (April 2026), only about 64% of mobile origins pass INP—making it the hardest of the three Core Web Vitals to pass and the most common reason a site fails the overall threshold. LCP and CLS pass at 78% and 81% respectively.
The business case is sharper than the ranking case. RedBus reduced INP by 68% and saw a 7% increase in sales. The Economic Times improved INP by 61% and saw a 50% drop in bounce rate. Slow interactions cost conversions even when search rankings hold steady.
How to Measure INP in Real Users
Lab data alone won't catch INP problems—the metric is built around real user behavior across thousands of interactions. You need both lab tests for debugging specific issues and field data to verify production impact.
Field Data Tools (What Google Uses for Ranking)
Google Search Console
Core Web Vitals report. Groups URLs by template, shows which need attention. Updates on a 28-day rolling window.
Best for: ongoing site-wide monitoring, ranking-relevant data.
PageSpeed Insights (Field Data)
Shows CrUX field data for any URL with sufficient Chrome traffic. Fast spot-check for individual pages.
Best for: per-URL audits, sharing reports with stakeholders.
RUM (Real User Monitoring)
Vercel Speed Insights, SpeedCurve, DebugBear, or self-hosted with the web-vitals library. Updates within hours.
Best for: low-traffic pages, debugging specific user journeys.
CrUX BigQuery Dataset
Public dataset with monthly INP data for every origin in CrUX. Useful for competitive benchmarking.
Best for: comparing against competitors, longitudinal trends.
Lab Tools (For Debugging Specific Interactions)
- Chrome DevTools Performance panel: Record while clicking your slowest interactions. Look for tasks with red corners (over 50ms). The 2024+ "Interactions" track shows INP candidates directly.
- Web Vitals Chrome extension: Live INP score for the page you're viewing. Fastest way to spot-check during development.
- Lighthouse Total Blocking Time (TBT): A lab proxy for INP. If TBT is high, INP almost certainly is too.
- web-vitals JavaScript library: Drop into your site to capture INP from real users. Send to your analytics or RUM platform.
web-vitals INP Capture (basic RUM):
import { onINP } from 'web-vitals';
onINP((metric) => {
// Send to your analytics endpoint
navigator.sendBeacon('/api/vitals', JSON.stringify({
name: metric.name,
value: metric.value,
rating: metric.rating, // 'good' | 'needs-improvement' | 'poor'
id: metric.id,
path: window.location.pathname,
}));
});Why Is My INP Score Bad? The Five Common Causes
INP problems almost always trace back to the same handful of patterns. Diagnose by recording a Chrome DevTools Performance trace while clicking your slowest button or form, then look for which of these is dominating your trace.
1. Long JavaScript Tasks Blocking the Main Thread
Any task longer than 50ms is a "long task" that blocks input handling. A click that fires while a 300ms task is running has at least 300ms of input delay before its handler even starts. Long tasks come from heavy parsing, render-blocking scripts, expensive component trees, and synchronous loops over large arrays.
2. Heavy Third-Party Scripts
Chat widgets, A/B testing tools, tag managers, ads, and analytics all run JavaScript on the main thread. The 2024 Web Almanac performance chapter found that third-party scripts account for an average of 38% of main-thread time on mobile pages—often the single largest INP contributor on otherwise-fast sites.
3. Hydration Overhead in SSR Frameworks
Next.js, Remix, and other SSR frameworks render HTML on the server, then "hydrate" with JavaScript on the client. Hydration is a long task by definition—if the user clicks during hydration, INP spikes. Sites with large component trees or excessive client components (use client) suffer here. Our Next.js performance guide walks through the Server Component split that fixes this.
4. Oversized DOM
Pages with more than 1,500 DOM nodes pay a tax on every layout, paint, and event handler. Long product listings without virtualization, deeply nested component trees, and SVG-heavy infographics are the usual culprits.
5. Synchronous Work Inside Event Handlers
Click handlers that run validation, format data, update state, and trigger re-renders all synchronously will blow past 200ms on mid-range phones. The fix is to yield to the main thread between expensive steps so the browser can paint a response (loading state, ripple, focus) before finishing the work.
How to Fix Slow INP: 8 Proven Strategies
These strategies move sites from "poor" to "good" INP in 30 days. Implement them in order—the early wins (yielding, third-party deferral) usually deliver 50-70% of the total improvement.
1. Yield to the Main Thread Inside Handlers
The single highest-leverage INP fix. After the first chunk of work in a click handler, yield to let the browser paint, then continue. The new scheduler.yield() API is the modern way; setTimeout(fn, 0) is the universal fallback.
Yield pattern with scheduler.yield():
async function handleClick() {
// 1. Show immediate visual feedback
setLoading(true);
// 2. Yield so browser can paint the loading state
await scheduler.yield?.() ?? new Promise(r => setTimeout(r, 0));
// 3. Do the heavy work
const validated = validateForm(formData);
// 4. Yield again before the next chunk
await scheduler.yield?.() ?? new Promise(r => setTimeout(r, 0));
// 5. Submit
await submitForm(validated);
setLoading(false);
}2. Defer or Remove Third-Party Scripts
Audit every third-party script with the Chrome DevTools Coverage tab. Anything not used on the current page should be deferred (load on interaction) or removed. Replace heavy chat widgets with lighter alternatives or facade patterns. Move analytics to defer attributes and load tag managers via Partytown to push them to a web worker.
3. Use React useTransition for Non-Urgent Updates
React 18+ ships useTransition and useDeferredValue specifically for INP. Wrap state updates that don't need to be synchronous (filtering a large list, expanding a panel, switching tabs) and React will keep the UI responsive while the update runs in the background.
useTransition for filter UI:
import { useTransition, useState } from 'react';
function ProductFilter() {
const [isPending, startTransition] = useTransition();
const [filter, setFilter] = useState('');
const handleChange = (e) => {
// Urgent: update the input immediately
setInputValue(e.target.value);
// Non-urgent: filter the 5,000-item list in the background
startTransition(() => {
setFilter(e.target.value);
});
};
return <input onChange={handleChange} />;
}4. Debounce Expensive Event Handlers
Scroll, resize, and input events fire dozens of times per second. Wrap any expensive handler in a debounce or throttle so it runs at most every 100-200ms. For React, use a debounce hook or libraries like use-debounce.
5. Move Heavy Computation to Web Workers
Image processing, large-data parsing, encryption, and complex calculations belong in a web worker. The main thread stays free to handle clicks while the worker runs in parallel. Comlink makes the messaging boilerplate trivial.
6. Virtualize Long Lists
Lists of 100+ items render and re-render expensively. Use react-window, TanStack Virtual, or react-virtuoso to render only the rows currently in the viewport. DOM size drops, and every interaction speeds up.
7. Use CSS Containment and content-visibility
CSS containment (contain: layout paint) tells the browser an element's rendering is independent of the rest of the page, so style recalculations don't cascade. content-visibility: auto skips rendering entirely for off-screen sections—huge wins on long pages.
8. Avoid Layout Thrashing in Handlers
Reading layout properties (offsetWidth, getBoundingClientRect) and then writing to the DOM in the same handler triggers synchronous layout. Batch reads first, then writes. Even better: use ResizeObserver and IntersectionObserver instead of measuring during click handlers.
Framework-Specific INP Fixes
Next.js INP Optimization
- • Default to Server Components. Add
use clientonly on the leaves that need interactivity. Smaller client bundles = faster hydration = better INP. - • Use
next/scriptwith strategy="lazyOnload" for non-critical third parties. - • Stream with React Suspense so users can interact with above-the-fold content while below-fold content loads.
- • Audit your bundle with
@next/bundle-analyzer—every kilobyte of client JS is hydration time.
WordPress INP Optimization
- • Audit plugins. Each plugin adds JavaScript. Disable any not in active use.
- • Use a performance plugin (Perfmatters, FlyingScripts, Fast Velocity Minify) to defer scripts until interaction.
- • Avoid heavy page builders. Elementor and WPBakery often blow INP budgets via DOM size and event listeners.
- • Self-host fonts instead of loading via Google Fonts CDN with their JavaScript loader.
Shopify INP Optimization
- • Audit installed apps. Each app injects scripts. Remove abandoned apps fully (their scripts often persist).
- • Use a Dawn-based theme or other performance-focused theme. Older themes ship megabytes of legacy jQuery.
- • Defer chat and review widgets until user interaction (Tidio, Yotpo, Judge.me).
- • Disable unused theme features in customizer to drop their JavaScript.
Pro Tip:
Use Chrome DevTools' new "Interactions" track in the Performance panel (Chrome 124+) to see INP candidates highlighted directly in the trace. Click any interaction marker to jump to its handler. This single feature replaces an hour of manual trace analysis.
How to Prioritize INP Fixes
Not every page needs the same treatment. Use this prioritization order to focus engineering time where it moves rankings and revenue.
INP Fix Priority Order:
- 1.Money pages with poor INP: Pricing, contact, checkout, lead forms. These have the largest revenue leverage per fix.
- 2.High-traffic pages near the threshold: An INP of 220ms is one fix away from passing. Look in Search Console for "needs improvement" pages.
- 3.Templates: If your blog template fails INP, every blog post fails. Fix the template once, fix every post.
- 4.Site-wide third parties: One bad chat widget breaks INP everywhere. Auditing globals beats per-page tuning.
- 5.Long-tail pages: Lower priority. If your money pages and templates pass, the long tail follows.
For a broader Core Web Vitals roadmap that includes LCP and CLS alongside INP, work through our website speed optimization guide. INP fixes that come from cutting JavaScript and DOM also tend to improve LCP—the wins compound.
30-Day INP Action Plan
Week 1: Audit and Baseline
- □Pull INP scores for top 20 pages from Google Search Console Core Web Vitals report
- □Install web-vitals library or RUM tool (Vercel Speed Insights, DebugBear)
- □Record DevTools Performance traces of your three slowest interactions
- □Document baseline INP for each priority page
Week 2: Quick Wins
- □Audit and remove unused third-party scripts (chat, A/B tests, analytics duplicates)
- □Defer remaining third-party scripts to load on user interaction
- □Add yield points (scheduler.yield or setTimeout) inside slow click handlers
- □Debounce all scroll, resize, and input handlers
Weeks 3-4: Structural Fixes
- □Convert eligible client components to React Server Components (Next.js)
- □Wrap non-urgent state updates in useTransition
- □Virtualize lists with 100+ items
- □Add CSS containment and content-visibility on long pages
- □Re-measure INP after deploy and document deltas
If INP is still failing after the 30-day plan, the issue is usually structural—a framework choice, a vendor script you can't remove, or a DOM that needs to be rebuilt. At that point a deeper technical SEO audit and refactor is the right next step.
Frequently Asked Questions
What is a good INP score?
A good INP score is 200 milliseconds or less, measured at the 75th percentile of real user interactions. Google classifies INP between 200ms and 500ms as "needs improvement" and anything over 500ms as "poor." Because INP captures the worst interaction across the entire page lifecycle (clicks, taps, key presses), the threshold is stricter than it sounds—a single 600ms click handler on a popular button can fail the metric for the whole URL group.
How do I fix INP issues on my website?
Fix INP by reducing the work done on the main thread when users interact. Audit long tasks in Chrome DevTools Performance panel, then break them up using yielding patterns (await scheduler.yield(), setTimeout, or requestIdleCallback). Move heavy work to web workers, debounce expensive event handlers, defer or remove non-critical third-party scripts (chat widgets, analytics, ads), and reduce DOM size below 1,500 nodes. For React apps, use useTransition for non-urgent updates and avoid synchronous state updates inside click handlers.
Why is my INP score bad?
The most common causes of bad INP are long JavaScript tasks blocking the main thread, heavy third-party scripts (especially chat widgets, A/B testing tools, and tag managers), large React component trees re-rendering on every interaction, and expensive event handlers that trigger layout recalculations. Hydration delays on Next.js and other SSR frameworks also push INP up because the page looks ready but JavaScript is still parsing. Run a Performance recording while clicking your slowest button—any task with a red corner exceeds 50ms and is a candidate for optimization.
Does INP affect SEO rankings?
Yes. INP is one of three Core Web Vitals Google uses as a ranking signal, alongside LCP and CLS. It officially replaced First Input Delay (FID) on March 12, 2024. Google has stated that page experience signals act as a tiebreaker between pages with similar content quality and relevance. In competitive niches, passing INP can be the difference between ranking on page one or page two. INP rankings impact comes from field data in the Chrome User Experience Report (CrUX), which Google collects from real Chrome users over a 28-day rolling window.
How do I measure INP in real users?
Measure real-user INP with field data from three sources: Google Search Console (Core Web Vitals report shows site-wide INP grouped by URL template), PageSpeed Insights (the "Field Data" section pulls from CrUX for any URL with sufficient traffic), and a Real User Monitoring (RUM) tool that uses the web-vitals JavaScript library (Vercel Speed Insights, SpeedCurve, DebugBear, or a self-hosted setup). RUM is essential for low-traffic pages where CrUX has no data, and it lets you correlate INP with specific browsers, devices, and user flows.
What replaced FID with INP and why?
Google replaced First Input Delay (FID) with Interaction to Next Paint (INP) on March 12, 2024 because FID only measured the delay before the first interaction was processed—not the time to update the UI, and not subsequent interactions. INP measures the full latency from input to the next paint, across all clicks, taps, and key presses during the page lifecycle, then reports the worst (or near-worst) interaction. This makes INP a far more honest measure of how responsive a page feels, especially for SPAs and highly interactive apps where the first interaction is rarely the slowest.
How long does it take for INP fixes to show in Search Console?
INP improvements take roughly 28 days to fully reflect in Google Search Console because the data comes from the Chrome User Experience Report's rolling 28-day window. After deploying a fix, monitor lab data immediately in PageSpeed Insights (the "Diagnose performance issues" section), watch your RUM tool for changes within hours, and expect Search Console field data to update gradually over four weeks. Ranking impact typically follows another two to six weeks after the field data updates, depending on crawl frequency and competitive density.
Can a single slow button fail INP for an entire page?
Yes. INP reports the worst (or near-worst at high traffic) interaction on the page, so a single 700ms button click handler can fail the metric even if every other interaction is fast. This is especially common with "save" or "submit" buttons that run validation, format data, and update state synchronously. The fix is to identify your slowest interactions in RUM, then break their work into smaller chunks that yield to the main thread between paint opportunities.
Need Help Fixing Your INP Score?
Verlua runs performance audits that pinpoint exactly which interactions, scripts, and components are tanking your INP. We deliver a prioritized fix plan with expected impact and ship the engineering work to pass Core Web Vitals.
Get a Free Performance AuditFounder & Technical Director
Mark Shvaya runs Verlua, a web design and development studio in Sacramento. He builds conversion-focused websites for service businesses, e-commerce brands, and SaaS companies.
California real estate broker, property manager, and founder of Verlua.
Stay Updated
Get the latest insights on web development, AI, and digital strategy delivered to your inbox.
No spam, unsubscribe anytime. We respect your privacy.
Comments
Comments section coming soon. Have questions? Contact us directly!
Related Articles
Core Web Vitals: The Complete 2026 Guide to Technical SEO Performance
Master LCP, INP, and CLS to improve Google rankings. Diagnostic tools, practical fixes, and prioritization for measurable wins.
Read MoreWebsite Speed Optimization: Make Your Site Faster
A practical site speed playbook covering images, fonts, JavaScript, hosting, and CDN setup for faster page loads.
Read MoreNext.js Performance Optimization: Best Practices
Server Components, streaming, image optimization, and advanced caching patterns for fast Next.js apps.
Read More