Your interactions are laggy. Fix them now
1. The End of the FID Era: Why INP Rules
For years, we optimized for First Input Delay (FID). But FID had a massive loophole: it only measured the first interaction and only counted the initial delay, completely ignoring the time it took for the browser to actually paint the result.
In 2026, INP is the absolute standard. It measures the latency of all user interactions (clicks, taps, keyboard inputs) throughout the entire page lifecycle. If a user clicks a menu and the page takes 500ms to show it because the main thread is blocked, your INP is officially in the red zone.
🎯 2026 Thresholds
- Good: < 200ms
- Needs Improvement: 200ms - 500ms
- Poor: > 500ms
Business Impact
An INP higher than 500ms correlates with a **22% drop in conversion rates** in e-commerce sites. "Invisible friction" is the silent killer of your digital revenue.
2. Anatomy of an Interaction: The 3 Pillars
To improve INP, we must break down what happens between the user’s touch and the screen update:
- Input Delay: The time spent waiting for the Main Thread to become idle (busy with heavy JS, hydration, etc.).
- Processing Time: The duration of your actual JS event handlers.
- Presentation Delay: The time the browser takes to recalculate layout, paint, and composite the resulting frame.
The Latency Cycle
Input Delay
JS Execution
Presentation Delay
3. Advanced Tactics: Yielding to the Main Thread
The key to elite INP is never blocking the main thread. In 2026, simply offloading work to Web Workers isn’t enough—you must master the art of “yielding” control back to the browser.
The scheduler.yield() Revolution
Until recently, we hacked yielding using setTimeout(0). Now, scheduler.yield() is the native API specifically designed to boost INP. It allows the browser to process pending interactions and renders right in the middle of a heavy JS task.
async function processLargeBatch() {
for (const item of giantList) {
calculate(item);
// Every 50 items, we yield to allow for user interactions
if (shouldYield()) {
await scheduler.yield();
}
}
}
4. Real-World Diagnosis: RUM vs. Lab Data
INP is a Field metric (RUM). You cannot trust Lighthouse alone because INP depends on real people interacting on real (and often bottlenecked) hardware.
Implementing Telemetry
Use the web-vitals library in production to capture attribution data. You need to know exactly which interaction triggered the latency spike and why.
import { onINP } from 'web-vitals/attribution';
onINP((attribution) => {
console.log('Interaction:', attribution.interactionType); // 'pointerdown', 'keydown'
console.log('Target Element:', attribution.processedEventTarget);
});
For extreme fluidity, discover how WebAssembly can offload heavy tasks from your main thread and how High-Efficiency Programming improves global efficiency.
5. Tooling: The SEO Expert Advantage
At AldeaCode, we have integrated predictive INP diagnostics into our SEO Expert. Don’t wait for Google Search Console to flag a “Poor” error. Our tool audits the main thread and identifies bottlenecks before they impact your ranking.
6. Frequently Asked Questions (FAQ) about INP
Why is my Lighthouse 100 but my INP is poor?
Because Lighthouse doesn't click. INP requires real human interaction. A low-end mobile trying to run JS while a user fast-scrolls creates an INP that a desktop simulation will never see.
Do third-party ads affect INP?
Dramatically. Ad and tracker scripts inject heavy tasks into the Main Thread at unpredictable times. The solution is moving them to a Worker via Partytown or using `requestIdleCallback` loading strategies.
What is "Layout Thrashing" and how it impacts?
It occurs when your code reads and writes DOM properties (like `offsetHeight`) repeatedly in a synchronous loop. This forces the browser to recalculate styles during JS execution, spiking Presentation Delay.