Auditing third-party scripts before they cost you a customer
Every third-party script gets added for a reason that made sense at the time: a chat widget a sales team asked for, an analytics tool a previous marketing hire installed and never removed, a retargeting pixel from a campaign that ended two years ago. Individually, none of them look expensive. Collectively, they're one of the most common causes of a slow site we find in audits.
The accumulation happens gradually enough that nobody notices it happening. Each individual script gets approved by a different team, at a different time, for a reason that was reasonable in isolation, and no single decision ever felt like it was making the site meaningfully slower. It's only when someone pulls the full list together in one place, usually during an unrelated performance audit, that the cumulative weight becomes visible for the first time.
Start by just listing what's actually there
Most site owners are surprised by their own script count when we pull the full list from the browser's network tab. It's common to find eight to twelve third-party scripts running on a page where the client can name maybe three of them. The audit itself, before any decisions, is often the most valuable first step.
We export the full list into a shared spreadsheet with each script's domain, approximate file size, and where in the page load it fires, before making a single recommendation. Seeing the list laid out this plainly tends to prompt the client's own team to start recognizing scripts they'd forgotten about, a marketing platform from a campaign two roles ago, a heatmap tool nobody's looked at the data from in over a year, well before we've suggested cutting anything ourselves.
Ask who actually owns each one
For each script, we ask: which team requested this, is it still actively used, and what does removing it break. Scripts with no clear current owner and no one who'd notice their removal are the easiest, safest cuts, and there are usually more of these than clients expect.
This ownership question surfaces something interesting almost every time: a script installed by someone who's since left the company, approved for a campaign that ended, or added to test something that was never followed up on. Nobody actively defends these scripts once asked directly, because nobody actually remembers why they're there, which is exactly why they're the safest and fastest wins in the whole audit.
Defer what you can't remove
For scripts that are genuinely needed but not required for the initial render, chat widgets, most analytics, non-critical tracking pixels, loading them after the main content paints rather than blocking it is usually a straightforward win that doesn't require removing anything, just changing when it loads.
This distinction between removing and deferring matters politically as much as technically. A marketing team that hears "we're removing your chat widget" pushes back immediately, since chat conversion is a real, measurable channel for them. The same team has no objection to "we're changing when the chat widget loads so it doesn't block the page from rendering," because the functionality is entirely preserved and the change is invisible to anyone using the site normally.
Watch for scripts that load other scripts
Some tag managers and marketing platforms load a cascade of secondary scripts you didn't directly add, which can be the least visible and most damaging category. We specifically check for this pattern, since it's easy to approve one tag manager script and unknowingly inherit five more.
A tag management platform is particularly prone to this because approving it once feels like a single decision, when in practice it becomes an ongoing, largely invisible pipeline for adding more scripts later without a corresponding review process. We ask what governance exists around the tag manager itself, who can add a new tag, and whether there's any review before it goes live, since an unmanaged tag manager tends to become the single largest contributor to script bloat over time.
Some tag managers and marketing platforms load a cascade of secondary scripts you didn't directly add, which can be the least visible and most damaging category.
A recurring approval process, not a one-time cleanup
The audit fixes the current state, but scripts accumulate again over time unless there's a process to prevent it. We set up a simple rule for ongoing clients: any new script needs a named owner and a stated purpose before it gets added, logged in the same place the original audit lives, so the next cleanup is smaller and easier than the last.
The rule works because it's lightweight enough to actually follow under normal deadline pressure, not a heavyweight approval committee that slows down a legitimate request. A single line in a shared document, who requested it, why, and when to revisit whether it's still needed, is enough friction to stop casual, unaccountable additions without meaningfully slowing down a team that has a genuine, well-considered reason to add something new.
The result on a typical audit
On a recent client audit, we found eleven third-party scripts, removed four entirely with no team objecting, and deferred five more until after main content render. Total blocking script weight dropped by more than half, and mobile LCP improved by nearly a full second, with zero functionality actually lost.
The most striking part of that result wasn't the performance number itself, it was how little internal resistance the changes generated once framed correctly. Nobody on the client's team missed the four removed scripts, because nobody had a clear use for them in the first place; the audit simply made that fact visible instead of leaving it buried in a network request nobody had looked at closely in years.
Making the audit a recurring habit, not a one-time save
The improvement from a single cleanup pass erodes over time as new scripts get added under the same casual conditions that created the original bloat. We schedule a lightweight re-audit every six months for retainer clients specifically, comparing the current script list against the last one and flagging anything new that snuck in without going through the approval process established after the first cleanup.
Clients without an ongoing retainer relationship still benefit from setting a calendar reminder to run this check themselves, even without our involvement. Pulling the network tab list, comparing it against the last known-good list, and asking the same ownership questions again takes under an hour and catches the drift early, well before it accumulates back into the kind of problem that needed a full paid audit to untangle the first time.