1. Remove unused scripts
Chat widgets, heatmaps, session recorders, A/B tools and social embeds are the usual culprits. Load them on interaction, or remove them.
Guide
Most slow websites are slow for five predictable reasons. Work through this list in order, measure after each change, and you will remove most of the delay without a redesign.
Speed is not one number. It is how quickly the main content appears (LCP), how quickly the page responds when tapped (INP), and how much the layout moves while loading (CLS). A site can load in one second and still feel broken because the button moves under your thumb.
Measure on a throttled mobile profile, not office wifi. Record the date, the URL and the profile. If you change three things at once and the number improves, you will not know which one mattered.
Baseline
| Metric | Good | Needs work | Where to find it |
|---|---|---|---|
| LCP | ≤ 2.5s | > 4s | PageSpeed Insights, Lighthouse |
| INP | ≤ 200ms | > 500ms | CrUX field data, Search Console |
| CLS | ≤ 0.1 | > 0.25 | PageSpeed Insights, Lighthouse |
| Page weight | < 1MB | > 2.5MB | DevTools Network tab |
| Third-party origins | 0–2 | 5+ | DevTools Network, request domains |
Checklist
Chat widgets, heatmaps, session recorders, A/B tools and social embeds are the usual culprits. Load them on interaction, or remove them.
Self-host, subset to the characters you use, and load two weights at most. A Google Fonts request costs a DNS lookup, a connection and a render delay.
Serve WebP or AVIF, set width and height, and do not send a 4,000px photograph to a 390px phone. Images are usually the largest bytes on the page.
But never lazy-load the hero image. That is the LCP element; delaying it makes the score worse.
One preload for the LCP image or font, with the correct type and crossorigin attribute. More than one preload competes with itself.
Use defer or module scripts. Inline only what must run before paint, and keep it tiny.
One stylesheet, critical rules first, and no enormous framework you use 5% of. A 300KB CSS file delays first paint.
Reserve space for images, ads, embeds and cookie banners. Use font-display and a metric-compatible fallback to reduce text reflow.
Cache at the edge or in front of the app, avoid cold starts, and do not run a database query on every page view.
Every redirect is another round trip. Point old URLs directly at the final destination, not at another redirect.
Every plugin is a script, a stylesheet and often a database query. If you cannot say what it does, remove it and see what breaks.
Page weight, LCP and JS bytes in the build. Without a budget, the next marketing request adds the weight back within six months.
Diagnosis
If the page is blank for two seconds, the problem is usually server response or render-blocking CSS. If it appears but cannot be tapped, the main thread is busy with JavaScript. If the text jumps as it loads, the font or an unsized image is shifting the layout. If only the homepage is slow, a plugin or a hero video is the likely cause.
Test one template at a time. The homepage, a service page and a contact page often have different problems, and a single score hides that.
Questions
Under 1MB for a first view is a reasonable target for a marketing site. The median mobile page is around 2.6MB, and much of that is images and third-party JavaScript.
It fixes distance and caching. It does not fix a 3MB page, a render-blocking stylesheet or a chat widget that loads before the content.
It is a useful lab approximation, not field truth. Use CrUX or Search Console field data where available, and always compare like with like.
Monthly for a small site, and on every release if the site changes often. A one-off optimisation decays as soon as someone adds a tag.
Tell us what you are trying to achieve. We will tell you honestly whether we can help, what it would take, and roughly what it would cost — before anyone signs anything.