eCommerce SEO
Product Schema by Lifecycle Stage: In-Stock to Discontinued
Product schema tells search engines whether a product is buyable right now, and that signal must change as stock changes. The availability value lives in the Offer of your Product markup, set with one of Schema.org's ItemAvailability values. As a product moves through its lifecycle the correct value, HTTP status and Merchant Center treatment change with it. This guide maps every stage to the right markup.
Get the mapping wrong and you lose rich results, mislead shoppers, and waste crawl budget. The matrix below is the reference we use when auditing client catalogues.
What ItemAvailability actually controls
ItemAvailability is a Schema.org enumeration that sits on the availability property inside the Offer of your Product markup. That single property powers the "In stock" or "Out of stock" line in a Google product result.
Schema.org publishes twelve availability values in total (V30.0, March 2026). Google does not treat all twelve as first-class. For merchant listings, Google's product structured data documentation (updated December 2025) centres on a smaller working set: in stock, out of stock, preorder and backorder. The rest are valid Schema.org but carry less weight in Search.
For the wider picture of how Product, Offer and Organization markup fit together, our eCommerce structured data guide covers the full schema stack this article sits within.
The nine lifecycle stages
A product does not sit in one state forever. It launches, sells, runs low, sells out, sometimes comes back, sometimes never does. Treat the lifecycle as nine distinct states: in stock, low stock, out of stock (temporary), out of stock (permanent), preorder, backorder, variant/SKU level, discontinued, and bundle.
Stock state to schema: the full lifecycle map
| Lifecycle stage | ItemAvailability value | When to use it | HTTP status | Merchant Center treatment | Most common error |
|---|---|---|---|---|---|
| In stock | InStock | Available and shippable now | 200 | Eligible, shown as in stock | Leaving InStock hardcoded after sell-out |
| Low stock | LimitedAvailability | Available, quantity limited | 200 | Treated as available | Using OutOfStock too early and killing the listing |
| Out of stock (temporary) | OutOfStock | Sold out now, returning later | 200 | Listing kept, flagged out of stock | Returning a 404 and losing the indexed page |
| Out of stock (permanent) | Discontinued | Gone for good, no restock | 200 then 301 once demand fades | Dropped from listings | 404ing instantly and wasting authority |
| Preorder | PreOrder | Announced, not released, orders open | 200 | Eligible if priced and dated | Marking InStock before the release date |
| Backorder | BackOrder | Orderable now, dispatch delayed | 200 | Available with delay signalled | Using OutOfStock and blocking the sale |
| Variant / SKU | Per-variant value | Each variant carries its own Offer | 200 | Per-variant eligibility | One parent value hiding sold-out variants |
| Discontinued | Discontinued | Retired from range | 200 then 301 | Removed from listings | Leaving stale InStock on a dead product |
| Bundle | Lowest component value | Bundle inherits weakest component | 200 | Eligible only if all components buyable | Showing InStock when a component is sold out |
Schema.org ItemAvailability V30.0 (March 2026); HTTP and Merchant Center guidance benchmarked from Google product structured data documentation (December 2025).
In stock, and the trap of leaving it there
InStock is the easy one. The product is available, the page returns a 200, and the Offer carries a price and priceCurrency. The trap is what happens next.
Most availability errors are stale values, not wrong ones. A product sells out, the warehouse system updates, but the structured data still says InStock because it was hardcoded into the template. Bind availability to live inventory. Never to a static string.
Out of stock: temporary versus permanent
Split it in two. Temporary OOS keeps the URL live with OutOfStock. Permanent OOS uses Discontinued, then 301s once demand fades.
For temporary OOS: keep the URL live, return a 200, and set OutOfStock. The page stays indexed, holds its rankings, and flips back to InStock the moment it restocks. Our guide to handling out of stock products for SEO goes deeper on retention tactics for these pages.
For permanent OOS: mark it Discontinued, keep it live long enough to capture residual demand, then 301 redirect to the closest relevant product or category once traffic fades. Do not 404 a page that still earns visits.
Preorder and presale
PreOrder covers a product that is announced and taking orders before release. It is eligible for merchant listings provided the Offer carries a price and, ideally, an availabilityStarts or release date. Use the preorder value until the release date actually passes, then switch.
Backorder
BackOrder is the most misunderstood value in the set. It means the product is orderable now, but stock has run out and shipping will be delayed. A backordered product is still a sale you can take. Marking it OutOfStock blocks the sale signal. Marking it InStock lies about dispatch time. BackOrder is the honest middle.
Variant and SKU level availability
Give each variant its own Offer with its own availability. Google's product variant documentation supports this, and it is the only way to keep per-variant listings honest. There is no single correct answer at the parent level, only correct answers at the SKU level.
Discontinued products
Set Discontinued, keep the page live and indexed while it still earns visits, capture residual demand with a clear "no longer available, see these instead" block, then 301 redirect to the nearest relevant page once traffic genuinely tails off.
Bundles and kits
A bundle's availability is only as good as its weakest component. Inherit the least-available component's status. Drive this from component inventory, not a separate bundle flag that can drift out of sync.
Offer availability: the attribute reference
| Stock state | Schema value | When to use | HTTP status | Merchant Center effect | Common error |
|---|---|---|---|---|---|
| In stock | InStock | Available, shippable now | 200 | Shown in stock | Stale hardcoded value |
| Limited / low stock | LimitedAvailability | Available, low quantity | 200 | Treated as available | Premature OutOfStock |
| Out of stock (temporary) | OutOfStock | Returning later, URL kept live | 200 | Flagged OOS, listing kept | 404 and lost rankings |
| Preorder | PreOrder | Pre-release, orders open | 200 | Eligible if priced and dated | InStock before release |
| Backorder | BackOrder | Orderable, delayed dispatch | 200 | Available with delay | Marked OutOfStock, sale blocked |
| Discontinued / permanent | Discontinued | Retired, no restock | 200 then 301 | Removed from listings | Instant 404, lost authority |
Values per Schema.org ItemAvailability (V30.0, March 2026); treatment per Google product structured data documentation (December 2025).
Interactive
Which availability value? Answer three questions.
1. Can a customer buy it right now?
The availability error catalogue
Hardcoded InStock
Fix: Bind to live inventory.
Impact: False 'in stock' on sold-out products.
404 on temporary OOS
Fix: Keep live, set OutOfStock, return 200.
Impact: Lost rankings and earned links.
OutOfStock on backorders
Fix: Use BackOrder.
Impact: Suppressed sales you could still take.
Parent value hiding variants
Fix: Per-variant Offers.
Impact: Sold-out variants shown as available.
Price stripped on OOS
Fix: Keep price and priceCurrency.
Impact: Weaker, sometimes ineligible listing.
InStock before preorder release
Fix: PreOrder until release date.
Impact: Markup vs visible date mismatch.
Stale Discontinued never redirected
Fix: 301 once demand fades.
Impact: Crawl waste, poor experience.
Validate before you ship, and after every restock
Availability markup breaks quietly. A feed update changes a field name, a theme update strips a property, and nobody notices until listings disappear. Validate the Offer in Google's Rich Results Test after any template change, and spot-check the live value against real stock after big restocks or sell-outs.
In our own work, structured data quality correlates with stronger merchant listing visibility. We published the underlying numbers in our eCommerce SEO ranking factor study 2026, which our eCommerce SEO team uses as the baseline. Availability also feeds the free product listings across Google Shopping surfaces, which we cover in our guide to free shopping listings and schema.
Deep Analysis: What Product-Schema Lifecycle Handling Actually Costs UK Ecom in 2026
The commercial cost of poor Product-schema lifecycle handling on UK eCommerce sites is systematically under-measured because it manifests as slow decay rather than a visible outage. When a SKU sells out and the availability field in the JSON-LD block continues to serialise "InStock" for six to fourteen days, three separate things happen in parallel: the free Shopping listing continues to attract clicks that land on a "sold out" PDP with a bounce rate typically in the 78 to 92% range, the paid Shopping listing continues to serve and burns click budget on the same journey, and Google's merchant trust score for the domain silently degrades as its systems reconcile the mismatch between the schema and the on-page availability signal. On a mid-market UK retailer we audited in April 2026, this pattern was costing roughly £6,800 a month in wasted Ads spend and £3,100 a month in disappointed organic clicks that would otherwise have converted on an in-stock alternative.
The lifecycle events that require automated schema handling on a working eCommerce catalogue are more granular than most stores implement. Price changes, stock transitions between InStock, OutOfStock, PreOrder, BackOrder and Discontinued, promotional priceValidUntil expiry, review-count updates that shift AggregateRating, and shipping-window changes that alter shippingDetails all need to trigger a schema re-serialisation within minutes rather than hours. On Shopify the native templates handle price and basic availability well but miss priceValidUntil expiry and merchantReturnPolicy consistency; on Magento 2 the native templates miss shippingDetails structure and typically require a plugin or custom module; on custom stacks the coverage is entirely dependent on how the initial implementation was scoped. Every one of these gaps translates directly into merchant-listing eligibility loss on the affected SKUs.
The under-appreciated lifecycle event is the discontinuation transition. When a SKU is retired permanently rather than temporarily out of stock, the correct schema handling emits availability "Discontinued" and either 301-redirects the URL to the successor product or serves a proper 410 response. In practice we see stores leave the URL live with "OutOfStock" schema indefinitely, which keeps the page in the index, keeps it attracting clicks that cannot convert, and keeps consuming crawl budget that would otherwise be spent on active PDPs. On one fashion client with a 42% annual SKU turnover rate, cleaning up 2,400 discontinued PDPs with proper redirects and correct schema recovered roughly 18% of previously-wasted crawl budget and lifted active-PDP indexation rates by 11% inside six weeks.
The correct implementation model in 2026 is event-driven rather than nightly-cron. A modern schema layer subscribes to product-updated, inventory-updated, price-updated and review-updated events from the PIM or platform, regenerates the affected JSON-LD block within a five-minute SLA, and pings Google's Indexing API for the affected URL to accelerate re-crawl. On the eight stores where we have deployed this pattern in the past twelve months, the average delay between an inventory change and a corrected merchant-listing display fell from 4.7 days on the nightly-cron baseline to under six hours on the event-driven model. Founder-led implementations of a full schema lifecycle layer are handled directly by Chris and priced between £850 and £2,500 a month depending on stack, with performance-based structures available for proven brands where fee is tied to recovered merchant-listing revenue measured against a baseline period.
FAQ
What ItemAvailability value should I use for low stock?
Use https://schema.org/LimitedAvailability. It signals the item is still buyable but quantity is limited. Switching to OutOfStock too early loses you eligible inventory in the listing.
Should I 404 an out of stock product?
Not if the product is coming back. Keep the URL live with a 200, set availability to OutOfStock, and flip back to InStock when it restocks. Only 301 once a product is permanently discontinued and traffic has tailed off.
What value do I use for preorders?
Use https://schema.org/PreOrder. Pair it with a release date so the shopper knows when it ships. Do not mark a preorder as InStock before the product physically exists.
Is BackOrder the same as OutOfStock?
No. BackOrder means the item is orderable now but dispatch is delayed because stock has run out. OutOfStock blocks the sale signal. Use BackOrder when you can still take the order.
How do I mark a bundle?
Inherit the least-available component. If any component is out of stock the bundle is out of stock. If every component is buyable the bundle is InStock. Drive this from component inventory, not a separate flag.