Shopify missing hasMerchantReturnPolicy / shippingDetails

The Search Console warning is non-critical — set returns and shipping once (Search Console, Merchant Center, or Organization markup) before hand-editing every offer

Agentic Catalog by momiji (Shopify App Store) reviews policy, shipping, tax, domain, and product data in one readiness score, and audits Product JSON-LD completeness on live product pages. The Search Console warning “Missing field ‘hasMerchantReturnPolicy’” / “Missing field ‘shippingDetails’ (in ‘offers’)” flags recommended merchant-listing properties on Offer — not a required field, and not an error that removes the product from Search. Set a store-wide return and shipping policy once, then re-score. The app audits and scores those live surfaces; you apply the policy change yourself.

Related: Staff Access Audit Guard — Staff access audit for permission drift after the last review.

Free check first: Product JSON-LD field checker runs in your browser and sends nothing. Paste product JSON-LD and see which merchant-listing fields are present or missing.

Job: give Google one store-wide returns and shipping policy (Search Console, Merchant Center, or organization-level markup) instead of hand-editing every product offer unless a product truly has a non-standard policy.

What the warning means

Google’s merchant listing structured data documentation splits Offer properties into required and recommended. Required properties (for merchant-listing eligibility) include the active offer price / priceSpecification.price and the matching currency. hasMerchantReturnPolicy and shippingDetails sit under Recommended properties on Offer. Google says you must include the required properties for the content to be eligible as a rich result, and you can include the recommended properties to add more information.

The same merchant-listing page tells you to validate with the Rich Results Test and “fix any critical errors,” then: “Consider also fixing any non-critical issues that may be flagged in the tool, as they can help improve the quality of your structured data (however, this isn't necessary to be eligible for rich results).” That is the class this Search Console warning belongs to. It is a recommended enhancement for merchant listings, not a required-field failure that takes the product out of Search.

Google also recommends a global policy under Organization rather than repeating return and shipping markup on every offer. Offer-level properties are for overrides, or for stores that have no standard policy.

Three ways to give Google the policy

Google’s November 2025 Search Central post More ways to share your shipping and returns policies with Google is the store-wide path most product-page Liquid edits skip. You can tell Google about shipping and returns in two distinct ways without touching every offer: configure them directly in Search Console, or use organization-level structured data. Merchant Center remains the path for merchants who already keep delivery and return settings there.

  1. Search Console shipping and returns settings. Google expanded the “Shipping and returns” feature in Search Console so it is available to websites identified as online merchants, including merchants without a Merchant Center account. That is a UI path: set the policy once. The blog states that “settings configured in Search Console will take precedence over structured data on your site.” The return-policy and shipping-policy docs say you can configure account-level policies in Search Console, “which get automatically added to Merchant Center.”
  2. Merchant Center (existing Google & YouTube channel / Merchant Center account). The return-policy and shipping-policy docs say that if you have a Google Merchant Center account and keeping markup current is hard, configure return policies and delivery settings in Merchant Center. Merchant listing’s “combining multiple” list also places product-level feeds submitted in Merchant Center and Content API for Shopping settings above on-page markup.
  3. Organization-level markup on the refund or shipping policy page. Nest hasMerchantReturnPolicy and hasShippingService under an OnlineStore (a subtype of Organization). Google recommends placing return information on a single page that describes the return policy, and shipping structured data on the page that describes the shipping policy — not on every product URL. Test that URL in the Rich Results Test.

Precedence, as Google states it (strongest to weakest):

A short organization-level shape (placeholders only; put this on your policy page, not as a live block on this guide):

{
  "@context": "https://schema.org",
  "@type": "OnlineStore",
  "name": "Example Store",
  "url": "https://www.example.com",
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "applicableCountry": ["XX"],
    "returnPolicyCountry": "XX",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn",
    "refundType": "https://schema.org/FullRefund"
  },
  "hasShippingService": {
    "@type": "ShippingService",
    "name": "Standard shipping",
    "fulfillmentType": "FulfillmentTypeDelivery"
  }
}

Copy the property names from Google’s return policy, shipping policy, and Organization pages. Replace the placeholders with your live policy. The legal refund-policy wording on the storefront is still the merchant’s job.

Install Agentic Catalog by momiji → run check → re-score after you set returns and shipping

Write a review

When offer-level markup is still right

Use offer-level hasMerchantReturnPolicy and shippingDetails only when a product has a non-standard policy, or when you have no store-wide policy. Google says product-level return and shipping markup supports a subset of the organization-level properties. On Offer, the merchant-listing subset for returns includes required applicableCountry and returnPolicyCategory (plus merchantReturnDays when the window is finite), and recommended returnMethod, returnFees, and returnShippingFeesAmount. For shipping, if you add shippingDetails, Google’s OfferShippingDetails required set for the shipping-details enhancement is deliveryTime, shippingDestination, and shippingRate.

Google’s own reference pattern points an offer at the organization policy with @id instead of repeating the full object:

{
  "@context": "https://schema.org",
  "@type": "Offer",
  "hasMerchantReturnPolicy": {
    "@id": "https://www.example.com/policies/refund-policy#returns"
  },
  "shippingDetails": {
    "@type": "OfferShippingDetails",
    "hasShippingService": {
      "@id": "https://www.example.com/policies/shipping-policy#shipping"
    }
  }
}

Hand-editing every Shopify product offer for a store-wide 30-day return window is the expensive path. Set the organization policy (or Search Console / Merchant Center settings) first. Only then add offer-level markup for the products that truly differ.

Where Shopify themes print Product JSON-LD

Open a live product page. Use View source (or equivalent). Search for application/ld+json. That is the source of truth for this theme, this product URL. Do not assume every Shopify theme emits the same Product graph, and do not assume the graph includes hasMerchantReturnPolicy or shippingDetails.

On Shopify’s Dawn theme, Product JSON-LD is printed from sections/main-product.liquid as:

<script type="application/ld+json">
  {{ product | structured_data }}
</script>

That uses Shopify’s Liquid structured_data filter. Other themes may hand-build a Product object, skip JSON-LD, or inject a second block. Check the live PDP. Completing return or shipping settings in Search Console does not, by itself, add those keys to the theme’s Product JSON-LD — and it does not need to, because Search Console / Merchant Center settings outrank on-page markup when both exist.

Not the same as GTIN, Open Graph, robots.txt, or llms.txt

None of those jobs writes a return or shipping policy for Google. The legal refund-policy and shipping-policy content on the storefront is the merchant’s. This page is about how Google is told that policy exists — not a substitute for counsel, and not a rewrite of the policy text.

Install Agentic Catalog by momiji, run a catalog readiness scan, then review policy and shipping in the score.

App path: score policy and live Product JSON-LD, then fix the policy yourself

Agentic Catalog by momiji:

Use that score after you set returns and shipping. The app re-scores the live catalog; it is not the Search Console setting, the Merchant Center setting, or the markup edit.

  1. Set the store-wide policy in Search Console, Merchant Center, or organization-level markup on the refund / shipping policy page.
  2. Open a live PDP, view source, and note whether Product JSON-LD is present. Treat missing offer-level return or shipping keys as expected when the store-wide path is in place.
  3. Install Agentic Catalog by momiji and run the readiness check so policy, shipping, and Product JSON-LD completeness are scored together.
  4. If the score still flags policy or shipping, fix the matching Google setting or the policy-page markup yourself, then run another check.

A score is a checklist. It is not a ranking, inclusion, or merchant-listing guarantee.

Install Agentic Catalog by momiji, run a catalog readiness scan, then review policy, shipping, and Product JSON-LD completeness the score cites.

What this page is not

Install Agentic Catalog by momiji, run a catalog readiness scan, then review policy, shipping, and Product JSON-LD completeness the score cites.

Related pages

Not an inclusion or ranking guarantee. Not legal advice. Confirm the live product-page source for Product JSON-LD, and confirm Search Console or Merchant Center settings when you use those paths. The app scores policy, shipping, and Product JSON-LD completeness; you apply the policy change yourself.