Back to blog
INP: the new Core Web Vital that changes everything in 2026
Performance

INP: the new Core Web Vital that changes everything in 2026

Bastien AllainMarch 4, 202619 min read
performancecore-web-vitalsinpseojavascript

The landscape of web performance has fundamentally shifted. For years, the industry fixated on how quickly a page loaded, optimizing initial payload sizes and server response times. While those metrics remain important, modern web applications are highly dynamic, JavaScript-heavy experiences where the initial load is merely the beginning of the user journey. The true measure of quality now lies in runtime responsiveness—how fluidly an application reacts to user input after the page has painted.

In 2026, Interaction to Next Paint (INP) is the undeniable gold standard for measuring this responsiveness. Having fully replaced First Input Delay (FID) as a Core Web Vital, INP represents a paradigm shift from a highly forgiving, narrow metric to a comprehensive evaluation of the entire user lifecycle on a given page. This transition forces developers and technical SEO experts to look beyond the network tab and dive deep into main thread execution, rendering pipelines, and complex state updates.

Understanding and optimizing for INP is no longer an edge-case performance enhancement; it is a critical baseline for any serious digital product. Failing to address INP issues means serving a frustrating, sluggish experience that directly degrades both algorithmic search visibility and user conversion rates. To master this metric, teams must unpack exactly what INP measures, why it matters, and how to surgically diagnose the main thread blockages that cause it.

What is Interaction to Next Paint (INP)?

Interaction to Next Paint (INP) is a field metric that assesses a page's overall responsiveness to user interactions by observing the latency of all click, tap, and keyboard events that occur throughout the lifespan of a user's visit. Rather than averaging these interactions, INP reports a single value representing the longest—or nearly the longest—interaction delay observed. For pages with fewer than 50 total interactions, INP is strictly the interaction with the worst latency. For highly interactive pages with more than 50 interactions, INP ignores the single highest value per 50 interactions to filter out freak anomalies, providing a more stable, representative high-percentile metric.

An interaction is defined as a logical user action. For example, a "click" interaction encompasses the sequence of pointerdown, pointerup, and click events. INP calculates the total time from the moment the user initiates the interaction until the exact moment the browser paints the next frame to the screen, visually acknowledging the input.

The 3 phases of an interaction analyzed by INP

To effectively debug high INP scores, developers must understand that an interaction's lifecycle is not a single block of time, but rather a sequence of three distinct phases. Each phase represents a different bottleneck in the browser's architecture.

1. Input Delay: This is the time between the user's physical action (clicking a mouse, tapping a screen) and the moment the browser's main thread actually begins executing the event callbacks associated with that action. High input delay is rarely caused by the event handler itself; instead, it occurs because the main thread is already occupied. If a user clicks a button while the browser is parsing a massive third-party script or executing an unrelated setInterval function, the interaction is queued. The input delay is the time spent waiting in that queue.

2. Processing Time: Once the main thread is free, it begins executing the event handlers bound to the interaction. The processing time represents the total synchronous execution duration of these callbacks. In modern frameworks like React or Vue, this phase includes not just the immediate logic of the event listener, but also the subsequent synchronous state calculations and Virtual DOM diffing triggered by the interaction.

3. Presentation Delay: After the JavaScript execution completes, the browser must calculate styling changes, recalculate layout, and ultimately paint the new pixels to the screen. Presentation delay is the time required to complete this rendering pipeline. Complex CSS animations, massive DOM trees, or operations that force synchronous layout recalculations (often called layout thrashing) will severely inflate this phase.

Technical Callout: A common misconception is that offloading heavy calculations to a Web Worker immediately solves INP. While Web Workers free up the processing time phase, if the worker passes back a massive dataset that requires the main thread to render thousands of new DOM nodes synchronously, your presentation delay will skyrocket, resulting in a poor INP score regardless.

Key differences: INP vs FID

The retirement of First Input Delay (FID) in favor of INP was driven by FID's inability to accurately reflect the actual user experience of modern web applications. FID was notoriously easy to "pass" while still delivering a sluggish interface.

The differences between the two metrics are stark and structural:

  • Scope of Measurement: FID only measured the very first interaction a user had with the page. If the initial click was fast, the page passed, even if every subsequent interaction froze the browser for seconds. INP continuously monitors all supported interactions until the user leaves the page, capturing the true lifecycle responsiveness.
  • Phases Measured: This is the most critical distinction. FID only measured the Input Delay phase. It stopped the timer the moment the event handler began executing. It completely ignored how long the JavaScript took to run and how long the browser took to paint the result. INP measures the entire journey: Input Delay + Processing Time + Presentation Delay.

Consider the following JavaScript example to illustrate why FID was insufficient:

document.getElementById('heavy-button').addEventListener('click', () => {
  // FID stops measuring right here. It only tracks the wait time before this line runs.
  
  const startTime = performance.now();
  // Simulate heavy synchronous processing blocking the main thread
  while (performance.now() - startTime < 800) {
    // Blocking execution for 800ms
  }
  
  // INP continues measuring through this execution, 
  // AND waits for the subsequent UI update to paint to the screen.
  updateInterface(); 
});

Under FID, this button could theoretically score a perfect 5ms if the main thread was idle when clicked. Under INP, this same interaction will immediately trigger a failing score of 800ms+, accurately reflecting the fact that the user stared at a frozen screen for nearly a second.

Why INP is crucial for UX and SEO

The transition to INP forces a holistic approach to performance architecture. It is no longer sufficient to optimize the critical rendering path; developers must optimize the application's runtime state. This metric sits at the exact intersection of user psychology and search engine evaluation criteria.

The INP thresholds you need to know

Google evaluates Core Web Vitals using data from the Chrome User Experience Report (CrUX), which aggregates real-world telemetry from opted-in Chrome users. To ensure consistency, metrics are evaluated at the 75th percentile (p75) of all page loads. This means that 75% of your users must experience an INP below the threshold to achieve a "Good" rating.

The official thresholds for Interaction to Next Paint are uncompromising:

  • Good: At or below 200 milliseconds. Visual feedback feels instantaneous and connected to the user's physical action.
  • Needs Improvement: Between 200 milliseconds and 500 milliseconds. Users perceive a noticeable lag. The interface feels "heavy" or disconnected.
  • Poor: Greater than 500 milliseconds. The application feels broken. Users frequently rage-click, assuming their first input was not registered.

Achieving a sub-200ms INP at the 75th percentile on mobile devices—where CPU power is highly variable and network latency can impact main-thread hydration—requires rigorous code splitting, efficient state management, and strict control over third-party execution.

The business impact of a good INP score

The correlation between runtime responsiveness and business metrics is profound. When an application responds fluidly, cognitive load decreases. Users navigate checkout flows with less friction, consume more content, and are less likely to abandon forms.

From an SEO perspective, Google integrates Core Web Vitals into its ranking systems as a page experience signal. While content relevance remains the primary driver of search rankings, page experience acts as a critical tie-breaker in competitive SERPs. A "Poor" INP score not only flags your site as providing a subpar experience to Google's algorithms, but it directly inflates bounce rates—a secondary signal that users are dissatisfied with the result they clicked.

Furthermore, sluggish interactivity damages brand perception. In an era where users are accustomed to native-app-like responsiveness on the web, a 600ms delay when opening a mobile navigation menu or adding an item to a cart signals low quality. Fixing INP often yields direct, measurable lifts in conversion rates simply because users are no longer abandoning processes out of frustration or confusion.

Essential tools to measure and diagnose INP

Because INP is a metric that encompasses the entire lifespan of a page visit, relying solely on lab data (like a single Lighthouse run) is inadequate. Lab tools simulate a clean load but cannot predict where a real user will click, how rapidly they will interact, or what the state of the main thread will be exactly at that moment. A robust performance strategy requires a combination of real-user monitoring (RUM) for field data and specialized developer tools for local debugging.

Google tools for field data (CrUX)

To understand how your application performs in the wild, you must access CrUX data.

Google Search Console provides the broadest overview, offering a dedicated Core Web Vitals report that flags specific URL groupings suffering from high INP. This should be your starting point for identifying which templates or page types require attention.

PageSpeed Insights (PSI) provides URL-level CrUX data. When you analyze a URL, the "Discover what your real users are experiencing" section provides the 28-day rolling average of your p75 INP. It also provides a critical breakdown of the metric, showing the percentage of users falling into the Good, Needs Improvement, and Poor buckets.

For enterprise teams, implementing custom RUM via the web-vitals JavaScript library is essential. This allows you to capture raw INP data from every user session and send it to your own analytics infrastructure. Crucially, the library can provide attribution data, telling you exactly which CSS selector the user interacted with when the high latency occurred.

import { onINP } from 'web-vitals/attribution';
 
onINP((metric) => {
  // Extract actionable data from the metric object
  const { value, rating } = metric;
  const targetElement = metric.attribution.interactionTargetElement;
  const eventType = metric.attribution.interactionType;
  
  // Send this highly specific data to your logging endpoint
  navigator.sendBeacon('/api/log-vitals', JSON.stringify({
    metric: 'INP',
    value,
    rating,
    element: targetElement ? targetElement.nodeName + '.' + targetElement.className : 'unknown',
    eventType,
    path: window.location.pathname
  }));
});

Debugging tools for developers

Once field data identifies a problematic interaction, developers must reproduce and diagnose the issue locally. The Chrome DevTools Performance panel is the primary diagnostic environment.

To effectively debug INP locally:

  1. Open the Performance panel and enable CPU throttling (e.g., 4x slowdown) to simulate average mobile hardware.
  2. Start recording, perform the specific interaction flagged by your field data, and stop the recording.
  3. Locate the "Interactions" track in the resulting flame chart. DevTools specifically highlights interactions with high latency, coloring them red if they exceed the 200ms threshold.

By hovering over the interaction in the timeline, developers can see an exact breakdown of the three INP phases: Input delay, Processing duration, and Presentation delay. This breakdown dictates the optimization strategy. If the processing duration is massive, you must look at the function call tree directly below the interaction to find the expensive JavaScript execution. If the presentation delay is the culprit, you must analyze the main thread for long "Recalculate Style" or "Layout" tasks following the execution.

Technical Callout: You can also utilize the Long Animation Frames (LoAF) API natively in Chrome to diagnose rendering delays that contribute to high INP. LoAF provides deep insights into frames that take longer than 50ms to render, exposing the specific scripts and rendering phases responsible for the blockage, which is invaluable for debugging presentation delay issues.

Additionally, developers can utilize the Lighthouse Timespan mode. Unlike a standard navigation load, timespan mode allows you to start recording, freely interact with the page (opening modals, submitting forms), and stop recording. Lighthouse will then evaluate the interactions that occurred during that specific window, providing targeted recommendations for reducing main thread work and improving interaction latency.

Common causes of a poor INP score

When an interaction feels sluggish, the root cause almost always boils down to one fundamental issue: the browser's main thread is blocked. The main thread is responsible for executing JavaScript, computing styles, laying out the page, and painting pixels. If it is occupied with a heavy task when a user clicks a button or types in an input, the browser must wait for that task to complete before it can process the interaction and present visual feedback.

The number one culprit: JavaScript Long Tasks

In the context of web performance, a Long Task is defined as any continuous period of execution on the main thread that exceeds 50 milliseconds. Long Tasks are the primary enemies of a good Interaction to Next Paint (INP) score.

If a user interacts with your page at the exact moment a Long Task begins, the browser cannot even begin to acknowledge that interaction until the task completes. The longer the task, the more noticeable the delay becomes to the user. This phenomenon is especially common in single-page applications (SPAs) during the hydration phase, or when complex state updates trigger massive re-renders across the component tree.

// Example of a Long Task that ruins INP
function blockMainThread() {
  // A heavy synchronous operation
  let result = 0;
  for (let i = 0; i < 1000000000; i++) {
    result += Math.sqrt(i) * Math.sin(i);
  }
  
  // The user cannot see any UI updates until this loop finishes
  document.getElementById('result').textContent = 'Done: ' + result;
}
 
document.getElementById('action-button').addEventListener('click', blockMainThread);

In the example above, clicking the button instantly locks up the browser. The user sees no visual state change—not even a button press animation—until the loop entirely finishes its calculation.

Pro Tip: You can easily identify Long Tasks in Chrome DevTools by recording a performance trace. Look for tasks marked with a red triangle in the Main thread flame chart; these are the bottlenecks dragging down your INP.

Event handler overload

Another significant contributor to poor INP is doing too much synchronous work directly within your event handlers. While it is necessary to respond to user input, you do not need to perform every single related operation before painting the next frame.

Developers frequently fall into the trap of updating the immediate UI state, firing analytics events, recalculating dependent data, and modifying the DOM all within a single onClick or onKeyDown handler. This bundles everything into one massive task, delaying the initial visual feedback that tells the user "your click was registered."

Instead, you must separate the visual acknowledgment of the interaction from the heavy lifting required by the interaction. The UI should update instantly, while complex data processing or network requests are deferred.

Third-party script impact

Often, the code ruining your INP is not even code you wrote. Third-party scripts—such as those used for advertising, A/B testing, analytics, and social media widgets—are notorious for commandeering the main thread and executing monolithic scripts.

These scripts frequently evaluate large blocks of JavaScript or continuously poll the DOM for changes, generating Long Tasks unpredictably. If a user tries to interact with your site while an analytics script is heavily processing data in the background, their interaction will be queued, and your INP score will suffer. Evaluating and strictly managing the execution priority of third-party code is crucial for modern web performance.

Optimization strategies for an excellent INP

Fixing a poor INP requires a shift in how you architect your frontend execution. You must prioritize the main thread's availability above all else, ensuring the browser always has the breathing room to paint frames and respond to inputs.

Yielding to the main thread

The most effective strategy for resolving Long Tasks is yielding to the main thread. Yielding means intentionally breaking up a single monolithic task into smaller, distinct chunks. By pausing execution, you give the browser a window of opportunity to process pending user interactions, update the DOM, and paint the screen before resuming the remaining work.

Historically, developers relied on setTimeout to push work to the back of the task queue. In 2026, modern APIs like scheduler.yield() provide a much more robust and ergonomic way to pause execution and allow the browser to prioritize urgent rendering work without losing your place in the execution flow.

// Legacy approach using setTimeout
function yieldToMain() {
  return new Promise(resolve => setTimeout(resolve, 0));
}
 
async function processDataInChunks(data) {
  for (let i = 0; i < data.length; i++) {
    processItem(data[i]);
    
    // Yield every 50 items to keep the thread responsive
    if (i % 50 === 0) {
      await yieldToMain();
    }
  }
}
// Modern approach using scheduler.yield()
async function processDataModern(data) {
  for (let i = 0; i < data.length; i++) {
    processItem(data[i]);
    
    // Natively yield control back to the browser
    if (i % 50 === 0 && 'scheduler' in window && 'yield' in scheduler) {
      await scheduler.yield();
    }
  }
}

By yielding frequently during heavy operations, you guarantee that even if a user interacts in the middle of a complex calculation, the browser can immediately respond, resulting in a phenomenal INP.

Optimizing processing code

While yielding is powerful, it is only a band-aid if your underlying code is fundamentally inefficient. Optimizing processing code requires minimizing the total amount of work the browser has to do in response to an interaction.

This involves several critical practices:

  1. Avoiding DOM Thrashing: Batch your DOM reads and writes. Reading layout properties (like offsetHeight) and immediately modifying styles forces the browser into a synchronous layout recalculation, which is notoriously slow.
  2. Debouncing and Throttling: For continuous interactions like scrolling, resizing, or typing, do not fire heavy logic on every single event. Use debouncing to wait until the interaction stops, or throttling to limit execution frequency.
  3. State Management Efficiency: In framework-driven applications (React, Vue, etc.), ensure that a single interaction does not trigger a cascading re-render of the entire application. Use memoization and localized state to scope rendering updates only to the components that actually changed.

Crucial Concept: The fastest JavaScript is the JavaScript you never execute. Before asking how to make a task faster, ask if the task needs to happen at all during the critical interaction phase.

Web Workers and Code Splitting

For computational tasks that absolutely must happen but take too long to yield effectively, you should offload them entirely from the main thread. Web Workers allow you to run JavaScript in the background, utilizing separate CPU threads.

Data parsing, complex cryptography, image processing, and heavy formatting logic are perfect candidates for Web Workers. Because they run outside the main thread, they cannot block rendering or user interactions, effectively reducing your INP to zero for those specific tasks.

// main.js
const worker = new Worker('heavy-calculator.js');
 
document.getElementById('calc-button').addEventListener('click', () => {
  // 1. Update UI immediately (Instant visual feedback)
  document.getElementById('status').textContent = 'Calculating...';
  
  // 2. Send task to background thread
  worker.postMessage({ type: 'start_heavy_math', payload: data });
});
 
worker.onmessage = (event) => {
  // 3. Update UI when result is ready
  document.getElementById('status').textContent = `Result: ${event.data}`;
};

Furthermore, Code Splitting ensures that the main thread is not overwhelmed during page load or navigation. By breaking your application bundle into smaller chunks and loading only the JavaScript required for the current view, you drastically reduce parse and compile times. This prevents the browser from locking up while trying to evaluate megabytes of scripts, ensuring the page becomes interactive—and remains interactive—much faster.

Integrating INP into a culture of continuous performance

Optimizing INP is not a one-time project; it is an ongoing architectural commitment. As your application grows and new features are added, Long Tasks will inevitably creep back into the codebase unless you establish a culture of continuous performance monitoring.

Performance budgets

To prevent regressions, you must enforce strict limits on the size and execution time of your JavaScript. Setting up performance budgets within your Continuous Integration (CI) pipeline ensures that no pull request can be merged if it violates your established performance thresholds.

You can configure tools like Lighthouse CI or Webpack performance hints to fail the build if the JavaScript payload exceeds a certain size, or if simulated interaction delays spike above your target INP threshold (typically 200 milliseconds). By making performance a structural requirement of your deployment process, you force the development team to prioritize efficiency at the architectural level.

Performance Strategy: Do not just budget bundle size; budget execution time. A 50KB script that takes 500ms to evaluate is far more damaging to INP than a 200KB script that takes 50ms to evaluate.

Monitor, alert, and iterate

Lab data (like Lighthouse scores run on a developer's high-end machine) is not enough to guarantee a good INP. INP is highly dependent on the user's actual device capabilities and current network conditions. Therefore, you must rely on Real User Monitoring (RUM).

By collecting RUM data, you capture the actual INP scores experienced by real users in the wild. You should aggregate this data to identify which specific interactions on which specific pages are causing the most significant delays. Set up automated alerts to notify the engineering team whenever the 75th percentile of your INP score degrades beyond the "Good" threshold.

When an alert triggers, you isolate the specific user flows, recreate the interaction in a controlled lab environment with CPU throttling enabled, profile the main thread, and iterate on the optimization strategies discussed earlier. This closed-loop system ensures your performance remains resilient over time.

Conclusion

Interaction to Next Paint has fundamentally redefined how we measure web performance in 2026, forcing a critical shift away from simply loading pages quickly to ensuring they remain continuously fluid and responsive. As applications become increasingly complex, mastering main thread management is no longer an optional enhancement; it is a baseline requirement for retaining user engagement. By systematically diagnosing Long Tasks, ruthlessly optimizing event handlers, leveraging Web Workers, and embedding strict performance budgets into your CI/CD pipelines, you can build digital experiences that feel instantaneous. The transition to an INP-centric mindset demands technical rigor, but the reward—a frictionless, highly responsive user interface that builds trust and drives conversion—is unequivocally worth the investment.

Related posts