This is a repost. Originally published on the Arvio blog: https://arvio.a.xyz/blog/shopify-product-images-not-showing. The canonical URL points back there.
Published September 3, 2026 by Adot Technologies Inc, the team behind Arvio: AI Store Operator. We read the public catalogue of 30 live Shopify storefronts on September 3, 2026 and fetched a sample of their main image URLs directly. Every count below is from the 25 of those whose catalogue we read to the end; five stores hit our 1,000-product ceiling, so their totals are partial and are excluded rather than mixed in.
The image file does not load, and the shopper gets a grey box. Or the product genuinely has no image, and the theme is showing a placeholder. Or — the common one nobody searches for by name — the shopper picks a colour and the photo does not change, because that variant has no image of its own.
Three causes and three fixes. The one request below tells you which of them you are looking at.
Key takeaways The image files themselves came back fine every time we asked for one. We fetched up to five main image URLs per store — 119 across 25 stores — and all 119 returned HTTP 200. Read that for what it is: an anonymous request to the CDN succeeded. It says the file exists and is being served; it cannot tell you the image renders on the page, and five products per store is a spot check, not a survey of the file layer. If your image is not loading, the suspect list starts with your theme and your cache, not Shopify's CDN. Products with no image at all are rare. 38 of 3,689 products, and 35 of those 38 belong to one store. This is an import problem when it happens, not a background rate. The variant layer is where it goes wrong at scale. 2,442 products out of 3,689 have more than one variant, and 807 of them (33.0%) have no variant-level image at all. It is a per-store habit, not a random defect. Six of the 25 stores had no variant images on any multi-variant product. Six others had them on every one. The median store sits at 20.5%. One script tells you which of the three you have. It walks the same public catalogue JSON we read, page by page: whether the product has no image at all, or has variants and no image on any of them.
Two thirds of the products we read have variants. A third of those carry one photo for every option a shopper can pick. The script above already finds them, at no cost to you — keep using it. What it cannot do is the rest of the catalogue it walks past: the titles, descriptions, metadata and alt text on those same products. Arvio reads that surface, drafts the changes, and applies nothing you have not approved. Install Arvio on the Shopify App Store →
That URL gives you the first 250 products only. If your catalogue is bigger, &page=2, &page=3 and so on give you the rest — a 400-product store needs two pages, and reading one of them and calling it a catalogue is the most common way to get a clean-looking wrong answer.
Or get it as a task list. This prints one line per product that is missing an image somewhere — either the product itself has none, or it has variants and not one of them carries its own image:
The last line is the one to read first. If it says fewer products than your admin does, the pages ran out early and the list above is incomplete — raise the page range and run it again.
That is the same rule we ran across 30 storefronts — 25 of which we read to the end, and those 25 are the ones every count in this article comes from. If it prints nothing and shoppers still report grey boxes, you are in failure 1 below and the answer is not in your catalogue.
We took a sample of main image URLs straight from the catalogues — 119 of them across 25 stores — and requested each one directly, reading only the first kilobyte. Every single one came back HTTP 200 with an image content type. Not one 404, not one 403, not one timeout.
That does not mean your image is fine. It means the file was there and serving every time we asked, so the failure sits somewhere between the file and the shopper's screen. We did not measure that stretch; the list below is not from our data, it is the order worth checking in: Your theme's lazy-loading. A blank slot that fills in when you scroll, or never fills in on a slow connection, is theme code, not a missing file. A cached page. You replaced the image and the shopper has the old HTML. Hard-reload before you debug anything else. A blocked request. Ad blockers and corporate proxies eat CDN requests. Try a different network before you rebuild your product. The URL you are checking is not the URL the page uses. Themes rewrite image URLs to add size suffixes. Copy the broken image's URL out of the page, not out of your admin.
The check that separates these from a real catalogue problem is the one at the top: if the handle does not print, the product has an image and the file will serve when requested directly.
Rare, and concentrated. 38 of 3,689 products across 25 stores had zero images — 1.0% — and 35 of them were in a single store, a catalogue of 176 products.
That shape is worth reading. Thirty-five of the 38 sitting in one catalogue is not a background rate; it is one batch. Which batch, we cannot see. Twenty-one of the 25 stores had zero products with no image.
If the command above prints a long list of NO IMAGE AT ALL lines, treat it as an import artefact and go looking for the batch it came from. We wrote up that cleanup separately in fixing a Shopify catalogue after a messy import.
Two thirds of the products we read have variants: 2,442 out of 3,689, or 66.2%. Among those multi-variant products, 807 (33.0%) have no variant-level image at all. Not a missing image on one colour: no image assigned to any variant of the product.
What a shopper sees is one photo that does not respond. What the catalogue hands the theme is one photo for the whole product. Pick Green and there is no Green photo to hand over, because that variant carries none; a theme doing the standard fallback has nothing but the product's first image to show. On a mug that is a nuisance. On paint, apparel, or anything where the variant is the thing being chosen, it is the whole decision they came to make.
