Optimization Guide
Shopify Warranty and Guarantee Structured Data for AI Shopping Agents
AI shopping agents answer "laptops with 3-year warranty" and "appliances with lifetime guarantee" by reading structured data — not your product description tab. Shopify's default JSON-LD includes zero warranty signals, making your coverage terms invisible to every AI shopping index.
WarrantyPromise block to your product Offer JSON-LD via the warranty property. Include durationOfWarranty as a QuantitativeValue (e.g., value: 2, unitCode: "ANN") and warrantyScope specifying coverage type. Store warranty data in Shopify product metafields (product.metafields.warranty.years) and inject conditionally in product.liquid. Extended protection plans go in additionalProperty on the same Offer.
The Warranty Visibility Gap
Warranty information is one of the strongest purchase-decision signals for durables — electronics, appliances, tools, outdoor gear. Yet in virtually every Shopify store, warranty terms live in one of three invisible places: a product description tab injected by a theme feature, a metafield displayed as plain text, or a footer trust badge. None of these surfaces are machine-readable by AI shopping agents.
When ChatGPT, Perplexity Shopping, or Google AI Mode answers "which air fryer has the longest warranty?" or "compare dishwashers by warranty coverage," they are reading structured WarrantyPromise data — not your product page copy. Stores without warranty JSON-LD are simply absent from these recommendation results, regardless of how prominently they display warranty terms on the page.
Warranty query types that require structured data
| Query type | Example | Required signal | AI shopping behavior |
|---|---|---|---|
| Duration filter | "laptops with 3-year warranty" | durationOfWarranty: {value: 3, unitCode: "ANN"} |
Filters products by warranty duration threshold |
| Lifetime guarantee | "lifetime warranty cookware" | durationOfWarranty: {value: 99, unitCode: "ANN"} + additionalProperty: lifetimeWarranty |
Surfaces products explicitly declaring unlimited/lifetime term |
| Coverage type | "drills with parts and labor warranty" | warrantyScope: "https://schema.org/PartsAndLabor" |
Distinguishes full vs. limited vs. parts-only coverage |
| Warranty comparison | "compare robot vacuums by warranty" | Both durationOfWarranty + warrantyScope |
Builds comparison table from WarrantyPromise across products |
| Extended plan available | "refrigerators with extended warranty option" | additionalProperty: extendedWarranty with plan details |
Surfaces products that offer optional extended protection |
Shopify default vs. warranty-complete JSON-LD
{
"@type": "Offer",
"price": "299.00",
"priceCurrency": "USD",
"availability":
"InStock"
// warranty: invisible
}
{
"@type": "Offer",
"price": "299.00",
"warranty": {
"@type":
"WarrantyPromise",
"durationOfWarranty": {
"@type":
"QuantitativeValue",
"value": 2,
"unitCode": "ANN"
},
"warrantyScope":
"https://schema.org/
PartsAndLabor"
}
}
Warranty JSON-LD Patterns
Minimum viable warranty — duration and scope
The most impactful addition is a WarrantyPromise with duration and scope attached to the product Offer. This is sufficient to appear in duration-filter and coverage-type queries:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Cordless Drill — 20V Max",
"offers": {
"@type": "Offer",
"price": "149.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": 3,
"unitCode": "ANN"
},
"warrantyScope": "https://schema.org/PartsAndLabor"
}
}
}
Full warranty with extended protection plan option
For stores offering optional extended plans (via Extend, Asurion, or in-house programs), declare the base warranty via WarrantyPromise and the extended option via additionalProperty on the same Offer:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "55\" 4K Smart TV",
"offers": {
"@type": "Offer",
"price": "549.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": 1,
"unitCode": "ANN"
},
"warrantyScope": "https://schema.org/Parts"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "extendedWarranty",
"name": "Extend Protection Plan",
"value": "2-year or 3-year extended coverage available via Extend — covers accidental damage, power surges, and mechanical failure"
},
{
"@type": "PropertyValue",
"propertyID": "warrantyRegistrationRequired",
"value": "false"
}
]
}
}
Lifetime warranty declaration
Schema.org's QuantitativeValue has no "unlimited" unitCode. The convention for lifetime warranty is to use a very high year value (99) combined with a lifetimeWarranty additionalProperty so both structured parsers and AI text parsers understand the term is lifetime:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Cast Iron Skillet — 12 inch",
"offers": {
"@type": "Offer",
"price": "89.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": 99,
"unitCode": "ANN",
"description": "Lifetime warranty"
},
"warrantyScope": "https://schema.org/PartsAndLabor"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "lifetimeWarranty",
"value": "true"
},
{
"@type": "PropertyValue",
"propertyID": "warrantyDescription",
"value": "Lifetime warranty against manufacturing defects — we replace or repair at no cost, no questions asked"
}
]
}
}
Multi-component warranty (different coverage per part)
Some products carry different warranty terms for different components — for example, a battery warranted for 1 year while the motor carries 3 years. Use multiple WarrantyPromise entries in an array or declare each via additionalProperty:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Electric Lawn Mower — 40V",
"offers": {
"@type": "Offer",
"price": "349.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
"value": 5,
"unitCode": "ANN"
},
"warrantyScope": "https://schema.org/PartsAndLabor"
},
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "batteryWarrantyYears",
"name": "Battery warranty",
"value": "2"
},
{
"@type": "PropertyValue",
"propertyID": "motorWarrantyYears",
"name": "Motor warranty",
"value": "5"
}
]
}
}
Shopify Liquid Implementation
Store warranty data as product metafields. Create a metafield namespace warranty with the following fields in Shopify Admin → Settings → Custom data → Products:
| Metafield key | Type | Example value | Purpose |
|---|---|---|---|
warranty.duration_years |
Integer | 3 |
Warranty length in years for QuantitativeValue |
warranty.scope |
Single-line text | PartsAndLabor |
WarrantyScope: PartsAndLabor, Parts, or Labor |
warranty.is_lifetime |
Boolean | true |
Triggers lifetime warranty pattern (value: 99) |
warranty.extended_plan_available |
Boolean | true |
Whether an extended protection plan is offered |
warranty.extended_plan_provider |
Single-line text | Extend |
Provider name for extended plan additionalProperty |
Add this block inside your product JSON-LD Offer object in product.liquid or your product JSON-LD snippet:
{% assign warranty_years = product.metafields.warranty.duration_years %}
{% assign warranty_scope = product.metafields.warranty.scope | default: 'PartsAndLabor' %}
{% assign is_lifetime = product.metafields.warranty.is_lifetime %}
{% if warranty_years or is_lifetime %}
"warranty": {
"@type": "WarrantyPromise",
"durationOfWarranty": {
"@type": "QuantitativeValue",
{% if is_lifetime %}
"value": 99,
"unitCode": "ANN",
"description": "Lifetime warranty"
{% else %}
"value": {{ warranty_years }},
"unitCode": "ANN"
{% endif %}
},
"warrantyScope": "https://schema.org/{{ warranty_scope }}"
},
{% endif %}
{% assign extended = product.metafields.warranty.extended_plan_available %}
{% assign ext_provider = product.metafields.warranty.extended_plan_provider %}
{% if extended %}
"additionalProperty": [
{
"@type": "PropertyValue",
"propertyID": "extendedWarranty",
"name": "{{ ext_provider | default: 'Extended Protection Plan' }}",
"value": "Extended warranty available — covers mechanical failure and accidental damage beyond standard warranty"
}
{% if is_lifetime %}
,{
"@type": "PropertyValue",
"propertyID": "lifetimeWarranty",
"value": "true"
}
{% endif %}
],
{% endif %}
WarrantyScope Reference
| WarrantyScope value | URL | What it covers | Best for |
|---|---|---|---|
PartsAndLabor |
https://schema.org/PartsAndLabor |
Replacement parts + technician labor costs | Appliances, power tools, electronics |
Parts |
https://schema.org/Parts |
Replacement parts only; customer pays labor | Budget appliances, auto parts |
Labor |
https://schema.org/Labor |
Labor costs only; customer pays for parts | Installation services, repair services |
| Limited (custom) | Use Parts + additionalProperty describing scope |
Coverage excludes specific causes (water damage, misuse) | Consumer electronics, outdoor gear |
Common Mistakes
| Mistake | Impact | Fix |
|---|---|---|
| Warranty text in product description only | AI agents cannot parse warranty duration or scope from free text | Add WarrantyPromise to Offer JSON-LD; keep the text too for humans |
Using durationOfWarranty without warrantyScope |
AI agents know duration but cannot answer coverage-type queries | Always include both durationOfWarranty and warrantyScope |
Placing warranty on Product instead of Offer |
warranty is an Offer property — misplacement causes schema validation errors |
Attach warranty inside the offers block, not at the Product level |
| Hardcoding warranty years in Liquid template | When warranty terms change, every product page is wrong | Drive warranty from metafields so you update once in Admin, not in code |
| Extended plan missing provider name | AI agents cannot match "Extend protection plan" or "Asurion warranty" queries | Include the provider name explicitly in additionalProperty.name |
Implementation Checklist
- Create warranty metafield namespace in Shopify Admin → Settings → Custom data → Products
- Add
duration_years,scope,is_lifetime, andextended_plan_availablemetafields - Fill warranty metafields for all products that carry a warranty (start with top-selling SKUs)
- Add
WarrantyPromiseblock inside theOfferobject inproduct.liquidJSON-LD - Use Liquid conditional so the block only outputs when
warranty.duration_yearsoris_lifetimeis set - Include
warrantyScopeusing the correct schema.org URI (not just the string) - For lifetime warranty, use
value: 99, unitCode: "ANN"+lifetimeWarranty: trueadditionalProperty - For extended plans, add
extendedWarrantyadditionalProperty with provider name - Validate with Rich Results Test and Schema.org Validator after adding WarrantyPromise block
- Run CatalogScan to confirm warranty signals appear in your AI readiness score
Frequently Asked Questions
How do I add warranty information to Shopify product structured data?
Add a warranty property to your product Offer JSON-LD containing a WarrantyPromise type. Include durationOfWarranty as a QuantitativeValue with value (number) and unitCode ("ANN" for years, "MON" for months), plus warrantyScope with the appropriate schema.org URI. Store warranty data in product metafields and inject conditionally in product.liquid.
What is WarrantyPromise in schema.org?
WarrantyPromise is a schema.org type describing the warranty terms of an Offer. It has two key properties: durationOfWarranty (a QuantitativeValue with duration length and unit) and warrantyScope (a WarrantyScope enumeration — PartsAndLabor, Parts, or Labor). Attach it to an Offer via the warranty property. AI agents use it to filter products in warranty-duration and coverage-type queries.
Can I declare extended warranty or protection plans in structured data?
Yes. Add an additionalProperty to the Offer with propertyID: "extendedWarranty" and include the plan provider name and coverage description in the value. For structured parsing, also include whether the plan is optional (most are) and the provider name explicitly (Extend, Asurion, SquareTrade) so AI agents can match provider-specific queries.
Does Shopify include warranty information in its default JSON-LD?
No. Shopify's default product JSON-LD generates a basic Offer with price, availability, and currency — no WarrantyPromise. Warranty text in description tabs, metafield displays, or trust badges is not machine-readable. You must add the warranty block manually to your product.liquid JSON-LD snippet.
What duration unit codes should I use in QuantitativeValue for warranty?
Use UN/CEFACT unit codes: "ANN" for years, "MON" for months, "DAY" for days. For a 2-year warranty: value: 2, unitCode: "ANN". For a 90-day warranty: value: 90, unitCode: "DAY". For lifetime warranty: use value: 99, unitCode: "ANN" and add a lifetimeWarranty: true additionalProperty so AI agents understand the term is unlimited.