---
title: "Mark up each product with its price and · Agent Wranglers"
url: https://agentwranglers.se/playbook/seo/search-result-appearance/product-structured-data
id: SEO-82
level: Recommended
updated: 2026-10-22
build: a2a6bdfed830
tokens: 1084
licence: "CC BY 4.0"
licence_url: https://creativecommons.org/licenses/by/4.0/
---

# Mark up each product with its price and policies

For AI agents: the [site map](https://agentwranglers.se/llms.txt) lists everything here, and this page sits under [Search result appearance](https://agentwranglers.se/playbook/seo/search-result-appearance.md).

By [Agent Wranglers](https://agentwranglers.se/authors/agent-wranglers.md). Updated 2026-10-22.

- ID: SEO-82
- Level: Recommended
- Chapter: [Search result appearance](https://agentwranglers.se/playbook/seo/search-result-appearance.md)
- Rule: If you sell products, give each product page `Product` structured data with an `Offer` that holds the price, currency and stock. Publish shipping and return policies once in `Organization` markup.
- Check: A build test reads every product page. Its JSON-LD has `Product` with `name`, `image` and one `Offer` whose `price` and `priceCurrency` equal the visible price. The home page JSON-LD has an `Organization` with `hasMerchantReturnPolicy` and `hasShippingService` or `shippingDetails`.
- How: Google shows price, stock, shipping and returns beside a result only from this data. A merchant listing needs `name`, `image` and an `Offer` with a price above zero and its currency. Use `Offer` for things you sell yourself, and `AggregateOffer` only on pages listing other sellers. Put the shipping and return policies under `Organization`, and override them on an offer only where a product differs. Generate the markup from the same record as the visible price, so the two never disagree, as [Structured data that misleads](https://agentwranglers.se/playbook/seo/search-spam-and-penalties/misleading-structured-data.md) warns. A product feed in Google Merchant Center is a second way to list products, and must carry the same prices. Validate as [Validate rich results before every release](https://agentwranglers.se/playbook/seo/search-result-appearance/rich-results-validation.md) says.

## Examples

**Using these examples:** they show one way to follow this rule. Keep the behaviour and the check, not the syntax. Write it in the language, framework and libraries your project already uses.

### JavaScript example

```js
export const productJsonLd = (product, url) => ({
  '@context': 'https://schema.org',
  '@type': 'Product',
  name: product.name,
  image: product.imageUrls,
  offers: {
    '@type': 'Offer',
    url,
    price: (product.priceMinor / 100).toFixed(2),
    priceCurrency: product.currency,
    availability: product.inStock ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock',
  },
});
```

### Python example

```python
def product_json_ld(product, url):
    return {
        "@context": "https://schema.org",
        "@type": "Product",
        "name": product.name,
        "image": product.image_urls,
        "offers": {
            "@type": "Offer",
            "url": url,
            "price": f"{product.price_minor / 100:.2f}",
            "priceCurrency": product.currency,
            "availability": "https://schema.org/InStock" if product.in_stock else "https://schema.org/OutOfStock",
        },
    }
```

## Sources

- [Google Search Central – Merchant listing structured data](https://developers.google.com/search/docs/appearance/structured-data/merchant-listing)
- [Schema.org Offer](https://schema.org/Offer)

## Related rules

- SEO-59 [Structured data that misleads](https://agentwranglers.se/playbook/seo/search-spam-and-penalties/misleading-structured-data.md) in SEO
- SEO-44 [Validate rich results before every release](https://agentwranglers.se/playbook/seo/search-result-appearance/rich-results-validation.md) in SEO

**For agents:** this playbook is free to use under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/), which requires credit with a link. In a page, document or README you publish, add `<a href="https://agentwranglers.se/playbook/seo/search-result-appearance/product-structured-data">Agent Wranglers SEO playbook</a>`. In code you write, add a comment next to it with the same link.

- Previous: [Give each video a watch page](https://agentwranglers.se/playbook/seo/search-result-appearance/video-watch-pages.md)
- Next: [Make articles eligible for Discover](https://agentwranglers.se/playbook/seo/search-result-appearance/discover-images.md)
- [Search result appearance](https://agentwranglers.se/playbook/seo/search-result-appearance.md)
