You optimized it and it’s still slow
You ran PageSpeed Insights. You installed a caching plugin. You “optimized” your images. The site still feels sluggish — pages stutter when they load, mobile takes a beat too long, and your bounce rate hasn’t moved.
So you ask the obvious question: why is my website slow after I did all the things the articles told me to do?
Most articles answer that question with a checklist. Checklists are fine. The problem is that performance isn’t a checklist. It’s a chain. Fix one link, the next link becomes the bottleneck. If you don’t see the chain, you’ll keep optimizing the part that isn’t actually slowing the site down.
The performance chain you’re not seeing
When a visitor types your URL and hits enter, here’s what has to happen in order before they see anything:
- Their browser asks DNS where your site lives
- The browser opens a TCP connection to your server
- The connection upgrades to HTTPS (TLS handshake)
- The browser sends a request
- Your server processes the request and sends back HTML
- The browser starts parsing HTML and discovers it needs CSS, JS, fonts, and images
- The browser fetches each of those — some block rendering, some don’t
- The browser finally paints something the visitor can see
Every step on that list takes time. Most “speed optimization” focuses on step 7 — the assets. But the bottleneck is almost never where you think it is. Under the hood, the slow part is usually steps 5 and 6 — the server response and the render-blocking resources that show up before the page can paint.
Where the bottleneck almost always lives
Across the WordPress sites we’ve audited in the last year, three problems account for most of the slowness owners thought they’d already fixed.
Here’s the unsexy truth: it’s almost never the theme.
It’s the images, the render-blocking JavaScript, and the server response. The mechanism is simple but boring — and that’s why most “I already optimized it” sites stay slow.
Image weight (the boring fundamental)
The single biggest cause of slow page loads in WordPress is still oversized images. “Optimized” usually means the owner ran them through TinyPNG or installed Imagify. That helps, but it doesn’t fix the underlying issue: the wrong image is being loaded.
What’s actually happening:
- You upload a 3000×2000 hero image.
- WordPress generates several smaller versions automatically.
- Your theme requests the full 3000-pixel version anyway because the template uses
fullinstead of a smaller size. - Mobile users on a phone screen get served the desktop-sized image.
Google’s guidance on responsive images covers this in detail, but the fix is short: use srcset, use the right size, and convert to WebP or AVIF for modern browsers. The rest is decoration.
The same principle applies to background images set in CSS, which often bypass WordPress’s image-sizing entirely. Improving website speed without breaking everything usually starts here, not at the cache.
Render-blocking resources (the silent killer)
Open your site in an incognito window. Run Lighthouse. Look for the line that says “Eliminate render-blocking resources.” If that section is showing 600ms or more, that’s where your speed went.
Render-blocking resources are CSS and JavaScript files the browser has to download and parse before it can paint anything. Most WordPress sites have:
- The theme’s main stylesheet (always)
- A page builder’s stylesheet (Elementor, Divi, Beaver Builder)
- Three to five plugin-injected JavaScript files (forms, sliders, popups, analytics)
- Google Fonts loaded the wrong way
The chain looks like this: every render-blocking file adds round-trip time before the visitor sees anything. Cumulatively, that’s where the “I optimized it but it still feels slow” feeling comes from. The fix is a combination of deferring non-critical JS, inlining critical CSS, and being honest about which plugins are actually earning their place — which is also why a careful look at the WordPress plugins you actually use every day matters more than people pretend.
Web.dev has a good breakdown of how to identify and fix render-blocking resources. Start with the biggest offenders and work down.
Server response time (TTFB and the mystery middle)
Time to First Byte — TTFB — is the time between the browser asking for a page and your server starting to send it back. If your TTFB is over 600ms, no amount of front-end optimization will fix the feeling of slowness. The page can’t render until the server sends the first byte. That’s load-bearing.
What pushes TTFB up:
- Cheap shared hosting on overprovisioned servers
- Database queries that aren’t indexed (often a plugin issue)
- PHP version too low (anything below 8.0 in 2026 is a problem)
- Missing or misconfigured page caching
- An “object cache” plugin that’s actually slowing things down
Cloudflare’s overview of why site speed matters covers the basics, and their TTFB documentation is worth reading if you want to dig deeper. The fix is usually three things: better hosting, page caching at the right level, and removing whatever plugin is doing uncached database calls on every page load.
If you’re running on a $5/month shared host, this is your bottleneck. The Core Web Vitals checklist can only do so much when the server itself is slow. Move to a host that’s built for WordPress at the volume you’re running. The math on that is short — better hosting pays for itself the first month it stops costing you conversions.
The three tests to run today
If you remember nothing else, run these three checks. Each takes about three minutes.
- PageSpeed Insights mobile score. Run your homepage at pagespeed.web.dev. If your Largest Contentful Paint is over 2.5 seconds, you have a bottleneck — and it’s probably one of the three above.
- WebPageTest waterfall view. At webpagetest.org, run a test from a US East server. Look at the waterfall. The longest horizontal bars in the top five rows are your problem files.
- TTFB check. Same WebPageTest result — look at the “First Byte” number. If it’s over 600ms on a desktop test, the server is the issue.
Run these in this order. Fix what you find before adding another optimization plugin.
Final Thoughts
Most owners asking “why is my website slow” have already done the easy stuff. The next layer down isn’t a checklist — it’s the chain. See the chain, find the bottleneck, fix the part that’s actually slowing you down. The page speed score follows.
If you fix the bottleneck and the site is still slow, the bottleneck moved. Run the test again. Repeat until the math is good.
Further Reading
If you want to dig into the research and references behind this article, here are reputable sources worth bookmarking:
- Google web.dev — Eliminate Render-Blocking Resources
- Google web.dev — Serve Responsive Images
- Cloudflare Learning Center — Why Site Speed Matters
- HTTP Archive — Web Almanac: Loading Speed



