Three years of WebP, two of AVIF, dozens of tested plugins. The image-optimisation workflow that stuck across our entire client portfolio is short, boring, and effective. Here is what it is, and what stopped working that we used to recommend.
The workflow
- Resize at upload to a maximum of 2400px on the longest edge before any further processing. Most uploads are 5000+ from phones and the extra resolution does nothing.
- Compress to WebP automatically with a server-side conversion. Quality 80 is the sweet spot. Below 70 is visibly worse on photos. Above 85 is wasted bytes.
- Generate AVIF for the hero image only. AVIF compresses better than WebP but encoding is expensive. Doing it for every image bloats your media library; doing it for the LCP image specifically pays off.
- Serve responsive variants via WordPress’s built-in
srcset. Do not override it with a CDN URL trick that loses the responsive behaviour. - Lazy-load below-the-fold images with
loading="lazy". Skip the above-the-fold image — lazy-loading the LCP hero hurts your Core Web Vitals.
What stopped working
- JPEGtran-style optimisers as a standalone strategy. They squeeze 10-15 percent out of a JPEG; switching to WebP saves 30-40 percent. The compression is no longer where the win is.
- CDN-based automatic conversion with no local fallback. Worked great until the CDN had an incident and every image on every site went 404 for 90 minutes. We now keep the original on origin.
- Aggressive lazy-loading with native attribute alone. Browser support is great, but native
loading="lazy"can fire late and cause LCP regressions on slow connections. We now use it everywhere except the hero.
The stack
We use ShortPixel as the conversion service (any of the modern image-conversion plugins work equivalently — ShortPixel, Imagify, EWWW). Configuration: WebP for all, AVIF for the hero only, originals preserved. CDN at the edge with WebP/AVIF content negotiation. WordPress core handles the srcset.
The measurement
Median image weight on the homepage of a typical client site, before and after:
- JPEG, no compression: 1,840 KB
- JPEG, optimised: 1,520 KB
- WebP @ 80: 740 KB
- AVIF @ 80 (hero only): 510 KB
The format change is roughly 2x the savings of compression alone. Combine both and Core Web Vitals usually go from “Needs Improvement” to “Good” on the image score, no other changes.
Boring, working, stable. That is what we wanted three years ago and that is what we have now.
