Interaction to Next Paint (INP): What It Is and How to Fix It

INP
Spread the love

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

  1. Break up long JavaScript tasks into smaller chunks under 50ms
  2. Yield to the main thread frequently during heavy processing
  3. Optimize event handlers to minimize processing time
  4. Defer non-critical JavaScript until after page becomes interactive
  5. Reduce DOM size to speed up rendering after interactions
  6. Minimize layout thrashing by batching DOM reads and writes
  7. Use requestAnimationFrame for visual updates
  8. 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.

200ms Good INP Threshold
500ms Poor INP Threshold
75th Percentile Measured
2024 Became Core Web Vital

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

≤ 200ms
Good
Interactions feel instant and responsive
200-500ms
Needs Improvement
Noticeable delay in responses
> 500ms
Poor
Page feels sluggish and unresponsive

The Three Phases of INP

👉
Input Delay
Time waiting for the main thread to become available to process the event
Processing Time
Time spent running event handlers and JavaScript callbacks
🎨
Presentation Delay
Time to render the visual update and paint it to the screen

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.

Pro Tip:

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.

1

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 Impact
2

Optimize 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 Impact
3

Yield 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 Impact
4

Reduce 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 Impact
5

Avoid Layout Thrashing

Batch DOM reads together, then batch DOM writes together. Reading layout properties (offsetHeight, getBoundingClientRect) between writes forces synchronous layout recalculation.

High Impact
6

Defer 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 Impact
7

Use 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 Impact
8

Optimize 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 Impact

Code 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

Free
🔍

Google Search Console

INP report for your site

Free
📊

Chrome UX Report

Real user INP field data

Free
🚀

Web Vitals Extension

Real-time INP in browser

Free
🛠

Chrome DevTools

Performance panel debugging

Free

Lighthouse

TBT proxy metric (lab)

Free
📍

WebPageTest

Interaction testing

Free
📋

SpeedCurve

INP monitoring over time

Measuring 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 Audit

Or call (888) 644-7795

Frequently Asked Questions

What is Interaction to Next Paint (INP)?

+
Interaction to Next Paint measures the responsiveness of a webpage by tracking all user interactions (clicks, taps, key presses) and reporting the worst latency. A good INP score is 200 milliseconds or less. INP became a Core Web Vital in March 2024, replacing First Input Delay.

What is a good INP score?

+
A good INP score is 200 milliseconds or less. Scores between 200-500ms need improvement, and scores above 500ms are considered poor. Google measures the 75th percentile, meaning 75% of your page interactions should have INP of 200ms or less to pass.

What causes poor INP scores?

+
Poor INP is caused by long JavaScript tasks blocking the main thread, heavy event handlers, large DOM sizes, layout thrashing, third-party scripts, and complex rendering operations. Problems in any of the three phases (input delay, processing, presentation) contribute to poor INP.

How do I fix poor INP?

+
Fix INP by breaking up long JavaScript tasks, optimizing event handlers, yielding to the main thread during heavy processing, reducing DOM size, avoiding layout thrashing, and deferring non-critical work. Identify your worst interactions first and focus optimization efforts there.

How is INP different from FID?

+
FID only measured the first interaction’s input delay, while INP measures all interactions and includes the full response cycle (input delay + processing + presentation). INP has a 200ms threshold compared to FID’s 100ms threshold. INP replaced FID as a Core Web Vital in March 2024.

Does INP affect SEO rankings?

+
Yes, INP directly affects SEO rankings as one of Google’s three Core Web Vitals. Pages with poor INP may rank lower than competitors with responsive interactions. Google Search Console shows INP data and flags pages that need improvement.

How do I measure INP?

+
Measure INP using field data tools like PageSpeed Insights, Google Search Console, Chrome UX Report, or the Web Vitals JavaScript library. Lighthouse uses Total Blocking Time (TBT) as a proxy since INP requires real user interaction. Field data from CrUX is what Google uses for rankings.

What are the three phases of INP?

+
INP consists of three phases: input delay (waiting for the main thread to be available), processing time (running event handlers and callbacks), and presentation delay (rendering and painting the visual update). All three phases contribute to total INP time.

Which interactions count toward INP?

+
INP tracks clicks, taps, and keyboard interactions. Scrolling and hovering are not included because they don’t trigger discrete event handling in the same way. For pages with many interactions, INP reports approximately the 98th percentile rather than the absolute worst.

What is scheduler.yield()?

+
scheduler.yield() is a new browser API that allows JavaScript to explicitly yield control back to the main thread during long tasks. This lets the browser process pending user interactions, improving INP. It’s designed specifically for optimizing interaction responsiveness and is the recommended way to break up long tasks.

Spread the love

Meet The Author

Jobin John
Jobin is a digital marketing professional with over 10 years of experience in the industry. He has a passion for driving business growth in the online realm. With an extensive background spanning SEO, web design, PPC campaigns, and social media marketing, Jobin masterfully crafts strategies that resonate with target audiences and achieve measurable outcomes.
Back to Top
Top