Interaction to Next Paint (INP) measures the responsiveness of a webpage by tracking the latency of all user interactions and reporting the worst interaction (or near-worst for pages with many interactions). A good INP score is 200 milliseconds or less. INP replaced First Input Delay (FID) as a Core Web Vital in March 2024 because it provides a more complete picture of page interactivity.
INP is critical for technical SEO because Google uses it as a ranking signal. Pages with poor INP feel sluggish and unresponsive, causing users to abandon your site. This guide explains what causes poor INP and how to fix it.
Key Takeaways: Interaction to Next Paint
- Good INP: 200 milliseconds or less is considered a good score
- Replaces FID: INP became the official Core Web Vital for interactivity in March 2024
- Measures all interactions: Unlike FID, INP tracks every click, tap, and key press
- Three phases: INP includes input delay, processing time, and presentation delay
- Key fix: Break up long JavaScript tasks and optimize event handlers
8 Ways to Improve Interaction to Next Paint
- Break up long JavaScript tasks into smaller chunks under 50ms
- Yield to the main thread frequently during heavy processing
- Optimize event handlers to minimize processing time
- Defer non-critical JavaScript until after page becomes interactive
- Reduce DOM size to speed up rendering after interactions
- Minimize layout thrashing by batching DOM reads and writes
- Use requestAnimationFrame for visual updates
- Prioritize visible content updates over background processing
INP Is Now a Core Web Vital
In March 2024, Google officially replaced First Input Delay (FID) with Interaction to Next Paint (INP) as a Core Web Vital. INP provides a more accurate measure of page responsiveness because it evaluates all interactions throughout a page’s lifecycle, not just the first one. If you optimized for FID, you have a head start, but INP requires additional attention to processing and rendering phases.
What Is Interaction to Next Paint?
Interaction to Next Paint (INP) is a Core Web Vital metric that measures the time from when a user interacts with a page (clicking, tapping, or pressing keys) to when the browser paints the visual feedback. INP observes all interactions during a page visit and reports a value representing the worst interaction latency, giving a realistic picture of how responsive a page feels.
Egochi, America’s #1 digital marketing agency headquartered in New York City, helps businesses optimize Core Web Vitals including INP. From our offices in NYC, Milwaukee, Madison, and Miami, we’ve helped clients improve page responsiveness and search rankings through technical SEO optimization.
What is a good INP score?
A good INP score is 200 milliseconds or less. Google considers INP scores of 200ms or under as “good,” between 200-500ms as “needs improvement,” and over 500ms as “poor.” These thresholds are measured at the 75th percentile, meaning 75% of your page interactions should have INP of 200ms or less to pass. The 200ms threshold allows time for visual feedback that feels responsive to users.
What causes poor INP scores?
Poor INP scores are caused by JavaScript blocking the main thread, slow event handlers, excessive DOM manipulation, and complex rendering operations. Unlike FID which only measured input delay, INP includes the full interaction cycle: input delay (waiting for the main thread), processing time (running event handlers), and presentation delay (rendering the visual update). Problems in any phase contribute to poor INP.
How is INP different from FID?
INP measures all interactions throughout a page’s lifecycle and includes the full response time, while FID only measured the first interaction’s input delay. FID could miss slow interactions that happened after the initial page load. INP captures clicks, taps, and key presses throughout the entire session and reports the worst (or near-worst) latency, giving a more accurate picture of real-world responsiveness.
⚡ Interaction to Next Paint Score Thresholds
The Three Phases of INP
Table of Contents
- Why Interaction to Next Paint Matters for SEO
- What Causes Poor Interaction to Next Paint
- How to Improve Interaction to Next Paint
- Code Examples for INP Optimization
- INP vs FID: Key Differences
- Tools to Measure Interaction to Next Paint
- INP and Other Core Web Vitals
- Technical SEO Services from Egochi
- Frequently Asked Questions
Why Interaction to Next Paint Matters for SEO
Interaction to Next Paint directly impacts your search rankings and user experience. Google chose INP to replace FID because it better captures how users actually experience page responsiveness.
User Experience Impact: When users click a button or tap a link and the page doesn’t respond immediately, they perceive it as broken or slow. Research shows users expect visual feedback within 100-200 milliseconds. Delays beyond this create frustration, increase bounce rates, and reduce conversions.
Search Ranking Factor: INP is one of Google’s three Core Web Vitals that directly affect rankings. Sites with poor INP may rank lower than competitors with responsive pages. Google Search Console shows INP data and flags pages that need improvement.
Complete Measurement: FID only measured the first interaction and only the input delay portion. A page could have good FID but still feel sluggish because later interactions were slow or because rendering took too long. INP captures the complete picture by measuring all interactions from input to paint.
INP reports the worst interaction (or the 98th percentile for pages with 50+ interactions). This means a single slow interaction can hurt your INP score even if most interactions are fast. Focus on identifying and fixing your slowest interactions first.
What Causes Poor Interaction to Next Paint
INP problems can occur in any of the three phases: input delay, processing time, or presentation delay. Understanding these causes helps you target the right optimizations.
Long JavaScript Tasks
JavaScript tasks longer than 50ms block the main thread and prevent the browser from responding to user input. Long tasks cause input delay and can also extend processing time.
Heavy Event Handlers
Event handlers that perform extensive calculations, DOM manipulation, or synchronous operations increase processing time. Every millisecond in your click handler adds to INP.
Large DOM Size
Pages with many DOM elements take longer to update and render. After event handlers complete, the browser must recalculate styles, layout, and paint, all slowed by large DOMs.
Layout Thrashing
Reading and writing DOM properties in alternating patterns forces the browser to recalculate layout repeatedly. This synchronous layout work blocks the main thread.
Third-Party Scripts
Analytics, ads, chat widgets, and other third-party scripts compete for main thread time. They can cause input delay by blocking when users try to interact.
Complex Rendering
CSS animations, filters, shadows, and complex layouts increase presentation delay. The browser must complete all rendering work before painting visual feedback.
Common Mistake
Many developers only optimize the first interaction and assume later interactions will be fast. INP measures all interactions, and later interactions often perform worse because more JavaScript has loaded and more state has accumulated. Test interactions throughout the page lifecycle, not just at initial load.
How to Improve Interaction to Next Paint
Improving INP requires optimizing all three phases: reducing input delay, minimizing processing time, and speeding up presentation. These techniques address the root causes of poor INP.
Break Up Long Tasks
Split JavaScript tasks longer than 50ms into smaller chunks. Use scheduler.yield(), setTimeout, or requestIdleCallback to yield to the main thread, allowing the browser to process pending interactions.
High ImpactOptimize Event Handlers
Keep event handlers lean and fast. Move heavy processing to web workers, defer non-essential work, and avoid synchronous operations. The faster your handler completes, the lower your processing time.
High ImpactYield to Main Thread
During heavy processing, periodically yield control to the main thread so the browser can respond to user input. The new scheduler.yield() API is designed specifically for this purpose.
High ImpactReduce DOM Size
Smaller DOMs render faster. Remove unnecessary elements, use virtualization for long lists, and lazy-load off-screen content. Aim for under 1,500 DOM elements when possible.
Medium ImpactAvoid Layout Thrashing
Batch DOM reads together, then batch DOM writes together. Reading layout properties (offsetHeight, getBoundingClientRect) between writes forces synchronous layout recalculation.
High ImpactDefer Non-Critical Work
Move analytics, tracking, and non-essential processing out of event handlers. Use requestIdleCallback or setTimeout to schedule this work when the browser is idle.
Medium ImpactUse CSS Containment
Apply CSS contain property to isolate parts of the page. This tells the browser it can optimize rendering because changes in that element won’t affect the rest of the page.
Medium ImpactOptimize Third-Party Scripts
Audit and defer third-party scripts that block the main thread. Load them asynchronously, after user interaction, or replace heavy scripts with lighter alternatives.
High ImpactCode Examples for INP Optimization
Breaking Up Long Tasks
Use the scheduler API or setTimeout to yield to the main thread during heavy processing:
// BAD: Single long task that blocks interactions function processAllItems(items) { items.forEach(item => { heavyProcessing(item); // Blocks for 300ms total }); } // GOOD: Yield to main thread between chunks async function processAllItemsOptimized(items) { for (const item of items) { heavyProcessing(item); // Yield to allow browser to process interactions if (scheduler.yield) { await scheduler.yield(); } else { await new Promise(r => setTimeout(r, 0)); } } }
Optimizing Event Handlers
// BAD: Heavy processing in click handler button.addEventListener('click', () => { const data = calculateComplexData(); // 150ms updateDOM(data); // 50ms sendAnalytics(); // 30ms }); // GOOD: Minimal work in handler, defer the rest button.addEventListener('click', () => { // Show immediate visual feedback button.classList.add('loading'); // Defer heavy work requestAnimationFrame(() => { const data = calculateComplexData(); updateDOM(data); button.classList.remove('loading'); }); // Defer non-critical analytics requestIdleCallback(() => sendAnalytics()); });
Avoiding Layout Thrashing
// BAD: Interleaved reads and writes cause layout thrashing elements.forEach(el => { const height = el.offsetHeight; // Read (forces layout) el.style.height = (height + 10) + 'px'; // Write }); // N forced layouts! // GOOD: Batch reads, then batch writes const heights = elements.map(el => el.offsetHeight); // All reads elements.forEach((el, i) => { el.style.height = (heights[i] + 10) + 'px'; // All writes }); // Only 1 forced layout
Using CSS Containment
/* Isolate components to limit rendering scope */ .card { contain: layout style paint; } /* For scrollable containers with many items */ .virtual-list { contain: strict; content-visibility: auto; } /* Skip rendering off-screen content */ .offscreen-section { content-visibility: auto; contain-intrinsic-size: 0 500px; }
INP vs FID: Key Differences
Understanding the differences between INP and FID helps you optimize for the metric that actually affects your rankings.
FID vs INP Comparison
First Input Delay (FID)
- Measured only the first interaction
- Only measured input delay phase
- Threshold: 100ms or less
- Replaced in March 2024
- Could miss slow later interactions
- Didn’t capture processing or rendering
Interaction to Next Paint (INP)
- Measures all interactions
- Includes input + processing + presentation
- Threshold: 200ms or less
- Current Core Web Vital
- Reports worst interaction latency
- Complete measure of responsiveness
Why Google Made the Switch: FID was a good starting point but had significant blind spots. It only measured the delay before event processing started, ignoring how long the actual processing took. And it only measured the first interaction, missing slow interactions that happened after the page loaded. INP addresses both limitations by measuring the complete interaction cycle for all interactions.
Tools to Measure Interaction to Next Paint
INP requires real user interaction to measure accurately. Field data from Chrome User Experience Report (CrUX) is what Google uses for ranking decisions. Lab tools can help identify potential issues but don’t measure INP directly.
PageSpeed Insights
Field INP data from CrUX
FreeGoogle Search Console
INP report for your site
FreeChrome UX Report
Real user INP field data
FreeWeb Vitals Extension
Real-time INP in browser
FreeChrome DevTools
Performance panel debugging
FreeLighthouse
TBT proxy metric (lab)
FreeWebPageTest
Interaction testing
FreeSpeedCurve
INP monitoring over time
PaidMeasuring INP with JavaScript
Use the web-vitals library to measure INP on your own site:
// Install: npm install web-vitals import { onINP } from 'web-vitals'; onINP((metric) => { console.log('INP:', metric.value, 'ms'); // Get details about the worst interaction const entry = metric.entries[0]; console.log('Target:', entry.target); console.log('Input delay:', entry.processingStart - entry.startTime); console.log('Processing:', entry.processingEnd - entry.processingStart); // Send to your analytics sendToAnalytics({ name: metric.name, value: metric.value, rating: metric.rating, }); });
INP and Other Core Web Vitals
Interaction to Next Paint works alongside Largest Contentful Paint (LCP) and Cumulative Layout Shift (CLS) to measure overall page experience. Optimizing all three creates fast, stable, and responsive pages.
| Metric | Measures | Good Threshold | Primary Fix |
|---|---|---|---|
| LCP | Loading performance | 2.5 seconds | Optimize largest element load |
| INP | Interactivity | 200 milliseconds | Reduce main thread blocking |
| CLS | Visual stability | 0.1 | Reserve space for elements |
Optimization Priority: INP optimization often requires the most effort because it affects code throughout your application. Unlike LCP (focused on initial load) or CLS (focused on layout), INP impacts every interactive element. Start by identifying your worst interactions using field data, then optimize those specific code paths.
Interaction to Next Paint Optimization Checklist
- ✓ Identify worst interactions using field data (Search Console, CrUX)
- ✓ Break up JavaScript tasks longer than 50ms
- ✓ Implement yielding during heavy processing (scheduler.yield)
- ✓ Optimize event handlers to minimize processing time
- ✓ Defer non-critical work out of event handlers
- ✓ Reduce DOM size (target under 1,500 elements)
- ✓ Batch DOM reads and writes to avoid layout thrashing
- ✓ Apply CSS containment to isolate components
- ✓ Audit and optimize third-party scripts
- ✓ Use requestAnimationFrame for visual updates
- ✓ Test interactions throughout page lifecycle, not just at load
- ✓ Monitor INP field data in Search Console
People Also Ask About INP
Is INP the same as FID?
No, INP and FID are different metrics. FID only measured the first interaction’s input delay, while INP measures all interactions and includes the full response time (input delay + processing + presentation). INP replaced FID as a Core Web Vital in March 2024 because it provides a more complete picture of page responsiveness.
Why is my INP score worse than my FID score was?
INP measures more than FID did. FID only captured input delay for the first interaction, missing slow processing, rendering, and later interactions. Your page may have had good FID but still felt sluggish due to issues INP now captures. This is why Google switched metrics.
Can I test INP in Lighthouse?
Lighthouse doesn’t directly measure INP because INP requires real user interaction. Lighthouse uses Total Blocking Time (TBT) as a proxy metric that correlates with INP. For accurate INP data, use field data tools like PageSpeed Insights, Search Console, or the Web Vitals extension with real interactions.
Which interactions count toward INP?
INP tracks clicks, taps, and key presses. Scrolling and hovering do not count toward INP because they don’t trigger discrete event handlers in the same way. The metric reports the worst interaction latency (or 98th percentile for pages with many interactions).
How do I find which interaction is causing poor INP?
Use the Web Vitals extension or web-vitals JavaScript library to identify slow interactions. These tools report which element was interacted with and break down the latency into input delay, processing time, and presentation delay. Chrome DevTools Performance panel can also record and analyze specific interactions.
Technical SEO Services from Egochi
Egochi, America’s #1 digital marketing agency headquartered in New York City, provides expert technical SEO services including Core Web Vitals optimization.
INP Audits: We analyze your site’s interaction responsiveness, identify slow event handlers, and pinpoint main thread blocking issues. Our audits use both field data and manual testing to find the interactions that need optimization.
Implementation Support: Our developers implement INP improvements including task scheduling, event handler optimization, DOM reduction, and third-party script management. We work with your team or handle implementation directly.
Ongoing Monitoring: We set up Real User Monitoring to track INP over time and alert you to regressions. New features and code changes can reintroduce INP issues, and we help you maintain responsive pages.
Proven Results: From our offices in NYC, Milwaukee, Madison, and Miami, we’ve helped clients achieve “good” Core Web Vitals scores and improve search rankings through technical optimization.
Need Help with Core Web Vitals?
Get a free technical SEO audit from Egochi. We’ll analyze your INP and other performance metrics.
Get Free INP AuditOr call (888) 644-7795






Comments are closed.