Structured Data Guide
Ecommerce Product Condition Structured Data
AI shopping agents use the itemCondition field in JSON-LD as a hard filter for condition-specific queries. A refurbished laptop without RefurbishedCondition in its structured data won't appear in "refurbished laptop" AI recommendations — regardless of how well its title and description match the query.
itemCondition on every Offer block. For new products: NewCondition. For refurbished/certified pre-owned: RefurbishedCondition. For used/secondhand: UsedCondition. For open-box, use RefurbishedCondition + a description qualifier. Shopify's default JSON-LD omits this field — set it explicitly in your theme's product JSON-LD snippet.
The schema.org OfferItemCondition Enum
| Value | Full URL | When to use | AI agent behavior |
|---|---|---|---|
NewCondition |
schema.org/NewCondition | Brand new, unused, in original packaging | Default for most product queries; appears in all new-product results |
RefurbishedCondition |
schema.org/RefurbishedCondition | Professionally restored, tested, cleaned — may include warranty | Surfaces for "refurbished", "certified pre-owned", "renewed" queries |
UsedCondition |
schema.org/UsedCondition | Previously owned, as-is or lightly used | Surfaces for "used", "secondhand", "pre-owned" queries |
DamagedCondition |
schema.org/DamagedCondition | Has known defects, damage, or missing components | Niche surfacing for "for parts", "cosmetic damage" queries |
OldCondition |
schema.org/OldCondition | Vintage, antique, or no longer manufactured | Surfaces for vintage/antique category queries |
Implementing itemCondition in Shopify JSON-LD
Basic condition from product tag or metafield
Shopify doesn't have a native condition field. The two common approaches are a product tag ("condition:new", "condition:refurbished") or a metafield (product.metafields.custom.condition). Both work well in Liquid:
{%- comment -%}
Approach 1: Use a product tag in format "condition:value"
Tag examples: "condition:new", "condition:refurbished", "condition:used"
{%- endcomment -%}
{%- assign condition_url = 'https://schema.org/NewCondition' -%}
{%- for tag in product.tags -%}
{%- if tag contains 'condition:' -%}
{%- assign condition_val = tag | remove: 'condition:' | strip | downcase -%}
{%- if condition_val == 'refurbished' -%}
{%- assign condition_url = 'https://schema.org/RefurbishedCondition' -%}
{%- elsif condition_val == 'used' -%}
{%- assign condition_url = 'https://schema.org/UsedCondition' -%}
{%- elsif condition_val == 'damaged' -%}
{%- assign condition_url = 'https://schema.org/DamagedCondition' -%}
{%- elsif condition_val == 'old' or condition_val == 'vintage' -%}
{%- assign condition_url = 'https://schema.org/OldCondition' -%}
{%- endif -%}
{%- break -%}
{%- endif -%}
{%- endfor -%}
"itemCondition": {{ condition_url | json }}
Approach 2: Metafield-based condition
{%- comment -%}
Create a metafield: product.metafields.custom.condition
with values: "new", "refurbished", "used", "damaged", "vintage"
{%- endcomment -%}
{%- assign condition_meta = product.metafields.custom.condition | downcase -%}
{%- case condition_meta -%}
{%- when 'refurbished' -%}{%- assign condition_url = 'https://schema.org/RefurbishedCondition' -%}
{%- when 'used' -%}{%- assign condition_url = 'https://schema.org/UsedCondition' -%}
{%- when 'damaged' -%}{%- assign condition_url = 'https://schema.org/DamagedCondition' -%}
{%- when 'vintage', 'old' -%}{%- assign condition_url = 'https://schema.org/OldCondition' -%}
{%- else -%}{%- assign condition_url = 'https://schema.org/NewCondition' -%}
{%- endcase -%}
"itemCondition": {{ condition_url | json }}
Multi-Condition Catalogs
Stores selling both new and refurbished versions of the same product should create separate Offer blocks — one per condition — rather than using a single Offer with a condition that describes both:
"offers": [
{
"@type": "Offer",
"name": "New",
"price": "{{ new_price }}",
"priceCurrency": "USD",
"itemCondition": "https://schema.org/NewCondition",
"availability": "https://schema.org/InStock"
},
{
"@type": "Offer",
"name": "Certified Refurbished",
"price": "{{ refurb_price }}",
"priceCurrency": "USD",
"itemCondition": "https://schema.org/RefurbishedCondition",
"availability": "https://schema.org/InStock",
"description": "Professionally refurbished. 90-day warranty included."
}
]
This dual-offer pattern lets AI agents recommend the appropriate tier: a "refurbished DSLR" query recommends the RefurbishedCondition Offer, while a "new DSLR" query recommends the NewCondition Offer — from the same product page.
Condition-Specific Description Patterns
AI agents extract condition context from both the structured itemCondition value and the surrounding Offer and product description text. For maximum coverage, include explicit condition language in description fields:
| Condition | Recommended description language |
|---|---|
| RefurbishedCondition | "Professionally refurbished. Tested to manufacturer specifications. [N]-day warranty. May show light cosmetic wear." |
| UsedCondition (Good) | "Used — Good condition. Functional and fully tested. Normal signs of use. No major damage." |
| UsedCondition (Fair) | "Used — Fair condition. Functional. Shows visible wear including [specific details]. Sold as-is." |
| Open box (as RefurbishedCondition) | "Open box — opened but unused. All original accessories included. Full manufacturer warranty applies." |
| DamagedCondition | "For parts or repair. [Specific defect description]. Does not power on / [issue]. Sold as-is, no returns." |
Condition and Return Policy Interaction
AI agents correlate product condition with return policy signals. Refurbished products with no return policy are surfaced less confidently by ChatGPT Shopping and Perplexity Shopping than refurbished products with explicit warranty or return terms. The interaction:
| itemCondition | MerchantReturnPolicy present? | AI agent confidence |
|---|---|---|
| NewCondition | Yes (30-day return) | High |
| RefurbishedCondition | Yes (90-day warranty) | High |
| RefurbishedCondition | No return policy specified | Medium |
| UsedCondition | Yes (14-day return) | Medium |
| UsedCondition or DamagedCondition | No / final sale | Lower — note "final sale" in description |
Product Condition Structured Data Checklist
| # | Check | Priority |
|---|---|---|
| 1 | itemCondition field is present on every Offer block |
Critical |
| 2 | Refurbished/used products use the correct schema.org URL (not a plain text string like "used") | Critical |
| 3 | Multi-condition products have separate Offer blocks per condition with distinct prices | High |
| 4 | Condition context in Offer description matches the itemCondition value |
High |
| 5 | Refurbished products have associated MerchantReturnPolicy or warranty description |
High |
| 6 | Open-box products identified as RefurbishedCondition + "open box" qualifier in description | Medium |
| 7 | DamagedCondition products include specific defect description to prevent misleading recommendations | Medium |
| 8 | Condition stored in consistent metafield or tag format for scalable Liquid output | Medium |
Related Resources
- Shopify Schema Markup Guide — full Offer block reference including all OfferItemCondition values and Liquid snippets.
- Ecommerce Return Policy Structured Data — MerchantReturnPolicy implementation for refurbished and used product warranties.
- Shopify Product Availability Structured Data — availability signals that interact with condition for refurbished catalog pages.
- AI Shopping Agent Product Ranking Factors — how itemCondition factors into the 18 catalog signals scored by CatalogScan.
Frequently Asked Questions
What schema.org values are valid for product condition?
schema.org defines five OfferItemCondition values: NewCondition (brand new), RefurbishedCondition (professionally restored), UsedCondition (previously owned), DamagedCondition (has known defects), and OldCondition (no longer manufactured). Always use the full URL format: https://schema.org/NewCondition, etc.
Do AI shopping agents filter by product condition?
Yes, directly. AI shopping agents use itemCondition as a hard filter for condition-specific queries like "refurbished MacBook" or "used camera." Missing itemCondition defaults to NewCondition in most agent interpretations — incorrect for used/refurbished sellers and causes those products to be excluded from condition-specific searches.
How should I handle open-box condition in Shopify JSON-LD?
schema.org does not have an official OpenBoxCondition type. Use RefurbishedCondition if the item has been professionally inspected, or NewCondition with a qualifier in the Offer description: "Open box — tested, unused, full warranty applies." AI agents that parse offer descriptions can surface the "open box" qualifier even when the structured type is RefurbishedCondition.
Does product condition in JSON-LD affect Google Shopping listings?
Yes. Google Shopping's Product data specification requires itemCondition for non-new products. Missing condition data on used or refurbished products causes "Missing or invalid value [condition]" errors in Google Merchant Center and can result in disapproved listings. Setting it correctly also helps Google's AI shopping features properly categorize your listings in condition-filtered searches.
Audit Product Condition Across Your Catalog
CatalogScan checks every Offer block for missing or incorrect itemCondition values — including refurbished products incorrectly labeled as NewCondition and used products with no condition signal at all.