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 missing | What Google needs for it | Usual cause on a WooCommerce store | Where to go |
|---|---|---|---|
| Ordinary results | The 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 Center | The store was never launched, the page says noindex, or the product is not published | Checks 1 to 3 |
| Rich product results: the page is listed, with no price, stock or rating beside it | Product structured data on the page | The product has no price, so the page prints no offer, or a theme or plugin has dropped the data | Checks 4 and 5 |
| The Shopping tab's free listings | The 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.
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.
HTTP/1.1 200
<meta name='robots' content='max-image-preview:large' />
"@type":"Product"
"@type":"Offer"| What it prints | What it means | Check |
|---|---|---|
A line with woo-coming-soon-page | The store is in coming soon mode | 1 |
HTTP/1.1 404 | The product is not published, or its address has changed | 2 |
noindex in the robots tag, or an X-Robots-Tag line that says it | The page asks to be left out of search | 2 |
No "@type":"Product" line | The page carries no product data | 4 |
"@type":"Product" with no "@type":"Offer" | The product data has no offer | 4 |
"@type":"AggregateOffer" | The price is given as a range | 4 |
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, nofollowon 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 address | Robots tag | Product data | Shop and category pages | Product search | Product sitemap |
|---|---|---|---|---|---|---|
| "Shop and search results" | 200 | max-image-preview:large | Yes | Listed | Listed | Listed |
| "Shop only" | 200 | max-image-preview:large | Yes | Listed | Not listed | Listed |
| "Search results only" | 200 | max-image-preview:large | Yes | Not listed | Listed | Listed |
| "Hidden" | 200 | max-image-preview:large | Yes | Not listed | Not listed | Listed |
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 is | Its own address | Robots tag | Product data | Shop and category pages | Product sitemap |
|---|---|---|---|---|---|
| A draft | 404 | Not listed | Not listed | ||
| Private | 404 | Not listed | Not listed | ||
| Password protected | 200, with a form that asks for the password | max-image-preview:large | None | Listed | Listed |
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.
wp wc product list --user=admin --fields=id,name,status,catalog_visibility --orderby=id --order=asc --per_page=100 --format=csvstatus 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.
curl -s https://example.com/wp-sitemap-posts-product-1.xml | grep -o "<loc>[^<]*</loc>" | sortEach 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 availability | name, and one of review, aggregateRating or offers |
| Merchant listing: for a page where a shopper can buy the product | name, 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 has | Product data on its page |
|---|---|
| A price, no product image, no reviews | A Product with one Offer, and no image |
| No price and no reviews | No Product at all. The only structured data on the page is its breadcrumb trail |
| No price and one rated review | A Product with an aggregateRating and no offer |
| Variations at different prices | A 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
AggregateOfferand merchant listings require anOffer. 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
noindexheader 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.
- Error fixHow to fix WooCommerce payment gateway errors
- ResourceWooCommerce checkout is down: a runbook
- Cost guideWooCommerce maintenance cost: why a store costs more, and what the extra should buy
- ResourceWooCommerce sale readiness checklist: Black Friday or any big sale
- Error fixHow to fix a WooCommerce checkout that is not working
- GuideHow to maintain a WooCommerce store: before every update, every week, every month and before a sale

