Shopify Variant Image Coverage Checker

Paste any Shopify store URL and this tool scans the catalog to show which variants have no image of their own. It reads the public product feed, counts every variant, checks the featured_image field on each one, and reports coverage as a real number and a real percentage. No login, no API key, no access to the store admin.

Most variant image audits stop at "you have 412 variants with no image" and let you panic. That number on its own is close to meaningless. A Size option is supposed to share one photo. Small, Medium and Large of the same blue shirt are the same blue shirt, and nobody expects three separate photos of it. A Color option is a different story entirely, because the shopper picking Rust instead of Navy is picking a different looking thing.

So this checker splits the result by option name. For every option in your catalog, whether it is Color, Size, Material or something you invented yourself, it shows how many of that option's variants are missing an image, and it labels the option as one that matters visually or one where sharing an image is normal. That single split is the whole point of the tool. Everything else is supporting detail.

It also goes one level deeper than a variant count. Instead of counting nulls, it groups each product's variants by the value of its visual option and asks whether that value has any photo at all. Blue in three sizes with one image assigned to Blue Small is a partly covered group. Blue in three sizes with no image on any of them is an unphotographed color, and that is the thing costing you conversions.

Below the coverage summary you get a ranked list of your worst products with direct links to each product page, a per-option table, and a list of products that have fewer images than variants. That last list is worth reading twice. If a product has 24 variants and 6 photos, per variant imagery is arithmetically impossible for at least 18 of them, and no app or setting fixes a photo that was never shot.

One honest limitation up front. Shopify caps the public product feed at 250 products per request, so the scan walks through pages until it runs out of products or reaches its page limit. If your catalog is bigger than the scan window, the tool says so in plain language at the top of the results instead of quietly reporting a percentage of a partial catalog. A truncated audit that pretends to be a full one is worse than no audit.

DetailValue
Data sourcePublic products.json endpoint on the storefront
Field checkedvariants[].featured_image (null means no image assigned)
Products per request250, which is Shopify's hard cap
Pages scannedUp to 8, so up to 2,000 products per run
Grouping logicDistinct values of each visual option, evaluated per product
Option name matchingMultilingual, so Color, Farbe, Couleur and Kleur all register
Shopify variant image ruleOne featured image per variant
Long-standing product limits3 options, 100 variants per product by default, up to 2,048 with Combined Listings or the API
Login requiredNone, the endpoint is public on every Shopify storefront
Works withCustom domains and myshopify.com domains

What variant image coverage actually measures

Every Shopify variant has one optional image slot. In the product feed it appears as featured_image, and it is either an image object or null. When it holds an image, themes that support variant image switching can swap the gallery, the product card, and the cart line thumbnail to that photo the moment the shopper selects that variant. When it is null, the theme falls back to whatever the product's first image happens to be.

Coverage is the share of variants that hold an image. If a store has 3,400 variants and 1,980 of them have a featured image, coverage is 58.2 percent. That is the headline number this tool computes from your actual catalog rather than from a rule of thumb.

The number is useful as a trend line. Run it monthly, watch it move, and you will notice the day someone bulk imported 200 products without touching image assignment. As a pass or fail grade, though, the headline percentage is a bad judge, and the next section explains why.

One more mechanical detail worth knowing. The featured image is set per variant, not per option value. Assigning a photo to Blue does not exist as an operation in Shopify. You assign it to Blue Small, Blue Medium and Blue Large individually, or you assign it to one of them and leave the rest empty. Plenty of catalogs are in that half assigned state without anyone realizing, which is exactly the pattern the group analysis below is built to surface.

Why a null image is not automatically a bug

This is where most variant audits get it wrong, including some paid ones. They count nulls, call every null a problem, and hand you a scary number that you cannot act on.

Consider a t-shirt in one color and five sizes. Five variants, one photo, four nulls. Should you shoot four more photos of the identical shirt? Obviously not. The shirt looks the same in every size, the shopper knows that, and adding size specific photography would waste money and slow the page down for no benefit.

Now consider the same t-shirt in eight colors and five sizes. Forty variants. If the store assigned one photo per color to a single size and left the other four empty, thirty two variants show as null. Only some of that is a real problem. The eight colors are all photographed, so the catalog is genuinely covered at the level that matters, but shoppers who land on Rust Medium instead of Rust Small may see the wrong photo depending on how the theme resolves the fallback.

Finally, consider that same shirt where two of the eight colors were never photographed at all. Those two colors are the actual failure. A shopper picks Olive, sees Navy, and either leaves or orders while unsure. Two unphotographed colors will cost you more money than thirty unphotographed sizes ever will.

So the tool reports all three states separately, and it never counts a Size null in the problem totals. Being straight with you about this is the whole credibility of the page. A tool that inflates its own findings to look more useful is just a lead magnet with a progress bar.

The coverage states this tool reports

For each product, the scanner looks at the options that carry visual meaning and groups the variants by their value. Then it labels each group. Only the first two states below are counted as problems.

StateWhat it meansHow worried to be
UnphotographedNo variant with that option value has any image assignedFix this first. The shopper sees a photo of a different thing.
Partly coveredSome variants with that value have an image, others are nullWorth fixing. Behaviour depends on the theme and can be inconsistent.
CoveredEvery variant with that value has an imageNothing to do.
Expected nullNulls under Size, Length, Weight, Pack and similar optionsNormal. Not counted as a problem anywhere in the results.
Single valueThe product only comes in one value of that optionHarmless. There is nothing for the shopper to switch between.

Single variant products deserve a note of their own. Shopify gives them a hidden option called Title with the value Default Title, and their one variant almost always has a null featured image. That is completely normal behaviour, the product simply shows its gallery, and the scanner excludes those from the problem counts and tells you how many it excluded.

How to read the per option breakdown

The option table is the part you should screenshot and send to whoever owns your product data. Each row is one option name found in your catalog, with the number of products using it, the number of variants sitting under it, and then the columns that actually decide anything: how many distinct values of that option exist, how many of those values have no photo at all, and what share of them are photographed. Products that come in only one value of an option sit outside those three columns, in line with the state table above, because a value the shopper cannot switch away from cannot show them the wrong thing.

Read the value columns, not the variant columns. A raw null count cannot tell a Color option apart from a Size option, because on a product with both, every variant sits under both, so both rows carry the same number. Counting values fixes that. Eight colors with two of them unphotographed is 75 percent value coverage. Five sizes sharing the one photo assigned to Small is 20 percent, and that 20 percent is fine.

Each row also carries a type label. Visual means the option changes what the product looks like, so a value with no photo there is a real gap. Size like means the option changes a measurement or a quantity, so sharing a photo is the expected and correct setup. Unclassified means the option name did not match either list, and you should apply your own judgment.

The classification is a heuristic based on the option name, nothing more. It reads names like Color, Colour, Pattern, Style, Finish, Material, Print and Fabric as visual, in several languages, so Farbe and Couleur are recognised too. It reads Size, Length, Width, Weight, Capacity, Quantity, Pack and Voltage as size like. When a name contains a word from both lists, the one further to the right wins, because in an option name the last word is the one doing the work. Print Size, Frame Size, Strap Length and Fabric Weight are all measurements, so they are read as size like, while Frame Colour and Colorway stay visual. Anything it does not recognise lands in the unclassified bucket.

Unclassified options are still analysed for missing photos, on the assumption that a color option in a language we did not anticipate should not slip through silently. What they are not is counted as the real problem. They get their own line in the summary, outside the headline figure, and every value they produce is tagged as unclassified in the worst products table so you can go through them one at a time. Nobody's catalog uses vocabulary a keyword list can fully predict, so the tool shows its working rather than pretending to be certain.

One caveat on the arithmetic. A variant that belongs to both a Color option and a Size option is counted in the variant column of both rows, because it genuinely sits under both options. That means the variant columns do not sum to your total variant count, and the tool says so directly under the table rather than hoping you do not notice. The value columns do not have that problem, since a value belongs to exactly one option.

So compare value coverage across the rows. If your Color row shows 90 percent of its values photographed and your Size row shows 20 percent, your catalog is in good shape and the headline percentage was lying to you. A Color row down at 40 percent is the one to act on, whatever the Size row says.

Products with fewer images than variants

This list answers a question the coverage percentage cannot. Coverage tells you what was assigned. Image count tells you what exists to assign.

A product with 30 variants and 4 photos cannot reach full per variant coverage no matter how carefully you click through the admin. The photos are not there. You either shoot more, or you accept that variants will share, and if they share you want them sharing sensibly, which usually means one photo per color value rather than one photo for the entire product.

The list only includes products that vary by an option the scan reads as visual, or one it could not classify, and within those it is sorted by the size of the shortfall. A shoe listed in one color and thirteen sizes with five photos is not short of anything, so it stays out of the table and gets counted in a footnote instead. The products at the top are the ones where the gap between what shoppers can select and what they can actually see is widest, which makes them the products where a shopper is most likely to be looking at a photo of something they did not pick.

Use this list to plan a photo shoot, not to plan an app install. We build variant image software and we will still tell you that no software conjures a photograph that was never taken. Assignment tooling solves assignment problems. Missing photos are a photography problem.

Worth pairing this with the Variant Image Calculator, which works out how many photos a given option structure actually needs before you book the studio.

How to fix the gaps once you have found them

Start with the unphotographed values, because those are the ones where the shopper is looking at the wrong product. Work down the worst products list in order. It is already ranked by how many variants sit under a value that has no photo.

The manual route. Open the product in Shopify admin, scroll to Variants, click a variant, and use the image picker to attach the right photo. Repeat for each variant. On a product with a handful of variants this takes a minute. It works, it costs nothing, and for a small catalog it is genuinely the right answer.

Where manual stops working. The arithmetic turns against you quickly. A catalog of 300 products with 8 colors and 4 sizes each is 9,600 variant assignments, and every new colorway you add reopens the job. That is the point where merchants start looking for tooling, and it is the honest threshold rather than a scare tactic.

The app route. Rubik Variant Images, built by Craftshift, assigns a whole image set to each variant instead of Shopify's single featured image, so picking Rust filters the gallery down to the Rust photos rather than swapping one hero shot. It loads through Shopify metafields with no external API calls. It also has two different bulk paths that people mix up constantly, so here is the distinction in plain terms: AI auto assign works on one product at a time and reads four data points, the product name, the variant name, the image filename and the image alt text, to decide which photo belongs to which variant. Bulk assign is a different mechanism entirely, grouping by the order of images in your Shopify gallery using featured image boundaries, with no AI involved. On the App Store it sits at 5.0 stars across 420 ratings as of August 2026, and it is free to install.

You can see variant filtering running on a live storefront in the Rubik demo store, or read the getting started guide before you install anything.

The case where no variant tooling helps. If your colors are separate products rather than variants of one product, variant image assignment is the wrong lever, because there are no variants to assign to. That is a product linking problem, and the Separate Products vs Variants comparison walks through which structure fits which catalog.

What the scan can and cannot see

The public product feed is generous but not complete, and pretending otherwise would make every number on this page suspect. Here is the honest boundary.

  • It sees published products only. Drafts, archived products and anything hidden from the Online Store sales channel are absent from the feed, so they are absent from the audit too.
  • It sees the default market. The feed returns products as your primary storefront serves them. Region specific catalog differences will not show up.
  • It cannot see a password protected store. If the storefront is behind a password, the feed is unreachable and the scan fails with an error rather than a fake result.
  • It cannot always reach headless storefronts. A custom frontend may not expose the endpoint on the domain you typed, though the underlying myshopify.com domain often still does.
  • It stops at the page limit. Eight pages of 250 products is the ceiling. Larger catalogs get scanned up to that point and clearly labelled as partial.
  • It does not judge photo quality. A variant with a blurry, badly cropped or mislabelled photo counts as covered. Coverage is about presence, not quality. For quality checks use the Product Image Audit.

Also note that fetched pages are cached briefly on our side to stay polite to the store being scanned, so if you fix something and rerun the check within a few minutes you may see the previous result. Wait a little and run it again.

Common mistakes when auditing variant images

Six patterns come up again and again in the support questions we get about variant imagery. Most of them are audit mistakes rather than store mistakes.

  • Treating the headline percentage as a grade. A store selling shoes in one color and fourteen sizes will always score low, and there is nothing wrong with it. Read the option table, not the big number.
  • Assigning one photo to a whole color and calling it done. If Blue Small has the photo and Blue Medium does not, the theme may fall back to the product's first image for Medium. Assign across the full size run of each color.
  • Fixing the newest products first. Your traffic is concentrated in a handful of products. Fix the ones people actually land on, then work backwards. Cross reference the worst products list with your analytics before you start clicking.
  • Assuming the theme does variant switching at all. Some themes ignore the variant featured image entirely, or only apply it to the main gallery and not to the product card. Assignment without theme support changes nothing on the page. Check with the Theme Compatibility Checker first.
  • Shooting new photography before checking image counts. Many catalogs already have the photos uploaded and simply never assigned them. Look at the fewer images than variants list before you book anything.
  • Auditing once and never again. Coverage decays. Every import, every new colorway, every product duplicated from a template reintroduces gaps. Put it on a monthly calendar reminder and the number stays healthy.

Who this tool is for

Merchants use it as a pre season check before the catalog doubles in size. Run it in September, fix what it finds, and the peak season traffic lands on product pages that show the right thing.

Agencies use it during onboarding. Running a new client's store through the scanner before the discovery call turns a vague conversation about product presentation into a specific list of products with names and numbers attached. It is a fast way to show you did the homework.

Developers and app builders use it to reproduce merchant reports. When someone says the wrong image shows on their product page, the first question is whether the variant even has an image assigned. Often it does not, and the theme is behaving exactly as designed.

And anyone doing competitive research can point it at a competitor. It only reads public data, the same data any shopper's browser downloads, so there is nothing private about it. Seeing how a large store in your category handles variant imagery is a decent benchmark for how much effort the category expects.

Related Tools

What does variant image coverage mean?

Coverage is the share of your variants that have an image assigned to them individually. Shopify gives every variant one optional featured image slot, and coverage counts how many of those slots are filled across the catalog. A store with 3,400 variants where 1,980 have a featured image has 58.2 percent coverage. The tool computes this from your live product data rather than estimating it.

Does a variant with no image always mean something is broken?

No, and this is the most important thing to understand about the results. Size variants are supposed to share one photo, because a Medium shirt looks identical to a Small one. Single variant products have a null image by design. What matters is whether a visually distinct option value, a color, a pattern, a finish, has no photo anywhere on that product. That is the case the tool flags as a real problem, and it deliberately excludes the harmless nulls from that count.

Which options actually matter for variant images?

Options that change what the product looks like. Color and Colour first, then Pattern, Print, Style, Finish, Material, Fabric and similar. A shopper selecting one of those values expects to see that specific thing. Options like Size, Length, Width, Weight, Capacity, Quantity and Pack do not change the appearance, so one shared photo is the correct setup and the tool never counts those in its problem totals. A compound name is read by its last word, so Print Size and Strap Length are treated as measurements rather than as print or strap.

How many products can this tool scan?

Up to 2,000, which is eight pages of 250. Shopify caps the public product feed at 250 products per request, so the scanner walks through pages until it runs out of products or hits the page limit. If your catalog is larger, the results say so at the top and tell you exactly how many products were included, so you never see a percentage of a truncated catalog presented as a whole catalog figure.

What is the difference between an unphotographed value and a partly covered one?

An unphotographed value has no image on any of its variants. Choose Olive and you see a photo of some other color, which is the version that actually loses sales. A partly covered value has an image on some variants but not all, usually because someone assigned the photo to the first size and stopped. That one is theme dependent and less severe, but still worth cleaning up because behaviour becomes inconsistent across sizes.

Why do the option rows not add up to my total variant count?

Because a single variant can belong to more than one option. Blue Medium sits under both the Color option and the Size option, so it appears in both rows. The option table is a per option view, not a partition of your catalog, and summing the rows will overshoot your variant total on any product with two or three options. The overall coverage figure at the top is the one that counts each variant exactly once.

Does this need access to my Shopify admin?

No. It reads the products.json endpoint that every Shopify storefront exposes publicly, the same data any visitor's browser can request. There is no login, no API key, no app install, and no permission to grant. That also means it can be pointed at any public store, including competitors, since nothing private is involved.

Why did the scan fail on my store?

The error message tells you which of the four cases you hit, because they need different answers. If the store answered with a web page instead of a product feed, the domain is probably not a Shopify storefront or a custom frontend is serving it, so try the myshopify.com domain. If the feed came back too large to read, the fetch hit its size ceiling and your store is fine. If the feed returned zero products, everything is unpublished or hidden from the Online Store channel. If nothing answered at all, check the spelling, and check whether the storefront is password protected.

Are draft and archived products included?

No. The public feed returns published products on the Online Store sales channel only. Drafts, archived products and anything hidden from the storefront are invisible to the scan. If your admin shows more products than the scan found, unpublished items are usually the explanation, and the difference is worth checking rather than assuming the tool missed something.

What should I fix first?

Work down the worst products list. It ranks by the number of variants sitting under an option value that has no photo at all, not by raw null count, so the product at the top is the one where the most shoppers can land on a photo of something they did not pick. Unphotographed values and partly covered values are the tie breakers below that. Then cross reference the list with your analytics and reorder by traffic, because fixing a product nobody visits changes nothing.

Can an app fix missing variant images automatically?

An app can fix assignment. It cannot fix absence. If the photo exists in the product's image list but is not linked to the right variant, tooling handles that at scale. If the photo was never uploaded, no software can invent it, and the fewer images than variants list tells you which products are in that situation. Check that list before you assume this is a software problem.

How does Rubik Variant Images differ from Shopify's built in variant image?

Shopify allows one featured image per variant, so selecting a color swaps a single hero shot and the rest of the gallery still shows every other color. Rubik Variant Images assigns a whole image set per variant, so the gallery filters down to just that variant's photos. It runs through Shopify metafields with no external API calls, and it is free to install on the Shopify App Store.

What is the difference between AI auto assign and bulk assign?

They are two separate mechanisms and they get confused constantly. AI auto assign works on one product at a time and reads four data points, the product name, the variant name, the image filename and the image alt text, to decide which photos belong to which variant. Bulk assign is not AI at all, it groups images by their order in the Shopify gallery using featured image boundaries, and it runs in the background across many products.

How often should I run this check?

Monthly for an active catalog, and always after a bulk import or a new season drop. Coverage decays quietly. Every CSV import, duplicated product template and newly added colorway can introduce gaps that nobody notices until a shopper complains or a return comes back marked as not as described. Tracking the number over time is more useful than any single reading.

Is my scan data stored anywhere?

The analysis runs in your browser and nothing is saved to an account. Fetched pages are cached briefly on our server so that repeated scans of the same store do not hammer it with requests, which means rerunning a check within a few minutes of a fix may show the previous result. Wait a few minutes and run it again to see the change.