Product images far larger than they need to be
A four-megabyte photograph is the slowest thing on a product page, and on a phone over cellular it is why the visitor leaves before seeing the price.
The symptom
The store feels fine on your laptop on office wi-fi. On a phone, on mobile data, the product page shows text and then a grey rectangle for two seconds before the photograph appears.
The cause is usually a camera file uploaded exactly as it came off the card, or a supplier’s press-quality image dropped straight into the library — 4000 pixels wide and several megabytes, to be displayed in a 600-pixel box.
What it costs
On a product page the main photograph is almost always the largest element on screen, which makes it the thing Core Web Vitals measures as Largest Contentful Paint. Whatever that image weighs is what the visitor waits for before the page looks finished.
- Mobile visitors leave first. They are the majority of e-commerce traffic and the ones on the slowest connections, and they leave the earliest.
- It compounds on category pages. One heavy image is a slow product page; twenty-four of them in a category grid is a page that never settles.
- It costs bandwidth, on your hosting and on the visitor’s data plan.
Merchlint uses 500 KB as the default threshold — high enough that a properly exported product photograph passes comfortably, low enough that an untouched camera file does not.
How to check it yourself
Straight from the filesystem, which is the honest measurement:
find wp-content/uploads -type f \
\( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.webp' \) \
-size +500k -printf '%s\t%p\n' | sort -rn | head -40
That lists the forty heaviest files with their sizes. On Windows without a shell, the same job is one line in WP-CLI:
wp eval 'foreach ( get_posts(["post_type"=>"attachment","post_mime_type"=>"image","posts_per_page"=>-1,"fields"=>"ids"]) as $id ) { $f = get_attached_file($id); if ( $f && file_exists($f) && filesize($f) > 512000 ) printf("%d\t%s\t%s\n", $id, size_format(filesize($f)), basename($f)); }'
How to fix it
- Resize before upload. Decide the largest size your theme ever displays — usually somewhere between 1200 and 2000 pixels on the long edge — and export to that. WordPress will not shrink an original you gave it, beyond its own big-image threshold.
- Compress. JPEG at quality 80 is visually indistinguishable from quality 100 on a product photo and is a fraction of the weight.
- Serve modern formats. WebP or AVIF typically halves the transfer again. Any of the common image plugins will do this without you touching the originals.
- Do not delete the originals to save space if you sell prints or need zoom — the fix is to stop serving them, not to lose them.
When it is a false positive
There is one important one, and it deserves saying plainly.
Merchlint measures the file that was uploaded, not the file the visitor downloads. WordPress generates smaller variants and serves one of those; an optimisation plugin may serve a WebP that never touches the original at all. So a 3 MB original can sit behind a page that transfers 90 KB, and this check will still report it.
That is a deliberate trade-off, not an oversight: the stored file is a fact the scanner can read without making a single outbound request, and this plugin does not make outbound requests. Treat the finding as “this original is heavier than it needs to be” — which is worth knowing anyway, for backups and migrations — rather than as “your page is slow”.
Other cases: images sold as the product (print files, digital downloads) and zoom imagery that genuinely needs the resolution.
How Merchlint finds it
Merchlint reads the size of each product image file on disk and compares it against the threshold, which is a setting. The finding shows the measured size, the threshold and the filename, and reports the attachment rather than the product — one photograph often belongs to several products and is fixed once.
Confidence: F — fact from the database and the filesystem. A byte count compared with a number.
The limitation in section five is stated on the finding itself, not just here. A scanner that reports a number without saying what the number does not cover is how audit tools lose the argument in the first thirty seconds.
Disagrees with what you see in your store? Write to us — we read every message. contact@merchlint.com