Skip to content

WooCommerce products not showing on Google: what to check, in order

First settle where the products are missing. Ordinary results need a product page Google can index, rich product results need product data on that page, and the Shopping tab needs the product in a Merchant Center account. Then check the store in that order.

By
WP Ministry
Published
Tested on
WordPress 7.1.3, WooCommerce 11.2.0, PHP 8.3.35

In short

  • Ordinary results, rich product results and the Shopping tab are three different things. A product can be in one and missing from the next.
  • A store that was never launched answers every product's address with a placeholder that has no product data. Check that first.
  • "Catalog visibility: Hidden" takes a product out of the shop, its category and both searches on your own site. Its address still answers 200 with no noindex, and it stays in the sitemap.
  • A draft or a private product answers 404 to a visitor. A password-protected one answers 200 with a password form, no noindex and no product data, and stays in the sitemap.
  • A product with no price prints no offer. With no price and no rating it prints no product data at all.
  • Google's documentation says the Shopping tab requires Merchant Center. When every check passes, what is shown is Google's choice.

When WooCommerce products are not showing on Google, first settle where they are missing, because there are three places and each has a cause of its own. A product missing from ordinary results has a page Google has not indexed. A product that is listed with no price, stock or rating beside it has a page without the product data Google reads for those. A product missing from the Shopping tab is not in a Merchant Center account, or is not approved there.

Then check the store in the order below, which rules out the quickest causes first. Each step shows what a WooCommerce store answers, as read from a test store on WordPress's default theme with no other plugin. Nothing here promises where a product appears.

Three places a product can be missing

Where it is missingWhat Google needs for itUsual cause on a WooCommerce storeWhere to go
Ordinary resultsThe product's page, crawled and indexed. Google's documentation says structured data "isn't required to appear in Google Search results", and says the same of Merchant CenterThe store was never launched, the page says noindex, or the product is not publishedChecks 1 to 3
Rich product results: the page is listed, with no price, stock or rating beside itProduct structured data on the pageThe product has no price, so the page prints no offer, or a theme or plugin has dropped the dataChecks 4 and 5
The Shopping tab's free listingsThe product in a Merchant Center account. Google: "Participation in Google Merchant Center is required to appear in the Google Shopping tab."No account, no product data in it, or products that are "Not approved"Check 6

To tell the first row from the second, search Google for site: followed by one product's full address, which is the search Google's help gives for a missing page. If the page comes back, it is indexed, and checks 1 to 3 are not your problem. The checks for a WordPress site that is not on Google cover that search and Search Console's URL Inspection tool.

One command for the first four checks

This asks for a product's page as a visitor who is not signed in, which is what a crawler is. It prints the status, any X-Robots-Tag header, the robots tag, WooCommerce's coming soon marker, and the types of product data the page carries. Put the address of one of your own products in place of the one here.

bash
curl -s -D - https://example.com/product/blue-enamel-mug/ | grep -i -o -E "^HTTP[^ ]* [0-9]+|^x-robots-tag:.*|<meta name=.(robots|woo-coming-soon-page).[^>]*>|\"@type\":\"(Product|Offer|AggregateOffer|AggregateRating)\""

A published product with a price, on a store that is launched, prints four lines. The first can read HTTP/2 200 on your server.

text
HTTP/1.1 200
<meta name='robots' content='max-image-preview:large' />
"@type":"Product"
"@type":"Offer"
What it printsWhat it meansCheck
A line with woo-coming-soon-pageThe store is in coming soon mode1
HTTP/1.1 404The product is not published, or its address has changed2
noindex in the robots tag, or an X-Robots-Tag line that says itThe page asks to be left out of search2
No "@type":"Product" lineThe page carries no product data4
"@type":"Product" with no "@type":"Offer"The product data has no offer4
"@type":"AggregateOffer"The price is given as a range4

Without a terminal, the page indexing check reads the status, robots.txt, a noindex in the page or its headers, and the canonical address. The product data check reads the product data.

1. Is the store launched?

A store on a fresh install of WooCommerce is put into coming soon mode the first time its dashboard is opened, without anyone choosing it. A signed-in administrator is shown the real store the whole time. Everyone else, a crawler included, is given a placeholder at every product's address: status 200, no noindex, and no product data. If the command printed the woo-coming-soon-page line, stop here. WooCommerce coming soon mode covers how to check it and how to launch.

2. Can the product's page be indexed?

What a product's page says by default

A published product answers 200 with the robots tag WordPress puts on every page of a site that is open to search engines, max-image-preview:large. It blocks nothing, and WooCommerce adds no noindex to a product. When the command does print noindex, it comes from one of three places.

  • WordPress's "Discourage search engines from indexing this site" box. It puts noindex, nofollow on every page and switches off the sitemap. What the box does covers it.
  • An SEO plugin's setting for one product, or for products as a content type.
  • A header. A server, a CDN or a plugin can send X-Robots-Tag: noindex, which is not in the page's source. The command prints it above the robots tag.

What "Catalog visibility" does and does not do

On a product's edit screen, the Publish box has a row named "Catalog visibility" with four choices. WooCommerce's documentation describes "Hidden" as "only visible on the single product page, and nowhere else". This is what the test store answered for a product set to each choice.

"Catalog visibility"The product's own addressRobots tagProduct dataShop and category pagesProduct searchProduct sitemap
"Shop and search results"200max-image-preview:largeYesListedListedListed
"Shop only"200max-image-preview:largeYesListedNot listedListed
"Search results only"200max-image-preview:largeYesNot listedListedListed
"Hidden"200max-image-preview:largeYesNot listedNot listedListed

Product search is a search for products, /?s=mug&post_type=product. The site's ordinary search, /?s=mug, left out the same two products.

So the setting changes which of your own pages link to a product, and nothing else. A hidden product still answers 200, carries no noindex, prints its product data and stays in wp-sitemap-posts-product-1.xml. It does not ask Google to leave the product out. It can still make a product harder to find, since the shop and its category no longer link to it.

A draft, a private and a password-protected product

The same Publish box holds "Status" and "Visibility". This is what a visitor who is not signed in was answered.

The product isIts own addressRobots tagProduct dataShop and category pagesProduct sitemap
A draft404Not listedNot listed
Private404Not listedNot listed
Password protected200, with a form that asks for the passwordmax-image-preview:largeNoneListedListed

Google's help on missing pages names password protection among the things that block a page. A password-protected product is the odd one of the three. The shop, its category and the sitemap all still lead to it, and it answers 200 with no noindex. What it serves is a password form in place of the product. Neither search on the store listed it. Its name and price were still in the page's source, in a block of data for scripts that nothing on the page displays.

List what each product is set to

With WP-CLI, this lists every product with its status and its catalog visibility. Put an administrator's username in place of admin.

bash
wp wc product list --user=admin --fields=id,name,status,catalog_visibility --orderby=id --order=asc --per_page=100 --format=csv

status is publish, draft or private. catalog_visibility is visible, catalog, search or hidden, in the order of the table above.

3. Is it in the sitemap, and does the sitemap answer?

Google's documentation on product data says "Web crawling is not guaranteed to find all products on your site." A sitemap is how a store says which addresses exist. WordPress makes one for products by itself. This prints the addresses in it, sorted.

bash
curl -s https://example.com/wp-sitemap-posts-product-1.xml | grep -o "<loc>[^<]*</loc>" | sort

Each published product should be there once. If the command prints nothing, WordPress is not serving that sitemap: an SEO plugin that makes its own replaces it, and the "Discourage search engines" box switches it off. The WordPress sitemap at wp-sitemap.xml shows how to tell which sitemap a site has, and the sitemap checker reads it from outside.

4. Is the product data there, and complete for the result you want?

Google's documentation describes two kinds of product result and what each requires of a page's structured data.

Requires
Product snippet: a text result with a rating, a price or availabilityname, and one of review, aggregateRating or offers
Merchant listing: for a page where a shopper can buy the productname, image, and offers holding an Offer with a price above zero and a priceCurrency

WooCommerce prints this data by itself, and what it prints depends on the product. These are four products on the test store.

The product hasProduct data on its page
A price, no product image, no reviewsA Product with one Offer, and no image
No price and no reviewsNo Product at all. The only structured data on the page is its breadcrumb trail
No price and one rated reviewA Product with an aggregateRating and no offer
Variations at different pricesA Product with an AggregateOffer: a lowest and a highest price

Set beside Google's two lists:

  • No price means no offer. A product whose price field is empty meets neither list unless a customer has rated it, and a merchant listing needs the price whatever else is there.
  • No image. The first product meets what a product snippet requires and not what a merchant listing requires.
  • A price range. Google's documentation says product snippets accept an AggregateOffer and merchant listings require an Offer. WooCommerce variations and SEO covers that.
  • No product data on a product that has a price. A theme's product template or a plugin is in the way. WooCommerce schema markup covers where the data comes from and how to test it.

The product data check reads one product page and sets what it finds beside these lists. A brand, a GTIN, a return policy and shipping details are recommended, not required, and their absence is not why a product is missing: see the brand and GTIN notices and the return policy and shipping notices.

5. What do Search Console's two product reports say?

Search Console keeps two reports under Shopping: Product snippets and Merchant listings. Its help says a report appears only if Google finds valid markup of that type in the property. A missing Merchant listings report is therefore a finding in itself, and it sends you back to check 4.

The help page defines the two words the reports use: "A valid item is an item that doesn’t have any critical issues and can appear on Google as a rich result. An invalid item has at least one critical issue preventing it from appearing as a rich result." Critical issues are in a table named "Why items are invalid", and non-critical ones in "Improve item appearance".

Two cautions. The same page says the reports show a sample of items, not every one. And "can appear" is eligibility: Google's documentation for merchant listings says Google "does not guarantee that features that consume structured data will show up in search results".

6. Is the product in Merchant Center, for the Shopping tab?

The Shopping tab has a door of its own. Google's documentation gives two ways for product data to reach Merchant Center: a feed, uploaded as files or sent through an API, or, for smaller sites, an automated feed built "from crawled web content". A store with no account has neither. Its markup can still make a page eligible for merchant listing results in ordinary Search: Google announced in 2022 that this no longer takes a Merchant Center account.

Merchant Center's help for free listings says this about being shown.

  • Free listings are usually already on. "In most cases, the Free listings feature is turned on by default for you". The status is under Marketing, then Marketing methods.
  • Seven attributes are required for every product: an ID, a title, a link, an image link, a price, a description and availability.
  • Being on is permission, not a result. The status "doesn't guarantee that your products will be shown to customers".

Each product in the account has a status, and the help names five: "Under review", "Processing", "Approved", "Limited" and "Not approved". A product that is "Not approved" cannot be shown, and the reason is on the "Needs attention" tab under Products. Of "Under review", the help says a review may take "a few weeks" for features such as free listings.

Two causes of disapproval sit on the store. Merchant Center's help lists a landing page that is unavailable, and a robots.txt that blocks Googlebot, among the website issues that get products disapproved. Those are checks 1 and 2 again. And Google compares the price in the product data with the price on the page: see a mismatched price in Merchant Center.

Google for WooCommerce is WooCommerce's extension for this. Its documentation says it connects a store to Merchant Center, and that products "will sync automatically to make relevant information available for free listings, Google Ads, and other Google services". It was not run for this page.

7. Everything checks out

If the page answers 200 with no noindex, is in a sitemap that answers, prints a Product with an Offer, and Search Console counts it valid, the store has done its part. Google's documentation says it "doesn't guarantee that it will crawl, index, or serve your page" even when a page meets its requirements. For a new page, its help says crawling and indexing typically take from a day or two to a few weeks in total.

What is left is Google's choice, and nobody outside Google can make it.

When to get help

  • Ask the host if a product's address sends a noindex header you did not set, or answers a visitor who is not signed in with an error.
  • Hand it over if a check points at a cause you would rather not change yourself, or every check passes and the reports still disagree. WP Ministry's WooCommerce SEO service is search work for a WooCommerce store, sold as work: checking what each product page tells Google and the Merchant Center feed, fixing what is wrong on the store, and testing each fix again. No ranking is promised.

Common questions

Do I need Merchant Center for my products to be on Google?

Not for ordinary results or for rich product results. Google's documentation says uploading product data to Merchant Center "isn't mandatory to appear in Google search results". It says participation is required for the Shopping tab.

Does "Catalog visibility: Hidden" hide a product from Google?

No. On the test store a hidden product's address still answered 200 with no noindex and with its product data, and it stayed in the sitemap. The setting takes the product out of the shop, its category and search on your own site.

My products are on Google with no price beside them. Why?

Start with check 4. A product with no price prints no offer, and a variable product with different prices prints a range, which Google accepts for a product snippet and not for a merchant listing. If the page prints a Product with an Offer and Search Console counts it valid, the rest is Google's decision.

More on this subject

SEO audit, done for you

SEO audit is $249. A written audit, each finding with its source, and up to 2 hours of fixes done and tested again. It starts with a free diagnosis.