Start with the one that dominates everything else
Before plugins, before image formats, before deferring JavaScript: where is the server? Round-trip time from an Indian city to a US-East host is 220–260 ms. To Singapore it is 55–70 ms. To a Mumbai server it is 6–12 ms.
That number is paid on every request, and a typical WordPress page makes several in sequence — the HTML, then the CSS it references, then the fonts that CSS references. Three sequential hops at 250 ms is 750 ms of pure waiting before anything is rendered. The same three hops from Mumbai cost 30 ms.
No amount of plugin tuning recovers that. If your audience is Indian and your host is not, moving the site into India is the single largest speed change available to you, and it usually takes an afternoon.
Measure before you change anything
Use three tools, in this order:
- PageSpeed Insights — look at the field data section, not the lab score. Field data is real Chrome users on real Indian connections; the lab score is a simulation on a machine in a data centre.
- WebPageTest, with the location set to Mumbai or Chennai. Testing from Virginia tells you nothing about your Jaipur customer.
- Query Monitor (a plugin) to find slow database queries and the plugins responsible for them.
Write the numbers down before you start. Most "optimization" sessions end with a site that feels the same and a lot of new plugins.
Time to first byte: the floor under everything
TTFB is how long the server takes to send the first byte. It is the floor under Largest Contentful Paint — LCP cannot be faster than TTFB, ever. Three things set it:
- Network distance. Covered above. Non-negotiable, and fixed by hosting location.
- Whether the page was cached. A cached page is a file read. An uncached page is PHP booting WordPress, loading every active plugin, and running thirty database queries.
- How fast the server is when it does have to think. NVMe over spinning disks, PHP 8.2+ over 7.4, and enough RAM that MySQL is not reading from disk.
Caching, done once and done right
Cache at the web server, not in PHP. If your host runs LiteSpeed, install LiteSpeed Cache and turn on page caching, object caching and the crawler. LSCache serves a cached page without PHP starting at all — typically under 100 ms from an Indian origin.
On Apache or Nginx, use WP Rocket or W3 Total Cache instead. Whatever you choose, run exactly one page-cache plugin. Two will fight, and the symptom is stale pages that nobody can explain.
Add object caching with Redis if your site is a store or a membership site. WooCommerce hammers the wp_options table, and Redis takes that traffic off MySQL entirely.
Images, which are most of your page weight
- Serve WebP. It is typically 25–35% smaller than JPEG at the same quality and every browser in use today supports it.
- Resize before upload. A 4000px photo displayed in a 800px column is 25× more bytes than needed. No plugin fixes this as well as not doing it.
- Lazy-load below the fold, but never the hero image — that is usually your LCP element, and lazy-loading it makes the score worse.
- Set explicit
widthandheightso the browser reserves space. This is what fixes Cumulative Layout Shift.
Plugins: the honest audit
Plugin count matters less than plugin behaviour. One badly written slider can cost more than twenty well-behaved plugins. Use Query Monitor to see which ones add queries on every page load, then ask of each: is this worth the milliseconds?
The usual offenders on Indian sites: page builders loading their entire CSS on every page, "related posts" plugins running unindexed queries, social-share counters calling out to APIs at render time, and analytics loaded in the <head> without async.
Fonts
Every Google Fonts link is a DNS lookup, a TLS handshake and a download from a server that may not be in India. Self-host the two or three weights you actually use, serve them as WOFF2, and add font-display: swap so text renders in a fallback while the webfont loads.
The database nobody looks at
WordPress keeps every post revision forever. A three-year-old blog can carry tens of thousands of rows of revisions, expired transients and spam comments. Clean them out, then keep WP_POST_REVISIONS limited to 5 in wp-config.php. On a shared plan this also frees inodes.
A realistic order of work
- Move hosting into India. Biggest win, one afternoon.
- Turn on server-level page caching. Second biggest win, one hour.
- Fix images — WebP, correct dimensions, no lazy-loaded hero.
- Upgrade PHP to the newest version your theme supports.
- Self-host fonts and defer non-critical JavaScript.
- Clean the database and cap revisions.
- Then audit plugins, with numbers rather than opinions.
Most sites are done after step three.
If you would rather not
Our managed WordPress plans start at ₹129/mo and arrive with LiteSpeed and LSCache already configured, PHP current, and the site in Mumbai or Delhi. Migration from your current host is free and we do it. Call +91 75994 50220.