Ecommerce SEO + AI Visibility

Ecommerce size guide
structured data schema

How to implement schema.org SizeSpecification, hasMeasurement, and size conversion data so AI shopping agents can answer size queries across US, EU, UK, and international sizing systems.

TL;DR Use SizeSpecification (schema.org v14+) on each size variant Offer. Include sizeSystem (country code like "US" or "EU"), sizeGroup ("Womens", "Mens", etc.), and hasMeasurement with body measurement ranges. This unlocks size-specific AI agent recommendations: "size medium dress for 36-inch bust" and international size conversion queries.

Why size data matters for AI shopping agents

Apparel is one of the highest-intent ecommerce categories for AI shopping agents. Users ask very specific size-qualified queries: "women's running shorts size S with 3-inch inseam", "men's dress shirt 15.5 neck 34 sleeve", "kids snow boots toddler size 7". Without structured size data, AI agents cannot match these queries to your specific variants — they either skip your products or recommend them incorrectly, generating returns and refund requests.

Schema.org's SizeSpecification type, introduced in version 14.0, gives merchants a standard vocabulary to express:

AI agent size query coverage by structured data tier

What you provideQueries answered by AI agentsCoverage level
No size data (default Shopify) General product queries only None
Size in variant name only (e.g. "Size: M") Exact label match ("size M dress") Label only
SizeSpecification + sizeSystem Size label + system ("EU 40", "US 8") System match
SizeSpecification + hasMeasurement Body measurement queries ("36 inch bust", "32 waist") Measurement match
SizeSpecification + hasMeasurement + multi-system International conversions + body measurements Full coverage

Schema.org SizeSpecification — complete property reference

PropertyTypeRequired for AI?Example values
name Text Yes "XS", "S", "M", "L", "XL", "2XL", "38", "40", "42"
sizeSystem Text (country code or enum) Yes "US", "EU", "UK", "JP", "CN", "FR", "IT", "AU", "BR"
sizeGroup SizeGroupEnumeration or Text Yes "Womens", "Mens", "Unisex", "Boy", "Girl", "Tall", "Petite", "Plus", "Maternity"
hasMeasurement QuantitativeValue Strongly recommended chest: 91–97 cm, waist: 72–78 cm, hip: 99–105 cm
suggestedAge QuantitativeValue Children's only minValue: 2, maxValue: 4, unitText: "years"
suggestedGender GenderType or Text Optional (use sizeGroup instead) "Female", "Male", "Unknown"

sizeSystem country codes

RegionsizeSystem valueExample (women's top)
United States"US"XS, S, M, L, XL or 0, 2, 4, 6, 8
Europe (most)"EU"34, 36, 38, 40, 42, 44
United Kingdom"UK"6, 8, 10, 12, 14, 16
Japan"JP"5, 7, 9, 11, 13, 15
China"CN"155/80A, 160/84A, 165/88A
Italy"IT"38, 40, 42, 44, 46, 48
France"FR"34, 36, 38, 40, 42, 44
Australia"AU"8, 10, 12, 14, 16, 18
Generic metric"SizeSystemMetric"Use for measurements-only sizes

Complete JSON-LD example: women's dress with US + EU sizing

This example uses ProductGroup (for the main product) with individual Product variants, each having a SizeSpecification. This is the structure Google recommends for size-variable apparel.

{
  "@context": "https://schema.org",
  "@type": "ProductGroup",
  "name": "Linen Wrap Dress",
  "description": "Relaxed-fit wrap dress in 100% Belgian linen. Available in three colors and five sizes.",
  "brand": { "@type": "Brand", "name": "Maison Laurent" },
  "url": "https://example.com/products/linen-wrap-dress",
  "productGroupID": "WD-2026-LINEN",
  "hasVariant": [
    {
      "@type": "Product",
      "name": "Linen Wrap Dress — Size S",
      "sku": "WD-LINEN-S",
      "color": "Ivory",
      "size": {
        "@type": "SizeSpecification",
        "name": "S",
        "sizeSystem": "US",
        "sizeGroup": "https://schema.org/WomensClothes",
        "hasMeasurement": [
          {
            "@type": "QuantitativeValue",
            "name": "chest",
            "minValue": 84,
            "maxValue": 89,
            "unitCode": "CMT"
          },
          {
            "@type": "QuantitativeValue",
            "name": "waist",
            "minValue": 65,
            "maxValue": 70,
            "unitCode": "CMT"
          },
          {
            "@type": "QuantitativeValue",
            "name": "hip",
            "minValue": 91,
            "maxValue": 96,
            "unitCode": "CMT"
          }
        ]
      },
      "offers": {
        "@type": "Offer",
        "price": "195.00",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      }
    },
    {
      "@type": "Product",
      "name": "Linen Wrap Dress — Size M",
      "sku": "WD-LINEN-M",
      "color": "Ivory",
      "size": {
        "@type": "SizeSpecification",
        "name": "M",
        "sizeSystem": "US",
        "sizeGroup": "https://schema.org/WomensClothes",
        "hasMeasurement": [
          { "@type": "QuantitativeValue", "name": "chest", "minValue": 91, "maxValue": 97, "unitCode": "CMT" },
          { "@type": "QuantitativeValue", "name": "waist", "minValue": 72, "maxValue": 78, "unitCode": "CMT" },
          { "@type": "QuantitativeValue", "name": "hip", "minValue": 99, "maxValue": 105, "unitCode": "CMT" }
        ]
      },
      "offers": {
        "@type": "Offer",
        "price": "195.00",
        "priceCurrency": "USD",
        "availability": "https://schema.org/InStock"
      }
    }
  ]
}

Shopify Liquid implementation with metaobject size specs

Store your size measurement data in a size_spec metaobject definition. Each entry represents one size in one system (e.g. "US M" and "EU 40" are separate entries that both link to the size M variant). This allows you to maintain size data in Admin without editing Liquid code.

Metaobject definition fields for size_spec

type: size_spec
fields:
  - key: size_label      type: single_line_text_field  (e.g. "M", "40", "12")
  - key: size_system     type: single_line_text_field  (e.g. "US", "EU", "UK")
  - key: size_group      type: single_line_text_field  (e.g. "Womens", "Mens")
  - key: chest_min_cm    type: number_decimal
  - key: chest_max_cm    type: number_decimal
  - key: waist_min_cm    type: number_decimal
  - key: waist_max_cm    type: number_decimal
  - key: hip_min_cm      type: number_decimal
  - key: hip_max_cm      type: number_decimal
  - key: inseam_min_cm   type: number_decimal  (bottoms only)
  - key: inseam_max_cm   type: number_decimal  (bottoms only)
  - key: foot_length_min type: number_decimal  (footwear only)
  - key: foot_length_max type: number_decimal  (footwear only)

Liquid JSON-LD output snippet

{% assign size_specs = product.metafields.custom.size_specs.value %}
{% if size_specs.size > 0 %}
  "size": [
    {% for spec in size_specs %}
    {
      "@type": "SizeSpecification",
      "name": {{ spec.size_label.value | json }},
      "sizeSystem": {{ spec.size_system.value | json }},
      "sizeGroup": {{ spec.size_group.value | json }},
      "hasMeasurement": [
        {% if spec.chest_min_cm.value != blank %}
        { "@type": "QuantitativeValue", "name": "chest",
          "minValue": {{ spec.chest_min_cm.value }},
          "maxValue": {{ spec.chest_max_cm.value }}, "unitCode": "CMT" },
        {% endif %}
        {% if spec.waist_min_cm.value != blank %}
        { "@type": "QuantitativeValue", "name": "waist",
          "minValue": {{ spec.waist_min_cm.value }},
          "maxValue": {{ spec.waist_max_cm.value }}, "unitCode": "CMT" },
        {% endif %}
        {% if spec.hip_min_cm.value != blank %}
        { "@type": "QuantitativeValue", "name": "hip",
          "minValue": {{ spec.hip_min_cm.value }},
          "maxValue": {{ spec.hip_max_cm.value }}, "unitCode": "CMT" }
        {% endif %}
      ]
    }{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ]
{% endif %}

Children's sizing: suggestedAge

For children's apparel and footwear, the suggestedAge property on SizeSpecification lets AI agents answer queries like "rain jacket for 4 year old" or "toddler shoes 18 months". Combine it with sizeGroup (Boy, Girl, or Unisex) for maximum coverage.

{
  "@type": "SizeSpecification",
  "name": "2T",
  "sizeSystem": "US",
  "sizeGroup": "https://schema.org/KidsClothes",
  "suggestedAge": {
    "@type": "QuantitativeValue",
    "minValue": 2,
    "maxValue": 2.5,
    "unitText": "years"
  },
  "hasMeasurement": [
    { "@type": "QuantitativeValue", "name": "height", "minValue": 85, "maxValue": 90, "unitCode": "CMT" },
    { "@type": "QuantitativeValue", "name": "weight", "minValue": 12, "maxValue": 14, "unitCode": "KGM" }
  ]
}

Common size structured data errors

ErrorEffectFix
No sizeSystem set AI can't convert between systems; only label queries match Add sizeSystem with country code
size value is a string variant option (not SizeSpecification) No hasMeasurement or sizeSystem data available Use SizeSpecification type, not plain text
hasMeasurement in inches without unitCode INH AI assumes cm; size conversions are wrong Set unitCode: "INH" for inches, "CMT" for centimeters
sizeGroup omitted for gendered clothing Ambiguous for unisex queries; may miss male/female specific searches Set sizeGroup to Womens or Mens
Only one size system (US) for international store EU, UK, JP visitors get no size context; high return rate Add alternate SizeSpecification entries for each system
Size in product title only ("Blue Dress Size M") AI can read the label but no measurement or system context Add SizeSpecification to the Offer or ProductGroup

FAQ

Does schema.org have a size guide or size chart type?

Schema.org added the SizeSpecification type in version 14.0 (2021). It describes a size value within a specific sizing system with properties: name (size label), sizeSystem (country code), sizeGroup (gender/age group), hasMeasurement (body measurements), and suggestedAge (for children's sizing). Use SizeSpecification on your product's size variant Offer or as size property on the Product itself.

How do AI shopping agents use size structured data?

AI agents use SizeSpecification to answer queries like "size medium blue dress", "men's jacket 42 chest", or "kids shoes size 5 toddler". ChatGPT Shopping and Google AI Mode cross-reference sizeSystem and hasMeasurement to disambiguate international size queries. Merchants who provide measurement ranges get matched to long-tail searches like "shirt that fits 42 inch chest" — queries that don't match any size label directly.

Can I add size structured data to Shopify without modifying product variants?

Yes. Store size measurement ranges in a size_spec metaobject definition and link specs to products via a list metaobject_reference metafield. Output SizeSpecification JSON-LD from the Liquid template without modifying Shopify's variant inventory system. No Shopify app required.

What sizeSystem values does schema.org support?

Schema.org supports ISO 3166-1 alpha-2 country codes as sizeSystem values: "US" for US sizes, "EU" for European, "UK" for British, "JP" for Japanese, "CN" for Chinese, "IT" for Italian, "FR" for French, "BR" for Brazilian, "AU" for Australian sizes. Google's Merchant Center documentation endorses this pattern for apparel structured data.

What unitCode should I use for body measurements?

Use "CMT" for centimeters and "INH" for inches — these are UN/CEFACT unit codes used throughout schema.org quantity values. Using the wrong unitCode causes AI agents to misinterpret measurements: a chest measurement of 38 with unitCode "CMT" (38 cm) is interpreted as a very small child's garment, not a standard men's medium. For US-market apparel stores, use "INH" and include metric equivalents as additional hasMeasurement entries for international AI agents.

Scan for size data completeness

CatalogScan checks apparel product pages for SizeSpecification, sizeSystem, and hasMeasurement structured data. Get a report showing which of your products are invisible to size-qualified AI shopping queries.

Scan your store free

Related: Schema markup overview · ProductGroup JSON-LD guide · Metaobjects for structured data