The 9 Essential eCommerce Structured Data Types

Structured data is code you add to a page to tell Google exactly what's on it: the product name, price, availability, reviews, shipping, and returns. Get it right and your product pages become eligible for rich results in Search, the listings with star ratings, prices, and stock status that stand out and earn more clicks. This guide covers the structured data types that matter most for an eCommerce store, with copy-ready JSON-LD for each.

Two things before the code. First, add structured data in the JSON-LD format, which means wrapping each block below in a <script type="application/ld+json">...</script> tag in your page's HTML. Second, the schema.org URLs are case-sensitive: use lowercase https://schema.org, exactly as shown.

The structured data types your store needs

1. Product, Offer, and Review: the foundation

Every product page should carry Schema markup that spells out:

  • The product name
  • Description
  • Image
  • Availability
  • Price and currency

Think of Product, Offer, and Review as a package. You nest the offer (price, stock, seller) and any reviews inside the main Product block, like this:

<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "Product",
  "name": "Product Name",
  "image": "https://www.example.com/product-image.jpg",
  "description": "Product description",
  "sku": "12345",
  "brand": { "@type": "Brand", "name": "Brand Name" },
  "offers": {
    "@type": "Offer",
    "price": "29.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "seller": { "@type": "Organization", "name": "Seller Name" }
  },
  "review": {
    "@type": "Review",
    "reviewRating": { "@type": "Rating", "ratingValue": "4.5" },
    "author": { "@type": "Person", "name": "Reviewer Name" }
  }
}
</script>

2. Shipping details

If you sell to more than one region, add shipping details with OfferShippingDetails, nested inside your Offer as shippingDetails. Google reads the destination, the rate, and how long delivery takes. Note that delivery time is split into handlingTime (how long before it ships) and transitTime (how long in transit):

"shippingDetails": {
  "@type": "OfferShippingDetails",
  "shippingRate": {
    "@type": "MonetaryAmount",
    "value": "5.00",
    "currency": "USD"
  },
  "shippingDestination": {
    "@type": "DefinedRegion",
    "addressCountry": "US"
  },
  "deliveryTime": {
    "@type": "ShippingDeliveryTime",
    "handlingTime": {
      "@type": "QuantitativeValue", "minValue": 0, "maxValue": 1, "unitCode": "DAY"
    },
    "transitTime": {
      "@type": "QuantitativeValue", "minValue": 1, "maxValue": 5, "unitCode": "DAY"
    }
  }
}

3. Payment methods

Shoppers have payment preferences, and an unsupported method is a real friction point. List what you accept with acceptedPaymentMethod on the Offer:

"acceptedPaymentMethod": [
  { "@type": "PaymentMethod", "name": "Credit Card" },
  { "@type": "PaymentMethod", "name": "PayPal" },
  { "@type": "PaymentMethod", "name": "Apple Pay" }
]

4. Warranty

If your products come with a warranty (think consumer electronics), make it clear with the WarrantyPromise type, added to the main Product schema:

"warranty": {
  "@type": "WarrantyPromise",
  "durationOfWarranty": {
    "@type": "QuantitativeValue", "value": "6", "unitCode": "MON"
  },
  "warrantyScope": {
    "@type": "WarrantyScope",
    "description": "This product has a 6-month warranty."
  }
}

5. Breadcrumbs

Your store should already follow a clear hierarchy, and breadcrumb markup reinforces it. It helps Google (and shoppers) understand your category structure:

{
  "@context": "https://schema.org/",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://www.example.com" },
    { "@type": "ListItem", "position": 2, "name": "Category", "item": "https://www.example.com/category" },
    { "@type": "ListItem", "position": 3, "name": "Product", "item": "https://www.example.com/category/product" }
  ]
}

6. Local business

If you also have a physical location, add the LocalBusiness type so Google knows your address, hours, and contact details. Pair it with a Google Business Profile:

{
  "@context": "https://schema.org/",
  "@type": "LocalBusiness",
  "name": "Example Business",
  "url": "https://www.example.com",
  "telephone": "(123) 456-7890",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "123 Main Street",
    "addressLocality": "Anytown",
    "addressRegion": "CA",
    "postalCode": "12345",
    "addressCountry": "US"
  },
  "openingHoursSpecification": {
    "@type": "OpeningHoursSpecification",
    "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
    "opens": "08:00",
    "closes": "18:00"
  }
}

7. Video

If you publish product videos, tag them with the VideoObject type:

{
  "@context": "https://schema.org/",
  "@type": "VideoObject",
  "name": "Product Demo Video",
  "description": "A demonstration of our new product",
  "thumbnailUrl": "https://example.com/thumbnail.jpg",
  "uploadDate": "2026-04-05T14:30:00Z",
  "duration": "PT1M30S",
  "contentUrl": "https://example.com/video.mp4"
}

8. Return policy

A clear return policy removes friction, and Google shows it on eligible listings. Use the MerchantReturnPolicy type, nested under your Offer as hasMerchantReturnPolicy. Google supports a specific set of properties here, so stick to these:

"hasMerchantReturnPolicy": {
  "@type": "MerchantReturnPolicy",
  "applicableCountry": "US",
  "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
  "merchantReturnDays": 30,
  "returnMethod": "https://schema.org/ReturnByMail",
  "returnFees": "https://schema.org/FreeReturn"
}

Set returnPolicyCategory to MerchantReturnFiniteReturnWindow (a set number of days), MerchantReturnUnlimitedWindow, or MerchantReturnNotPermitted. If returns aren't free, swap FreeReturn for ReturnShippingFees and add a returnShippingFeesAmount.

9. Energy efficiency ratings

For home electronics, you can surface the energy rating with the EnergyConsumptionDetails type, added to the Product:

"hasEnergyConsumptionDetails": {
  "@type": "EnergyConsumptionDetails",
  "energyEfficiencyScaleMin": "https://schema.org/EUEnergyEfficiencyCategoryD",
  "energyEfficiencyScaleMax": "https://schema.org/EUEnergyEfficiencyCategoryA3Plus",
  "hasEnergyEfficiencyCategory": "https://schema.org/EUEnergyEfficiencyCategoryA2Plus"
}

Does FAQ schema still work?

Mostly not. Since Google's 2023 change, FAQ rich results only show for a small set of well-known, authoritative health and government sites. For everyone else the markup no longer earns the rich result. That can even help your click-through rate, since people click to get the answer. Keep an FAQ section if it helps your shoppers, just don't expect the rich result.

Structured data on Shopify

Shopify adds most structured data for you, but a poorly built theme can break it. To check that your Shopify product pages carry the right markup, run our Shopify Product Page SEO check.

Think of schema as your site's skeleton, not scattered code

It's tempting to treat Schema as separate snippets you bolt on to satisfy Google. A more useful way to think about it comes from Martha van Berkel of Schema App: structured data is the skeleton of your online presence. Beyond product pages, add it to blog posts, contact pages, and more, so the pieces connect. As she puts it, "your schema connects to tell a story."

A diagram showing how structured data types connect across a website

Google's Lizzi Sassman has encouraged this nesting too: putting one type inside another (as with product, offer, and review above) helps Google understand how everything on your page fits together, and how authoritative you are in your field.

How to add structured data

If you're on Shopify or WooCommerce, structured data is likely already supported, natively or through plugins. On WordPress, plugins like Yoast generate the right types automatically. Even so, check that every relevant type is present. Most platforms leave a field for custom code where you can add anything that's missing.

Then confirm it with SiteGuru's free structured data checker.

One more thing worth knowing: Google can also read shipping and return details from your Google Merchant Center account. Providing both on-page markup and a Merchant Center feed gives you the widest eligibility, so if you already run Merchant Center, keep the two in sync.

Keep it simple, and stay ahead

Schema sounds technical, but it's really just Google's tagging system. Lean on the checkers, plugins, and tools to cover the bases, and stick to the types Google actually supports. Even if a type doesn't produce a rich result today, adding it is fine: as Search keeps changing, Google keeps adding features, and clean structured data means you're ready for them.