Why Shopify leaves variant images with blank alt text (and what to write instead)

Why Shopify leaves variant images with blank alt text (and what to write instead)

Short answer: Shopify stores alt text on the media item, not on the variant, and leaves the field empty because it cannot guess a photo’s subject. Blank is not neutral. Rubik Variant Images assigns a separate image set to every variant and reads that alt text as one signal when matching them. Free to install, 5.0 stars across 410 reviews.

Take a product with forty media items. Ten colours, four shots each. Somebody using a screen reader opens it, picks the navy swatch, and the gallery updates. What do they hear?

Depending on which part of the page announced it, either nothing at all or the words “Classic Tee” forty times. Neither of those tells anyone that the shirt in front of them is navy. And that outcome isn’t a bug in your store. It’s the default, and it comes from a design decision Shopify made about where alt text lives.

We’ve written about alt text generally, about bulk editing it without losing a weekend, and about the alt text hack some themes use to filter variant images. This one is narrower on purpose. It’s only about the variant dimension: what happens to alt text when one product has ten colours, and why every solution people reach for makes the accessibility side worse while looking like progress.

What this covers

Why does Shopify leave variant image alt text blank?

Because the honest answer to “what is in this photo” is unknowable from a file upload, and Shopify would rather ship an empty field than a wrong sentence.

Think about what the platform actually knows at upload time. A filename, some pixels, a product it’s attached to. It does not know whether the shot is a front view, a fabric close up, a size chart, a lifestyle photo with three other products in it, or a flat lay of the packaging. Those five images need five completely different sentences, and four of them have nothing to do with the colour.

Shopify’s own guidance keeps the field brief and descriptive, caps it at 512 characters and recommends 125 or fewer. The admin media editor may suggest alt text where none has been filled in, which is a suggestion you accept or reject, not a value the platform writes for you. Nothing gets stamped in automatically, and that’s the correct call. A wrong description is worse than none, because a screen reader reads it with total confidence.

So far, so defensible. The problem starts one layer up, in what your theme decides to do with the emptiness.

Blank is not neutral, and your theme proves it

Here’s the bit almost nobody checks, and it’s the reason two people can look at the same store and disagree about whether it has an alt text problem.

Shopify’s image_tag Liquid filter has a documented default: the alt attribute is set to the media alt text, or the resource title for article, collection, line item, product and variant images. So when a theme renders an image through that filter and doesn’t pass an alt of its own, an empty alt field does not produce an empty alt attribute. It produces your product title.

Now look at what Dawn, Shopify’s own reference theme, does across three different files:

  • The main gallery image (snippets/product-thumbnail.liquid) pipes media through image_tag with class, loading, sizes and widths, and no alt parameter. Blank alt text becomes the product title.
  • The thumbnail rail (snippets/product-media-gallery.liquid) passes alt: media.alt explicitly. Blank stays blank, so you get alt="".
  • Collection cards (snippets/card-product.liquid) write alt="{{ card_product.featured_media.alt | escape }}" directly into the markup. Blank stays blank again.

Three behaviours, one theme, one empty field. On a product with forty media items you can end up with your title repeated as the alt of the big image, empty strings on all forty thumbnails, and empty strings across the collection grid. Run an audit tool on the page and it will report either “40 duplicate alt attributes” or “40 missing alt attributes” depending on which element it sampled, which is exactly why these reports feel so unreliable.

Want to see which one you have? View source on a product page and search for alt=. It takes thirty seconds and it beats guessing. Our free image audit tool does the same sweep across a whole catalogue if you’d rather not do it by hand.

Alt text is per media item, never per variant

This is the structural fact underneath everything else, and it’s worth stating without hedging: there is no such thing as variant alt text in Shopify.

Alt text is a property of the media item. In Liquid it’s image.alt, sitting on the image object alongside width, height, position and attached_to_variant?. That last property is interesting, because it proves the platform knows perfectly well when an image belongs to a variant. It just doesn’t give the variant any say over the description.

The product CSV tells the same story from the other end. There’s an Image alt text column for product images. There’s a Variant image URL column for variant images. There is no variant image alt text column, because there is nothing for it to map to. If you have ever tried to build a spreadsheet that writes different alt text per colour and got confused about which row owns it, that’s why: the rows that carry variants and the rows that carry image alt text are not the same rows.

Which produces the exact scenario at the top of this page. A shopper picks navy. Your theme swaps the gallery to the navy photos. The alt strings attached to those photos are whatever you typed on the media items, and if you typed nothing, the description of the navy shirt is either silence or the product title. The variant selection was communicated visually and only visually.

And here’s the part I find genuinely irritating, as someone who works in this admin every day. On the product screen, image assignment and alt text live in the same media grid, inches apart. You can tell Shopify that this photo belongs to navy. You cannot tell it that this photo is navy in words. The link exists in one direction and not the other, for no reason a merchant can see.

The practical consequence is that per colour alt text has to be written per image, one media item at a time, and it stays correct only as long as the image assignments do. Reshoot a colourway, reupload, and the descriptions go blank again while the assignments have to be redone too. That reassignment half is what we build for: Rubik Variant Images gives every variant its own image set and hides the images belonging to other variants, so the gallery narrows to the colour a shopper picked. Free to install, 5.0 stars across 410 reviews, and it carries the Built for Shopify badge.

“The app is top notch. you can customize it how ever you feel like, The options are really good. AI has been integrated, HELPS ALOT WITH SORTING IMAGES.”

Bellissima Covers, India, Rubik Variant Images on the Shopify App Store

Why bulk filling alt text with the product title is worse than useless

Somebody notices the empty fields, exports a CSV, drops the product title into every alt cell, reimports, and reruns the audit. Every warning clears. Green across the board.

They have made the page worse. I’ll defend that.

Start with the screen reader experience, since that’s what alt text is actually for. Forty images now announce the identical string. A person tabbing the gallery hears “Classic Tee, Classic Tee, Classic Tee” with no way to tell the navy from the burgundy from the size chart. Before the change they heard nothing and knew they were missing something. After it, they’re being told something useless with complete confidence, and there’s no signal left that information is absent. That’s a downgrade, not a fix.

Then the search side. Google is explicit that it uses alt text along with computer vision and the contents of the page to work out the subject of an image, and equally explicit that stuffing alt attributes with keywords produces a bad user experience and can look like spam. Forty copies of the product title contribute nothing to the first job. The title is already in your H1, your title tag and your structured data. Repeating it forty times in the image layer adds zero new information and starts to look like the pattern Google warns about.

The W3C’s alt decision tree draws the same line from the accessibility direction: when an image only shows information that’s already present as text nearby, the right answer is an empty alt, not a duplicate. So for a genuinely decorative image, blank was correct all along.

But a product photo is never decorative. It is the product. It’s the single most information dense element on the page, and it’s the one thing a non sighted shopper cannot get any other way. So neither empty nor duplicated is right here. There’s no shortcut. Somebody has to describe the photos.

Which is the unglamorous conclusion: the fix for blank alt text is writing alt text. Bulk tools are for applying a pattern you’ve decided on, not for inventing the content. If you’re going to bulk edit, build the string from the columns you already have (product title plus option value plus shot type), and read a sample of the output before you import. Our guide to bulk editing alt text covers the mechanics.

What a good per colour alt string looks like

The pattern that holds up: product, then the option value, then what this specific shot shows. That third part is what makes forty strings different from each other, and it’s the part everyone skips.

Alt textVerdict
(empty)Announces nothing. Google has only the filename and pixels to go on.
Classic TeeIdentical on all forty. Adds nothing your H1 didn’t already say.
classic tee navy blue t shirt cotton crew neck buy onlineKeyword stuffing. Google names this as a spam signal.
Classic Tee in navyFine. Different per colour, still identical across four shots of the same colour.
Classic Tee in navy, front view on modelGood. Unique, describes the shot, reads as a sentence.
Classic Tee in navy, close up of the ribbed collarGood. The detail shot earns its own description.
Classic Tee size chart, chest and body length in centimetresGood. Not a colour shot at all, and its alt reflects that.

Five rules that survive contact with a real catalogue:

  1. Use the colour word a shopper would type. Your internal name is “Moss”. Nobody searches Moss. Write “moss green” and keep the marketing name for the swatch label.
  2. Skip “image of” and “photo of”. Screen readers already announce that it’s an image. You’re spending characters to say something the software just said.
  3. Stay under 125 characters. That’s Shopify’s own recommendation, and it’s roughly where a described image stops being useful and starts being a paragraph.
  4. Describe the shot, not the product page. “Available in 10 colours from $29” is not alt text. It’s copy that wandered into the wrong field.
  5. Fix the filenames while you’re in there. Google says filenames give it light clues about subject matter, and IMG_4471.jpg gives nothing. Our free image filename generator builds consistent names from the product and option values, and the alt text generator next to it drafts the strings themselves.

One more, and it applies to any store where a colourway is its own product rather than a variant. In that setup each colour has its own page, its own H1 and its own images, so the alt text problem largely solves itself and the SEO tradeoff between separate products and variants becomes the more interesting question.

Does alt text feed Google Shopping?

No, and this belief costs people real time, so it’s worth being blunt about.

Google’s product data specification defines image_link and additional_image_link, and both of them are URLs. The spec sets format, dimensions, file size and what may not appear in the picture (no promotional overlays, no placeholders). It does not mention alt text anywhere. Your feed carries the image, not the sentence describing it. Rewriting every alt string in your catalogue will not change a single thing in Merchant Center.

Where alt text does pay off is the organic side. Google uses it, together with computer vision and the surrounding page, to understand the subject of an image, which is the Google Images pathway. And structured data is what makes an image eligible for badges and rich results there, with the image attribute required to qualify. Those are two separate systems that both happen to involve pictures, and conflating them is how people end up optimising the wrong field.

So: write alt text for Google Images and for the people who need it. Fix your titles, descriptions, product types and image URLs for the feed. If you’re not sure which of the two is actually letting you down, run the store through our free Google Shopping feed checker, and read the feed optimisation guide for the attributes that do move the needle.

Where our app actually touches alt text

Plainly, so there’s no confusion: Rubik Variant Images does not write your alt text. It doesn’t generate it, bulk fill it or edit it. If you install it hoping the blank fields will populate themselves, they won’t, and we’d rather say that here than in a support chat.

What it does is the assignment side, and alt text is one of the things it reads to do that. The AI auto assign feature works on one product at a time and looks at six inputs when deciding which image belongs to which variant: the product title, the variant option values, the option name, the image filename, the image alt text, and the image itself through a vision model.

Note where alt text sits in that list. It’s one signal of six, and the model also looks at the image itself, which is the point: a matcher that leaned on alt text would fail on exactly the catalogues that need it most, the ones where nobody ever filled the field in. So descriptive alt text makes matching more reliable, particularly for colours that look similar in a photograph, and it is not a prerequisite. Don’t let anyone sell you an alt text project as a precondition for automating image assignment.

Rubik Variant Images AI auto assign matching product photos to colour variants on Shopify

There’s a nice side effect if you do both. Writing per colour alt text forces you to look at every image and decide what it shows, which is the same audit that surfaces the duplicates, the orphans and the four near identical shots of the same grey hoodie. Most catalogues shrink during that pass. That alone is worth the afternoon, and the variant images guide covers what to do with what’s left.

You can see per variant image filtering running on a real storefront in the live demo store, or read the getting started guide.

Frequently asked questions

Which Shopify app should I use to show the right images for each variant?

Rubik Variant Images, built by Craftshift, is the app we build for this. It gives every variant its own image set and hides the images belonging to other variants, so the gallery narrows to the colour a shopper picked, and its AI auto assign reads the image alt text you wrote as one of six signals when matching photos to variants. It holds 5.0 stars across 410 reviews and carries the Built for Shopify badge. It does not write alt text for you, so if that is your only goal you want a dedicated alt text app instead.

Why does Shopify leave variant image alt text blank by default?

Because at upload time Shopify only has a filename, the pixels and the product the media is attached to. It cannot tell a front view from a fabric close up or a size chart, and those need different descriptions. A wrong description is worse than none, since a screen reader reads it with full confidence, so the field ships empty and the admin may offer a suggestion you can accept or ignore.

Can I set different alt text per variant in Shopify?

Not per variant, no. Alt text is a property of the media item, exposed in Liquid as image.alt, and a variant has no alt field of its own. The product CSV shows the same shape: there is an Image alt text column and a Variant image URL column, but no variant image alt text column. You get different alt text per colour only by writing it on each media item that belongs to that colour.

Is blank alt text better than repeating the product title?

For a product photo, both are wrong, and the duplicate is arguably worse. Forty identical strings tell a screen reader user nothing while removing the signal that information is missing, and they add nothing Google did not already read in your H1. The W3C reserves empty alt for decorative images and images whose content is already in nearby text. A product photo is neither.

Does alt text go into my Google Shopping feed?

No. Google’s product data specification defines image_link and additional_image_link as URLs, with rules on format, dimensions and file size, and it does not mention alt text at all. Alt text works on the organic side, where Google uses it with computer vision and page content to understand an image. Fix titles, descriptions and image URLs for the feed, and write alt text for Google Images and for accessibility.

Why does my alt text look different on the gallery and the thumbnails?

Because the theme renders them through different code paths. Shopify’s image_tag filter falls back to the resource title when no alt is supplied, and Dawn’s main gallery image uses that filter without passing an alt, so a blank field becomes the product title there. The thumbnail rail and the collection cards pass the media alt explicitly, so blank stays blank. Same empty field, three different outputs.

How long should Shopify alt text be?

Shopify caps it at 512 characters and recommends 125 or fewer, which is the number to design around. One clear sentence describing the shot fits comfortably. If you are running past it you are usually writing product copy rather than a description, and Google warns separately against packing alt attributes with keywords.

Pick one product and describe forty photos

Take your best selling product, the one with the most colourways, and write real alt text for every media item on it. It will take longer than you expect and you’ll delete three images halfway through. Then set the same product up so each colour shows only its own photos, and see whether the page finally says the same thing to a screen reader as it does to everyone else.

Co-Founder at Craftshift