Slow sites are rarely slow for the reason people think
Almost every site I am asked to speed up has already had a caching plugin installed and a few images compressed. The remaining problem is usually in the database, the plugin stack, or a server that takes most of a second to answer. Which of those it is takes a morning to find out and is worth knowing before anyone spends money.
YOU ARE PROBABLY HERE BECAUSE
- the site got slower as you added products
- it is fast for visitors and slow once customers log in
- Search Console says Core Web Vitals are failing
What I can do for you
The first one exists because guessing is expensive and measuring is cheap.
Performance audit
Profiling against real traffic, not a Lighthouse run on my laptop. Where the time actually goes — server, database, plugins, assets, third-party scripts — ranked by how much each is costing you, with an estimate for fixing each one. You keep the document whether or not I do the work.
Optimization pass
Working through the audit in order of impact. Plugin and theme reduction with replacements written where a feature is worth keeping, database work, caching layers configured properly, asset pipeline, and server tuning.
Core Web Vitals remediation
Targeted work against the metric that is actually failing, measured on field data rather than lab scores, with a follow-up once the twenty-eight day window has caught up.
Server and hosting work
Configuration tuning, caching layers set up properly at server level, and a migration to hosting that suits you if the review says the machine is the limit. Includes telling you when you are paying for capacity you never use.
Keeping it fast
Performance does not stay fixed. Reserved time for monitoring, catching regressions when plugins update or content grows, and reviewing anything new before it ships slow.
Forty-five minutes, no charge.
Bring your URL and I will have looked at it before we speak.
01
WordPress performance optimization
Sixteen years of WordPress means I can usually tell within an hour which of the installed plugins is responsible, and — more usefully — rebuild the feature it provides without the weight. Deactivating a plugin is easy. Deactivating it without losing the thing the client actually wanted is the job.
Every active plugin measured for what it adds to a page load — queries, scripts, styles, admin-ajax calls — rather than judged by reputation. Some well-regarded plugins are expensive; some obscure ones are free.
Where a plugin is doing one small thing at a large cost, I write that one thing as lightweight custom code and remove the plugin. You keep the feature, lose the overhead, and lose one more thing that needs updating.
Commercial themes load a great deal that a given site never uses. I identify what is costing you, disable it safely, and rebuild anything genuinely needed as custom code that does not carry the rest of the theme with it.
Loading only what a page needs, minifying and combining sensibly, deferring what is not required for first paint, and hosting fonts locally rather than fetching them from somebody else's network.
Correct cropping at generation rather than in the browser, lossless compression, modern formats, lazy loading below the fold, and separate treatment for mobile so phones are not downloading desktop images.
Moved off the origin server, loaded on interaction rather than on page load, with a poster image so the page renders without waiting for it.
Slow query identification, missing indexes, orphaned rows left by plugins removed years ago, autoloaded options that have grown to megabytes, and revision and transient tables nobody has ever cleared.
Queries written when the site had two hundred rows and now run against two hundred thousand. Unbounded loops, missing limits, and archive pages loading everything to display twelve items.
02
Elementor performance optimization
Elementor sites can be made considerably faster than they usually are, and most of the gain comes from a handful of specific changes rather than another optimization plugin. The largest single win is usually stopping it loading where it is not needed at all.
Account, cart, checkout and other functional pages rarely contain Elementor content, but frequently load its full asset stack anyway. Preventing that is often the biggest improvement available, and it matters most for logged-in users, who cannot be served from a page cache.
Elementor can output widget styles either inline in the page or as separate cached files. Inline means fewer requests but heavier HTML on every view and nothing reused between pages; external means the browser caches the stylesheet once and reuses it everywhere. Which wins depends on your traffic pattern, and the default is not always right.
Elementor loads support for widgets and experiments a site never uses. Disabling the ones you do not need reduces both the JavaScript parsed and the CSS shipped.
Layouts built by nesting sections inside columns inside containers produce a very deep DOM, which slows rendering and interaction alike. Flattening it usually improves responsiveness more than any script change.
Third-party addon packs load their entire library for one widget. I replace those with lightweight custom Elementor widgets, or with plain markup where a widget was never needed, and remove the pack.
Fonts served from your own domain rather than fetched from Google, removing a third-party connection and a render-blocking dependency, with the added benefit of not shipping visitor data somewhere else.
Object cache, page cache, CDN and browser cache configured to work together rather than against each other — and correct exclusions for cart, account and checkout, which is where a badly configured cache does real damage.
PHP version and settings, OPcache, database server tuning, and whether the hosting itself is capable of the response times the rest of the work assumes.
Builder-generated meta grows quickly. Cleaning orphaned data, clearing regenerable caches and indexing what needs indexing.
Occasionally a site is asking a builder to do something it was never built for, and the honest recommendation is to rebuild that part differently. I will tell you if I think so, with the reasoning and the cost — after the audit, not before.
03
Performance work on any codebase
Not everything slow is WordPress. The same discipline applies to any application: measure first, fix what the measurement says, prove the difference. Most performance work fails because somebody optimised the part that was easy to optimise rather than the part that was slow.
Real profiling against real traffic, so there is a before and an after and the improvement is demonstrable rather than asserted. Without it, both of us are guessing.
Eliminating queries running inside loops, reading the slow query log properly, adding the indexes nobody added, and rewriting queries whose cost grows with the dataset rather than staying flat.
Structures designed when the data was small and now the bottleneck. Normalising what has been flattened, denormalising where joins have become expensive, and moving high-volume data into tables shaped for how it is actually read.
Anything not required to render the response moves to a queue — emails, third-party API calls, image processing, report generation. The user should never wait for work that could happen after they leave.
Some features are slow because of how they were built, not how they were configured. Reprogramming those properly is often cheaper than another six months of working around them.
Opcode, object, application, response and CDN caching arranged deliberately. The harder half is composing pages where most of the content caches and one personalised fragment does not.
Endpoints and views that return everything, which is fine at a thousand rows and fatal at a million. Cursor pagination where offsets have got expensive.
Minification and bundling, compression at the server, code splitting so a page loads only the JavaScript it needs, and deferring everything not required for first paint.
Tag manager, chat widget, heatmap, two analytics tools and a consent banner. Frequently more expensive than everything else combined, and the one category where the client can simply decide to remove something.
04
Server, hosting and architecture
Everything above assumes the machine underneath can answer quickly. Often it cannot, and no amount of front-end work compensates. This is also where most businesses are on the wrong plan — some paying for capacity they never touch, others losing sales to a server that cost them nine dollars a month.
Whether your current host is capable of the response times the rest of the work assumes, and whether the plan matches the traffic. Shared hosting is fine for a great many sites and hopeless for some. I will tell you which yours is, and sometimes the answer is that your hosting is not the problem.
Overprovisioning is common and quiet — paying for sixteen gigabytes of memory to run a site using two. Underprovisioning is common and expensive — a checkout that times out under campaign traffic. I look at actual utilisation and tell you what you should be paying, which is sometimes less than you are.
PHP version and memory limits, PHP-FPM pool sizing against your real concurrency, OPcache allocation, database buffer and connection settings, and web server configuration for compression, HTTP/2 and TLS. Defaults are chosen for safety on unknown workloads, not for yours.
Full-page caching at the web server rather than inside WordPress, so a cached page never starts PHP at all. Object caching with Redis or Memcached so repeated database work is not repeated. Correct browser cache headers so returning visitors fetch almost nothing.
What is cached at the edge and for how long, what must always reach the origin, image optimization at the edge, and cache invalidation that actually fires when content changes rather than leaving stale pages for a week.
Moving to hosting that suits you, with DNS time-to-live lowered in advance, files and database synced, a final delta at cutover, and the old server kept warm until the new one has proven itself. Planned so that orders placed during the switch are not lost.
A staging environment that genuinely matches production, and a deployment process that is repeatable rather than a series of file uploads. Most emergency work I am called into began with a change nobody could roll back.
Background jobs running on real system cron with proper workers, rather than firing on visitor page loads. Anything slow — imports, syncs, emails, reports — happens where nobody is waiting for it.
A Black Friday or a launch is a known event, not a surprise. Load testing against realistic traffic, deciding in advance what scales and what degrades gracefully, and knowing which part gives way first.
Uptime, response time, resource utilisation and error rates, with alerts that reach a person. Performance regressions are usually gradual, and without monitoring the first report comes from a customer.
05
Page speed, Core Web Vitals and ranking
Core Web Vitals are a confirmed Google ranking signal, and also one of hundreds — a tiebreaker between pages of similar quality rather than a way to outrank better content. Treat them as a conversion problem that happens to help with search, and the money makes sense either way.
Largest Contentful Paint
How long until the main content appears. The one most sites fail on mobile, and the one most affected by server response time.
Interaction to Next Paint
How quickly the page responds when someone taps or clicks. Replaced First Input Delay in March 2024 and is stricter, because it measures every interaction rather than the first.
Cumulative Layout Shift
How much the page moves around while loading. Usually the cheapest of the three to fix, and mostly a matter of reserving space for things that arrive late.
Working from what real visitors experienced rather than a lab score. Lab tools are for diagnosis; field data decides whether you pass.
The thresholds are the same on both, but mobile is far harder to pass — mid-range phones on real networks, which is what most of your traffic is.
Whichever metric is in the poor band gets attention first. There is no value in improving a score that already passes, and INP is usually the hardest of the three because it is about work on the main thread.
Crawlable structure, structured data, redirects that survive a rebuild, correct canonicals, and confirming your site is actually reachable by the crawlers you assume are indexing it.
Field data updates on a rolling month, so nothing changes in Search Console the day after a deployment. I will tell you that at the start rather than let you wonder in week two.
Where this has been done
Foreign Policy
High-traffic news portal with extensive content, many categories, newsletters and gated subscription content. Features and maintenance written to carry millions of visits without raising server load.
High traffic
features · analytics
via Toptal
Comtrade Group
Corporate group site plus the Gaming, System Integration, Tesla and Edit World properties — multilingual, multisite, several countries, with deployment and hosting mine as well as the code.
Multisite · multilingual
deployment · hosting
2013 — 2019
hotsport.rs
Sports portal built in 2010 with news, publishing and live results. Not maintained by me since 2013, and it has taken millions of visits in the years since.
High traffic
still online
built 2010
What this does not include
Content and keyword strategy
I do the technical layer — speed, structure, markup, crawlability. What you write and which terms you chase is somebody else's discipline.
Link building
Not something I do, and not something I would recommend most people buy.
Guaranteed rankings
Nobody can promise those honestly. Core Web Vitals are a confirmed signal and one of hundreds. I can promise a faster site and a measurable before and after.
A green score as the goal
The point is a site that feels fast to your customers and converts better. A number in a tool is how we check, not what we are aiming at.
Questions I get asked
Our Lighthouse score is 95 but Search Console says we are failing. Why?
Because they measure different things. Lighthouse simulates a page load on one machine under assumed conditions. Google's assessment uses field data from real Chrome users at the 75th percentile over a rolling 28-day window — real phones, real networks, real caches. A fast lab score alongside a failing field assessment usually means your visitors are on slower devices or connections than the simulation assumed.
How much faster can you actually make our site?
I will not give you a number before looking, and anyone who does is guessing. What I can say is where the time is going after a couple of days of profiling, and roughly what each fix is worth. Sites carrying a heavy plugin stack and an unoptimised database usually have a great deal available; sites already tuned have less, and I will say so rather than sell you a pass.
Will this improve our rankings?
It may help, and it is not the reason to do it. Core Web Vitals are confirmed as a ranking signal but they are one of many, and they work as a tiebreaker between comparable pages rather than a way to beat better content. The reliable return is conversion — people abandon slow checkouts regardless of where you rank.
Can you speed up our site without changing how it is built?
Usually a long way, yes. Caching layers, database work, asset handling, plugin reduction and server tuning go a considerable distance without touching the design or the build method. Where that runs out, I will tell you what the remaining gain would cost and let you decide whether it is worth it.
Our site is fast for visitors but slow when customers log in.
Common, and it has a specific cause: logged-in pages cannot be served from the page cache, so every one is generated fresh. Everything the theme and plugins load on a normal page now happens on every request, with the database work included. It is very fixable, and it is usually where the real money is on a membership or ecommerce site, because those are the pages people spend money on.
How long before we see the improvement?
Visitors feel it immediately. Search Console takes about four weeks, because the field data behind the assessment is a rolling 28-day window and needs time to reflect the change.
Send me the URL and I will look before we speak
Forty-five minutes is usually enough for me to tell you roughly where your time is going and whether it is worth paying to fix.