[ Tutorials ]
Why Is My Website So Slow? The Real Causes and How to Fix Them
A practical walkthrough of what actually slows a site down, ranked from most common to least, and how to fix each one without guessing.

On this page
Here is the trap almost everyone falls into: you open your site on your laptop, it loads instantly, and you conclude it's fine. Meanwhile a chunk of your visitors are on a three-year-old phone with two bars of signal, watching a blank screen for four seconds before they give up and leave.
A site that feels fast for you can be painfully slow for half the people who actually visit it. The difference is what you measure, and whose experience you measure it on. This post walks through the real causes of a slow website, ranked from most common to least, with a concrete fix for each, and then shows you how to stop guessing and watch the speed your real visitors get.
TL;DR: the usual suspects, ranked
Most slow websites are slow for the same handful of reasons, and you can usually find yours in the list below. The biggest wins are almost always images that are too large and third-party scripts you forgot you added. Start there, then work down. A one-time speed test on your own machine will mislead you, so the last and most important step is measuring the speed your actual visitors experience on their own phones and networks.
- Heavy images and media. Uncompressed photos and oversized files are the number one cause of slow loads. Compress, resize, and use modern formats.
- Too many third-party scripts. Chat widgets, ad pixels, A/B tools, and heavy analytics each add a tax. They add up fast.
- Render-blocking CSS and JavaScript. The browser stalls on resources it has to load before it can paint anything. Defer what isn't needed up front.
- Slow hosting and no caching or CDN. Cheap shared hosting and missing caching mean every visitor waits on a slow origin server.
- Failing Core Web Vitals. Even a 'fast' site can feel janky if content jumps around or buttons don't respond. These are the metrics Google and your users notice.
- Measuring the wrong thing. A lab score on one fast machine is not the speed your real visitors get. Monitor real users to find the slow path that's actually costing you.
Heavy images and media
If your site is slow, images are the first place to look. A single hero photo exported straight out of a phone or a design tool can be three or four megabytes. Stack a few of those on one page and you've built a site that crawls on mobile, no matter how clean your code is.
The fix has three parts. First, resize images to the size they're actually displayed at. A photo shown 600 pixels wide does not need to be 4000 pixels wide. Second, compress them. Tools and build pipelines can shrink most images by half or more with no visible quality loss. Third, use modern formats like WebP or AVIF, which are dramatically smaller than old JPEGs and PNGs for the same quality.
Two more cheap wins: lazy-load images that sit below the fold so the browser only fetches them when the visitor scrolls near them, and always set explicit width and height on images so the page doesn't jump around as they load. That last one matters more than it sounds, and we'll come back to it when we talk about Core Web Vitals.
Video is the same story, only worse. If you must use it, host it on a platform built for streaming and load the player only when someone interacts with it.

Too many third-party scripts (the hidden tax)
This is the cause that hides in plain sight. Over a year, a site quietly accumulates a chat widget, a heatmap tool, an A/B testing snippet, two ad pixels, a cookie banner, a font loader, and an analytics tag or three. Each one felt harmless when you added it. Together they're often the heaviest thing on the page, and the slowest, because they reach out to servers you don't control.
Third-party scripts are a tax for two reasons. They add bytes to download and parse, and they add network round trips to other domains that may themselves be slow. A single sluggish marketing tag can block the rest of your page from becoming interactive, and you usually can't make those external servers faster, so your only lever is removing or deferring the script.
Audit what you've got. Open your browser's network panel, load the page, and sort by domain. You'll almost certainly find requests to services you forgot about or stopped using months ago. Delete anything you don't actively need. For the rest, load them asynchronously or after the page is interactive, and consider a lighter alternative. The heaviest offenders are rarely the ones you'd guess.
A good habit: treat every new script as a cost, not a free add-on. Before pasting a snippet into your site, ask whether it earns its weight. If you're standing up a new project, a quick pass through a website launch checklist helps you avoid bolting on five tools you'll later have to rip out.
Render-blocking CSS and JavaScript
Even with lean images and few scripts, a page can feel slow because of the order the browser does things in. When the browser hits a stylesheet or a script in the head of your page, it often has to stop, download that file, and process it before it can paint anything on screen. That stall is what visitors experience as a blank white page.
The goal is to let the browser show something useful as early as possible. Inline the small bit of CSS needed to render what's visible first (the 'above the fold' content), and load the rest afterward. For JavaScript, use the defer or async attributes so scripts don't block the initial paint, and split large bundles so the browser only downloads the code a given page actually needs.
Modern frameworks and site builders handle a lot of this for you, but not all of it. Fonts are a common culprit: a custom web font that blocks text from showing leaves visitors staring at nothing, or causes a flash when the text swaps in. Tell the browser to show fallback text immediately while the font loads. Small change, real difference.
Hosting, caching, and a CDN
Sometimes the page itself is fine and the server behind it is the problem. On budget shared hosting, your site sits on a machine with hundreds of others, and when one of them gets busy, everyone slows down. The first byte of your page can take a second or more to arrive before anything else even starts. If your time-to-first-byte is consistently slow, no amount of image compression will save you.
Caching is the highest-leverage fix here. A cache stores a ready-made copy of your pages so the server doesn't rebuild them from scratch on every request. For a content site or blog, full-page caching can turn a sluggish origin into something that responds almost instantly. Most platforms and content management systems have caching built in or a plugin away.
A content delivery network (CDN) is the other big lever. A CDN keeps copies of your static files (images, CSS, JavaScript) on servers around the world, so a visitor in Sydney loads from a nearby city instead of waiting for bytes to cross an ocean from your origin in Frankfurt. For a global audience this alone can cut load time noticeably, and if your hosting doesn't include one, plenty of CDNs are free to start.
And before any of this matters, the server has to be up at all. A site that's down is infinitely slow, and outages have a way of happening at the worst times without anyone noticing for hours. If you've never thought about what your hosting actually guarantees, our notes on website uptime explain why a string of small outages quietly adds up to far more lost time than most owners assume. Knowing the moment your origin goes dark, or starts responding slowly, is the floor under everything else here.
Core Web Vitals in plain English
Google measures site speed through a set of metrics called Core Web Vitals, and they show up in search and in the Chrome experience report. They're worth understanding because they map closely to what a real visitor actually feels, not just to raw download time. There are three, and the thresholds are public on web.dev.
Largest Contentful Paint (LCP) measures how long until the biggest visible thing (usually your hero image or headline) finishes loading. Aim for under 2.5 seconds. Interaction to Next Paint (INP) measures how quickly the page responds when someone taps or clicks, with a target under 200 milliseconds. Cumulative Layout Shift (CLS) measures how much the page jumps around as it loads, and you want it under 0.1. You can read the full definitions on the official Core Web Vitals page.
In plain terms: LCP is 'how fast did the page show up,' INP is 'how fast does it react when I touch it,' and CLS is 'did the layout stay put or did the button move just as I went to tap it.' That CLS one ties directly back to images without dimensions and late-loading ads, which is why setting width and height on images matters so much. If a term in here is new to you, the glossary defines the common ones in one place.
Two of the three are about responsiveness and stability, not just download speed. That's the part a single Lighthouse run on your laptop tends to hide, which brings us to the most important section.

Lab data lies: monitor your real users
Here's the catch that undermines most speed work. When you run a tool like Lighthouse and get a glowing score, that's a lab test: one page, one fast machine, one stable connection, run once. Your real visitors are nothing like that. They're on mid-range phones, on hotel wifi, on a train, with a dozen background tabs open. The speed they get can be wildly different from what your laptop reports, and a script that loads fine for you might be the thing dragging everyone else down.
Which is why a single score, however green, isn't enough. The only way to know the speed people actually experience is to measure it from their side, on their devices and networks, continuously. When you can watch the speed real visitors get, you stop optimizing for a number nobody else sees and start fixing the slow path that's costing you visitors: the page that's quick on your machine but stalls on a phone, the script that's fine on fiber but blocks everything on mobile data.
The simplest place to start is the most basic question of all: is the site even responding right now, and how quickly? You can't fix a slowdown you never hear about, and outages and slow responses have a habit of going unnoticed for hours. A bit of uptime monitoring that checks your origin on a schedule will tell you when first-byte times creep up or the server goes quiet, which is the floor under every other fix in this post.
Once you're watching real users, the work changes. Instead of chasing a perfect lab score, you watch for the pages and devices where speed falls off, fix those, and confirm the fix held for real people. For a broader framework on what to track and why, our guide to web analytics best practices covers how to tie speed and behavior data to outcomes that matter.
Frequently Asked Questions
Why is my website slow on mobile but not desktop?
Phones have slower processors and far less reliable networks than your desktop, so heavy images, large JavaScript bundles, and third-party scripts hurt much more on mobile. Your desktop on fast wifi hides all of it. The fix is to test on a real mid-range phone (or throttle your browser to '4G, mid-tier device') and, better, to watch the speed your actual mobile visitors get rather than trusting your own machine.
What is a good page load time?
A common rule of thumb is that the main content should appear within about two to three seconds, and ideally faster. Google's Core Web Vitals give a more precise target: Largest Contentful Paint under 2.5 seconds is considered good. More important than any single number is consistency across real devices and networks, not just a fast result on your own laptop.
Do analytics scripts slow down my site?
A heavy analytics script can, and a lightweight one does not. The cost depends entirely on how much the script downloads and how much work it does on the page. Some popular tools ship large bundles and make many network requests; lean, well-built analytics adds a negligible amount of weight. Check yours in the browser network panel, and if it's heavy, look for a lighter alternative.
What are Core Web Vitals?
Core Web Vitals are three metrics Google uses to measure real-world page experience: Largest Contentful Paint (loading, good under 2.5s), Interaction to Next Paint (responsiveness, good under 200ms), and Cumulative Layout Shift (visual stability, good under 0.1). Full definitions are on the official Core Web Vitals page.


