Issue reference
No machine-readable product data
- SCHEMA_PRODUCT_MISSING
- Read the details
- —
- High
What it means
tragent reports this at the “Read the details” stage. The question there is “Can it understand what the product is?” Name, description, images and variants have to be readable as data, not just rendered as a page.
What it does to an agent
Most agents fail at this point. The few that find a way round it spend more time and model calls doing so, and may give up before checkout.
Structured data is how an agent reads a product page as data: the name, the price, whether it is in stock, which variant is which. schema.org Product markup in JSON-LD is the form search engines, shopping agents and comparison tools all read. Without it, an agent has to infer those facts from layout, and it gets them wrong often enough to stop trusting the page.
This is the finding that makes the rest of the product-data checks possible. Once a Product is present, tragent can check its name, price, currency, stock, images and identifiers; until then, every one of those stages scores zero.
How to fix it
Add schema.org Product JSON-LD so agents read the catalogue without rendering the page.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trail Runner 2",
"image": ["https://shop.example/images/trail-runner-2.jpg"],
"description": "Lightweight trail shoe with a recycled mesh upper.",
"sku": "TR2-BLK-10",
"gtin13": "0123456789012",
"brand": { "@type": "Brand", "name": "Northwind" },
"offers": {
"@type": "Offer",
"url": "https://shop.example/products/trail-runner-2",
"price": "89.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock"
}
}
</script>On your platform
Shopify
Current Shopify themes output product structured data with the structured_data filter, which builds a Product (or a ProductGroup with its variants) from the product object. If your theme lacks it, add it to the main product section.
{%- comment -%} sections/main-product.liquid {%- endcomment -%}
<script type="application/ld+json">
{{ product | structured_data }}
</script>WooCommerce
WooCommerce outputs Product JSON-LD on single product pages by default. If it is missing, a theme or an SEO plugin has removed it or replaced it with a version that fails to render. Check the page source for application/ld+json, and if an SEO plugin owns schema, enable its product schema.
Headless or custom
Render the JSON-LD on the server from the same product record the page uses, in the document head or body.
In practice
One Product block per product page is the goal. If a page shows a product with variants, use a ProductGroup with the variants inside it, or one Product with several Offers; both are read correctly. Keep related-product carousels out of the markup, or mark them up as a separate ItemList, so the page's main product is never confused with the products recommended beside it.
Check a sample across the catalogue, not one page. Templates differ: gift cards, bundles, subscriptions and made-to-order items often use a different template from the standard product, and those are exactly the pages that end up without markup. A scan reads up to three product pages per run, so pass a few --product-url values from your unusual templates to see them.
Check the fix
- View the page source of a product page and search for application/ld+json.
- Paste the URL into Google's Rich Results Test and confirm it detects a Product.
- Run the scan; Read the details should score, and the next findings tell you which fields are missing.
Run the check that reported SCHEMA_PRODUCT_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
- Adding the markup with a tag manager after load, where readers that do not run JavaScript cannot see it.
- Marking up the collection page as a Product. Product markup belongs on the product's own page.
- Two competing Product blocks from the theme and a plugin, with different prices.