Product Page SEO: Which of Your 400 Products Deserve Unique Copy
You can't write 400 product descriptions and don't need to. Tier the catalogue with Search Console and GA4, then give each tier the product page SEO it earns.

Every product page SEO guide says to write unique copy for every product. On a 400-product store nobody does, so the supplier text stays and nothing ranks. The fix is to tier the catalogue and spend the writing where the data says it pays:
- Tier the catalogue: Join Search Console clicks and impressions per product URL with GA4 revenue. Products with revenue are tier 1, products with impressions but no revenue are tier 2, variants and one-offs are tier 3.
- Give tier 1 the full page: Unique title and meta description, copy that answers the buying question, an HTML specs table, Product markup with an Offer, availability and reviews, named image files with real alt text, and links in from the category and a guide.
- Template tier 2: A title, meta and description template with variable slots filled from product fields. Never the manufacturer's paragraph. Recheck after 30 days and promote anything that earned impressions.
- Decide tier 3: True variants canonicalise to the parent product. One-offs with no demand get noindex when crawl budget is tight, and stay templated otherwise. Out-of-stock pages stay live with OutOfStock availability if the product returns.
"product page seo" gets 140 US searches a month at keyword difficulty 19, and "product description seo" 210 (DataForSEO, US, September 2026). Every page ranking for them lists tips. None of them shows you which products to start with.
Every ranking guide for this query lists 15 to 20 tips and tells you to write unique copy for all of them. I read the same October 2025 Reddit thread the AI Overview cites, and the practitioners in it do something different: they tier. Try CrawlRaven free: 1 site, no credit card →
A store owner posted in r/ecommercemarketing in October 2025 that writing unique titles and descriptions for hundreds of new products "feels impossible". Every product page SEO guide on page one says to do it anyway. So the supplier text stays, and the store ranks for nothing.
The honest answer is that you don't write 400 descriptions. You find the 60 to 80 products that earn clicks and revenue, write those properly, template the next hundred or so, and stop the rest from competing with them. This guide is that method, with the data join that makes the tiers fall out on their own.
Three questions that sort every product URL into a tier
Why 400 unique product descriptions is the wrong goal
The thread is worth reading in full, because the OP had already run the experiment. "When I first started, I just copied the supplier descriptions, but those pages never ranked well. Then I tried rewriting a few manually and noticed those actually brought in some traffic."
Two replies, both from October 2025, gave the answer the guides skip. One: "the top 20% of products will drive 80% of the revenue, so make sure these are crawled, indexed and optimized", then "wait 30 days, come back and optimize each page individually based on google search consloe data". The other split the catalogue into three tiers:
- Tier 1: "Best-sellers, flagship items, high-margin products", which get "unique titles, rich descriptions, internal links, FAQs".
- Tier 2: "Category representatives, seasonal items, products with steady search volume", which get a "partial rewrite + templated structure".
- Tier 3: "Low-traffic variants, one-offs, long-tail SKUs", which get "light optimization or even canonicalized to parent category".
The thread stops there. It doesn't say how to pick the tiers without guessing, what "fully optimized" contains, or that canonicalising a product to a category is not what a canonical tag is for. The rest of this guide fills those three gaps.
Step 1: Tier the catalogue with Search Console clicks and GA4 revenue
Tiering by gut works for the ten products you already know sell. It fails for the long tail, where a product that quietly earns 40 clicks a month for a model-number query looks identical to one that earns nothing. The two numbers that separate them live in different tools, so you join them on the product URL.
The join, by hand
- Export Search Console pages. Performance, Search results, last 3 months, filter Page contains your product path (
/products/on Shopify,/product/on WooCommerce). Export clicks and impressions per URL. - Export GA4 revenue by landing page. Reports, Engagement, Landing page, same 3 months, with the Total revenue metric. Export it.
- Normalise the URLs. Strip query strings and trailing slashes so a variant URL joins to its parent, and the two exports agree.
- Join on URL in a sheet. Every product URL now has four columns: clicks, impressions, revenue, and blank where it earned none.
- Sort by revenue, then by impressions. The tiers are the three bands of that sort.
We built CrawlRaven's ecommerce mode for exactly this join: it lists every product URL with its Search Console clicks, impressions and GA4 revenue in one table, so the tiers fall out of a sort. The same audit flags product pages with missing or broken Product markup and duplicate titles across the catalogue, which is where step 2 starts.
The free plan covers 1 site; the 3-site lifetime licence launched at $49. Lifetime pricing steps up as licenses sell, so check the pricing page for the current batch. Today's number is on the pricing page.
Where to draw the tier lines
Run the three questions in the flow above, in order, and stop at the first yes:
- Revenue in the last 90 days, or top 20% by units sold: tier 1. Revenue outranks everything. A product that sells from paid or email traffic and has no organic clicks still gets the full page, because the query exists and you are not on it yet.
- Impressions in Search Console but no revenue: tier 2. Google already shows the page for something. A template that names the attribute in the query is usually enough to earn the click.
- Neither: tier 3. Split it once more: a variant or near-duplicate of an indexed product canonicalises to it; a standalone one-off stays templated, with noindex only if crawl budget is a real constraint.
On a 400-product catalogue that usually lands around 80 products in tier 1, 150 in tier 2 and the rest in tier 3. Your numbers will differ. The order of work will not.
What each tier of the catalogue gets
Step 2: Give tier 1 the full product page
"Unique copy" is the phrase everyone uses and the smallest part of the job. A tier-1 product page carries eight elements. I checked what three live stores ship before writing the list: Allbirds on Shopify, Barefoot Buttons on WooCommerce, and Zappos, all fetched in September 2026.
The eight elements a product page that earns revenue should carry
alt: Men's Cruiser sneaker in medium grey, side view
- 1Title tag and H1Product, the attribute the query uses, brand. Title and H1 agree.
- 2BreadcrumbCategory path in HTML with BreadcrumbList markup; the first internal link in.
- 3GalleryFile names and alt text name the product, colour and angle.
- 4Price and availabilityVisible on the page and identical in the Offer markup.
- 5Buying-question copyWho it is for, what it fits, what it is not. Written from the product.
- 6Specs tableHTML table of attributes; the source of the tier-2 template variables.
- 7Reviews and questionsReal reviews with AggregateRating; a questions block answers the objections.
- 8Related and guide linksTwo related products and the buying guide that links back.
Title tag and meta description
The title tag names the product, the attribute the query uses, and the brand. Allbirds ships "Men's Cruiser | Everyday Comfort & Style | Allbirds"; Barefoot Buttons ships "Barefoot Buttons V1 Standard Clear Acrylic Footswitch Topper", which carries the model, the material and the product type a guitarist types.
The meta description is where templates show. Zappos runs one pattern: "Men's Kenneth Cole Charles by Kenneth Cole at Zappos.com. Read ... product reviews, or select the size, width, and color of your choice." Barefoot Buttons wrote theirs: "Turn tiny switches into solid targets... No wobble. No misses." Tier 1 gets the second kind.
Check both with the meta checker; the Shopify meta description guide covers the theme field.
Copy that answers the buying question
A shopper on a product page has one question left: is this the right one for me? The copy answers it in three parts, and none of them is in the supplier's paragraph:
- Who it is for. The use, the skill level, the room, the pedal. Barefoot Buttons opens with LEDs staying visible and "common 3PDT switches 3/8" (10mm)", then answers "How big is a Standard Barefoot Button?" in a questions block.
- What it fits or works with. Compatibility, sizing, what else you need. This is where the model-number and "fits" queries land.
- What it is not. The honest line that cuts returns and reads as expertise: runs narrow, not for outdoor use, needs the larger bore.
Length follows the product. 120 to 300 words plus a specs table covers most of a catalogue. Keep the page to one product, because Google's merchant listing documentation says product rich results "only support pages that focus on a single product (or multiple variants of the same product)".
Specs table and Product structured data
Put the attributes in an HTML table, not a PDF or an image. It is the content the long-tail queries match, and the field list your tier-2 template draws from. Then add the structured data. Google's Product structured data intro splits the feature in two, and a store wants the second:
| Property | Merchant listing status | What the live pages carry |
|---|---|---|
| name, image | Required | All three |
| offers with price and priceCurrency | Required (one Offer, not AggregateOffer) | All three: $105 USD, $9.95 USD, $159.95 USD |
| offers.availability | Recommended; InStock, OutOfStock, PreOrder, BackOrder | All three; Allbirds sets InStock or OutOfStock per variant |
| sku or gtin, brand | Recommended | Zappos: sku 10038622 and brand; Barefoot: sku 17-V1-ST-CR; Allbirds: brand |
| aggregateRating, review | Recommended, only with real reviews | Allbirds 4.1 from 62; Zappos 5 from 2; Barefoot none (no reviews yet) |
| itemCondition, priceValidUntil | Recommended; a past priceValidUntil can stop the listing | Allbirds and Zappos: NewCondition |
| ProductGroup with hasVariant | For variants, per the variant doc | Allbirds: 42 variants under productGroupID MENS_CRUISER |
Two rules from the same documentation decide whether the markup does anything. Google "may attempt to verify merchant listing product data" against the page, so the price and availability in the markup must be the visible ones. And Google recommends the markup "in the initial HTML", because JavaScript-generated markup "can make Shopping crawls less frequent and less reliable".
The product schema generator writes a valid block for one product, and the schema validator shows what the theme actually emits. On Shopify the markup also has to agree with the Merchant Center feed.
Google runs two product features. Product snippets are for pages where you can't buy the item, and need one of review, aggregateRating or offers. Merchant listings are for pages where you sell it and need an Offer with a price; they unlock price, stock, shipping and returns in the result. A store page wants the second.
Image file names, alt text and internal links
Image alt text is where the three stores split. Barefoot Buttons: "Barefoot Buttons V1 Standard Clear Acrylic guitar pedal footswitch topper top view for 3PDT switch 3/8 inch 10mm", on a file named barefoot-buttons-v1-standard-clear-footswitch-topper.png. Zappos: "Pair View", "Top View", "Bottom View", with 6 of 25 images carrying no alt at all.
Allbirds sits between: the alt reads "Men's Cruiser - Medium Grey (Blizzard Sole)", but the lead image file on the Medium Grey page is named for Dark Navy. Small, and exactly what a tier-1 pass catches. Run each tier-1 URL through the image alt checker; the image optimization entry has the file-name rules.
A product that only the category grid links to has one weak inbound link. Tier 1 gets four: a sentence in the category copy (the category page SEO guide covers writing it), a mention in the buying guide for the head term, and two related products. Tier 2 gets the grid and the related-products module.
Step 3: Template tier 2 with variables, not manufacturer text
Tier 2 has impressions and no revenue, which means Google already shows the page for a query and shoppers pass it by. A template with variable slots is unique per product as long as the slots are filled from real fields, and it is built once in a CSV, which is how both Shopify and WooCommerce bulk-edit products.
- Title:
{Product} {Attribute} | {Category} | {Brand}, where Attribute is the field the query uses. Search Console's Queries tab, filtered to the URL, tells you which one. - Meta description: one sentence with two slots, such as fit and material, never the first line of the description.
- Description: three template paragraphs (who it is for, what it fits, what is in the box) with a slot in each, followed by the generated specs table.
- Alt text:
{Product} {Attribute} {angle}from the same fields. - Never: the supplier's paragraph, not even as a base. It is on every reseller's page and it is the text the OP said "never ranked well".
The 30-day rule from the thread is the promotion rule. Recheck the join a month later: any tier-2 product that earned clicks or a sale moves to tier 1 and gets written by hand. That is how the tier-1 list grows from 80 toward the products that deserve it, instead of from a guess.
I have watched teams stall for a quarter because "we haven't written the descriptions yet". A template with honest slots ships in a week, ranks for the model-number and attribute queries, and tells you within a month which pages deserve a writer. Perfect copy on 400 pages is a plan for writing none.
Step 4: Decide what tier 3 does: canonical, noindex or nothing
The Reddit advice to canonicalise low-value products to the category comes with a warning: "may need to noindex too since google ignores canons often". Google ignores them because that is not the tag's job. Its consolidate duplicate URLs doc describes rel="canonical" as a preference among "duplicate or very similar pages". A one-off product is neither.
So tier 3 splits by what the page actually is:
- A variant or near-duplicate of an indexed product (same item in another colour, a bundle, the same product reachable at a second URL): canonical to the parent product, out of the sitemap. This is the case the tag exists for, and the duplicate content it prevents is real.
- A standalone one-off with no demand: leave it templated and indexable. If crawl stats show Googlebot spending its budget on thousands of these, add noindex to the tail. Google's same doc warns that noindex "will completely block the page from Search", so only use it where you mean it.
- A product with a second URL through a category path (Shopify's
/collections/x/products/y): canonical to/products/y, which the theme does by default. Verify it, because apps and theme edits break it.
The same documentation ranks the signals: a redirect is stronger than rel="canonical", which is stronger than a sitemap entry, and robots.txt is not a canonicalisation method at all. Do not block tier 3 in robots.txt; Google may still index the URL from links.
Variants and the canonical
Google's ecommerce URL guidance recommends giving each variant its own URL, either a path segment like /t-shirt/green or a parameter like /t-shirt?color=green, and says: "If you use optional query parameters to identify variants, use the URL with the query parameter omitted as the canonical URL."
The two stores handle it differently, and both are defensible:
- Allbirds puts the colour in the handle (
/products/mens-cruiser-medium-grey), self-canonicalises each colour, and carries size as a parameter (?size=8). The JSON-LD is a ProductGroup with variesBy size and colour and 42 hasVariant entries, so Google sees one product with variants across several URLs. - Zappos puts colour in the path (
/product/10038622/color/72), canonicalises to the colour URL, and sets the Product'surlto the parent product while the Offer'surlis the colour page.
The tiering question is whether a variant deserves its own indexable page. The join answers it: a colour with its own impressions ("cruiser grey") earns a tier-2 page; a size never does. Google's product variant markup documentation covers both single-page and multi-page layouts.
Out-of-stock products: keep, redirect or 404
An out-of-stock product page with rankings is an asset; deleting it throws the rankings away. Google's launch guidance even describes shipping a whole site "with products marked as out of stock" before fulfilment is ready. The decision is about whether the product returns:
- It will be back: keep the page live, set availability to OutOfStock or BackOrder in the markup and on the page, add a back-in-stock form, and link two alternatives. Leave the price visible.
- It is discontinued and a successor exists: 301 to the successor product, because a redirect is Google's strongest canonical signal and the intent matches.
- It is discontinued and nothing replaces it: return 404 or 410. Google's URL guidance says the same for a category that has emptied and been removed from navigation: "consider returning a 404".
- Never redirect to the homepage. It is not the page the shopper or Google asked for, and it sends the ranking signals nowhere useful.
Zappos does it at scale: an out-of-stock product URL I fetched redirected to an internal search page for the product name, with ?oosRedirected=true appended. That keeps the shopper among near-matches. A smaller store should redirect to the successor product instead.
Measure the tiers, then promote and demote
The join that built the tiers is the report that maintains them. Rerun it every 30 days for the first quarter, then quarterly:
- Tier 1 clicks and revenue per URL. Rewritten pages should gain impressions within two to four weeks and clicks after. A tier-1 page losing clicks month on month is decay, and gets the first look.
- Tier 2 promotions. Any templated page with a sale or a run of clicks moves up and gets written.
- Tier 3 leakage. Variant URLs earning their own impressions in the Pages report mean the canonical is being ignored; check for one canonical and no conflicting sitemap entry.
- Markup health. Search Console's Merchant listings report lists pages with missing or invalid Product markup. Fix tier 1 first.
This is the ecommerce-specific half of an ecommerce SEO checklist. The other half, category pages and the plumbing that differs from a software site, is in SaaS SEO vs ecommerce SEO. If the catalogue is supplier stock you don't hold, does SEO work for dropshipping stores covers why tier 1 is even more selective.
Product page SEO FAQs
Tiering and prioritisation
The 80/20 rule, how to find the products that deserve unique copy, and whether every product needs a unique description. The FAQ block below answers each in the same terms as the steps.
What goes on the page
Description length, what the title tag carries, and what Product markup and AggregateRating do and do not do for ranking.
Variants, stock and platforms
Variant URLs and canonicals, out-of-stock pages, and where Shopify and WooCommerce differ.
What to do this week
- Run the join for the last 90 days and sort by revenue. Write the tier-1 list down; it is shorter than you think.
- Validate three tier-1 URLs in the schema validator: one Offer, visible price, availability, a rating only where reviews exist.
- Write the tier-2 template with three slots and bulk-apply it by CSV. Delete the supplier paragraph as you go.
- Rewrite the first ten tier-1 pages, highest revenue first, with the eight elements above.
- Set a 30-day reminder to rerun the join and promote.
Sources
- r/ecommercemarketing: How do you handle SEO when adding hundreds of new products at once? (October 2025)
- Google Search Central: Introduction to Product structured data
- Google Search Central: Merchant listing (Product, Offer) structured data
- Google Search Central: Product snippet structured data
- Google Search Central: Product variant structured data
- Google Search Central: How to specify a canonical URL
- Google Search Central: Designing a URL structure for ecommerce sites
- Google Search Central: How to launch a new ecommerce website
- Allbirds: Men's Cruiser product page (fetched September 2026)
- Barefoot Buttons: V1 Standard Clear Acrylic product page (fetched September 2026)
- Zappos: Men's Kenneth Cole Charles product page (fetched September 2026)
- Keyword data: DataForSEO Labs keyword overview and SERP API, United States, September 2026.
Frequently asked questions
What is the 80/20 rule in product page SEO?
It is the observation that around 20% of a catalogue produces around 80% of organic revenue, so those products get hand-written pages and the rest get a template. The split comes from your own data: Search Console clicks per product URL joined with GA4 revenue. On most stores the top tier is 50 to 100 products.
How do I find which product pages deserve unique copy?
Export Search Console's Pages report filtered to your product path, export GA4's landing-page revenue for the same 90 days, and join the two on URL. Any product with revenue is tier 1. Any product with impressions but no revenue is tier 2. Everything else is tier 3, and tier 1 gets the writing first.
Do I need a unique product description for every product?
No. You need a unique description for every product that earns clicks or revenue, and a templated description with variable slots for the rest. What you must never do is paste the manufacturer's paragraph, because the same text sits on every reseller's site and Google has no reason to rank your copy of it.
How many words should a product description be?
Long enough to answer the buying question: who the product is for, what it fits or works with, and what it is not. For most products that is 120 to 300 words plus a specs table. A 600-word essay under the add-to-cart button does not rank better than 150 words that name the attributes shoppers search for.
What should a product page title tag contain?
The product name, the attribute the query uses (colour, size, material or model number) and the brand, in that order. Allbirds uses "Men's Cruiser | Everyday Comfort & Style | Allbirds"; Zappos uses "Men's Kenneth Cole Charles | Zappos.com". Match the title to the query Search Console already shows impressions for, not the one you wish it had.
Does product schema markup help product pages rank?
It does not change ranking, but it decides how the result looks. Google's merchant listing documentation says Product markup with an Offer, price and availability makes a page eligible for price, stock and rating in the result, and that Google may verify the data against the page. Missing or mismatched markup loses the enhancement, not the ranking.
Should product pages have an AggregateRating?
Only when real customer reviews exist on the page. Google's product snippet documentation requires one of review, aggregateRating or offers, and the rating must reflect reviews a shopper can read. Adding a rating block with no reviews behind it is the kind of mismatch Google's guidelines call out, so leave it off tier-2 pages until reviews arrive.
How should I handle product variants for SEO?
Google's ecommerce URL guidance recommends a separate URL per variant, either a path segment or a query parameter, with the parameter-free URL as the canonical. Mark the variants up with ProductGroup and hasVariant. Only give a variant its own indexable page when it has its own query, which is what the Search Console join tells you.
What should I do with out-of-stock product pages?
Keep the page live with availability set to OutOfStock if the product will return; Google's own launch guidance describes shipping a full site with products marked out of stock. If it will not return, redirect to the closest replacement product when one exists, and return a 404 or 410 when it does not. Never redirect to the homepage.
Is Shopify product page SEO different from WooCommerce?
The tiering is identical; the plumbing differs. Shopify gives every product a /products/ URL plus a /collections/ duplicate that must canonicalise, and the theme writes the Product markup. WooCommerce uses /product/ URLs, writes Product JSON-LD in core, and leaves the meta description to an SEO plugin. Both bulk-edit titles and descriptions from a CSV.
15+ years of growing SaaS websites through SEO | Author, 200-Point Audit Checklist
Aditi has spent 15+ years helping SaaS companies scale organic traffic through technical SEO and content strategy. She is the author of the CrawlRaven 200-Point Audit checklist used by agencies and in-house teams to systematically improve search performance.