Enter any URL to check Interaction to Next Paint (INP) from real user data (Google CrUX). Also measure INP live in your browser or simulate values and get prioritized fixes. Core Web Vitals responsiveness metric that replaced FID in March 2024.
Fetches real user INP data from Google CrUX (Chrome User Experience Report). Returns the 75th-percentile INP value that Google uses to assess Core Web Vitals. Data is only available for URLs with sufficient real user traffic in Chrome.
Data source: Google Chrome User Experience Report (CrUX) — 75th percentile of real Chrome users in the last 28 days.
If no data appears, the URL may not have enough traffic or may not be indexed in CrUX.
For lab-based testing, use Google PageSpeed Insights or integrate the web-vitals library.
Click Start, then interact with this page — click buttons, type, or select options. The meter captures each interaction using the PerformanceObserver API and displays the worst-case INP in real time.
Enter your INP value and stack details to get a diagnosis and prioritized fix recommendations.
From PageSpeed Insights or CrUX above
What triggers high INP on your page
Frontend technology
Analytics, ads, chat widgets
INP (Interaction to Next Paint) replaced FID (First Input Delay) as the Core Web Vitals responsiveness metric in March 2024. The change was significant: FID only measured the input delay before the browser started processing the first interaction on a page, and only that delay — not the full time to visual update. INP measures the entire duration of every click, tap, and keyboard interaction throughout a user's session, and reports the worst-case value.
This shift reflects how users actually experience sluggishness. A page can have excellent FID (the first tap is processed quickly) but terrible INP if clicking a filter button or typing in a search field causes a 600ms lag. Google's field data from the Chrome User Experience Report (CrUX) showed that many sites passing FID were still delivering poor interaction responsiveness to real users.
Phase 1 / Input Delay
Input DelayTime from user gesture to when the browser begins running event handlers. A long task running on the main thread when the user interacts is the primary cause.
Phase 2 / Processing
Processing DurationTime the event handler code itself takes to run. Heavy JavaScript, synchronous DOM reads, forced layout (reading offsetWidth after writes), and framework re-renders add up here.
Phase 3 / Presentation
Presentation DelayTime the browser needs to render the visual update — style recalculation, layout, paint, and compositing. Complex CSS or large layout shifts after an interaction drive this up.
| Dimension | FID (deprecated) | INP (current) |
|---|---|---|
| Scope | First interaction only | All interactions in session |
| What is measured | Input delay only (Phase 1) | Full duration: delay + processing + presentation |
| Good threshold | < 100ms | < 200ms |
| Poor threshold | > 300ms | > 500ms |
| Outliers | No exclusion logic | Worst interaction, outliers optionally excluded |
| Core Web Vitals status | Removed March 2024 | Active ranking signal |
| Interaction types | Click, tap, keydown only | Click, tap, keyboard (scroll excluded) |
| Lab measurable? | Partially (with lab interaction) | Partially (requires scripted interactions) |
Long input delay — main thread blocked at time of interaction
If the input delay phase dominates your INP, a JavaScript long task was running when the user tapped or clicked. Use scheduler.yield() (Chromium 115+) to insert yield points inside long tasks. Where scheduler.yield() is unavailable, setTimeout(fn, 0) breaks up work but yields less control. Move non-critical initialization to requestIdleCallback. Audit third-party scripts — analytics, tag managers, and ad loaders are frequent culprits for input delay because they run continuous background tasks.
Heavy event handler code — processing duration too long
Synchronous work inside click or input handlers directly adds to INP. The most common mistake is triggering forced layout — reading a layout-triggering property like getBoundingClientRect() or offsetWidth immediately after writing to the DOM. This forces the browser to recalculate layout synchronously. Batch reads before writes, or separate them with requestAnimationFrame. In React, wrap expensive non-urgent updates with startTransition() to let the browser stay responsive to new input while rendering catches up.
Framework re-render performance — React, Vue, Angular
In React: use React.memo, useMemo, and useCallback to prevent unnecessary re-renders. Avoid re-rendering large trees on every keystroke — debounce state updates that feed search or filter logic. For long lists, virtualize with TanStack Virtual or react-window. In Vue: v-memo prevents re-rendering list items whose dependencies haven't changed. Use shallowRef for large objects to avoid deep reactivity overhead. In Angular: switch to ChangeDetectionStrategy.OnPush to limit change detection to components whose inputs have changed.
Presentation delay — complex rendering after interaction
If the presentation delay phase is large, the browser is doing too much layout and paint work after the event handler completes. Reduce the number of DOM nodes in the layout scope triggered by the interaction. Avoid CSS properties that trigger full layout (width, height, top, left) in favor of transform and opacity, which only require compositing. Use CSS content-visibility: auto on off-screen content to skip rendering work for elements not in the viewport.
Third-party scripts — auditing and deferring
Third parties (Google Tag Manager, Hotjar, Intercom, ad networks) frequently cause input delay by running long tasks on the main thread throughout the page lifecycle. In Chrome DevTools Performance tab, look for long tasks from third-party origins in the Main thread flamechart. Load non-critical third parties after the first user interaction using a deferred loading pattern. Consider partytown to run third-party scripts in a Web Worker, isolating their main-thread impact. Measure the INP delta with and without each third party to quantify impact.
Diagnosing INP with Chrome DevTools and LoAF
The Long Animation Frames (LoAF) API, available in Chrome 123+, provides the most detailed INP breakdown available without RUM tooling. In DevTools Performance panel: record a trace, interact with the page, and look for the LoAF entry that corresponds to your interaction. It breaks down input delay, processing duration, and presentation delay with script attribution. The web-vitals library (import { onINP } from 'web-vitals/attribution') surfaces LoAF data for real users and sends it to your analytics.
| Tool | Data Type | INP Coverage | Notes |
|---|---|---|---|
| This tool (URL Checker) | Field (CrUX) | 75th percentile real users | Google CrUX API, no login needed |
| Google PageSpeed Insights | Field + Lab | CrUX + some scripted interactions | Most trusted; official tool |
| Google Search Console | Field (CrUX) | Aggregated site-wide | Requires site ownership verification |
| Chrome DevTools | Lab | Manual interactions only | Best for diagnosing specific interactions |
| web-vitals library | Field (RUM) | All real user interactions | Best for ongoing monitoring in production |
| Lighthouse | Lab | Does not measure INP | No interaction simulation; use for other metrics |
| WebPageTest | Lab | Scripted interactions only | Supports custom interaction scripts |