Free SEO Tools

WooCommerce SEO Checker: Product Page Audit

Audit a WooCommerce product or category URL: indexability, title and description length, canonical, Product and BreadcrumbList schema, and image alt text.

Enter a product, category or shop URL from any WooCommerce store. The check runs the full indexability test, then reads the title, meta description, canonical, Product and BreadcrumbList structured data and image alt text from the same page. It works on any page; RankHive’s agent itself edits posts and pages, not WooCommerce products or categories yet.

What this covers: the check works on any product, category or shop page. RankHive’s agent edits WordPress posts and pages, not WooCommerce products or product categories yet, so fix what this finds on product pages in WooCommerce or your SEO plugin. See what RankHive does for WooCommerce stores and the WooCommerce SEO guide.

The check takes up to 30 seconds.

WooCommerce SEO report

Enter a WooCommerce URL to check indexability, snippet length, canonical, structured data and image alt text.

What the check runs on one URL

It first runs the same test as the indexability checker: status code, redirects, robots.txt, robots meta tags, X-Robots-Tag headers and the canonical. The headline comes from that alone and reads Nothing blocks indexing, Indexable, with warnings, or Not indexable as it stands, or Could not check this URL when the page did not load.

From the same fetch it then reads the title, the meta description, the canonical, every JSON-LD block, up to 200 images and the number of H1 headings, and turns each into one line of the report. Each line links to the tool that checks it in depth. The whole check has 30 seconds.

Because the headline is about indexing only, a product with broken Product markup and no meta description can still read Nothing blocks indexing. Read the lines under it.

What it does not read

  • Microdata and RDFa. Only JSON-LD is read, which is what WooCommerce and the main SEO plugins print.
  • JSON-LD added by JavaScript after the page loads.
  • Anything past the first offer of a Product. The Structured data panel below the report lists every Product it found.
  • Whether the price in the markup matches the price on the page or in your Merchant Center feed.

How it decides the page type

The page type comes from the classes WordPress prints on the <body> element. single-product makes it a Product page; tax-product_cat or tax-product_tag a Product category; post-type-archive-product or woocommerce-shop a Shop page. Failing those, an og:type of product or any Product JSON-LD makes it a Product page. Anything else is Not recognised as a WooCommerce page.

The type changes the Product line. On a product page, missing Product markup is a fail. On a category or shop page the line is only informational. With no Product markup there, it reads “Category and shop pages list products rather than describe one, so Product markup is not expected here.” When a plugin prints a Product item for each listed product, the line gives the number of items and says Google does not use them on this page, and the Structured data panel shows their messages as notes rather than errors.

If no WooCommerce body class is found, the report adds “WooCommerce markers were not found on this page. The checks below still apply to any page.” That happens on headless storefronts, on themes or page builder templates that drop WordPress’s body classes, and on pages that are not store pages at all.

Product snippets, merchant listings and Merchant Center

Google has two kinds of product result built from the markup on your page, and a third fed from Google Merchant Center. They have different requirements, and the checker’s messages name the one each rule belongs to.

ResultWhat it isWhat it needs (as of October 2026)
Product snippetAn ordinary search result with price, stock status or review stars under the titleA Product with a name and at least one of offers, review or aggregateRating
Merchant listingShopping-style results, such as popular products and product knowledge panelsA Product with a name, an image and an offer with a price and currency; Google recommends more, such as shipping, returns and identifiers
Merchant Center listingsProducts from a feed you send to Google Merchant Center, including free listingsA Merchant Center account and a product feed; WooCommerce stores usually connect with the Google for WooCommerce extension

The checker reads the page side. “Google needs at least one for a product rich result” is the product snippet rule, and “Google requires one for merchant listings (the shopping-style result)” is the image rule for merchant listings. Valid markup makes a page eligible; Google still decides what to show.

Merchant Center does not replace the markup. Google compares your feed with your pages and can disapprove a product when the price or availability disagree, so the on-page markup matters even if you sell through a feed.

Every Product message, and the fix

The Product line shows the number of errors and the first one, or the number of missing recommended fields, for the most complete Product on the page. The Structured data panel lists every message for every Product. WooCommerce’s own markup passes most of these by design, so a message usually points to missing product data or to a second source of markup.

MessageUsual cause on a WooCommerce storeFix
Product has none of “offers”, “review” or “aggregateRating”.A Product printed by a theme or plugin. WooCommerce itself prints no Product at all when a product has no price and no reviews.Find that source (see the next section) and complete it or turn it off
Product has no “image”.No product image is set; WooCommerce includes the image only when there is oneProduct image, in the right-hand column of the product editor
Offer has no “price”. / AggregateOffer has no “lowPrice”.Another plugin’s markup. WooCommerce leaves the offer out entirely when the price is empty.Set the price under Product data → General, and check the other source
Offer has no “priceCurrency” (e.g. USD).Custom or third-party markupWooCommerce adds it from WooCommerce → Settings → General → Currency
aggregateRating has no “ratingValue”, or needs “ratingCount” or “reviewCount”A review or theme plugin printing its own ratingThat plugin’s settings; WooCommerce prints both fields when it adds a rating
Price “…” should be a plain number…Markup that copies the displayed price, such as $1,299.00WooCommerce prints 1299.00; fix or remove the other source
Offer has no “availability”, or availability “…” is not a schema.org valueCustom markup, or text such as in stockWooCommerce maps the stock status to InStock, OutOfStock or BackOrder
Product has no “description”.Both the short and the long description are emptyWrite the short description; WooCommerce uses it first
Product has no “brand”.No brand assigned to the productProducts → Brands in WooCommerce, which adds the first brand to the markup; in Rank Math, also pick the brand taxonomy under Rank Math SEO → General Settings → WooCommerce → Select Brand
Product has no identifier (“sku”, “gtin” or “mpn”).Rare with WooCommerce, which prints the product ID as sku when no SKU is setAdd the SKU and the GTIN, UPC, EAN or ISBN field under Product data → Inventory

A product that passes reads “Product with name, offer, price, currency and availability.”

Where Product markup comes from, and when there are two

WooCommerce builds its Product JSON-LD while the product summary is displayed and prints it in the page footer, in one block that can also hold the page’s BreadcrumbList. It includes the name, URL, description, main image, sku, a valid GTIN if you entered one, the offer, and the rating with up to five recent reviews when the product has ratings.

So “No Product JSON-LD found” on a product page has three usual causes: the product has no price and no reviews, so WooCommerce prints nothing rather than invalid markup; a page builder template for single products never runs WooCommerce’s standard product hooks; or the markup is microdata, which this check does not read.

SEO plugins change this. Rank Math’s schema module replaces WooCommerce’s markup: on product pages it removes WooCommerce’s block and prints its own Product (a ProductGroup when its markup lists variants), following the Schema Type setting under Rank Math SEO → Titles & Meta → Products. On shop and category pages Rank Math prints a short Product entry for each listed product only if you switch off Remove Schema Markup on Shop Archives under Rank Math SEO → General Settings → WooCommerce, or Remove Snippet Data under Rank Math SEO → Titles & Meta → Product Categories; both are on by default. Free Yoast SEO leaves Product markup to WooCommerce; its paid WooCommerce add-on extends it. In SEOPress, product schema is a PRO feature.

Two Product entries in the Structured data panel, one from WooCommerce and one from a plugin, can give Google two sets of values for the same product. Keep one complete source. With two or more, the Product line is at best a warning: it starts “2 separate Product items on this page” and reports on the most complete one, the item with the fewest errors and then the fewest missing recommended fields. Variants listed under a ProductGroup’s hasVariant are part of that group, not separate items.

Variable products and price ranges

For a variable product whose variations cost different amounts, WooCommerce prints an AggregateOffer with lowPrice, highPrice and offerCount. When every variation costs the same, it prints a single Offer instead. The checker reads lowPrice as the price, so a variable product passes, and the panel shows its lowest price.

Some SEO plugins mark a variable product up as a ProductGroup, Google’s documented markup for products sold in variants. The group itself usually carries no offer: each variation is a Product under hasVariant with its own Offer. The checker counts those offers as the group’s, so the Product line passes when every variant has an offer with a price, currency and availability, and reads “ProductGroup with 3 variants, each with an offer, price, currency and availability”, followed by the price range. A problem on some of the variants is listed once, with how many variants it affects. A ProductGroup with no offer, review or rating on the group or on any of its variants still fails.

Google’s product documentation says not to use an AggregateOffer to describe a set of product variants, and merchant listings require a single Offer from the seller. For products sold in variants it documents ProductGroup with hasVariant (as of October 2026). Run a variable product through the Rich Results Test to see which result types it qualifies for.

Recent WooCommerce versions describe a single variation, with one Offer at that variation’s price, when the URL selects every attribute, for example ?attribute_pa_size=large. That is the kind of URL a Merchant Center feed links to. Check one separately: its canonical usually points to the parent product, which the report shows as an informational line, as it should.

Canonicals on product, filter, variant and paginated URLs

Stores create many URLs for the same products: sorting, filters, attribute parameters and pagination. The canonical line judges each against what that kind of URL should declare.

URLExpected canonicalWhat the check says
A product, /product/blue-mug/ItselfPass: “Points to this URL.”
A filtered, sorted or variant URL, such as ?orderby=price or ?attribute_pa_color=blueThe clean category or product URLInformational: “usually right for a filtered or variant URL”
Category page 2, /product-category/mugs/page/2/Itself: it lists different products from page 1Warning if it points to page 1, with a note that paginated pages should point to themselves
A category on a site with no SEO pluginItselfWarning: “No canonical tag.” WordPress core prints canonicals only on single posts, pages and products.

Yoast SEO, Rank Math and SEOPress make paginated pages point to themselves by default, so a page 2 that points to page 1 usually comes from a theme or custom code. To set a canonical by hand, use the Advanced tab of the SEO plugin’s box on the product, or the same fields on the category’s edit screen under Products → Categories.

Titles, descriptions and H1s on product pages

The title line warns above 60 characters (“Likely cut off in results; put the product name and the detail buyers search for first.”) and notes titles under 30 as short, suggesting brand, model, size or material. The meta description line warns when there is none or when it is over 160 characters, and notes one under 70 as short. Both are character counts; Google truncates by pixel width, so the title checker gives the closer answer.

Most store titles come from a template: Yoast SEO → Settings → Content types → Products, Rank Math SEO → Titles & Meta → Products, or SEO → Titles & Metas → Post Types in SEOPress. A template that appends the store name to a long product name runs past 60 characters on most products. Override the worst ones in the SEO box on the product, and shorten the template if most products overflow. Categories have their own templates under the taxonomy settings of the same screens.

The H1 line expects one heading with text. Most WooCommerce themes print the product or category name as the H1. No H1 usually means a page builder template that shows the name in a styled paragraph; several usually mean a theme that also makes the logo or a banner an H1. More than one is informational only.

Worked example: one product, before and after

Illustrative values. A ceramics store on Yoast SEO checks a variable product, a stoneware mug sold in three sizes at $24 to $32.

Title tag

Before: Hand-Thrown Stoneware Coffee Mug with Speckled Glaze, 12 oz, 14 oz or 16 oz - Clay & Kiln (89 characters)

After: Stoneware Coffee Mug, Speckled Glaze | Clay & Kiln (50 characters)

The template added the store name to a long product name. The owner set a shorter SEO title in the Yoast SEO box on the product; the sizes belong on the page, not in the title.

Meta description

Before: No meta description. Google will build the snippet from page text instead.

After: A hand-thrown stoneware mug with a speckled glaze, in 12, 14 and 16 oz. Dishwasher safe, made in small batches in our Vermont studio. Free shipping over $50. (157 characters)

Product structured data

Before: Required fields present. 1 recommended field missing. Panel: Product: Hand-Thrown Stoneware Coffee Mug · 24.00 USD · Product has no “brand”.

After: Product with name, offer, price, currency and availability.

The AggregateOffer’s lowPrice is the 24.00 shown. The owner created the store’s own brand under Products → Brands and assigned it.

Image alt text

Before: 2 of 9 images need better alt text. They are listed under Images to fix.

After: All 9 images have alt text or are marked decorative.

The gallery passed: WooCommerce used the product name as a fallback. The two failures were related-product thumbnails with alt text like mug-blue-03, fixed in the Media Library.

Indexable, Canonical, BreadcrumbList (“3 crumbs: Home › Mugs › Hand-Thrown Stoneware Coffee Mug”) and H1 passed before and after. The headline read Nothing blocks indexing throughout, which is why the lines below it matter.

Confirming in Google, and when to leave a result alone

Run the product URL through Google’s Rich Results Test. It renders the page, so it also sees microdata and JSON-LD added by JavaScript, and it says whether the page qualifies for product snippets, merchant listings or both. The Schema Markup Validator at validator.schema.org checks every type against schema.org, whether or not Google uses it.

In Search Console, the Shopping section has Product snippets and Merchant listings reports covering the whole store. After a fix, open the issue and choose Validate fix. For a single product, URL Inspection with Test live URL shows the structured data Google detects now.

Leave these alone: informational lines (a short title or description, several H1s, no BreadcrumbList); an informational canonical on a filtered or variant URL; no Product markup, or unused Product items for listed products, on category and shop pages; and Not indexable as it stands on cart, checkout and my account pages, which WooCommerce marks noindex on purpose. A brand warning on products you make yourself goes away when you use your store name as the brand.

FAQ about the WooCommerce SEO Check

Can RankHive fix what this finds on my product pages?

Not yet. RankHive drafts and applies fixes to posts and pages (buying guides, blog posts, landing pages), not to WooCommerce products or product categories. Fix product-page findings in WooCommerce or your SEO plugin; RankHive covers the content that sends shoppers to them.

Where does WooCommerce product schema come from?

WooCommerce prints Product JSON-LD on product pages itself, as long as the product has a price or reviews. Rank Math replaces it with its own Product, Yoast’s paid WooCommerce add-on extends WooCommerce’s, and themes or review plugins sometimes add another. If the check finds none, check the price, the product page template, and whether the markup is microdata.

Why does my category page canonical point to page one?

Usually a theme or custom code points every paginated category page at the first one; the main SEO plugins do not by default. Page 2 lists different products, so it should normally point to itself; otherwise products linked only from later pages are harder for Google to find.

Do I need Google Merchant Center for my products to show in Google?

Not for product snippets or merchant listings in search results, which can come from the markup on your pages. Merchant Center adds listings from a product feed, including free listings, and more control over how products appear (as of October 2026).

Why don’t review stars show for my products?

WooCommerce adds a rating to the markup only when the product has approved reviews with ratings and star ratings are on under WooCommerce → Settings → Products. Even with valid markup, Google decides whether to show stars.

Should category pages have Product schema?

No. Google’s product results are for pages about one product. Category pages are better served by BreadcrumbList and a good title and description. If Rank Math prints a Product entry for each listed product, the checker counts those entries and shows their messages as notes, since Google does not use them there. Rank Math’s settings can turn them off for the shop page and for product categories.

Does the check read microdata?

No, only JSON-LD. Some older themes print product details as microdata (itemprop attributes in the HTML). Google’s Rich Results Test reads both, so use it when this check reports no Product markup but you expect some.

Why is brand flagged when I make my own products?

Brand is recommended, not required. If you make the products yourself, your store name is the brand: create it under Products → Brands and assign it.