←all writing
1804 Apr 2025/6 min read

SEO for product pages that are almost the same

A ring catalogue has many pages that differ by one word, like the metal or the diamond shape. How we handle titles, canonicals, collections and structured data for them at Renaissance Jewel.

SEOShopifyE-commerce

Since September 2024 I have been working on the Shopify store of Renaissance Jewel, a lab-grown diamond jeweler in New York. One half of the job is speed. The other half is SEO, and the SEO problem here is an unusual one.

In this store, every combination of a ring design is its own product. I wrote about why in the post on Shopify’s variant limit. The result is that one design becomes many pages, and those pages differ by a word or two.

Here is a real family. It is one ring, in five metals, as five products:

Platinum Fancy Black Asscher Cut Solitaire Tension-Set Diamond Split Shank Ring
Silver Fancy Black Asscher Cut Solitaire Tension-Set Diamond Split Shank Ring
White gold Fancy Black Asscher Cut Solitaire Tension-Set Diamond Split Shank Ring
Yellow gold Fancy Black Asscher Cut Solitaire Tension-Set Diamond Split Shank Ring
Rose gold Fancy Black Asscher Cut Solitaire Tension-Set Diamond Split Shank Ring

To a search engine this can look like the same page copied five times. This is called near-duplicate content, and the usual advice is to get rid of it. We chose to keep all five pages in Google. This post explains why, and what makes that work.

First decide: one page or many?

There are two ways to handle near-duplicates.

Option 1: point them all at one page. You pick a main product and set the canonical tag of the others to it. Google then treats the five as one page. Simple, and safe.

Option 2: let each page stand alone. Every page has a canonical tag that points to itself, and each one competes in search under its own name.

The way to choose is to ask what people type. Nobody searches for “blue t-shirt size M” and expects a different page from size L. For t-shirts, option 1 is right.

Rings are different. A person close to buying an engagement ring searches with detail: “rose gold oval solitaire engagement ring”. Metal is not a small option for them. It is part of what they are looking for. If all five pages were folded into the platinum one, the person who searched for rose gold would land on a platinum ring.

So we use option 2. Every product page has a canonical that points to its own URL. On Shopify this is what the theme does by default, so the real work is making each page deserve it.

Titles that say exactly what the ring is

Every product title names the metal, the stone, the cut, the setting and the style, and carat and colour where they apply. Look at the five titles above. They are long, and that is on purpose.

Two things follow from this.

Sibling products never share a title, because at least one word differs. And the word that differs is the word the buyer typed. The title is also the <title> tag and the main heading of the page, so the search result matches the search.

Titles like these cannot be typed by hand for hundreds of products without mistakes. Ours are built from the product data by a script, in a fixed order. That keeps the pattern the same across the catalogue.

Real photos for each combination

Each product has photos of that exact combination. The rose gold page shows a rose gold ring.

This sounds obvious. But with normal Shopify variants it is common to have one set of photos for the whole product, and then every “page” shows the same images. Five pages with the same photos and one different word are duplicates in every way that counts. Five pages with different photos are five products.

It also matters for the person. Someone who searched for rose gold lands on rose gold.

Collections catch the broad searches

Not every search is that detailed. Many people type only “oval engagement rings”.

For that search, no single product page is the right answer, and you do not want five siblings competing for it. The answer is a collection page.

The store has a collection for each diamond shape:

/collections/round-diamond-rings
/collections/oval-diamond-rings
/collections/pear-diamond-rings
/collections/cushion-diamond-rings
/collections/emerald-diamond-rings
/collections/princess-diamond-rings
/collections/marquise-diamond-rings
/collections/radiant-diamond-rings
/collections/heart-diamond-rings

Every ring collection page shows a strip of shapes at the top, linking to all of these. That does two jobs. A shopper can move from round to oval in one click. And every shape collection gets a link from every other ring collection, which tells a search engine that these pages matter.

So the broad search lands on a collection, and the detailed search lands on a product. The near-identical products are not fighting each other, because they sit behind a parent page.

Structured data: check what your theme already prints

Product pages carry structured data, which is how Google can show price and availability in the search result.

Most themes print this for you. Do not assume it is right. On a paid theme I would check these five things. They are common problems in a theme’s built-in code:

  1. The price format. A price with a thousands separator, like 2,469.00, is not a valid number in structured data. It must be 2469.00.
  2. Reviews from the wrong app. Themes often print review data from Shopify’s old reviews app. If the store uses another reviews app, that block is empty or wrong, and the reviews app prints its own. Keep one.
  3. One product, one block. If the theme and an app both print product data, Google sees two products on the page.
  4. Breadcrumb URLs. Check that the collection link in the breadcrumb data is a real URL that opens.
  5. Availability for each variant. A sold-out product marked as in stock gets you a warning in Search Console.

The test is quick. Paste a product URL into Google’s Rich Results Test and read every warning.

What I would not do

Do not write a different description for each sibling just to be different. Five versions of the same paragraph with the words shuffled help nobody. The honest differences are the title, the photos, the price and the metal. Those are enough.

Do not block siblings with noindex to “save crawl budget”. A store with a few thousand products does not have a crawl budget problem.

Do not mix the two options. If a page has a canonical pointing to another product, do not also put it in the sitemap and link to it from collections. Pick one signal and make everything agree with it.

Speed is part of it

A catalogue built like this is large, and ring pages are heavy. I covered that side in the post on speeding up the store.

If I had to pick the one decision that helps search the most, it is that a specific ring has a specific page, with its own URL, title and photos.

← all writing nextDawn, a paid theme, or a custom theme: what I used on three Shopify stores →