The bestseller your website cannot find
A canonical attribute dictionary, enforced at ingestion, keeps inventory findable

Introduction
Every retailer with both floors and a webshop has a version of this product. In the store it sells out by Thursday. Online it barely registers. The merchandising team has theories: the photos, the price point, the placement on the category page. The theories are usually wrong, and the truth is usually stupider.
One apparel client's version was a mid-weight jacket. In-store, a reliable mover. Online, a ghost. The reason took one query to find, once someone thought to run it: the jacket came from a supplier whose feed said size "Med" and color "Forest". The site's size filter listed S, M, L. The color filter listed Green. Filter by either, and the bestseller simply is not in the result set. It was not deranked. It was invisible.
Shoppers do not report the products they never saw. They buy them somewhere else.
The stock, meanwhile, sits in the warehouse: paid for, photographed, live on the site in the technical sense, and unreachable through the one interface most purchase journeys actually use. Multiply by every supplier feed with its own opinions about size labels, color names, units, and material fields, and "our online conversion is weaker" starts to look less like a marketing problem and more like an inventory of quiet data mismatches.
Facets are a contract nobody signed
Here is the mechanism. Faceted navigation, the filter column that drives a huge share of category-page purchases, only works if every product speaks the same attribute language. "M", "Med", "Medium", and "size 38" are one size to a human and four distinct values to a filter. A facet is an implicit contract: every product must express this attribute from a controlled vocabulary. But catalogs are built from feeds, and feeds come from suppliers, and no supplier signed your contract or has heard of it.
Search has the same disease with different symptoms; a query for "green jacket" that matches on text will find "Forest" only if someone taught it to. But facets fail harder, because a filter is binary. There is no partial credit, no fuzzy match, no ranking. In or invisible.
The dictionary and the gate
The method is unglamorous and it works: a canonical attribute dictionary, enforced at ingestion.
Define the canonical vocabulary once per attribute: sizes, colors, materials, fits, whatever your filters expose. For every supplier feed, maintain a mapping into that vocabulary: "Med" is M, "Forest" is Green, "100% cotton" and "Cotton" are the same material. Normalize units at the same gate, grams to the site's standard, centimeters to the size chart. Values the mapping does not recognize do not pass silently into the catalog; they land in a rejection queue that a human clears, and each clearance becomes a new mapping rule, so the queue shrinks month over month. New feed, new mappings, same dictionary.
The modern refinement is that language models have made the first draft of those mappings nearly free: they will propose that "Frst Grn" means Forest Green with high confidence. The judgment call, and the part that keeps the system trustworthy, is that a proposal is not a rule until reviewed; auto-accepting fuzzy mappings just relocates the corruption. We stood up this gate at a marketplace ingesting forty-plus supplier feeds; the rejection queue ran hot for six weeks, then settled to a few dozen items a week, and the "invisible product" class of ticket effectively retired. The jacket equivalents started showing up in filters, which is to say, in revenue. (The photos, it turned out, had been fine all along.)
A product with an unmapped attribute is not badly merchandised. It is unlisted, on the shelf, at full cost.
The fair objection is that this is plumbing, permanent plumbing, with a queue to staff. Correct. The alternative is what most catalogs actually run: a slow leak in which some single-digit percent of inventory is unreachable at any given moment, the specific victims rotating with every feed update, undetectable in any metric you currently chart.
TensorLabs builds catalog infrastructure of exactly this kind, and the first deliverable is always the same query we ran for the jacket: how much of your inventory is currently invisible to your own filters. The number has never once been zero.
You might also like
Keep reading from the journal.
June 30, 2026Coding
Encode the playbook, not just the contract
Put the firm's positions where a system can apply them
January 8, 2026JavaScript
Building “TagTamer” — A Chrome Extension with Manifest V3
Learn how to build a Chrome extension using Manifest V3 by creating TagTamer—a simple tool that highlights HTML heading tags on any webpage. This hands-on guide covers popup UI, background scripts, content scripts, and modern extension architecture.
July 13, 2026Engineering
A third of your ad spend reports to nobody
Server-side first-party collection makes the budget follow real numbers