hasMerchantReturnPolicy for WooCommerce: how to give Google your return policy
Search Console lists Missing field "hasMerchantReturnPolicy" (in "offers") on your product pages, and it will on every one of them. WooCommerce has no return policy setting at all, so its product markup never says whether a product can be sent back, for how long, or who pays.
The warning is optional: your products stay eligible for merchant listings without it. But a return window is one of the things shoppers compare, and Google has several ways to receive it. This guide covers what the hasMerchantReturnPolicy property needs, a tested schema example for WooCommerce, the store-wide policy Google now recommends, and the no-code route in Search Console. We ran each one through Google's Rich Results Test on WooCommerce 11.1.2. One of them, the store-wide policy, doesn't clear the warning even though Google accepts it.
Quick answer.
Missing field "hasMerchantReturnPolicy"means theOfferin your product markup has noMerchantReturnPolicy. It's a non-critical issue, and the product stays a valid merchant listing. WooCommerce stores no return policy, so you supply one: in Search Console → Settings → Shopping → Shipping and returns (no code, checked by Google in about 10 to 13 days), as aMerchantReturnPolicyon each offer through thewoocommerce_structured_data_product_offerfilter, or with a plugin. Each policy needs a country and a category, plus the number of days for a limited window. Only the product-level markup cleared the warning in Google's Rich Results Test.
The short version
- It's optional. The warning sits under Improve item appearance, and the product stays eligible.
- WooCommerce can't fix it on its own. There's no return policy anywhere in WooCommerce's settings or markup.
- Two properties are required:
applicableCountryandreturnPolicyCategory. A limited window also needsmerchantReturnDays. - The store-wide policy didn't clear the warning. Google's test accepted our
OnlineStorereturn policy as valid, and Google can use it, but the test still flagged the product's offer. - Publish only the policy you actually offer. It's a promise to customers as much as a signal to Google.
What "Missing field hasMerchantReturnPolicy" means
hasMerchantReturnPolicy is the Schema.org property on a product's Offer that holds its return policy, and its value is a MerchantReturnPolicy. When it's missing, Search Console lists Missing field "hasMerchantReturnPolicy" in the Merchant listings report, in the Improve item appearance table, and the Rich Results Test shows it as Missing field "hasMerchantReturnPolicy" (optional). A product with only non-critical issues is still valid.
We checked on our test store. WooCommerce 11.1.2's own markup for a simple $18 T-shirt was a valid merchant listing with four non-critical issues, and the missing return policy was one of them. Our guide to merchant listings issues covers the other three.
Optional doesn't mean pointless. A clear return window is information a shopper weighs before buying, and the markup is how Google learns yours instead of guessing.
What the merchant return policy schema needs
The policy is a MerchantReturnPolicy. For one placed on a product's offer, Google's merchant listing documentation (last updated 8 September 2026) lists these properties:
| Property | Required? | What it holds |
|---|---|---|
applicableCountry | Yes | The country the policy covers, as an ISO 3166-1 alpha-2 code such as US |
returnPolicyCategory | Yes | MerchantReturnFiniteReturnWindow, MerchantReturnUnlimitedWindow or MerchantReturnNotPermitted |
merchantReturnDays | Yes, for a limited window | The number of days the customer has, counted from delivery |
returnMethod | Recommended | ReturnByMail, ReturnInStore or ReturnAtKiosk |
returnFees | Recommended | FreeReturn, ReturnFeesCustomerResponsibility or ReturnShippingFees |
returnShippingFeesAmount | Yes, with ReturnShippingFees | The fixed fee the customer pays, as a MonetaryAmount |
In JSON-LD, write the category, method and fee values as full schema.org addresses, such as https://schema.org/MerchantReturnFiniteReturnWindow, as the snippets below do.
Google's separate return policy documentation describes the store-wide version, which can say much more: the type of refund, the item conditions you accept, restocking fees, who provides the return label, different fees for defective items and for change-of-mind returns, seasonal overrides for the holidays, and merchantReturnLink, the address of your returns page. It also lists returnPolicyCountry, the country items are sent back to, as recommended.
We tested whether leaving returnPolicyCountry out of a product's policy matters. It didn't: the Rich Results Test raised no warning about it.
Four ways to give Google your return policy
Google takes return policies from several places, and its documentation ranks them, strongest first:
- Return settings sent through the Content API for Shopping.
- Settings in Merchant Center or Search Console.
- Product-level markup:
hasMerchantReturnPolicyon each offer. - Organization-level markup: one store-wide policy.
For a WooCommerce store that's three practical routes, plus a plugin that writes the product-level markup for you. Here's what each one did in our tests:
| Route | Clears the warning in the test? | Code | Follows your settings? |
|---|---|---|---|
| Search Console settings | No: the page doesn't change | None | Entered by hand |
hasMerchantReturnPolicy on each offer, via a filter | Yes | A PHP snippet | Typed into the snippet |
Store-wide OnlineStore policy | No: the offer is still flagged | A PHP snippet | Typed into the snippet |
| NeoSERP's Returns settings | Yes | None | Yes, from five fields |
1. Search Console's Shipping and returns settings (no code)
In Search Console, open Settings → Shopping → Shipping and returns. An owner or full user of the property can enter the return window and who pays for returns there, without a Merchant Center account. Google's help page says return policies are checked by hand and take about 10 to 13 days; until then they show as pending.
These settings outrank all markup. Google's return policy documentation says that when a store has both, Google uses only what's in Search Console. What it doesn't say is whether the Merchant listings report then stops listing the missing field, and the Rich Results Test, which reads only your page, keeps reporting it.
2. A hasMerchantReturnPolicy schema example for WooCommerce
WooCommerce passes every product's offer through the woocommerce_structured_data_product_offer filter before it prints the markup, so you can add the policy there. This adds a 30-day, free return by post for customers in the US:
add_filter( 'woocommerce_structured_data_product_offer', function ( $offer ) {
$offer['hasMerchantReturnPolicy'] = array(
'@type' => 'MerchantReturnPolicy',
'applicableCountry' => 'US',
'returnPolicyCountry' => 'US',
'returnPolicyCategory' => 'https://schema.org/MerchantReturnFiniteReturnWindow',
'merchantReturnDays' => 30,
'returnMethod' => 'https://schema.org/ReturnByMail',
'returnFees' => 'https://schema.org/FreeReturn',
);
return $offer;
} );
Add it with a code-snippets plugin or a small custom plugin, and change the values to your own terms:
- Customer pays a fixed return fee: set
returnFeesto
https://schema.org/ReturnShippingFees and add returnShippingFeesAmount as a MonetaryAmount, with the fee and your store's currency.
- No time limit: use
MerchantReturnUnlimitedWindowand remove
merchantReturnDays.
- No returns: use
MerchantReturnNotPermitted, and remove the days,
method and fees.
- Several countries:
applicableCountrytakes a list, such as
array( 'US', 'CA' ), for a policy that's the same in each.
We ran it on our test store and put the T-shirt's markup through the Rich Results Test. Missing field "hasMerchantReturnPolicy" was gone, and so was it when we removed returnPolicyCountry. The issues left were the ones that have nothing to do with returns. The filter runs on every offer WooCommerce builds, including the price range offer of a variable product.
3. The store-wide policy Google recommends
Google's merchant listing documentation recommends a single return policy for the whole store, in your organization markup, and keeping product-level policies for the products that differ. Google's own examples use OnlineStore, a kind of Organization. This prints one on every page:
add_action( 'wp_head', function () {
$store = array(
'@context' => 'https://schema.org',
'@type' => 'OnlineStore',
'@id' => home_url( '/#organization' ),
'name' => get_bloginfo( 'name' ),
'url' => home_url( '/' ),
'hasMerchantReturnPolicy' => array(
'@type' => 'MerchantReturnPolicy',
'applicableCountry' => array( 'US', 'CA' ),
'returnPolicyCountry' => 'US',
'returnPolicyCategory' => 'https://schema.org/MerchantReturnFiniteReturnWindow',
'merchantReturnDays' => 30,
'returnMethod' => 'https://schema.org/ReturnByMail',
'returnFees' => 'https://schema.org/FreeReturn',
'refundType' => 'https://schema.org/FullRefund',
'itemCondition' => 'https://schema.org/NewCondition',
'merchantReturnLink' => home_url( '/returns/' ),
),
);
echo '<script type="application/ld+json">' . wp_json_encode( $store ) . "</script>\n";
} );
That says: 30 days from delivery for customers in the US and Canada, items sent back to the US by post, free, refunded in full, new condition only, with the details on your /returns/ page. Change the last line's address to your own returns page.
We put its output, together with WooCommerce's own markup for the T-shirt, through the Rich Results Test. The test listed a separate Return policies item, valid with no issues, and the OnlineStore as a valid organization. But the T-shirt's merchant listing still came back with Missing field "hasMerchantReturnPolicy". We saw the same thing with a store-wide shipping policy: the test checks each offer for its own policy. Google's documentation treats the store-wide policy as the default that product-level policies override, so Google can read it. It just doesn't make the warning go away.
If an SEO plugin already prints an Organization for your site, add the return policy to that node through the plugin's own filter rather than printing a second organization.
Keep the policy true
A return policy in your markup is a claim about what your customers are entitled to, and Google checks the policies entered in Search Console by hand. Before you publish one:
- Match your returns page. The days, the method and who pays should be
the same in the markup, on your returns page and in your terms.
- Check the law where you sell. In the EU and the UK, for example, consumers have 14
days to withdraw from most online purchases, so MerchantReturnNotPermitted would misstate their rights.
- Change it in one place. A policy typed into code stays the same when
your terms change. Put a reminder wherever you keep your returns page, or use a route that reads from a setting.
How NeoSERP builds it
NeoSERP, our free product schema plugin, writes the WooCommerce return policy schema from a Returns section with five fields, because WooCommerce itself has nothing to read:
| NeoSERP field | Becomes |
|---|---|
| Returns accepted | returnPolicyCategory: a set number of days, no time limit, or not accepted |
| Return window (days) | merchantReturnDays |
| How items come back | returnMethod: by post, in store, or at a kiosk or drop-off point |
| Who pays return postage, plus the fee | returnFees, and returnShippingFeesAmount for a fixed fee |
| Applies to country | applicableCountry; left empty, it uses your store address |
Its default is "Do not publish a return policy". Until you choose one, NeoSERP publishes nothing, rather than a policy you never offered.
We filled the fields in on our test store (30 days, by post, a $4.95 fee, the country left empty) and put the T-shirt through the Rich Results Test. The policy came out with applicableCountry set to the store's country, the fee as a returnShippingFeesAmount, and no return policy warning. On the variable Hoodie, all five offers carried it: the product group and each of its four variations.
Two limits, plainly. NeoSERP writes the policy on each offer, not as the store-wide policy Google now recommends; adding the store-wide version is on our list. And it covers one country. If your terms differ by country, use the filter above, or Search Console's settings. NeoSERP is free and in review at WordPress.org; until it's approved, you can download it from its page.
Frequently asked questions
What does Missing field "hasMerchantReturnPolicy" mean?
The offer in your product markup doesn't include a return policy. Search Console reports it as a non-critical issue in the Merchant listings report. On a WooCommerce store it appears on every product, because WooCommerce has no return policy setting to publish.
Is "Missing field hasMerchantReturnPolicy" optional?
Yes. The product stays a valid merchant listing, and the Rich Results Test labels it (optional). Adding the policy tells Google your return window and fees instead of leaving them out.
Should the return policy go on the product or the organization?
Google recommends the organization, but only the product cleared the warning in our test. A store-wide policy is the default Google reads for products that don't have their own. If you want the warning gone, add the policy to each offer as well.
Do I need returnPolicyCountry?
No. Google lists it as recommended for store-wide policies, not required. We removed it from a product's policy and the Rich Results Test raised no warning. The two say different things: applicableCountry is the country the policy covers, where your customers buy, and returnPolicyCountry is the country returned items are sent to. Add it if those differ.
What if my store doesn't accept returns?
Say so with MerchantReturnNotPermitted, if it's true. It's a valid policy. Check your local law first: in the EU and the UK, consumers have 14 days to withdraw from most online purchases.
Does entering returns in Search Console fix the warning?
Google uses those settings, but the page doesn't change. They outrank any markup, and Google checks return policies by hand over about 10 to 13 days. The Rich Results Test only reads your page, so it still reports the missing field until the markup has one too.
One policy, said the same way everywhere
The warning is optional, so there's no rush to clear it. What matters is that the return policy Google reads is the one you honour. Write it once, on your returns page, then give it to Google the way that suits your store: Search Console's settings if you'd rather not touch code, the filter above if your terms rarely change, or a setting that writes the markup for you.