Optimization Guide
Ecommerce MerchantReturnPolicy Schema: Shopify Returns Structured Data for AI Agents
Return policy is a top-3 purchase decision factor for first-time buyers. AI shopping agents answer "does this store have free returns?" from structured data — not from reading your returns page. MerchantReturnPolicy is the schema.org type built exactly for this, and almost no Shopify stores use it.
hasMerchantReturnPolicy block to your Product JSON-LD (per-product policies) or to your Organization JSON-LD on the homepage (store-wide policy). Use returnPolicyCategory enum values, merchantReturnDays for the window, returnFees for cost, and returnMethod for the return channel. Five fields is enough to make your return policy machine-readable to all AI shopping agents.
Why MerchantReturnPolicy Structured Data Matters
Return policy anxiety is the #1 barrier to first purchase at unknown online stores. When AI shopping agents help a buyer compare products across stores, return policy is a decision-critical attribute — equal in weight to price and shipping time for many purchase categories.
Google AI Mode explicitly surfaces return policy in product comparison panels. ChatGPT Shopping answers "which of these has the best return policy?" from structured data. Perplexity Shopping includes "free returns" as a filterable attribute. If your policy lives only in prose on a /policies/refund-policy page, AI agents either skip it entirely or produce a low-confidence inference that may be wrong.
The fix — MerchantReturnPolicy — is a schema.org type added to Google's product structured data spec in 2022 and now widely recognized by AI product crawlers. It takes five fields to implement correctly. Almost no Shopify stores have done it.
MerchantReturnPolicy: Core Fields
| Field | Type | Purpose |
|---|---|---|
returnPolicyCategory |
Enum URI | Overall policy type — finite window, unlimited, or no returns |
merchantReturnDays |
Integer | Number of days from purchase (or delivery) for returns |
returnFees |
Enum URI | Whether return shipping is free, at customer expense, or original fee |
returnMethod |
Enum URI | How the item is returned (mail, in-store, kiosk) |
applicableCountry |
ISO 3166-1 alpha-2 | Country/countries this policy applies to |
itemReturnShippingFeesAmount |
MonetaryAmount | Specific dollar amount charged for return shipping label |
restockingFee |
MonetaryAmount or QuantitativeValue | Restocking charge applied on return |
merchantReturnLink |
URL | URL to the full return policy page |
returnPolicySeasonalOverride |
MerchantReturnPolicySeasonalOverride | Holiday or promotional extended return window (with startDate/endDate) |
inStoreReturnsOffered |
Boolean | Whether in-store returns are available (for omnichannel merchants) |
returnPolicyCategory enum values
| Enum | Use when |
|---|---|
schema.org/MerchantReturnFiniteReturnWindow |
Returns accepted within a fixed number of days (30, 60, 90, etc.) |
schema.org/MerchantReturnUnlimitedWindow |
Returns accepted at any time (rare — Costco-style policies) |
schema.org/MerchantReturnNotPermitted |
No returns — final sale, personalized, or perishable items |
returnFees enum values
| Enum | Meaning |
|---|---|
schema.org/FreeReturn |
Return shipping is free for the customer |
schema.org/ReturnShippingFees |
Customer pays return shipping — use with itemReturnShippingFeesAmount for the specific cost |
schema.org/OriginalShippingFees |
Customer pays the original order's shipping cost (not a separate return label fee) |
Implementation: Store-Wide Policy on Organization
If your return policy is the same for all products, add it once to the Organization block in your homepage's JSON-LD. AI agents apply this store-level policy to all products from your domain unless overridden at the product level.
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme Store",
"url": "https://acme-store.com",
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": ["US", "CA"],
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"merchantReturnLink": "https://acme-store.com/policies/refund-policy",
"inStoreReturnsOffered": false
}
}
Implementation: Per-Product Policies in Shopify
For product categories with different return rules (e.g., electronics have 30-day returns, personalized items are final sale), add hasMerchantReturnPolicy inside the Product JSON-LD block. This overrides the Organization-level policy for that specific product.
{% comment %} product.liquid — extend existing Product JSON-LD block {% endcomment %}
{
"@type": "Product",
"name": {{ product.title | json }},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
{% assign is_final_sale = product.tags | where: "final-sale" | size %}
{% if is_final_sale > 0 %}
"returnPolicyCategory": "https://schema.org/MerchantReturnNotPermitted"
{% else %}
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"merchantReturnLink": "https://{{ shop.domain }}/policies/refund-policy"
{% endif %}
}
}
Return policy with specific fee amount
{
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 60,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/ReturnShippingFees",
"itemReturnShippingFeesAmount": {
"@type": "MonetaryAmount",
"value": "7.99",
"currency": "USD"
},
"merchantReturnLink": "https://store.com/policies/refund-policy"
}
Holiday extended return window override
{
"@type": "MerchantReturnPolicy",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnFees": "https://schema.org/FreeReturn",
"returnPolicySeasonalOverride": {
"@type": "MerchantReturnPolicySeasonalOverride",
"startDate": "2026-11-15",
"endDate": "2027-01-31",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 90
}
}
Return Policy as a Competitive Advantage in AI Results
When AI agents present product comparisons, free returns is a trust signal that moves buyers. Google's own consumer research shows "free returns" reduces purchase hesitation by up to 67% for first-time store visitors. Surfacing this in structured data means AI agents can highlight your return policy advantage in their recommendation text — without you needing to be the cheapest or best-reviewed option.
Return policy structured data checklist
- MerchantReturnPolicy on Organization (homepage JSON-LD)
- returnPolicyCategory set to the correct enum
- merchantReturnDays as integer (not string)
- returnFees enum — especially FreeReturn if you offer it
- returnMethod (ReturnByMail most common for DTC)
- applicableCountry for your shipping markets
- merchantReturnLink pointing to your /policies/refund-policy
- Per-product override for final sale or special-category items
- Seasonal override for holiday extended window (if applicable)
CatalogScan Checks for Return Policy Structured Data
CatalogScan's AI Readiness scan checks for the presence of MerchantReturnPolicy on your domain — either at the Organization level (homepage JSON-LD) or the Product level (product page JSON-LD). A missing return policy is flagged as a high-priority gap because it directly affects purchase conversion in AI shopping interfaces. The scan also checks that returnPolicyCategory uses valid schema.org enum URIs and that merchantReturnDays is a number, not a string.
Related guides: Return policy structured data overview · Warranty & guarantee schema · Shipping time structured data · Shopify schema markup overview
FAQ
What is MerchantReturnPolicy in schema.org?
MerchantReturnPolicy is a schema.org type for structured return policy data. It captures the return window (merchantReturnDays), fees (returnFees or itemReturnShippingFeesAmount), return method (mail, in-store, kiosk), applicable countries, and policy category (finite window, unlimited, or not permitted).
How do I add MerchantReturnPolicy to Shopify product JSON-LD?
Add "hasMerchantReturnPolicy" to your Product JSON-LD block with a MerchantReturnPolicy object. For store-wide policies, add it to the Organization block in your homepage JSON-LD instead — AI agents apply the organization-level policy to all products unless overridden at product level.
What is the difference between returnFees and itemReturnShippingFeesAmount?
returnFees is an enum (FreeReturn, ReturnShippingFees, OriginalShippingFees) for the general type of return cost. itemReturnShippingFeesAmount is a MonetaryAmount with a specific dollar value — use it when you charge a flat return shipping fee (e.g., $7.99 prepaid label).
Do AI shopping agents use MerchantReturnPolicy structured data?
Yes. ChatGPT Shopping, Google AI Mode, and Perplexity Shopping all surface return policy as a product attribute. Queries like "does this store have free returns?" and comparison queries pull from MerchantReturnPolicy structured data. Without it, agents skip the return info or extract low-confidence guesses from prose.
Should MerchantReturnPolicy go on the product page or the Organization?
For a store-wide policy (same rules for all products), add it once to the Organization JSON-LD on your homepage. For different policies by category (30-day standard, final sale on personalized), add per-product hasMerchantReturnPolicy overrides in each Product block.