Product pages include schema.org markup
Why it matters
Google and Bing use schema.org Product and Offer structured data to populate rich results — price, availability, and review stars displayed directly in search results. Without application/ld+json markup on product pages, listings appear as plain blue links competing against structured cards from competitors. For Google Shopping specifically, the schema.org Offer.availability field controls whether a product appears in shopping results at all. The schema-org Offer spec also feeds into AI shopping assistants that extract product data for recommendations — pages without structured data are invisible to this emerging discovery channel.
Severity rationale
Info because missing schema.org markup reduces search result richness and AI discoverability but does not break any user-facing functionality or expose a security surface.
Remediation
Add a <script type="application/ld+json"> block to src/app/products/[slug]/page.tsx with at minimum the Product and Offer types, including dynamic availability from stock state.
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify({
'@context': 'https://schema.org',
'@type': 'Product',
name: product.name,
description: product.description,
image: product.images,
sku: product.sku,
offers: {
'@type': 'Offer',
price: product.price.toString(),
priceCurrency: 'USD',
availability:
product.stock > 0
? 'https://schema.org/InStock'
: 'https://schema.org/OutOfStock',
},
}),
}}
/>
Validate output with Google's Rich Results Test after deployment — structured data syntax errors are silent at render time.
Detection
-
ID:
schema-org-markup -
Severity:
info -
What to look for: Count all product detail page components (
src/app/products/[slug]/page.tsx,src/app/products/[id]/page.tsx). For each, search forapplication/ld+jsonscript tags,schema.org,@type, orProductstructured data. Enumerate which schema.org fields are included: name, description, price, image, availability, brand, sku. -
Pass criteria: At least 1 product detail page includes structured data (schema.org Product and Offer markup) in JSON-LD format with at least 4 of these fields: name, description, price, image, availability. Report even on pass: "Schema.org markup found with X of 7 recommended fields: [list]."
-
Fail criteria: No schema.org markup is present on any product detail page — 0 instances of
application/ld+jsonor structured data found. -
Skip (N/A) when: The project is not a web application (e.g., API-only, mobile app backend) — confirmed by absence of product page components in
src/app/. -
Cross-reference: For structured data validation and rich results, the SEO Advanced audit covers schema.org completeness and testing.
-
Cross-reference: For availability markup accuracy, the check
ecommerce-catalog.inventory.out-of-stock-markingin this audit covers stock-based availability display. -
Cross-reference: For meta tag completeness alongside structured data, the SEO Fundamentals audit covers title, description, and OpenGraph tags.
-
Detail on fail:
"No schema.org markup found on product detail page at src/app/products/[slug]/page.tsx — 0 instances of application/ld+json" -
Remediation: Add schema.org Product markup to
src/app/products/[slug]/page.tsx:<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify({ '@context': 'https://schema.org', '@type': 'Product', name: product.name, description: product.description, image: product.images, offers: { '@type': 'Offer', price: product.price, priceCurrency: 'USD', availability: product.stock > 0 ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock', }, }), }} />
External references
- schema-org · Product — schema.org Product type
- schema-org · Offer — schema.org Offer type (price, priceCurrency, availability)
Taxons
History
- 2026-04-18·v1.0.0·Initial import from ecommerce-catalog·automated