WooCommerce SEO is the work of getting a WooCommerce store's product and category pages to rank in search. Because WooCommerce runs on WordPress, part of it is WordPress setup: indexing, sitemaps and an SEO plugin. The rest is specific to WooCommerce: the product permalink base, category and tag bases, attribute archives and filters, variable products, Product structured data and the product fields every page is built from.
The short version: choose a stable product permalink base before the catalog grows, keep thin tag and attribute archives out of the index, build filters on global attributes, give every variation its own SKU and GTIN, make sure exactly one plugin prints Product schema, and fill the fields a product page renders. This guide walks through each step with the real WooCommerce settings and field names. For the audit process that comes before it, see our ecommerce SEO audit checklist.
What WordPress and WooCommerce give you before any SEO plugin
A fresh WooCommerce install is less bare than people assume. Out of the box you get:
- Editable slugs: every product, product category and product tag has a slug you can change in the editor.
- An XML sitemap: WordPress has generated a basic sitemap at /wp-sitemap.xml since version 5.5. Yoast SEO and most other SEO plugins switch it off and publish their own.
- Product structured data: WooCommerce prints JSON-LD Product markup on single product pages, with the name, description, SKU, main image and an offer built from price and stock status.
- A barcode field: since WooCommerce 9.2, the Inventory tab has a field labeled "GTIN, UPC, EAN, or ISBN" (WooCommerce). Before that, stores needed a plugin or put barcodes in the SKU field.
What core does not give you: a separate SEO title and meta description per product, control over which archives get indexed, and identifiers or brand in the markup for every variation. That is the job of Yoast SEO, Rank Math or a similar plugin.
Check one WordPress setting before anything else: Settings > Reading > "Search engine visibility". A staging site promoted to live with "Discourage search engines from indexing this site" still ticked is one of the most frequent reasons a new WooCommerce store gets no organic traffic at all.
Caching, images and plugins: WooCommerce page speed
Speed is the part of WooCommerce SEO most general guides lead with, and it matters mostly through Core Web Vitals. Google measures loading (Largest Contentful Paint, good within 2.5 seconds), responsiveness (Interaction to Next Paint, good under 200 milliseconds) and visual stability (Cumulative Layout Shift, good below 0.1), and says good scores align with what its ranking systems reward (Google Search Central). On a WooCommerce store, four things move those numbers most:
- A page cache with the right exclusions. Cache product and category pages, but never Cart, Checkout or My Account, which WooCommerce says must stay dynamic because they show customer-specific data (WooCommerce developer docs).
- Images uploaded at display size. A 4,000-pixel supplier photo scaled down by the browser is the usual cause of a slow Largest Contentful Paint on product pages. Resize and compress before upload, or use an image plugin that serves WebP.
- Fewer plugins that load on every page. Sliders, popups and page builder add-ons often load their scripts sitewide, including on product pages that never use them.
- HTTPS everywhere, with old http:// URLs redirected, so product links and images do not mix protocols.
Product permalinks: pick a base before the catalog grows
Under Settings > Permalinks, WooCommerce offers four product permalink options (WooCommerce docs). For the stonewashed linen duvet cover used as the example in this guide, they produce:
WooCommerce product permalink options
| Default | example.com/product/stonewashed-linen-duvet-cover/ | No |
|---|---|---|
| Shop base | example.com/shop/stonewashed-linen-duvet-cover/ | No |
| Shop base with category | example.com/shop/duvet-covers/stonewashed-linen-duvet-cover/ | Yes |
| Custom base | Any prefix you type, such as example.com/bedding/stonewashed-linen-duvet-cover/ | No |
The category-in-URL option looks tidy, but it ties every product URL to a category. Move the duvet cover from "Duvet covers" to "Linen bedding" during a range review and its URL changes. The default or shop base keeps product URLs stable however often you reorganize the category tree, and stable URLs keep their links and ranking history. A keyword in the URL is a small signal; a forgotten redirect is a big problem.
Two rules from the WooCommerce documentation matter here. The product base must not match a taxonomy base, so a product base of "shop" and a category base of "shop" collide. And changing any base changes existing URLs, so old links and indexed pages return 404 errors unless you add redirects. If product pages 404 right after a change, saving the Permalinks page again regenerates the rewrite rules.
Product category pages, tag pages and attribute archives
WooCommerce creates three kinds of archive pages, and they deserve different treatment.
- Product categories (/product-category/duvet-covers/ by default): your main landing pages for broad queries such as "linen duvet cover". Index them, give the important ones an intro with real buying information, and keep the tree shallow enough that each category holds enough products to be useful. You can rename the base under Settings > Permalinks, in the Optional section.
- Product tags (/product-tag/...): usually created on the fly by whoever edits products, which produces hundreds of near-empty pages such as "linen", "Linen" and "linnen". Either curate a short list of tags that match real searches or set tag archives to noindex in your SEO plugin.
- Attribute archives: a global attribute only gets public pages when "Enable archives?" is ticked for it under Products > Attributes. Then example.com/color/sage/ lists every sage product. That can work for one or two attributes people search by, such as material, and creates thin pages for the rest.
Global pa_ attributes vs custom product attributes
Attributes are where WooCommerce SEO and product data meet. WooCommerce has two kinds:
- Global attributes are created under Products > Attributes, with a list of terms you reuse across products. Their taxonomy names start with pa_ (pa_color, pa_size). Only global attributes feed the product filter blocks and widgets, attribute archives and consistent variation dropdowns.
- Custom product attributes are typed on one product's Attributes tab. They print in the Additional information tab, but you cannot reuse them, filter on them or keep their spelling consistent across products.
A catalog built on custom attributes ends up with "Sage", "sage green" and "Sage Green" on three products and a color filter that cannot be built. Move anything shoppers filter or search by into a global attribute with a fixed list of terms, and keep free-text custom attributes for details that are unique to one product.
Filters also create URLs. WooCommerce's attribute filters add a filter_ parameter per attribute to the category URL, such as ?filter_color=sage, and every combination of color, size and price is another crawlable address. Most stores should keep filter combinations out of the index and let category pages rank. A few high-demand combinations can become real landing pages with their own links and copy. Our guide to faceted navigation SEO explains how to decide filter by filter.
Variable products: one indexable URL, many SKUs
A WooCommerce variable product is one page with variations underneath. Variations do not get their own permalinks, which suits SEO: links, reviews and ranking history all collect on one URL. The data per variation still matters, because Google Shopping, merchant listings and your own filters read it.
Each variation has its own image, SKU, "GTIN, UPC, EAN, or ISBN", regular and sale price, stock settings and description (WooCommerce). For the duvet cover with three sizes and three colors, that means nine variations, each with:
- Its own SKU and GTIN. A queen-size sage cover and a king-size charcoal cover are different trade items with different barcodes. Our guide to GTIN, UPC and EAN explains which code goes where.
- A variation image for every color, so the main image changes when a shopper picks sage instead of sand.
- Only true options marked "Used for variations". Size and color are options; material and thread count are plain attributes on the parent.
- A default only when it helps. Set "Default Form Values" to the best seller if there is a clear one. Otherwise the page shows the price range, which is honest.
Google's product variant structured data guidelines ask that each variant can be preselected through a distinct URL, usually with query parameters, and that the group keeps one canonical URL without variant selectors. WooCommerce preselects options from attribute_ parameters in the URL, such as /product/stonewashed-linen-duvet-cover/?attribute_pa_color=sage&attribute_pa_size=queen. Use those URLs as the variant links in your Merchant Center feed and keep the canonical on the parent URL.
The WooCommerce documentation also notes that above 30 variations the dropdowns stop updating based on earlier choices and list every option, so shoppers can pick combinations that do not exist (WooCommerce). If a product has 6 sizes, 8 colors and 2 fabrics (96 variations), consider splitting it by fabric. Two products with clear names usually serve shoppers and search better than one page with a long list of combinations.
Product schema in Yoast SEO and Rank Math, compared
Because WooCommerce already prints Product markup, the plugin decision is about what gets added and whether you end up with two Product entities on one page.
Product schema from WooCommerce, Yoast SEO and Rank Math
| WooCommerce core | A basic Product entity with name, description, SKU, image and offers, plus rating data when reviews are enabled | No identifiers or brand for every variation | None, built in |
|---|---|---|---|
| Yoast SEO + Yoast WooCommerce SEO | Connects the product to the rest of Yoast's schema graph (Yoast) | GTIN8, GTIN12/UPC, GTIN13/EAN, GTIN14/ITF-14 and MPN fields on every variation, printed in the structured data | The WooCommerce SEO add-on |
| Rank Math | WooCommerce Product schema type picked per product in the Schema tab; price, SKU and stock status pulled from WooCommerce (Rank Math) | Brand from a product taxonomy you select under General Settings > WooCommerce | Choosing a GTIN key (Pro) |
Whichever you use, open one product's page source and search for application/ld+json. You want a single Product entity whose price, currency, availability, GTIN and brand match what the page shows. To see what complete markup looks like for your product type, build a sample with our product schema generator and compare.
The plugin is only the printer. If the brand is empty or the GTIN sits in a custom field the plugin does not read, the markup stays incomplete whichever plugin you install.
The WooCommerce product fields that feed rankings
Most of the ranking work on a WooCommerce store happens in the product editor. Field by field:
- Product name: becomes the H1 and the default title. Put the product type and a defining attribute in it ("Stonewashed Linen Duvet Cover") and leave size and color to the variations.
- Slug: generated from the name when you first save. Shorten it before publishing, since changing it later needs a redirect.
- Product description: the main content in the Description tab. Use it for what a buyer needs: material, weave, fabric weight, closure, care and exact dimensions. Supplier text copied by every other reseller adds little.
- Product short description: shown next to the price in most themes. Two or three lines with the facts that decide the purchase.
- SEO title and meta description: plugin fields in Yoast or Rank Math. Build them from attributes rather than letting the plugin cut the first sentence of the description.
- Product image and gallery: alt text is stored per image in the Media Library, so one image reused on 20 products carries one alt text. Describe what the image shows.
- SKU and "GTIN, UPC, EAN, or ISBN": in the Inventory tab of the parent and of every variation.
- Attributes: global where possible, with "Visible on the product page" ticked for the specs shoppers compare.
- Categories: assign one primary category that matches the breadcrumb you want. Yoast and Rank Math both let you set it.
- Linked Products: Upsells and Cross-sells add links between related products, which helps crawlers find deep products.
- Catalog visibility: "Shop and search results", "Shop only", "Search results only" or "Hidden". Hidden products are still reachable by URL, so a hidden test product can still end up in Google.
For the reasoning behind each element, independent of platform, see our product page SEO guide.
Before and after: one linen duvet cover in WooCommerce
Here is the duvet cover as it arrived from a supplier import, next to the same product after a cleanup that took no new plugin. After the cleanup, Duvet covers is its primary category, with Linen bedding as a second category.
One linen duvet cover, before and after the cleanup
| Name | Duvet cover linen 240x220 sage NEW | Stonewashed Linen Duvet Cover |
|---|---|---|
| Slug and URL | duvet-cover-linen-240x220-sage-new | /product/stonewashed-linen-duvet-cover/ |
| Description | A 40-word supplier paragraph shared with every reseller | Weave, fabric weight, dimensions per size, care instructions and what makes stonewashed linen soft from the first night |
| Attributes | One custom attribute, "Colour: sage | sand | charcoal", not usable as a filter | Global pa_color (Sage, Sand, Charcoal) and pa_size (Twin, Queen, King) used for variations; material (100% linen), fabric weight (165 g/m²) and closure (coconut buttons) as visible attributes on the parent |
| Variations | Nine, without SKUs or GTINs, all showing the same sand-colored photo | Nine, with SKUs from LDC-SAG-TW to LDC-CHA-KG, a GTIN-13 each and one photo per color |
| SEO title | Empty, so the plugin used the first 155 characters of the description | Stonewashed Linen Duvet Cover, Twin to King, 3 Colors |
| Meta description | Empty, so the plugin used the first 155 characters of the description | Stonewashed 100% linen duvet cover, 165 g/m², with coconut button closure. Twin, Queen and King in sage, sand and charcoal. Machine washable at 40 °C. |
The product now qualifies for the color and size filters, prints a complete Product entity, and shows a meta description written for the search result instead of a truncated sentence.
Seven WooCommerce shortcuts that leak organic traffic
- Switching the product base on a live store without redirects. Every indexed product URL breaks at once.
- Letting product tags multiply. Hundreds of one-product tag archives dilute crawling and internal links.
- Storing filterable facts as custom attributes. No filter, no attribute archive, no consistent values.
- Two or three sources of Product markup. WooCommerce, an SEO plugin and a reviews plugin each print their own entity, sometimes with different prices.
- A page builder template that skips the description. If the product template does not render the Description field, the text you wrote never reaches the page.
- Deleting sold-out products. Keep temporarily unavailable products live and marked out of stock; redirect discontinued ones to the closest replacement or category.
- Publishing supplier descriptions unchanged. When the same paragraph appears on dozens of stores, your page has little reason to rank above theirs.
Other platforms have their own versions of these problems; compare our Shopify SEO checklist and the Magento SEO guide if you run more than one store.
Filling WooCommerce SEO fields in bulk with WISEPIM
Most of the work above is field work, repeated across every product and variation. WISEPIM connects to WooCommerce through its REST API. An import pulls names, SKUs, prices, descriptions and short descriptions, stock, images, attributes, categories, tags and variations, plus brand, EAN and SEO fields. In WISEPIM you fill missing attributes, descriptions, SEO titles and meta descriptions with AI, check completeness with Quality Guard, and export the result back, including the Yoast SEO title and meta description when the store uses Yoast. Variations go back under their parent product.
You can connect a store through the WooCommerce connection and work on up to 100 products on the free plan.

