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.
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.
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.
ID: ecommerce-catalog.search-discovery.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 for application/ld+json script tags, schema.org, @type, or Product structured 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+json or 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-marking in 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',
},
}),
}}
/>