GUIDE № 15 · STRUCTURED DATA
additionalProperty Schema for Shopify: The Field That Lets AI Filter You In
Your product title says what it is. Your schema should say who it's for, why it's better, and what makes it different.
AI engines filter product recommendations by buyer-specific attributes: "gluten-free," "ships in under 48 hours," "third-party lab tested." If your product schema is just title, description, and price, AI can't filter you in. The additionalProperty array is where that filterability lives — and almost no Shopify theme generates it by default. This guide covers the six attributes worth emitting, the JSON-LD shape, and how to verify the markup passes validation.
What additionalProperty does
additionalProperty is a field on the schema.org Product type. It takes an array of PropertyValue objects, each with a name and a value. That's the whole shape. It's the structured way to say things about your product that don't fit into the standard fields — not the price, not the title, not the brand, but the specific attributes buyers actually filter on.
The standard Product schema covers identity and commerce: name, brand, sku, gtin, offers. Those fields tell an AI what the product is. They don't tell it who it's for, what regulatory box it ticks, or what's genuinely different about it compared to the other ten results.
When a shopper asks an assistant for "a gluten-free vanilla whey protein that ships fast and is third-party tested," the assistant is matching the buyer's query against attributes it can read from your schema. Products that surfaced those attributes in structured form pass cleanly. Products that only mention them buried in a description often don't, because the assistant can't reliably disambiguate marketing adjectives from declared attributes.
The umbrella schema work — Product, Organization, BreadcrumbList — is covered in the JSON-LD structured data guide. This guide is specifically about the additionalProperty array.
The six buyer attributes to emit
You don't need twenty properties. Six covers almost every category we audit, and each maps to a real question buyers ask assistants before buying:
- Primary Use Case — what the product is actually for. "Post-workout recovery." "Weeknight dinner prep." Buyers ask AI by use case before they ask by category.
- Who It's For — the specific buyer segment. "Adults with lactose intolerance." "Side-sleepers with shoulder pain." The assistant matches this directly to the buyer's phrasing.
- Key Benefit — the concrete claim that separates you. "Lactose under 0.5g per serving." "Holds 40 hours of charge." Numbers beat adjectives here.
- Certifications — third-party credentials. "NSF Certified." "USDA Organic." "Third-party lab tested." Trust signals the assistant propagates into its answer.
- Dietary — for food, supplements, and skincare. "Gluten-free, Soy-free." "Vegan." Exactly the filter buyers apply when narrowing a shortlist.
- Ships In — fulfillment speed. "Ships in under 48 hours." "Same-day dispatch." Shipping speed often breaks ties between otherwise-similar products.
Not every property applies to every product. A cutting board doesn't need a Dietary field. Pick the four or five that genuinely apply and leave the rest out. An empty value or a generic "N/A" dilutes the signal — it's worse than not emitting the property at all.
How to check your product schema
Before you add anything, check whether your theme or a schema app is already emitting additionalProperty. On most Shopify stores it's blank, but a handful of themes and schema apps emit a minimal version. View-source on a product page (Cmd+U) and search for additionalProperty. From the terminal:
curl -s https://yourstore.com/products/whey-isolate-vanilla-2lb \
| grep -o '"additionalProperty":\[[^]]*\]' | head -1
If that returns nothing, you're in the default state — no additionalProperty array at all. If it returns an array, read the entries. Most default themes that do emit the field only populate it with variant options (color, size) copied from the product editor. That's not useless, but it's not the buyer-attribute layer this guide is about. The canonical Shopify gap is a Product block with name, image, description, sku, brand, and offers, and no additionalProperty anywhere.
How to add additionalProperty to Shopify
Two paths, same structure as the FAQPage schema work. The app path is right for most stores. The manual path fits if you already have a developer in your theme and want one fewer app.
App path: use a schema app. Schema Plus and JSON-LD for SEO both emit extended Product schema with room for custom properties. Both let you map product metafields into the additionalProperty array, so editors can update attributes in the admin without touching code. Install, create metafields for the six attributes (custom.primary_use_case, custom.who_its_for, etc.), and tell the app which metafields feed which property names.
Manual path: inject the JSON-LD in your product template. If you'd rather not install another app, add a snippet to sections/main-product.liquid or a dedicated snippets/product-schema.liquid. The shape:
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "NutriPure Whey Isolate Protein Powder Vanilla 2lb",
"additionalProperty": [
{ "@type": "PropertyValue", "name": "Primary Use Case", "value": "Post-workout recovery" },
{ "@type": "PropertyValue", "name": "Who It's For", "value": "Adults with lactose intolerance" },
{ "@type": "PropertyValue", "name": "Key Benefit", "value": "Lactose under 0.5g per serving" },
{ "@type": "PropertyValue", "name": "Certifications", "value": "Third-party lab tested, NSF Certified" },
{ "@type": "PropertyValue", "name": "Dietary", "value": "Gluten-free, Soy-free" },
{ "@type": "PropertyValue", "name": "Ships In", "value": "Ships in under 48 hours" }
]
}
</script>
In Liquid, pull each value from a metafield so the copy lives with the product, not the theme. Store the metafield as a JSON list of {name, value} pairs and loop it into the array at render time — editors can then reorder, add, or remove attributes without a code change. If a product doesn't have a value for a given property, leave the metafield entry out entirely; don't emit empty PropertyValue objects.
Keep identifiers in the same Product block. The gtin and sku fields do separate work — disambiguating your product across retailers — and belong in the parent schema alongside additionalProperty. See the GTIN and barcodes guide for the identifier side of the same block.
Writing values AI actually uses
The property name is fixed; the value is where the work happens. A few rules from the schema blocks we've reviewed across our scan corpus:
Numbers beat adjectives. "Lactose under 0.5g per serving" is a filterable claim. "Low-lactose" is marketing. The assistant can match a shopper's "lactose under 1 gram" query against the first and has to guess at the second. Whenever a claim has a real number behind it — grams, hours, inches, percent — put the number in the value.
Use the buyer's phrasing, not yours. If your internal taxonomy calls something "gut-friendly fermentation" but shoppers type "probiotic" into AI, the value should say "Probiotic." additionalProperty is a matching layer, not a branding surface.
Certifications get their full name. "NSF Certified" not "NSF." "USDA Organic" not "Organic." The longer form matches how buyers ask and how regulators write. Abbreviations sometimes match, sometimes don't, depending on how the assistant tokenizes.
Comma-separate multiple values inside a single property. "Gluten-free, Soy-free" in a single Dietary value is easier to maintain than two separate entries named "Dietary 1" and "Dietary 2." Assistants parse the commas and treat each entry as an independent filterable claim.
Keep values short. Under 80 characters, ideally under 50. A PropertyValue isn't a sales paragraph — it's a tag that decides whether your product survives a filter. Anything that reads like "high quality," "premium," or "best in class" doesn't belong here. Those aren't attributes; they're adjectives every competitor emits. Keep this block to claims a skeptical buyer could verify.
Edge cases: multi-variant, metafield-sourced, unrecognized names
Multi-variant products. If attributes differ across variants — a vanilla flavor is gluten-free but a chocolate flavor isn't — the array should live on the variant-scoped schema, not just the parent product. Schema Plus and JSON-LD for SEO both handle this by emitting a separate Product block per variant. Manually, loop product.variants in Liquid and emit one block per variant with its own array sourced from variant-level metafields. Parent-only schema is fine when every variant shares attributes; otherwise you'll mislead the assistant on non-default variants.
Metafield-sourced attributes. If attributes are already stored in metafields for a PIM integration, don't duplicate them — point the JSON-LD at the same metafield. The worst outcome is two sources of truth drifting apart; the admin says "Gluten-free" and stale schema says "Contains gluten."
Unrecognized property names. Schema.org doesn't publish a canonical list of names for PropertyValue — you can use any string. The downside: obscure names like "Vibe Profile" don't match what buyers type. Stick to the six in this guide plus category-standard names (Wattage, Caffeine Content, SPF, Thread Count).
Overlap with the description. Attributes in additionalProperty should also appear in the description — the assistant cross-references to confirm the schema isn't lying. A product that claims "Third-party lab tested" in schema but never mentions testing in the description looks suspicious. The product descriptions AI will quote piece has the description side of this pairing.
Verify the fix worked
Once the schema is rendering, run the markup through two validators before you trust it:
- Google's Rich Results Test at
search.google.com/test/rich-results. Paste a product URL and expand the Product card. TheadditionalPropertyentries should list under the product with eachnameandvalueas a pair. - Schema Markup Validator at
validator.schema.org. The strict schema.org-native validator — less forgiving than Google's, useful for catching subtle type errors (missing@type, wrong nesting) that Rich Results Test sometimes lets slide.
A valid Product block with additionalProperty produces zero errors on Rich Results Test and a clean tree on Schema Markup Validator with each PropertyValue expanded. If Google can parse the markup, ChatGPT and Claude almost certainly can too.
The AI-side confirmation takes longer. A week or two after deploy, ask an assistant an attribute-filtered question — "gluten-free vanilla whey protein that ships in under 48 hours" — and see whether the product surfaces. If the assistant quotes the specific value back ("this one is third-party lab tested and ships in under 48 hours"), the array is working. Pair with the broader testing pattern in test what ChatGPT knows about your store.
additionalProperty is the difference between a product AI can describe and a product AI can filter. Titles get you matched on category. Descriptions get you quoted for depth. The property array is what gets you through the filter step that runs before either of those. Run a free audit on your store →