GEO-019·Issue 02·Content & Semantics·19 / 132
Variants and Out-of-Stock Pages: Don't Feed AI a 404
Sold-out variants and 404s delete the pages AI already cited. Decide 200, 301, or 410 case by case, and use canonical so one shoe stays one product entity.
Issue focusGet Seen First: Crawling, Rendering, and AI Bot Accessibility
Two weeks before Black Friday, a trail-running brand pushes a warehouse sync to its German storefront and finds the wide-fit bestseller gone above size 44. Ops follows the runbook: the dead variants become 404s, since a page nobody can buy from looks like waste. Rankings barely move. Then a buyer in Colorado asks which wide-toe-box trail shoes suit flat feet; the answer names two competitors and a German review site. The 404’d pages were the wide-fit models.
A variant URL and a sold-out page are the only memory an assistant has of your product; one wrong status code deletes the entity, its attributes, and the mentions behind it.
One shoe, dozens of addresses
Start with arithmetic. Six colorways, eight sizes, two widths, and a version or two is ninety-six addresses for one shoe, each with its own title, price, and stock state. The crawler sees near-identical pages. The assistant faces a different question: ninety-six options of one product, or ninety-six products?
When it cannot tell, it retreats to the page where the story is complete. Split finer and each page thins, so fewer get quoted; filter parameters then spend the crawl budget on near-duplicates, itemized in how AI crawlers allocate crawl budget.
Three presentations exist; pick by whether a buyer would say the condition out loud.
| Presentation | What the assistant sees | Fits when | Cost |
|---|---|---|---|
| One URL plus selector, canonical to parent | One entity, attributes on one page | Appearance only: color, packaging | Color-level questions have no page |
| A URL per variant, self-canonical | Citable addresses, each with price and stock | Fit or use: size, width, capacity, voltage | URL count doubles; attributes drift |
| Parent URL, rest merged and noindexed | One entrance, least duplication | The difference does not affect selection | Narrow questions find no page |
The test: “wide fit,” “220 V,” and “2 L” get said out loud and deserve a URL. “Midnight blue” does not.
The counterexample is canonicalizing every variant to the best-selling color: ninety-six copies of one color, size and width collapsed into it, and when that color sells out the set loses its landing point.
Out of stock is not delisted
The second loss comes from defaults: most templates leave a zero-stock page to a human who has two moves: 404 it, or redirect it to the category. Both are usually wrong.
Keep a sold-out variant at 200 and state what is true. An assistant confirming the product exists needs one continuous address; reviews, backlinks, and citations hang from it. Delete the page and the evidence loses its anchor.
| Status | Meaning | Right when | Cost |
|---|---|---|---|
| 200, out-of-stock marker | Exists, not buyable | Restock due, or one size gone | Needs a restock window and a substitute |
| 301 to category or successor | Moved for good | Discontinued, replacement exists | Old identity ends; old and new re-paired |
| 410 | Gone for good | Line discontinued | Relaunch means being discovered again, slower than 200 |
| 404 | Not found | Addresses that never should have existed | Read as a fault, recrawled, old citations die |
302 is the common mistake: “temporary” left up for a season keeps the engine and the assistant re-fetching an address with neither content nor an ending. Pick 200 or 301; the middle state costs more the longer it runs.
A 200 sold-out page needs three sentences: restock window, closest substitute, which variants still ship. Those are the extractable answer and the buyer’s next step — without them, 200 is a shell. The shell can also be technical: availability injected at render time, the failure described in whether AI can render your store.
A four-step playbook
| Step | Action | Owner | Passes when |
|---|---|---|---|
| 1 Inventory | Export variant URLs, status codes, and 90 days of crawl requests; group by fit or use | Ops and engineering | One row per variant with a reason it exists |
| 2 Decide | Pick one presentation per attribute; write it into the template spec | Growth lead | A reviewable sentence per dimension |
| 3 Codify | Restock within a quarter stays 200; discontinuation goes 301 or 410 | Ops and engineering | The rule lives in the stock-sync script |
| 4 Verify | Status, price, and availability agree without JavaScript | Engineering | A curl fetch matches the page |
Teams skip step one and jump to “should we delete sold-out pages”; without the grouped list, that argument runs on memory. Pulling records is covered in a complete AI crawl audit.
A rule an operator must remember in peak season is a hope with a runbook; step three gives the policy a home.
Example: rewriting one stock rule
Example — a hypothetical brand selling USB-C docking stations, a dozen variant URLs per model split by port count, power delivery, and plug type. No real brand, no figures. Old rule: any variant hits zero, 302 the group to the category.
Port count keeps its own URL, because buyers ask whether an eight-in-one dock drives 4K at 60 Hz; color and packaging merge into the parent, self-canonical. Sold-out variants stay at 200 with a restock window, the nearest equivalent, and availability marked out of stock. Only a line-wide discontinuation gets 410.
Acceptance is three checks: status, price, and availability survive JavaScript off; a restocked variant is cited at its original URL; re-running the prompts still mentions the sold-out model, landing on that model’s URL, not the category. Sample as an AI visibility baseline does.
Where this breaks
First, variants differing only by color. Separate URLs manufacture duplicates; a selector is enough. The mirror misuse is opening every color for long-tail coverage — three addresses for blue make it harder to tell which page is the product.
Second, categories that convert inside a marketplace. On Amazon or Shopee the template and status codes are not yours; you control the stock state and the restock note; a 301/410 scheme has no entry point there.
Third, pre-order or back-in-stock products. Keep 200 and swap the button; treating them as sold out throws away a landing page you built.
Fourth, very short lifecycles — collabs, seasonal drops. 410 is defensible, but archive content to the series page first. Multilingual stores add a layer: a 200 in one language beside a 410 in another reads as two different product states. The content and semantics hub collects the rest of this line.
Do one thing this month: export the variants that sold out in 90 days, sort them into 200, 301, 410, and 404, and answer for every 404 — temporarily unavailable, or permanently gone? Change that group’s codes, then re-run the prompts and see whether citations land on a product page or a category.