Product Variants

How to handle product variants (size, color) without duplicate pages. One-URL strategy and correct Product Schema for variants.

In brief

Product variants are different SKUs of the same product (size, color, volume). A proper technical strategy (one URL with JS switching or separate pages) and correct markup prevent cannibalization and improve indexing.

Variant types

Products can vary along several dimensions:

  • Size – S, M, L, XL.
  • Color – red, blue, black.
  • Volume – 50ml, 100ml, 200ml.
  • Material – leather, textile.

URL strategy for variants

Choosing between one URL or separate pages depends on how different the variants are.

A single URL with JavaScript switching works when variants differ only in attributes (size, color) but share the same product identity. The URL stays the same while JS updates the price, availability, and image without a page reload. This prevents content duplication.

Separate URLs are necessary when variants represent distinct products: iPhone 15 Pro 128GB vs 256GB (different SKUs, prices). Each page gets its own Product Schema and unique canonical URL.

When using JS switching, update Product Schema dynamically so search engines see accurate price and availability for the selected variant.

Product Schema for variants

For one-URL pages, list variants in the offers array. Example for a t-shirt with sizes:

JSON
{
  "@type": "Product",
  "name": "Nike T-shirt",
  "offers": [
    {
      "@type": "Offer",
      "sku": "NIKE-S-RED",
      "price": "1990",
      "size": "S",
      "color": "Red"
    },
    {
      "@type": "Offer",
      "sku": "NIKE-M-RED",
      "price": "1990",
      "size": "M",
      "color": "Red"
    }
  ]
}

Common questions

If it's the same product, use one URL – fewer backend issues, no duplicates. If variants have different demand and unique descriptions, create dedicated landing pages with their own target keywords.
Yes, you can point variant pages (e.g., colors) to the main product page with canonical if content differs only slightly. For distinct SKUs, each page should have its own canonical.
The rich snippet usually comes from the main page. With an offers array that includes all variants, Google may show a price range or the availability of the nearest size.
If variants rely on parameters (?color=red), set up canonical or noindex. It's even better to avoid such parameters in the URL structure.
Direct contacts

Discuss your project?

Share your goals and website context — I will suggest a practical next step.

Product Variants — What is it?