Step 1: Resize to the display width
No spot on a normal website displays more than 1920 px; content areas are usually 700–1200 px. Shipping a 4000 px photo into a 1200 px slot sends 10× the pixels anyone can see. Resize before uploading — it's the single biggest saving, typically 70–90%.
Step 2: Convert photos to WebP
Same visible quality, 25–35% fewer bytes than JPG, supported by every current browser. PNG only for logos and transparency — a photo as PNG is the most expensive mistake in web images.
Step 3: Compress to a KB budget
Think in file-size targets, not quality percentages: content images under 100–150 KB, heroes under 200 KB, thumbnails under 30 KB. Quality 75–85 is visually indistinguishable from 100 at a fraction of the bytes.
Step 4: Keep the order — resize, compress, upload
Let your CMS do neither. WordPress, Shopify and the builders re-process what you give them with speed-optimized (quality-costing) settings, and some themes still serve the original. Deliver the finished file and the CMS has nothing left to break.
Step 5: Lazy-load everything below the fold
Images the visitor hasn't scrolled to shouldn't load yet. Modern CMSs add
loading="lazy" automatically. One exception: the hero/LCP image must load
eagerly — lazy-loading it makes your speed score worse, not better.
The result
A typical small-business page carries 5–15 MB of images and can get under 1 MB with the five steps above — a page that loaded in 6+ seconds on mobile starts rendering in under 2. No plugin subscription, no CDN contract: just correctly prepared files.