Issue reference
Your product data does not say whether it is in stock
- SCHEMA_AVAILABILITY_MISSING
- Check stock
- —
- Medium
What it means
tragent reports this at the “Check stock” stage. The question there is “Can it tell whether the product is in stock?” An agent that cannot tell what is available will recommend things you cannot sell.
What it does to an agent
Agents can usually carry on, but more slowly or less sure of what they found, and an unsure agent is likelier to recommend another store.
Agents stop recommending what they cannot confirm is in stock, or worse, recommend what is not. Offer.availability is the one field that tells them, as a schema.org URL such as https://schema.org/InStock or https://schema.org/OutOfStock.
This matters most per variant: the shoe may be in stock in size 9 and sold out in 10, and an agent asked for 10 needs to know before it adds it to a basket.
How to fix it
Set Offer.availability so agents stop recommending out-of-stock variants.
"offers": { "@type": "Offer", "price": "89.00", "priceCurrency": "USD" }"offers": { "@type": "Offer", "price": "89.00", "priceCurrency": "USD", "availability": "https://schema.org/InStock" }On your platform
Shopify
The structured_data filter sets availability from each variant. In a hand-written block, derive it from variant.available.
"availability": "{% if variant.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}"WooCommerce
WooCommerce sets availability from the stock status. Make sure products track stock, or have a stock status set, rather than none.
Headless or custom
Map your inventory states to InStock, OutOfStock, PreOrder, BackOrder or LimitedAvailability. Do not invent values.
In practice
Availability should reflect what the shopper can buy now, in the market they are in. If you sell from several warehouses, InStock should mean in stock for that shopper, not somewhere. Use PreOrder with an availabilityStarts date for items not yet released, and BackOrder for items you will take an order for but cannot ship immediately; both let an agent tell the shopper the truth instead of refusing.
Update the markup when stock changes, not on a nightly job. Agents check stock right before recommending, and a page that says InStock for an item that sold out at lunchtime sends shoppers to checkout to be disappointed. If the page is cached, purge it when a variant sells out, or render availability on request.
Products that are discontinued should either leave the catalogue or be marked Discontinued, not left as OutOfStock forever. An agent treats OutOfStock as "try again later" and may tell a shopper to wait for a restock that will never come. Discontinued tells it to look for an alternative, which might be another of your products if you link one from the page.
Check the fix
- Check the JSON-LD on an in-stock product and on a sold-out one; the two should differ.
- Sell out a test variant on staging and reload its page without the cache, to confirm the markup follows stock.
- Run the scan; Check stock should pass.
Run the check that reported SCHEMA_AVAILABILITY_MISSING again after the change. The scan needs no account; an issue found during an AI shopping test needs that test run again.
npx @tragent/cli scan https://your-store.comCommon mistakes
- Values like "in stock" or "available" instead of the schema.org URL.
- Every variant marked InStock because the group is.
- Availability rendered from a nightly export, hours behind the stock the basket checks.