INP: what it is and how to improve this Core Web Vitals metric
INP measures how quickly your site responds to user clicks and taps. The limit is 200 milliseconds. If you exceed it, your ranking notices.
Published on · Updated on · 11 min read

INP (Interaction to Next Paint) measures how quickly your site responds to user clicks and taps. Together with LCP (loading) and CLS (visual stability), it forms the Core Web Vitals trio that Google uses to evaluate your site.
The limit is 200 milliseconds. If you exceed it, your ranking notices. If you’re starting from scratch, begin with what Core Web Vitals are.
Difference between INP and FID (and why it’s harder now)
| Metric | What it measured | The problem |
|---|---|---|
| FID (old) | The delay of the user’s first click. Only the first one. Only the start of processing. | You could have a button that took 2 seconds to respond and still pass. |
| INP (current) | The worst-case interactivity across the whole session. Every click. The full latency until the screen updates. | If any button or interaction is slow, the metric fails. |
In plain English: before, it was enough for the first impression to be good. Now, if you have a single button that responds poorly, Google will make you pay for it.
What’s a good INP
Google evaluates INP at the 75th percentile of all interactions on the page. This means that 75% of interactions must be fast.
| Status | Time | What it means |
|---|---|---|
| Good | ≤ 200 ms | Your site responds well. You’re in the green. |
| Needs improvement | 200 – 500 ms | It may be acceptable, but you’re in the risk zone. |
| Poor | > 500 ms | Your users notice the delay. It affects your SEO. |
Why INP fails (the 3 main problems)
1. JavaScript blocks the main thread
The browser uses a single thread for everything: processing JavaScript and rendering visual changes. When a script occupies that thread for more than 50 ms, the browser can’t respond to user clicks.
The most common culprits:
- Analytics scripts (Google Analytics, Hotjar)
- Chatbots and third-party widgets
- Ad pixels
- Heavy event handlers that do complex calculations on click
2. Long tasks on click
When you click a button, the browser runs a «handler». If that handler makes an API call, processes data or updates a heavy React/Vue component, INP measures all that time.
3. Layout thrashing
When an interaction forces the page to recalculate the position of
many elements (resizes, style changes), the time between
the click and the visual update skyrockets. Animations using
width, height or margin instead
of transform or opacity are the main
culprits.
How to audit your INP
Don’t guess. Measure with real data.
| Tool | What it measures | When to use it |
|---|---|---|
| PageSpeed Insights | Field data (CrUX) and real INP from your users | For an initial diagnosis and to know if there are issues |
| Google Search Console | URLs with INP issues based on real Chrome data | To identify which priority pages are failing |
| Chrome DevTools (Performance) | INP marked on the timeline with real interactions | To identify exactly which element and which script cause the delay |
| web-vitals.js | INP data with attribution (know which script and which element fail) | For continuous monitoring with real users |
How to improve INP
1. Remove or defer third-party scripts
Scripts you don’t control (analytics, chat, ads) are the main cause of poor INP. You can’t optimize their code, but you can control when they load.
What to do:
- Add
deferorasyncto non-critical scripts. - Load chat widgets only when the user clicks a placeholder (lazy loading).
Example:
<script src="https://chat-provider.com/widget.js" defer></script>2. Split long tasks into smaller chunks
If your own JavaScript does heavy operations, split them into smaller chunks and let the browser breathe between each one.
Example:
// Bad: blocks the thread for 800ms
for (let i = 0; i < 10000; i++) { process(i); }
// Good: yields control every 50 items
async function processList(items) {
for (let i = 0; i < items.length; i += 50) {
const chunk = items.slice(i, i + 50);
processChunk(chunk);
await new Promise(r => setTimeout(r, 0));
}
}3. Optimize event listeners
If you have many elements with individual listeners (each product card, each menu item), use event delegation:
// Bad: 100 listeners
document.querySelectorAll('.card').forEach(card => {
card.addEventListener('click', handleClick);
});
// Good: 1 listener on the parent
document.querySelector('.grid').addEventListener('click', (e) => {
if (e.target.closest('.card')) handleClick(e);
});4. In WordPress with Elementor
Elementor tends to accumulate heavy JavaScript. Concrete solutions:
- Load third-party scripts only on the pages that need them.
- Disable widgets you don’t use (carousels, animations, particles).
- Use a caching plugin that minifies and combines JS (WP Rocket, W3 Total Cache).
If you want to dive deeper, check out why your WordPress needs maintenance.
5. In WooCommerce
INP in WooCommerce usually fails on three interactions:
| Problematic interaction | Why it fails | Solution |
|---|---|---|
| Clicking a product variation | Re-renders the entire form on every change | Reduce the size of the variation JSON or load it on demand |
| Add to cart | wc-cart-fragments.js refreshes the entire cart | Disable wc-cart-fragments on non-cart pages |
| Applying a coupon | Blocks the UI while waiting for the server response | Move the logic to a Web Worker or accept the architectural limit |
INP isn’t a number, it’s a symptom
Optimizing INP isn’t a whim. It’s a signal that your site has clean code, that third-party scripts don’t hijack the browser and that your users aren’t left waiting.
If you improve INP, user experience, conversion rate and ranking improve too. It’s not magic. It’s doing things right.
Start with what hurts most: third-party scripts and long main-thread tasks. Then go cleaning up what’s left over. Step by step.
And if you want to complete the strategy, check out how to improve LCP, how to improve CLS and the complete Core Web Vitals guide: what they are and how to improve them.
If you want a specialist to audit and fix your INP, I analyze your site, detect which scripts and which interactions are penalizing your interactivity, and give you a clear action plan. Tell me about your project and I’ll reply in less than 48 hours.
Want your site to respond instantly?
I audit your INP, optimize your scripts and help you so your users aren’t left waiting.