Apparel has the largest schema vocabulary on Shopify and the lowest completion rate. Size, color, material, fit, gender, age range, country of origin, care instructions, sustainability certifications — eight required-or-recommended attributes for full surfacing, and most catalogs ship three.
This guide is the apparel-specific stack. The schema vocabulary, the attributes that fashion-intent queries depend on, the GMC feed structure that gets apparel surfacing right, and the failure modes common to fashion catalogs.
What “apparel” means here
Schema and feed conventions diverge across fashion verticals. This guide covers:
- Casual and contemporary apparel (T-shirts, sweaters, denim, outerwear).
- Performance apparel (athleisure, athletic, technical outdoor).
- Streetwear and contemporary fashion (limited drops, sneaker-adjacent).
It does not specifically cover:
- Luxury watches and jewelry — different schema vocabulary, different surfacing patterns. See the watches guide (forthcoming).
- Bridal and special-occasion — long lead times and one-off configurations break the standard product schema model.
- Footwear — overlapping but distinct enough that a separate guide is warranted (forthcoming).
The eight apparel attributes
Where the attributes live on a real product page — what a complete apparel product card looks like with every attribute exposed:
In rough order of impact-on-surfacing for apparel-intent queries (weighted from observed behavior across the major AI search engines):
1. size
What it is: the variant’s size — XS, S, M, L, XL, 2XL,
30, 32, 34, 36. The exact label depends on the size system
(see attribute 2).
Where it lives: Shopify variant option, GMC size attribute,
Schema.org size (or additionalProperty).
Failure mode: catalogs that use non-standard size labels (“Petite,”
“Tall,” “True to size”) confuse AI agents. Use the size value plus
a separate size_type attribute for the qualifier.
2. size_system and size_type
What it is: the size system (US, EU, UK, JP, CN) and the
size type (regular, petite, tall, plus, maternity).
Where it lives: GMC supplemental feed; not directly in Schema.org but
exposable as additionalProperty.
Failure mode: US-only catalogs entering Europe surface poorly without
size_system: EU rows in the supplemental feed. This is the single
biggest cause of the “we expanded to EU and traffic disappeared”
pattern.
3. color
What it is: a structured color name — Forest Green, Charcoal,
Off-White. Not a hex code.
Where it lives: Shopify variant option, GMC color, Schema.org
color.
Failure mode: brand-specific color names (“Acme’s signature Tuscan Sunset”) that have no equivalence to a normalized color. Include both: the brand name in the title, the normalized color in the attribute.
4. material
What it is: primary material composition — 100% Merino Wool,
Recycled Polyester, Egyptian Cotton.
Where it lives: Shopify metafield, GMC material, Schema.org
material.
Failure mode: stored in prose only. AI agents extract material from prose with high accuracy when it’s in the description; with much higher accuracy when it’s in a structured field. The structural version surfaces in material-intent queries; the prose version sometimes does and sometimes doesn’t.
5. gender and age_group
What it is: target gender (male, female, unisex) and age group
(adult, kids, infant, newborn).
Where it lives: Shopify metafield or product type, GMC gender and
age_group (both required for apparel category).
Failure mode: tagging unisex products as unisex rather than splitting
into male and female listings. Some agents handle unisex
correctly; many treat it as ambiguous and surface the product less.
The catalog-level decision is whether to ship two variants or one with
unisex — splitting into two outperforms in the agents that don’t
handle unisex cleanly, with no downside in the ones that do.
6. fit
What it is: the fit description — slim, regular, relaxed,
oversized, athletic.
Where it lives: Shopify metafield, GMC product_detail (no first-class
GMC field), Schema.org additionalProperty.
Failure mode: unstructured fit descriptions (“runs slim”) embedded only in prose. Structured fit attributes are parseable by indexers and downstream commerce surfaces in a way prose isn’t, and fit-intent queries are increasingly common.
7. country_of_origin
What it is: the country where the product is manufactured.
Where it lives: Shopify metafield, GMC country_of_origin,
Schema.org countryOfOrigin.
Failure mode: omitted because “made in the US” is a marketing claim the catalog uses elsewhere; not knowing it can’t appear in two places without being a structured attribute.
8. care_instructions
What it is: structured care language — Hand wash cold, Dry clean only, Machine wash gentle.
Where it lives: Shopify metafield, GMC product_detail,
Schema.org additionalProperty.
Failure mode: stored as an icon image in the product page chrome without an alt text or structured equivalent. Invisible to AI agents.
The schema pattern for apparel
Built on the Product schema base, extended with apparel-specific properties:
{%- assign variant = product.selected_or_first_available_variant -%}
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": {{ product.title | json }},
"description": {{ product.description | strip_html | json }},
"sku": {{ variant.sku | json }},
{%- if variant.barcode -%}
"gtin13": {{ variant.barcode | json }},
{%- endif -%}
"brand": {
"@type": "Brand",
"name": {{ product.vendor | json }}
},
"category": "Apparel & Accessories > Clothing > {{ product.product_type }}",
"color": {{ variant.option1 | json }},
"size": {{ variant.option2 | json }},
{%- if product.metafields.product.material -%}
"material": {{ product.metafields.product.material | json }},
{%- endif -%}
{%- if product.metafields.product.country_of_origin -%}
"countryOfOrigin": {
"@type": "Country",
"name": {{ product.metafields.product.country_of_origin | json }}
},
{%- endif -%}
"additionalProperty": [
{%- if product.metafields.product.fit -%}
{
"@type": "PropertyValue",
"name": "Fit",
"value": {{ product.metafields.product.fit | json }}
},
{%- endif -%}
{%- if product.metafields.product.care_instructions -%}
{
"@type": "PropertyValue",
"name": "Care Instructions",
"value": {{ product.metafields.product.care_instructions | json }}
}
{%- endif -%}
],
"audience": {
"@type": "PeopleAudience",
"suggestedGender": {{ product.metafields.product.gender | json }},
"suggestedMinAge": 18
},
"offers": {
"@type": "Offer",
"url": {{ shop.url | append: product.url | json }},
"priceCurrency": {{ cart.currency.iso_code | json }},
"price": {{ variant.price | divided_by: 100.0 | json }},
"availability": {%- if variant.available -%}
"https://schema.org/InStock"
{%- else -%}
"https://schema.org/OutOfStock"
{%- endif %}
}
}
</script>
Apparel-specific GMC feed structure
The supplemental feed for apparel must include:
| Attribute | Required | Format |
|---|---|---|
color | Yes | Single normalized color name |
size | Yes | Size value matching size_system |
size_system | Yes | US, EU, UK, JP, CN, AU |
size_type | Optional | regular, petite, tall, plus, maternity |
gender | Yes | male, female, unisex |
age_group | Yes | adult, kids, infant, newborn |
material | Recommended | Comma-separated for blends |
pattern | Optional | solid, striped, floral, plaid |
country_of_origin | Recommended | ISO country code or name |
Skip pattern if products are predominantly solid colors. The
attribute is weighted in pattern-intent queries (“striped wool sweater”)
that may not be high-volume for the catalog.
Reviews
Apparel reviews carry two kinds of information: an aggregate
satisfaction signal (the rating value and review count) and review
text that frequently includes fit feedback (“runs small,” “true to
size,” “size up”). The aggregate signal is what aggregateRating
captures in structured data; the review text is what’s in the
server-rendered page HTML and contributes to the broader index of
the page’s content.
Whether and how AI agents specifically extract fit-feedback phrases from review text is not publicly documented. What’s documented is that server-rendered HTML is read by indexers, JavaScript-only widgets are not reliably indexed, and a server-rendered review section is a more durable input than a widget regardless of what’s done with the extracted content downstream.
Catalog-side discipline:
- Populate
aggregateRatingfrom real review data only. Faking ratings is a Google Merchant Center policy violation and against Bing’s guidelines. - Wire
aggregateRatingfrom the same data source the storefront uses so the values stay in sync. - Render review text in the page HTML rather than only in a client-side widget.
- If running a third-party reviews provider (Yotpo, Okendo,
Stamped, Reviews.io), confirm the integration injects
aggregateRatingonce. Some providers add their own schema block alongside the theme’s; pick one source.
See Review and AggregateRating schema after Google’s 2024 changes for the surfaces that continue to read review structured data and what Google’s narrowing actually changed.
Q&A pairs as a sibling FAQPage block
Apparel pages commonly carry pre-purchase Q&A — fit, sizing, fabric
care, returns. When that content exists, render it as a sibling
FAQPage JSON-LD block alongside the Product block. The two are
separate Schema.org types; they live in two <script type="application/ld+json">
blocks on the same page, not nested. See
Product schema for Shopify
for the rendering pattern.
The contrarian take
Most apparel-SEO content optimizes for Google Shopping with paid campaigns in mind. The free organic surfacing in Google Shopping, in Google AI Overviews, in ChatGPT’s product index, and in Perplexity’s sourcing pulls from the same feed but rewards different attributes — GMC paid campaigns weight bidding-related signals; organic surfacing weights attribute completeness.
Catalogs that pay close attention to GMC paid campaign performance often have feeds optimized for paid efficiency (only the must-have attributes), which underperforms on organic AI surfacing where the optional attributes carry weight. The fix is to maintain the feed for organic surfacing — full attribute coverage — and let the paid campaign work with whatever subset it weights.
Where it breaks
- Made-to-order and limited-run products. Apparel categories with
drops, limited runs, or made-to-order workflows have inventory states
the standard
availabilitydoesn’t cover cleanly. UsePreOrderand apriceValidUntilfor drops; useDiscontinuedfor past drops. - Resale and consignment. Two enums to keep straight:
Schema.org’s
OfferItemConditionuses the IRI form (https://schema.org/NewCondition,UsedCondition,RefurbishedCondition,DamagedCondition); Google Merchant Center accepts the short tokens (new,refurbished,used,damaged). Resale catalogs use theUsedConditionIRI on-page andusedin the feed, paired with detailed condition descriptions. Condition is plausibly read by AI agents for resale-intent queries. - Vintage with one-of-a-kind inventory. Each product is unique,
inventory is 1, sizes are not standardized. The catalog approach is
to render each piece as its own product with
inventoryLevel: 1rather than a variant; the GMC feed treats each as a unique listing.
How attribute coverage maps to scoring
Catalogs with all eight load-bearing attributes structured and exposed perform better on the Description density dimension of Lumio’s AI Readiness Score — the dimension that evaluates how attribute-rich the rendered content is. Catalogs with only the standard four (size, color, material, gender) score lower on that dimension by definition, since fewer attributes are present in the rendered structured data.
What to ship this week
- Add the five missing metafields if they’re not in place:
material,country_of_origin,fit,care_instructions, plus agendermetafield ifgenderisn’t already a product type. - Update
product.liquidto render the apparel-specific schema. - Configure the apparel supplemental feed in GMC with all required attributes.
- Validate ten products end-to-end: admin → product page → Schema.org Validator → GMC diagnostics.
For a 500–2,000 SKU apparel catalog, this is a 4–6 hour project that moves the readiness score 10–15 points and the Google Shopping organic surfacing measurably within 30 days.