Third-party scripts and INP: what squirrel counts per page
More than five known third-party scripts, or more than three that block the parser. squirrel counts both on every page.
What INP measures
Interaction to Next Paint measures the delay between a user acting and the browser painting the result. The delay comes from the main thread being busy: a long task started by a script has to finish before the browser can respond to a click.
Third-party scripts are the usual source, because they are written for a different set of constraints and they run on every page whether the feature is used or not. A classic script with neither async nor defer is worse still: it blocks parsing while it downloads and executes, which delays everything after it. A type="module" script defers by default and needs neither attribute. Neither number is a measurement of INP, which needs a real interaction to observe. They are the two things a static read of the HTML can tell you about the main thread.
What squirrel checks
The rule runs on every crawled page and emits one or two checks:
inp-third-party: warns with the messageN third-party scripts may impact INPabove five, reports at info status withN third-party script(s) detectedfrom one to five, and passes withNo third-party scripts detectedat zero. Each script URL is listed as an item in the first two cases.inp-blocking-scripts: warns with the messageN blocking scripts (consider async/defer)when more than three classic<script src>elements have neitherasyncnordefer. With three or fewer and at least one<script src>on the page it passes withScript loading patterns look good. A page with no external scripts emits nothing for this check, and asrcthat is present but empty is not counted as blocking.
A type="module" script counts as deferred, or as async when it has async. A classic script with nomodule, or a script whose type is not JavaScript (such as text/plain behind a consent banner), is never blocking, because a modern browser does not run it. Such a script still counts toward the third-party number, since a consent banner usually turns it into a running script later.
A script counts as third-party only when its host differs from the page host and matches one of about twenty-five known analytics, advertising, support and monitoring domains, either exactly or as a subdomain. A script from an unlisted third-party host is not counted, so the number is a floor rather than a total.
The signals come from a shared analysis of the page that six performance rules read, computed once per page.
Elements inside <noscript> are skipped: a browser with scripting enabled reads <noscript> content as plain text, so nothing in it loads or renders. See content inside noscript.
How to fix it
<script src="/app.js" defer></script>
<script src="https://cdn.example.com/analytics.js" async></script>defer keeps execution order and runs after parsing. async downloads without blocking the parser and runs as soon as it arrives, which can still interrupt parsing but suits an independent script that touches nothing else.
For the third-party count, the fix is deletion rather than an attribute. Each tag is a separate decision about whether the feature is worth the main thread it costs.
The limit worth knowing is a tag manager loading one script that pulls in ten more. The rule sees one script in the HTML, so the count understates the page.
| Rule ID | perf/inp-hints |
| Category | Performance |
| Scope | Per-page |
| Severity | info |
| Weight | 5/10 |
Enable / disable
Disable this rule
[rules]
disable = ["perf/inp-hints"]Disable all Performance rules
[rules]
disable = ["perf/*"]Enable only this rule
[rules]
enable = ["perf/inp-hints"]enable replaces the default ["*"], so this is the only rule selected. Leave disable out: a rule that matches any disable pattern is skipped even when enable names it. Only an enabled setting under a rule’s own [rule_options] table overrides both lists.
Related rules
- perf/render-blocking: the same blocking scripts measured for their effect on first paint.
- perf/dom-size: the tree size that makes each interaction more expensive.
- perf/duplicate-js: the same library loaded more than once.
- analytics/gtm-present: the tag manager that usually sits behind a third-party count.
Performance findings ship in every audit next to the SEO, security and agent experience rules. See Core Web Vitals for how an agent works through a report.
References
Check your site
Run squirrel audit https://example.com and open the Performance section of the report. Each page lists its third-party scripts and its blocking count. Signed-out local audits need no account and cost nothing. Signed-in audits spend credits.