Book now

Field notes on alt text, media metafields, and the catalog surface everyone pays for and nobody reads back.

Open any product in any Shopify admin we get handed. The photography is the most expensive thing on the page: art-directed, retouched, shot on a model who cost more per hour than the developer. Now click the first image and find the alt text field.

Empty. Or the filename, "IMG_2041.jpg", pasted in and called done.

We used to shrug at this too. Alt text lived on the accessibility checklist, the accessibility checklist lived at the bottom of the backlog, and everyone quietly agreed it would get done in a future sprint (we had that exact checklist). Media metadata was polish, and polish waits.

That theory survived until we started opening other people's catalogs for a living.

Everyone skips it, so nobody feels it

WebAIM crawls the top 1,000,000 home pages every year and grades their accessibility. In the 2026 run, 16.2% of all images on those pages had no alt text at all.

Read past the headline and it gets uglier. Counting the alt text that just says "image", repeats the caption next to it, or restates the filename, more than one in four images on the web's biggest front doors is effectively undescribed.

Those are home pages. The page everyone in the company looks at daily. A product catalog runs deeper than anyone scrolls, and nobody has opened the products at the bottom of the collection since the import script mapped alt text from a column that didn't exist.

Media metadata is the most neglected surface in every catalog we open. No exceptions so far.

The best-maintained part of your store has the worst data illustration 1

The photo is a row in a database

The turn came when we read Shopify's media docs the way we'd read a schema, not a feature list.

A product image on Shopify isn't decoration hanging off the product. It's a MediaImage object with its own global ID: uploaded once to the Files system, referenced from products and variants without duplication, alt text sitting on it as an editable field with mutations to manage the record. The platform will hold a 20 MB image for you. The field beside it, the only one that says what the image contains, holds whatever your last import left there.

Nerd detail, skip freely: metafields of type file_reference and list.file_reference store values like gid://shopify/MediaImage/123, so a size chart, a swatch, or a fabric close-up can be queried and validated by pipeline code exactly like a price.

Shopify already treats your photography as structured data. Most stores treat it as wallpaper.

The best-maintained part of your store has the worst data illustration 2

What the machines read when they can't see

Once media is a record, the alt field is the record's only text.

A screen reader has nothing else to announce. Google's image documentation names alt text as the most important attribute for describing an image, and says the filename gives it "very light clues". The same document points to structured data as how an image earns a rich result. Every one of these consumers is blind, and every one of them decides whether your product surfaces.

The W3C sorts images into categories with different rules: decorative ones get an empty alt on purpose, informative ones get a description shaped by the page's context. Almost nothing in a product gallery is decorative. The third photo is the fabric close-up. The fourth is the zipper. Those are attributes: material, texture, closure, fit. Data that exists nowhere else in the record, stored in the one format your own pipeline can't query.

Shopify gives the field 512 characters and recommends 125 or less. That's room for a spec sheet line: what the frame shows, which variant, what it's made of. Written from the product record, it's enrichment. Written as keyword soup, Google's own guidance files it under spam.

What changed on our side

On the catalogs we run, alt text moved into the enrichment pipeline with everything else. Generated from the record itself: title, category, variant, what the frame actually shows. Validated for length and stuffing, human oversight on the output. The same treatment titles and metafields get, because it's the same kind of field.

Across 642,000+ SKUs processed, the pattern has not broken once. Stores whose media carries data get found by everything that can't see, and stores whose media is wallpaper are running their most expensive asset partially unplugged.

What we keep taped to the wall

  • Alt text is an attribute field. Pipeline it like titles: generated from the record, validated, reviewed.
  • 125 characters or less, descriptive, no stuffing. Decorative frames get an empty alt on purpose.
  • Filenames are metadata too. IMG_2041.jpg is at least honest.
  • An attribute that lives only inside a photo is a data gap. Log it like one.

These days, the first thing we open in a new admin is the alt field on the first product's first image. It tells you how the whole catalog has been treated.

The model got paid. The retoucher got paid. The photography is gorgeous.

The field is still empty.

If you want to know what your catalog looks like to everything that can't see it, OKART's Infrastructure Stress-Test reads that surface too, read-only, delivered in 48-72 hours.

Sources

  1. The WebAIM Million (2026 report): accessibility analysis of the top 1,000,000 home pages; 16.2% of images missing alt text, more than one in four missing, questionable, or repetitive.
  2. Adding alt text to product media: Shopify's 512-character maximum and the recommendation to stay at 125 characters or less.
  3. Manage media for products and collections: MediaImage objects, supported formats and size limits, unified Files system, alt text via the GraphQL Admin API.
  4. Image SEO best practices: alt text as the most important image attribute, descriptive filenames, structured data and image sitemaps.
  5. W3C Web Accessibility Initiative: Images tutorial: image categories (informative, decorative, functional) and how alt text differs per category and context.
  6. Metafield data types: file_reference and list.file_reference types referencing MediaImage records.

Latest Stories

View all

No P&L has a line called catalog. The money leaks anyway.

No P&L has a line called catalog. The money leaks anyway.

We have never seen a P&L with a line called catalog. Not in 28 projects. The money leaks anyway; it signs in under four other names: marketing, tools, logistics, payroll.

Read moreabout No P&L has a line called catalog. The money leaks anyway.

Our 2027 bets, logged like incidents

Our 2027 bets, logged like incidents

Prediction is the safest genre in tech: publish in January, collect the applause, never get graded. We run a log, and log entries carry dates. Four bets on agentic commerce and catalog data, on the record until December 2027.

Read moreabout Our 2027 bets, logged like incidents

Your store is already a database. It's run like a filing cabinet.

Your store is already a database. It's run like a filing cabinet.

Search any large catalog for the sentence about washing wool at thirty degrees. It lives in product after product, every copy slightly different, and none of them is the master. Notes on metaobjects, the database console hiding under Settings.

Read moreabout Your store is already a database. It's run like a filing cabinet.