# Product pages include schema.org markup

- **Pattern:** `ab-001132` (`ecommerce-catalog.search-discovery.schema-org-markup`)
- **Severity:** info
- **Lifecycle:** active
- **Last modified:** 2026-04-18
- **Canonical URL:** https://auditbuffet.com/patterns/ab-001132
- **License:** CC-BY-4.0 — attribute to AuditBuffet Pattern Catalog (https://auditbuffet.com/patterns/ab-001132)

## 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.

```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,
      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 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`:

  ```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 Offer

Taxons: findability

HTML version: https://auditbuffet.com/patterns/ab-001132
