AboutAll ServicesFree EmailOur WorkGuidesFAQContact
Services
SEO ServicesEcommerce RankingSpeed OptimizationWebsite AuditGoogle Ads ManagementMeta Ads ManagementSocial Media ManagementAnalytics & TrackingShopify Catalogue SEO
Build & Solutions
WordPress DevelopmentEcommerce DevelopmentCustom EcommerceFlying CartFlying AdsFlying Blog
Dedicated Sites
ServicesCareFirstlightTruefeedWoo2ShopifyShopify

Speed Optimization

Slow sites are rarely slow for the reason you were told

Plugin recommendations are the last step, not the first. The worst site we have measured was instant when cached and forty seconds when not, because its object cache backend was slower than no cache at all. You cannot buy your way out of that with a better host.

From ₹6,000 · Cloudflare setup from ₹4,000

The problem, as we usually find it

What is actually going wrong on most of the sites we are called into — before anything about what we would charge.

The advice you have already been given is probably to install a caching plugin, compress the images and buy better hosting. Sometimes that is right. Often it hides the problem for a fortnight and then you are back where you started, with one more plugin.

The number nobody measures is how long an uncached page takes. Cached pages are fast on almost any site, because they are being served from storage. The visitor who happens to be first to a page — after a cache clear, a plugin update, a price change — pays the real cost, and that visitor is invisible in most speed tests.

The worst site we have measured was instant when cached and forty seconds when not. Its object cache backend was 281 times slower than serving straight from memory, and the plugin's own connection test reported it healthy.

What the work covers

Everything below is included. If something is not on this list, we quote it separately rather than leaving you to find out later.

Measure before touching

Field data from real visitors, not one lab score taken during our own crawl.

Server and database

PHP version, memory, OPcache, buffer pool and slow queries — where most of the real time goes.

Cache layers, in order

Object cache, page cache, CDN. Three layers hide each other's faults, so they get untangled one at a time.

Cloudflare done properly

Cache rules in the right order, WAF that does not block your own cart, and bot rules that keep crawlers in.

Front-end last

Images, fonts and render-blocking assets, once the server is no longer the bottleneck.

Database health

Slow queries, table sizes, autoloaded options and the tables nobody has cleared in years.

Plugin and theme audit

What is loading on every page that only needs to load on one, and what is duplicating something else.

Before and after measurement

The same test, the same conditions, so the improvement is a number rather than a feeling.

What we have actually found

Real numbers from real accounts. We never publish client names, so the businesses are described rather than identified — the figures are exactly as we found them.

281x

slower than memory — one object cache backend that the plugin's own test reported as healthy

Every 40 min

a database was being killed by a buffer pool set to five times the available RAM. The server looked idle.

4.5x

faster after turning a CDN off — a free plan was serving an India-hosted site out of Singapore

492 MB

of session rows on one store, because scheduled tasks had been silently dead for 23 days

25 bytes

larger — what a store's CSS minification was actually achieving, measured gzipped

The detail that decides it

The part most quotes leave out, because it takes experience rather than a price list.

We measure the uncached number first

Add a random query string to a URL and most caches treat it as a page they have never seen. That gives you the real server response time. Under a second is healthy. Three seconds is a problem. Above ten and something is broken rather than merely slow.

We also measure field data from real visitors rather than a single lab score, because a lab score taken from one location on one connection tells you very little about customers in three cities on four networks.

One thing we are careful about: never measuring during our own crawl. That gives you the number for a server under load, which is a different question and has misled more than one agency into blaming the wrong thing.

Where the seconds usually actually are

The database, more often than anything else. One site was being killed roughly every forty minutes because its buffer pool was set to five times the RAM the server actually had. Between crashes the server looked completely idle, which is exactly why nobody had suspected it.

A full opcode cache. When PHP's compiled-code cache fills up, the site keeps working and simply recompiles constantly. The tell is autoloader frames dominating the slow query log — those are not slow queries, they are a symptom of something else.

Scheduled tasks that stopped. One site had them dead for 23 days with no alert of any kind. The only visible evidence was a 492 MB sessions table nobody was clearing.

Cache layers hide each other, so they get untangled one at a time

Object cache, page cache and CDN each mask the other two's faults. Turning them all on at once and measuring tells you nothing about which is helping.

So each gets isolated and verified independently. It takes longer and it is the only way to know what actually did the work — and to know which layer to look at when something breaks in six months.

This is also where we find configurations that are actively harmful rather than merely useless. A minification setting that saved zero bytes gzipped and broke a layout. A bad-bot plugin whose honeypot link was itself an uncacheable full-bootstrap request.

The plugin installed to make it fast was the reason it was slow

A store came to us with the strangest symptom shape there is: cached pages in 0.27 seconds, uncached pages in 24 to 46. The homepage looked perfect to anyone spot-checking it. Cart, checkout, my-account, search and every first-time visitor were unusable.

The cause was a persistent object cache plugin — installed, by someone, to make the site faster. We benchmarked it in-process against plain memory: 703 milliseconds against 2.5. Two hundred and eighty-one times slower. Its backing file had grown to 121 MB with a 130 MB write-ahead log that had never once been checkpointed, on shared disk doing 5.5 ms per write.

A persistent object cache is only a win when the store behind it is faster than simply regenerating the value. On oversubscribed shared disk it inverts, and every one of the tens of thousands of cache writes a store page performs becomes a disk sync. The plugin's own connection test reported the backend healthy throughout.

Speed and capacity are two different numbers, and only one of them is your problem

Measured on the same three pages minutes apart on one site: served one at a time on a quiet box, 1.5 to 3 seconds. Four requests back to back, 112 seconds, 88 seconds, 60 seconds.

Per-request speed was never that site's problem. A small box with a full opcode cache has no headroom, so concurrency is what collapses it — and concurrency is what a real Tuesday afternoon looks like. We will admit to getting this wrong ourselves: we once reported an 88-second shop page that turned out to be our own parallel testing. Space the requests out or you measure yourself.

It has a corollary worth knowing before anyone clicks the tempting button: a full cache purge on an undersized server is a self-inflicted outage. Every visitor and every crawler arrives at once as an uncached render. Warm the important pages first, or purge in stages.

The tell for this class of problem is in the slow log, and it is not a slow query. If the traces are full of autoloader and file-include frames, the answer is the opcode cache, not the database. On one site 52 plugins compiled to 135 MB of PHP against a 128 MB cache — nothing fit, so every request recompiled from disk, burning both cores.

Most of what is sold as optimisation is not, and some of it is a liability

We measure before we keep anything. On one store the minification everyone assumes is free was re-minifying stylesheets that already shipped minified. Gzipped, the three largest files went from 36,373 bytes to 36,398 — 25 bytes *larger*, for a feature that was also silently breaking the site whenever its cache directory was cleared while a cached page survived.

The same goes for a database problem that is really a scheduling one. One store's session table had reached 492 MB — bigger than its post content — because a constant in the config promised something else would run scheduled tasks, and nothing ever did. It had been dead for 23 days and WordPress gives no warning at all.

On another store the same table held 329 MB, and it was not customers. 99.1% of those sessions carried an add-to-cart notice against six real orders in 48 hours — a crawler walking the add-to-cart links on the shop grid, minting a session per hit. The site already disallowed those URLs in robots.txt and marked every link nofollow. The bots ignored both, so it had to be enforced at the server.

Cloudflare, done properly or not at all

Cloudflare's free plan does not include Indian data centres. We measured an India-hosted site being served out of Singapore, and turning the proxy off made it four and a half times faster. A CDN pointed at the wrong continent is a downgrade.

Cache rules are order-dependent, and the last matching rule wins. We have found a bypass rule sitting above a cache-everything rule, quietly caching logged-in carts and serving one customer another customer's basket.

And WAF rules need to know about your own site's internals. A bot rule that also matches your cart's AJAX endpoint will break every add-to-cart on the site, and it will do it silently.

What we need from you

Short, and worth reading before you start. What delays this work is almost never the work — it is waiting on access or a decision.

Hosting or server access

cPanel, hPanel or SSH. Most of the real problems live below the site, and we will not guess at them from the browser.

WordPress or store admin

Administrator level. Cache, plugin and configuration changes all need it.

Cloudflare or CDN access

If one is in front of the site. A CDN we cannot see is the most common reason a speed fix appears to do nothing.

A window for changes

Cache and server changes can cause brief wobbles. Tell us when the site is quiet and we will work then.

Whether this is right for you

We would rather lose the enquiry than take work we would do badly, so the right-hand column is as honest as the left.

This is for you if

  • Your site is fast for you and slow for customers, and you cannot reconcile the two
  • You have already bought bigger hosting and it changed nothing
  • Core Web Vitals are failing in Search Console
  • You want to know what is actually slow before spending anything on fixing it

This is not for you if

  • You want a plugin installed and a screenshot of a green score
  • We cannot get access to the server or hosting panel; we will not guess from the browser
  • The site is being rebuilt next month — wait, and we will build it fast instead
  • You need a guaranteed score; we will tell you what is achievable, not promise a number

How it runs

Four steps, in this order, every time.

  1. We take field measurements and a full stack inventory before proposing anything.
  2. Server and database first, because that is where the seconds usually are.
  3. Cache layers next, isolated and verified one at a time so a fix cannot hide behind another.
  4. Front-end and assets last, then we re-measure against the same baseline.
Hosting

Looking for hosting? This is what we would put you on

We do not sell hosting and we do not resell it, so there is no plan of ours to push you onto. When a client asks where to host, this is the honest answer for most small Indian sites.

Indian data centre

Mumbai is on the list. A site served from India to Indian visitors starts a long way ahead of one served from Singapore.

LiteSpeed, not plain Apache

It ships with LiteSpeed and LSCache, which is most of the WordPress speed problem solved before anyone installs a plugin.

Free SSL and daily backups

Included on the plans we would actually put a client on, rather than sold back to you at renewal.

Priced for a small business

The long term is where it is cheap. Renewal rates are higher than the first-term price, so buy the longest term you are comfortable with.

See Hostinger plans

That is a referral link. Hostinger pays us a small commission if you sign up through it, at no extra cost to you. We recommend it because we run client sites on it, not because of the commission.

The Stack We
Work In Every Day

Every platform below is one we build on, maintain, rank and report from — not a logo wall.

WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
Merchant Center
Meta Ads
Instagram
Tag Manager
Razorpay
Next.js
MySQL
PHP
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console
WordPress
WooCommerce
Shopify
Elementor
Cloudflare
Google Ads
Analytics
Search Console

Questions

We can, and on a site with real problems it will hide them for a fortnight. We would rather find out why the page was slow uncached.

Every change is reversible and we tell you which layer we touched. We have seen a minification setting save nothing and break a layout — that is exactly what we test for.

Yes, if we get access. If we cannot see the server we will say so rather than guess from the browser.

Want free stats on your site first?

Send us the URL. We pull the numbers from your own accounts and tell you what is wrong before there is any quote, and before there is any contract.

No pitch deck, no obligation. Bring your URL and we will look at it together.