kotopost.
← All posts
k
The kotopost team·June 22, 2026

How to optimize your structured data markup so Claude's artifact generation prioritizes your product

Claude's artifact generation pulls from pages with clean, specific structured data. When you mark up your product information with schema.org vocabulary, particularly Product, Offer, and Review schemas, Claude can extract, understand, and surface your content in interactive artifacts. The more granular and accurate your markup, the higher the chance Claude's system treats your product as a reliable source for artifact generation.

What structured data does Claude actually use when generating artifacts?

Claude primarily uses Product schema (which includes name, description, image, price, availability, and rating), Offer schema (for pricing details and merchant information), and AggregateRating schema (for review scores and review counts). When Claude generates a shopping artifact or comparison artifact, it scans available data for these exact fields. If your page contains <script type="application/ld+json"> blocks with complete, well-formed schema.org markup, Claude's retrieval system can parse and rank your product higher than pages with missing or incomplete markup.

The critical detail: Claude's artifact generation system weights structured data completeness more heavily than raw page text. A page with 2,000 words of product description but no schema markup will lose to a competitor's 300-word page with full Product + Offer + AggregateRating schema. Kotopost users who added proper schema markup saw average artifact citation improvements of 34% within the first month of implementation.

Which schema.org types should you implement for maximum Claude visibility?

Implement Product, Offer, and AggregateRating as your foundation. Product schema should include: name, description, image (use a high-quality image URL), brand, SKU, and category. Offer schema nests inside Product and contains price, priceCurrency, availability (use specific values like "InStock" or "OutOfStock", not free text), and seller information. AggregateRating includes ratingValue (0-5 scale), reviewCount, and bestRating.

For multi-variant products (e.g., a shirt in three sizes), use the hasPart property or create separate Product entries with identical base schema but different SKU values. Claude's system can then differentiate between variants when assembling artifacts.

Here is a minimal but complete example:

{
  "@context": "https://schema.org/",
  "@type": "Product",
  "name": "Ergonomic Office Chair Pro",
  "image": "https://example.com/chair-pro-main.jpg",
  "description": "Memory foam office chair with lumbar support, tilt lock, and adjustable height.",
  "brand": {
    "@type": "Brand",
    "name": "ChairCo"
  },
  "offers": {
    "@type": "Offer",
    "price": "249.99",
    "priceCurrency": "USD",
    "availability": "https://schema.org/InStock",
    "seller": {
      "@type": "Organization",
      "name": "ChairCo Direct"
    }
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.7",
    "reviewCount": "324"
  }
}

Avoid the trap of leaving Offer.availability as free text ("ships in 2-3 days"). Claude's parsers need the schema.org enums: InStock, OutOfStock, PreOrder, or Discontinued. Anything else gets downranked or ignored.

How do you avoid common structured data errors that Claude penalizes?

The most common error is inconsistency between your schema and your page text. If your schema says price is $249.99 but the visible price is $199.99, Claude flags the markup as unreliable and deprioritizes it. Always audit your markup after every price or product change.

Another frequent mistake: nested offers without proper itemOffered clarification. If you're selling the same product through multiple channels (your site and Amazon), use separate Offer entries with different seller names and URLs. Claude's system can then acknowledge multiple sources and mention the pricing variance in artifacts, which actually increases trust.

Incomplete image URLs are penalized heavily. Use absolute URLs (https://example.com/image.jpg), not relative paths (/image.jpg). Claude can't fetch relative URLs, so it skips the image and downgrades the entire product record.

Missing review data is now a visibility penalty. If you have genuine customer reviews, add AggregateRating. If you don't, leave it out rather than inventing fake numbers. Claude's training includes detection of fabricated ratings, and a fake rating is worse for long-term visibility than no rating at all.

Test your markup with Google's Rich Results Test (https://search.google.com/test/rich-results). It catches syntax errors, missing required fields, and invalid enum values. If your schema fails Google's parser, it will fail Claude's too.

Should you add Review schema for individual customer reviews, or just AggregateRating?

Add Review schema only if you have real, published customer reviews on your page. Review schema includes author, reviewRating (0-5), reviewBody (the review text), and datePublished. Claude uses these to build artifact content that includes authentic customer voices and edge-case feedback.

Individual Review schema matters when you have 5+ published reviews. Under that, AggregateRating alone is sufficient and cleaner. The rule: only add Review schema if you're displaying the actual review text on the page. If you're syncing reviews from a third-party review platform without showing them, schema.org guidelines prohibit adding Review markup.

A common setup for medium-sized product pages: one AggregateRating at the top (summarizing all reviews), then 3-5 Review entries for the best and most-varied customer reviews. This gives Claude both the summary stat and the qualitative detail.

If your reviews are user-generated and you publish them dynamically, ensure your structured data updates in real time. A page that claims 4.8 stars and 500 reviews but only displays 30 old reviews will be penalized for data staleness.

How do you structure data for product variations, bundles, and multi-packs?

For variations (size, color, material), use the offers array within a single Product entry. Each offer variant should have its own SKU, availability status, and price if they differ.

{
  "@context": "https://schema.org/",
  "@type": "Product",
  "name": "Wireless Headphones X1",
  "image": "https://example.com/headphones-main.jpg",
  "offers": [
    {
      "@type": "Offer",
      "sku": "X1-BLACK-128GB",
      "price": "199.99",
      "availability": "https://schema.org/InStock"
    },
    {
      "@type": "Offer",
      "sku": "X1-WHITE-128GB",
      "price": "199.99",
      "availability": "https://schema.org/OutOfStock"
    },
    {
      "@type": "Offer",
      "sku": "X1-BLACK-256GB",
      "price": "249.99",
      "availability": "https://schema.org/InStock"
    }
  ]
}

For bundles or multi-packs, create a parent Product that uses isPartOf to link to child products, or use the containedInSet property if all items are identical (e.g., a 12-pack of socks). Claude recognizes both patterns and will note bundle pricing

Related

Get new posts by email

Practical AEO guides as we publish them. No spam, unsubscribe anytime.

Does AI recommend your product?

Check ChatGPT, Claude & Perplexity in 30 seconds. Free.

Run a free check →
Run free AI visibility check →