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.

TL;DR Add a 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

Shopify default (no warranty signal)
{
  "@type": "Offer",
  "price": "299.00",
  "priceCurrency": "USD",
  "availability":
    "InStock"
  // warranty: invisible
}
With WarrantyPromise structured data
{
  "@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

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.

Related Resources