Optimization Guide
Shopify Product Specifications Schema: additionalProperty & PropertyValue for AI Agents
AI shopping agents answer spec-matching queries — "laptop with 16GB RAM under $1000", "blender under 5kg with 1000W motor" — by reading structured PropertyValue data, not prose descriptions. Shopify's default JSON-LD omits all technical specifications. Here's how to fix that at catalog scale.
"additionalProperty" array of PropertyValue objects to your Product JSON-LD. Store specs in Shopify metafields (metaobject or typed product metafields), loop over them in product.liquid, and output each spec with name, value, and unitCode. AI agents use this data to rank your products in spec-filtered queries and to answer "what are the specs on the X?" conversational questions.
Why Specifications Structured Data Matters in 2026
In 2025 and 2026, AI shopping agents moved from keyword matching to structured reasoning. ChatGPT Shopping, Google AI Mode, and Perplexity Shopping build a product graph from structured data on your pages — price, availability, brand, category, and specifications — and use that graph to satisfy complex purchase queries.
A customer asking "which 4K projector works in a room larger than 15 feet and costs under $800?" is posing a structured filter query. If your projector's throw ratio, brightness (lumens), and price are in machine-readable PropertyValue pairs, your product appears in the answer set. If they're buried in a paragraph of description text, the agent may miss them entirely or assign low confidence.
Adobe's 2025 Holiday Report shows AI-referred ecommerce traffic converts at 31% above the site average. Spec coverage directly determines whether your products enter the AI agent's candidate set for spec-sensitive queries — the category of high-intent purchases where shoppers already know what they need.
The spec-matching gap in Shopify's default output
Shopify's default product JSON-LD (injected by themes) outputs only: @type: Product, name, description, image, sku, url, and an Offer block with price, priceCurrency, and availability. No additionalProperty. No weight. No depth/width/height. No power ratings, no certifications, no material composition in typed fields.
This means even a well-stocked product page with a detailed spec table has zero machine-readable spec signal in its JSON-LD — all of that information is invisible to AI agents reasoning over structured data.
PropertyValue: The Schema.org Type for Specs
A PropertyValue is a name-value pair with optional typing. Each one goes inside the additionalProperty array on a Product object.
{
"@type": "Product",
"name": "UltraCharge 20000mAh Power Bank",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Capacity",
"value": "20000",
"unitCode": "D30",
"unitText": "mAh"
},
{
"@type": "PropertyValue",
"name": "Maximum Output Power",
"value": "65",
"unitCode": "WTT",
"unitText": "W"
},
{
"@type": "PropertyValue",
"name": "Weight",
"value": "330",
"unitCode": "GRM",
"unitText": "g"
},
{
"@type": "PropertyValue",
"name": "Ports",
"value": "2× USB-C, 1× USB-A"
},
{
"@type": "PropertyValue",
"name": "Certification",
"value": "CE, FCC, RoHS"
},
{
"@type": "PropertyValue",
"name": "Compatible with",
"value": "USB-C laptops, iPhone 15+, Android"
}
]
}
Key PropertyValue fields
| Field | Type | Required? | Purpose |
|---|---|---|---|
@type |
String | Yes | Always "PropertyValue" |
name |
String | Yes | Human-readable spec label ("Battery life", "Weight", "Voltage") |
value |
String or Number | Yes | The measured value — use a number for numeric specs |
unitCode |
String (UN/CEFACT) | For numeric specs | Enables unit-aware filtering and cross-product comparison |
unitText |
String | Recommended | Human-readable unit label alongside unitCode |
propertyID |
URI | Optional | Links to a vocabulary definition (GS1, Wikidata, schema.org) |
Common Unit Codes (UN/CEFACT) for Product Specs
| Unit | unitCode | Common use |
|---|---|---|
| Kilogram | KGM | Product weight (heavier items) |
| Gram | GRM | Product weight (smaller items) |
| Pound | LBR | Product weight (US market) |
| Centimetre | CMT | Dimensions (L×W×H) |
| Millimetre | MMT | Small dimensions (thickness, gap) |
| Inch | INH | Dimensions (US market, screen size) |
| Metre | MTR | Cable length, room coverage |
| Litre | LTR | Tank or container capacity |
| Millilitre | MLT | Small volume (serums, shots) |
| Watt | WTT | Power rating (motors, chargers) |
| Milliampere-hour | D30 | Battery capacity (mAh) |
| Hour | HUR | Battery life, run time |
| Volt | VLT | Input/output voltage |
| Degree Celsius | CEL | Operating temperature range |
| Percent | P1 | Humidity rating, efficiency |
| Decibel | 2N | Noise level |
Shopify Implementation: Metafield-Driven Specs at Scale
For a catalog with many products, hardcoding specifications inside product.liquid is unmanageable. The right architecture stores specs in Shopify metafields and injects them into JSON-LD via Liquid.
Option 1: JSON metafield (simple catalogs)
Create a product metafield with namespace specs, key attributes, and type json. Store an array of spec objects:
[
{"name": "Weight", "value": "330", "unitCode": "GRM", "unitText": "g"},
{"name": "Capacity", "value": "20000", "unitCode": "D30", "unitText": "mAh"},
{"name": "Max Output", "value": "65", "unitCode": "WTT", "unitText": "W"}
]
{% comment %} In product.liquid — JSON-LD injection {% endcomment %}
{% if product.metafields.specs.attributes %}
{% assign specs = product.metafields.specs.attributes.value %}
"additionalProperty": [
{% for spec in specs %}
{
"@type": "PropertyValue",
"name": {{ spec.name | json }},
"value": {{ spec.value | json }}
{% if spec.unitCode %}, "unitCode": {{ spec.unitCode | json }}{% endif %}
{% if spec.unitText %}, "unitText": {{ spec.unitText | json }}{% endif %}
}{% unless forloop.last %},{% endunless %}
{% endfor %}
],
{% endif %}
Option 2: Metaobject (larger catalogs with reusable spec templates)
Create a product_spec metaobject type with fields: spec_name (single_line_text), spec_value (single_line_text), unit_code (single_line_text). Attach a list.metaobject reference metafield on each product. In Liquid, loop over the metaobject list entries. This allows the same spec definition to be reused across product variants sharing a spec template.
Option 3: Standard measurement metafields (weight and dimensions)
Shopify has native weight (in grams) on every product. For physical dimensions you can add standard metafields custom.length, custom.width, custom.height (type: dimension). Shopify's dimension type stores both value and unit — output them using:
{% assign dim = product.metafields.custom.length.value %}
{
"@type": "PropertyValue",
"name": "Length",
"value": "{{ dim.value }}",
"unitCode": "{% if dim.unit == 'mm' %}MMT{% elsif dim.unit == 'cm' %}CMT{% elsif dim.unit == 'in' %}INH{% endif %}",
"unitText": "{{ dim.unit }}"
}
Spec Categories Worth Prioritising by Product Type
| Category | Key specs to mark up | Why AI agents need it |
|---|---|---|
| Electronics | Battery life, screen size, resolution, RAM, storage, connectivity (WiFi spec, Bluetooth version) | Spec-filtering queries dominate electronics purchase intent |
| Appliances | Power (W), capacity (L), noise level (dB), energy class, dimensions | Room-fit and energy queries are high-frequency pre-purchase |
| Furniture | Dimensions (L×W×H), weight capacity, material, assembly required (yes/no) | Room-fit is the #1 rejection reason — precise measurements convert |
| Outdoor/Sports | Weight, load rating, temperature range, water resistance (IPX rating) | Activity-matching queries need load and weather specs |
| Supplements/Food | Serving size, servings per container, protein/macro content per serving | AI nutrition queries filter by per-serving macros, not totals |
| Apparel | Fabric weight (GSM), fabric composition (%), care method, country of manufacture | Fabric queries from eco-conscious and allergy-aware shoppers |
Before and After: Blender Product Page
{
"@type": "Product",
"name": "PowerBlend Pro 1200W",
"description": "High-performance blender
with 1200W motor, 2L BPA-free jar,
and 6 speed settings.",
"offers": {"price": "149.99", ...}
}
AI agent query "1200W blender under $200 with at least 1.5L capacity" — cannot confirm capacity from structured data. Low confidence, may not cite.
{
"@type": "Product",
"name": "PowerBlend Pro 1200W",
"additionalProperty": [
{"@type":"PropertyValue",
"name":"Motor Power",
"value":"1200","unitCode":"WTT"},
{"@type":"PropertyValue",
"name":"Jar Capacity",
"value":"2","unitCode":"LTR"},
{"@type":"PropertyValue",
"name":"BPA Free","value":"Yes"},
{"@type":"PropertyValue",
"name":"Speed Settings",
"value":"6"}
],
"offers": {"price": "149.99", ...}
}
AI agent confirms: motor 1200W ✓, capacity 2L > 1.5L ✓, price $149.99 < $200 ✓. High-confidence recommendation with source citation.
Common Mistakes
- Duplicating standard fields as PropertyValue — don't add
name: "Color", value: "Red"when color is already in thecolorproperty. Use additionalProperty for specs that have no dedicated schema.org field. - Using strings where numbers belong —
value: "1200W"is harder for agents to compare thanvalue: "1200", unitCode: "WTT". Numeric values with unitCode enable range filtering. - Mixing units within a catalog — some products in kg, others in lbs. AI agents doing cross-product comparison need consistent units per category. Standardise in your metafield schema.
- Omitting specs that disqualify competitors — if your product is IPX7 waterproof and competitors aren't, that's your most powerful structured signal. Mark it up.
- Too many low-value specs — more than 20 PropertyValue entries increases parsing time and dilutes signal weight. Prioritise the 8–12 specs most likely to appear in purchase queries.
CatalogScan Checks for Product Specifications
CatalogScan's AI Readiness scan evaluates product specification coverage as part of its 18-signal audit. Signals checked include: presence of additionalProperty on Product JSON-LD, numeric values with proper unitCode, weight and dimension coverage for physical products, and consistency of spec names across variants. The scan flags products with zero spec structured data as high-priority improvement candidates because they are invisible to spec-filtering AI queries.
Related guides: ProductGroup & hasVariant for variant specs · Shopify schema markup overview · Product weight & dimensions schema · GTIN & barcode guide
FAQ
How do I add technical specifications to Shopify product JSON-LD?
Add an additionalProperty array to your Product JSON-LD block. Each element is a PropertyValue object with name, value, and optionally unitCode. Store spec data in product metafields and loop over them in product.liquid to generate the array automatically across your catalog.
What is PropertyValue in schema.org and why do AI agents need it?
PropertyValue is a schema.org type representing a named attribute with a typed, optionally unit-coded value. AI shopping agents use PropertyValue pairs to filter products by specs in queries like "laptop with 16GB RAM under $1000" — a task impossible from free-text descriptions alone.
Does Shopify output additionalProperty in its default product JSON-LD?
No. You must extend product.liquid with a Liquid loop that reads spec data from product metafields and outputs PropertyValue objects. Shopify's built-in JSON-LD only generates name, description, image, SKU, url, and an Offer block.
Which unit codes should I use for product specifications in schema.org?
Use UN/CEFACT Common Code identifiers: KGM (kg), GRM (g), CMT (cm), INH (inch), LTR (litre), WTT (watt), HUR (hour), D30 (mAh), P1 (percent). Including proper unit codes enables AI agents to do unit-aware filtering and cross-product comparison.
How many specifications should each Shopify product have in JSON-LD?
8–15 for tech-heavy products (electronics, appliances, furniture); 3–8 for simpler items. Focus on the specs most likely to appear in purchase queries: dimensions, power/capacity, weight, certifications, and compatibility. Avoid duplicating data already in dedicated schema.org fields.