Skip to main content
Product pages get a schema.org graph containing:
  • Product (or ProductGroup with hasVariant for multi-variant products) — name, description, images, brand, and an Offer with price, currency, and availability from your live Shopify data.
  • BreadcrumbList — store → collection → product trail.
A typical rendered block is ~2.2 KB of valid JSON-LD, served from your Shopify SEO fields and product data. Multi-variant products are modeled the schema.org way: one ProductGroup with each variant as a Product under hasVariant, each carrying its own offer. Only the first 100 variants are included in hasVariant (to keep the bundle small); products with a larger variant matrix are truncated to 100.

Rendering it

app/products/[handle]/page.tsx

The meta tags that come with it

Alongside the JSON-LD, the product bundle carries the page’s title, meta description, canonical URL, Open Graph, and Twitter card tags — all rendered by the same helpers.
og:type on the App Router: Next’s typed Metadata union doesn’t accept "product" and throws at runtime, so the App Router adapter deliberately omits og:type. Every other Open Graph tag renders normally. The Pages Router, Remix, and Hydrogen adapters emit og:type=product (raw meta tags accept it).

Custom integrations

If you’re not using a shipped adapter, fetch the bundle and render it yourself:
See Security for why serializeJsonLd is mandatory here.