What MerchantReturnPolicy is
Per Schema.org v30.0, MerchantReturnPolicy 'provides information about product return policies associated with an Organization, Product, or Offer.' Inheritance: Thing > Intangible > MerchantReturnPolicy. The type supersedes the older ProductReturnPolicy. Key properties: applicableCountry (Country or Text — ISO 3166-1 alpha-2 like 'US', 'GB', 'DE'), returnPolicyCategory (MerchantReturnEnumeration), merchantReturnDays (Integer or Date — for finite-window policies), returnMethod (ReturnMethodEnumeration), returnFees (ReturnFeesEnumeration), refundType (RefundTypeEnumeration).
What Google documents, and the AI Overviews claim
Google's merchant return policy documentation is specific. Put a standard return policy that covers most or all of your products under Organization, using hasMerchantReturnPolicy, on a single page; you don't need it on every page. Use an Offer-level MerchantReturnPolicy only to override that policy for specific products, and note that Offer-level policies support fewer properties. When both exist, the product-level policy wins. Some SEO publications go further and say Google AI Overviews requires the property on every product. No Google documentation says that, so this page doesn't repeat it.
Why ship hasMerchantReturnPolicy anyway
Three reasons to ship hasMerchantReturnPolicy. First, it's the documented way to give Google your return terms for merchant listings: Google's return policy documentation and merchant listing documentation both cover it, and the alternatives Google names are settings in Merchant Center or Search Console, or the Content API for Shopping. Second, Shopify's own AI-optimisation doc names keeping policies 'complete and up-to-date' as one of its recommendations for AI agent reference. Third, it's cheap: the policy already exists in plain words on the store.
MerchantReturnPolicy fields
Google's return policy documentation requires either applicableCountry plus returnPolicyCategory (and merchantReturnDays for a finite window), or a merchantReturnLink to the policy page on its own. The field set Schema.org documents: applicableCountry (one or array of ISO 3166-1 alpha-2 country codes — the geographies where the policy applies), returnPolicyCategory (a MerchantReturnEnumeration URL), merchantReturnDays (when returnPolicyCategory is MerchantReturnFiniteReturnWindow), returnMethod (ReturnMethodEnumeration URL — ReturnByMail, ReturnInStore, ReturnAtKiosk), returnFees (ReturnFeesEnumeration URL — FreeReturn, RestockingFees, ReturnFeesCustomerResponsibility, ReturnFeesEnumerated), refundType (RefundTypeEnumeration URL).
JSON-LD example — MerchantReturnPolicy on Organization
The block below is the hasMerchantReturnPolicy property for the store-wide policy. It goes inside your one Organization (OnlineStore) block, alongside name, url and logo. Hard-coded values suit a universal policy (30-day finite window, free returns by mail). The same object shape works inside an Offer when one product needs different terms, though Offer-level policies accept fewer properties.
Validation
The Rich Results Test supports return policy markup as its own type. Test the page that carries the Organization block: expect the return policy detected with zero errors. The strict minimum is applicableCountry and returnPolicyCategory, plus merchantReturnDays for a finite window, or a merchantReturnLink alone. For an Offer-level override, test the product page; the policy shows up inside the merchant listing. Schema.org Markup Validator confirms structural validity.
Shopify gotchas on hasMerchantReturnPolicy
Four gotchas. First: emitting an empty MerchantReturnPolicy object on a store that hasn't configured its refund policy — validators accept the empty object, but the markup is meaningless. Wrap emission in a Liquid conditional on the metafield or hard-code the policy only after the merchant ships their real one. Second: hard-coding applicableCountry: 'US' on a multi-country store, misrepresenting policy to customers outside the US. Third: emitting MerchantReturnFiniteReturnWindow without merchantReturnDays — Google requires the day count for a finite window. Fourth: using a string for merchantReturnDays ('30') instead of an integer (30) — Google's documentation types it as an Integer, so print a number.