Slow Website? How to Uncover the Scripts Costing You Customers

Chat, booking, CRM and advertising tags can block the browser long after the page appears to have loaded. Here is a method for measuring the impact of each script and keeping only the integrations that create business value.

Why does your website feel slow even though the homepage receives a reasonable Lighthouse score? The answer is often that the test measures loading, while chat, booking, CRM and advertising scripts wait until the visitor starts interacting. A chat window that initially appears to weigh 80 kB may then download several megabytes of JavaScript and create a 300-millisecond task on the main thread just as someone clicks “Book”. The cost then appears in INP—not necessarily in the initial view—and a paid mobile visitor may interpret the lack of response as a broken form. The solution is to assign an owner to every integration, measure its impact in real user journeys and compare blocked milliseconds with bookings, leads or revenue.

Chrome DevTools Network med anrop grupperade per leverantör och kolumner för initiator, överförd storlek och tid bredvid en inventering med leverantör, ägare, sidor, trigger, affärsnytta och beslut

Map every third-party script behind a slow website

The inventory should begin in Chrome DevTools Network, Google Tag Manager, the page source and the website’s CMS, as the same provider is often loaded from several places. On a WordPress website, for example, a CRM may be added by a form plugin, hard-coded into the theme and simultaneously activated through the tag manager; in a React solution, the corresponding code may exist both in the application and in an externally managed container. Group network requests by provider in DevTools, WebPageTest or Request Map and follow the initiator chain, as a visible booking widget may trigger analytics, chat, retargeting and iframe communication from several other domains. For every domain and tag, the inventory should show the internal owner, affected pages, triggering conditions, transferred JavaScript volume, main-thread time and the specific decision or revenue stream supported by the integration. A tag without a named owner, documented use case and measurable conversion signal should be treated as a candidate for removal, while duplicate Meta Pixel or CRM events can also consume CPU time and cause the marketing team to overestimate the number of conversions.

Measure what blocks the next click—not just what delays page loading

Put simply, INP consists of the delay before the event can begin to be handled, the time JavaScript spends processing it and the wait until the browser can display the next frame. You should therefore record real mobile journeys in Chrome DevTools Performance: open the menu, accept consent, select a booking time, focus on a CRM form and submit it, rather than simply reloading the homepage. Long tasks exceeding 50 milliseconds are diagnostic warning signs, and expanding them often reveals whether the call stack points to a third-party script that wakes up on scrolling, form focus or a click and then performs synchronisation, DOM updates or communication with an iframe. Combine the lab test with the Chrome User Experience Report, where Core Web Vitals are assessed at the 75th percentile, and your own RUM monitoring using, for example, the web-vitals library with attribution. This allows you to connect a slow interaction to an element, interaction type and the most expensive part of the delay. Then temporarily block the provider’s domains using DevTools Request Blocking and repeat exactly the same journey; if the booking click falls from 340 to 170 milliseconds, you have much stronger evidence for a decision than general advice to “reduce JavaScript”.

Chrome DevTools Performance-inspelning av klick på en bokningsknapp där INP-interaktionen, en 300 millisekunder lång huvudtrådsuppgift och call stack från tredjepartsdomänen är markerade

Remove, defer or replace based on marginal value per millisecond

The decision should be based on marginal value per millisecond: how much verified business value does the integration create compared with how long it blocks critical interactions for the visitors who actually use it? Run a controlled test in which the tool is paused or loaded later, and monitor both INP and business metrics such as initiated bookings, qualified leads, completed purchases and customer acquisition cost, because a technical improvement without maintained conversion performance is not a complete result. Start by removing scripts that have no active owner, send overlapping data or are no longer used in a workflow. However, consider pausing them in Google Tag Manager during the test period so the change can be quickly reversed if a dependency is discovered. Chat and booking widgets can instead be loaded after an intentional click on a local button, while advertising tags can be conditionally loaded after consent and during browser idle time. When the same function can be provided through server-side tagging, a simpler form or a standard link to a separate booking page, the lighter architecture should be tested. Finally, verify the effect on the same devices, page types, traffic channels and user journeys, as an improved median can conceal the fact that mobile visitors at the 75th percentile still exceed the 200-millisecond threshold for a good INP.

When third-party scripts become a business risk—not just a performance problem

Scripts without an active owner remain long after their value has disappeared

An inventory that lists only the provider does not show who should justify the cost or decide whether to retire the integration. Old A/B testing tools, campaign pixels and chat modules may therefore remain in place for years after the experiment has ended, the agency has been replaced or the sales department has moved to another CRM. Every such integration increases the amount of code that must be downloaded, parsed and executed, but it also increases operational risk through external dependencies, changing APIs and unclear processing of personal data. Set a review date and require the owner to demonstrate actual usage, identify the report or process that needs the data and specify which conversion metric would be affected if the script were disabled.

In an inventory using Google Tag Manager and Request Map, 11 of 34 third-party requests had no internal owner. Once these requests had been paused and verified, they could be removed, reducing the transferred volume of JavaScript by 420 kB per page view.

Good loading metrics can conceal a blocked next click

LCP shows when the largest visible content element has been rendered, but it does not indicate that the main thread is free when the visitor selects a product variant or opens the checkout. Analytics, personalisation and remarketing may continue to execute after the page appears complete while competing with the interface’s own JavaScript. The result is a page that looks fast in a screenshot but feels broken when a click produces no visible response until several hundred milliseconds later. INP optimisation must therefore focus on the interactions that generate revenue and on field data showing what real mobile phones experience, rather than relying solely on a powerful development computer.

When a personalisation engine was deferred until the browser’s first idle period, INP when selecting a product variant fell from 380 to 160 milliseconds in the Chrome User Experience Report. The change moved the interaction from the “needs improvement” category to the level associated with a good user experience.

Consent does not automatically eliminate the performance cost

A common misconception is that a script has no cost before consent as long as it refrains from sending personal data. If the file has already been downloaded and initialised, the visitor has still paid the cost of DNS lookup, TLS connection, network transfer, JavaScript parsing and any DOM operations. Review both the consent platform’s rules and the network log before a choice is made in the banner; a correctly blocked script should normally not load at all until the legal and functional requirements have been met. The same principle applies to video players, maps and social embeds, which can be replaced with a local preview image until the visitor explicitly chooses to use the service.

By placing a video provider behind a click on a local preview image, three external connections and approximately 600 kB of JavaScript were removed from the initial load. Visitors who never played the video therefore incurred none of the provider’s performance costs.

Optimise for marginal value per millisecond, not script size

File size is a relevant network cost, but it does not reveal how often the code runs or whether it blocks a revenue-critical interaction. A smaller analytics script may run synchronously on every form field and create a greater conversion risk than a larger payment library used only once at checkout. Rank integrations according to blocked main-thread time in priority journeys, the proportion of visitors exposed, verified revenue and the cost of a provider failure. This model makes it possible to retain a heavy but revenue-generating tool under clearly defined loading conditions while replacing small scripts whose data collection no longer influences any decision.

A 70 kB analytics script that blocked the main thread for 190 milliseconds was replaced with server-side tagging, while a revenue-generating 240 kB payment script was retained but loaded only at checkout. The change reduced the cost on information and product pages without impairing the payment flow.

Beslutsdiagram med uppmätt INP-påverkan på ena axeln och verifierad affärsnytta på den andra där chatt, bokning, CRM-formulär och annonspixel placeras i behåll, villkorsladda, ersätt och ta bort

Questions that reveal which scripts are slowing down the website

Which third-party scripts load before visitors can see and use the page’s most important content?

Map consent tools, advertising tags, chat, personalisation, analytics and other external features that start during the initial load. Check not only when the network request begins, but also how much work the file creates on the main thread through parsing, compilation and initialisation. If these activities occur before the page’s main content or make the mobile menu unresponsive, the implementation has prioritised provider code over the visitor’s task. One measurable action is to move the scripts until after critical rendering and then compare LCP, INP and conversion rates within the same traffic segment.

Which integrations are actually used—and which remain out of habit?

Compare every script with its internal owner, most recent documented use and the report, automation or customer dialogue it enables. A CRM form may be central to sales, while an old advertising pixel from a completed campaign merely generates network requests and inaccurate audiences. Request a measurable signal, such as the number of qualified leads enriched or bookings initiated through the widget, rather than accepting the argument that the data might be needed later. If both an active function and regular follow-up are missing, the integration is technical debt and should be tested while disabled.

How much slower does the website become when third-party scripts are active?

Run the same page and user journey with all external scripts active, then with one provider blocked at a time, and compare INP, Total Blocking Time, the number of long tasks, transferred data volume and CPU time. The test should use the same mobile profile and network throttling so the difference cannot be attributed to variations in the test environment. Then add RUM data to determine how much real traffic is exposed and whether the effect is greater on older Android devices or specific landing pages. The difference between the test cases is the estimated performance cost that should be weighed against changes in leads, purchases or bookings.

Are all scripts loaded on every page, including where they are not needed?

A chat tool, video player, map or booking widget rarely needs to be initialised on every page, but global WordPress plugins and simplified triggers in Google Tag Manager make this common. Review coverage by page type and connect loading to an actual need: booking code on the contact page, payment code at checkout and conversion tags only after the correct event. Conditional loading often has a greater effect than a general time delay because the code is never downloaded for visitors who cannot use the feature. This reduces both data volume and main-thread work on every irrelevant page view, which is particularly valuable when traffic is purchased per click.

What happens to the website when an external provider responds slowly or not at all?

Simulate a slow connection, network errors and blocked third-party domains to see whether content, navigation, the consent dialog and forms still work. A chat provider should not be able to stop the mobile menu from working, and a CRM outage should not cause a submitted form to disappear without local confirmation or fallback handling. Measure timeouts and error rates as well, because waiting several seconds for an external resource can result in lost leads even when Core Web Vitals appear acceptable for the majority of visitors. If core functions stop working, the company has an operational and revenue risk within a system it does not control.

The next step is to create a prioritised list in which every script is assessed against business value, performance cost and operational risk. Start by pausing what is unused, load the remaining scripts only on the pages and after the actions where they are needed, and then monitor the change using real-user data. An experienced team or independent partner approaches the problem by reproducing business-critical journeys, isolating each provider’s cost and verifying both INP and conversion performance before making a permanent decision. This turns work on a slow website from a general optimisation project into a series of measurable decisions that free up main-thread time and reduce the risk of losing customers.

Topics
Share

FAQ

Frequently asked questions

01

How do I identify which third-party scripts are slowing down my website?

Use Chrome DevTools Performance, Lighthouse or WebPageTest to see which external domains and JavaScript tasks are putting pressure on the main thread. Then test the page with one script disabled at a time and compare INP, long tasks, click responsiveness and conversions.

02

How do chat, CRM and advertising scripts affect Core Web Vitals?

These scripts may load large JavaScript bundles, perform synchronous calculations and initiate numerous network requests that block the main thread. This primarily harms INP, but it can also affect LCP through resource contention and CLS when widgets or ads shift content.

03

What is a good INP score for a website with many integrations?

Google classifies an INP of no more than 200 milliseconds as good, 201–500 milliseconds as needing improvement and more than 500 milliseconds as poor, measured at the 75th percentile. Focus primarily on real-user data from PageSpeed Insights, CrUX or your own RUM monitoring.

04

Should third-party scripts be removed or simply loaded later?

Remove scripts that have no active owner, are rarely used or provide no measurable business value. Defer necessary scripts until after consent, interaction or browser idle time, and replace the tool if the same function can be delivered with less JavaScript and fewer requests.

05

Can a slow website result in fewer leads and bookings?

Yes. Delayed clicks, forms and booking steps increase the risk of visitors abandoning the process, even if the page appears to have finished loading. You should therefore connect INP and script load to actual outcomes such as completed forms, bookings, revenue and abandonment rates.

Keep reading