Case study by Vitaliy Hera · online shop

Around 100 sales a month for a haircare store after fixing cannibalisation

More than 70 categories were chasing the same searches. We gave each one its own job instead of closing any, and the store now sells from Google without paying per click.

  • Shop name kept under NDA
  • WooCommerce, 70+ categories
  • No noindex, no deleted pages
  • Same budget, no bought links

By Vitaliy Hera, founder of BeeTop · Published

From pages in conflict to steady sales

The shop had enough pages already. What it lacked was pages that stopped competing with each other.

Haircare store · Ukraine

Twin categories split by what people wanted

Over 70 categories fought for one set of searches. After each pair was split by intent and rewritten in batches of 8–10, organic search now brings the shop roughly 100 sales every month.

How the work unfolded

The order mattered as much as the work. Nobody wrote a line of copy until the map was finished.

  1. Stage 1

    A search map for every category

    We charted which of the 70+ categories clashed with which, and over which searches.

    You get a list of every conflict on the site

  2. Stage 2

    A separate angle for each twin

    In every pair, one page took the hair problem and the other took the product type. No page was closed.

    You get a decision for each pair

  3. Stage 3

    Rewrites in batches of 8–10

    The worst clashes went first. New texts came with JSON-LD, marked-up FAQ blocks and a page about the shop.

    You get new category pages going live

  4. After 6–8 weeks

    Rankings settle and clicks climb

    Each page kept a stable position for its own cluster. From there, clicks on commercial searches grew month after month.

    You get around 100 organic sales a month

Short version. A Ukrainian online shop selling professional haircare now makes around 100 sales a month from organic search, a channel with no ad budget behind it. Most of the work had little to do with "doing more SEO". We stopped the shop's own category pages from fighting each other for the same searches. Below is the whole case, step by step.

The shop's name stays private under an NDA. The niche, the figures and every step described here are real.

There was no magic involved either. For years the site earned less than it could because of one structural error, and I see that same error in 8 out of 10 online stores we look at.

The starting point with plenty of content and few sales

The shop sells professional haircare products such as shampoos, masks, oils and care for coloured hair. It ran on WooCommerce with more than 70 active categories.

The previous contractor worked on the idea that more pages bring more traffic. For almost every search they created a separate category with its own text.

On paper it looked impressive. Search Console told another story, with impressions growing while clicks and sales stayed flat.

Twin categories fighting over the same searches

I opened the keyword data and saw a textbook picture. "Shampoo for dry hair" and "moisturising shampoos" lived as two separate categories with almost identical texts. The same went for "masks for coloured hair" and "care for coloured hair".

For a shopper these are two different shelves. For Google they are duplicates competing for one set of results.

This is called keyword cannibalisation. Google cannot tell which page to show, so both rank worse than a single page would. Positions jump around, the snippet keeps changing and some pages drop out of the results entirely.

What it looked like in the data. Take one pair of twin categories. In Search Console both pages appeared for the same cluster of searches, and they took turns, one week this page and the next week the other.

The average position for both drifted between 8 and 15. Neither held the top 5, although the content and relevance of the two together would have been enough for the top 3.

Multiply that by several dozen such pairs. Now it is clear why a shop with 70+ categories pulled in the traffic of a site with 20.

Cannibalisation means paying for content that competes with itself.

We separated the pages instead of removing them

The usual advice here is to put the extra categories on noindex or delete them. I refused to do that, and the reason is simple.

Each of these categories had real search demand of its own. Closing one hands that demand to competitors. It is amputation where surgery will do.

So we gave every twin pair a different angle. One page answers the problem search ("for dry hair", with symptoms and how to pick a routine). The other covers the product type ("moisturising", with ingredients, brands and comparisons). Different intent leads to different texts and different searches, and the conflict disappears.

In practice we started with a full map of searches across all 70+ categories, showing which page clashed with which and over what. Then each conflict got a decision on which angle went to which page.

Only after that came the writing. Writing content before the map would repeat the path that led the site into cannibalisation in the first place.

One more detail mattered. We rewrote categories in batches of 8–10, starting with the worst conflicts and moving to the calmer pairs. The first results showed up while the work was still going, long before the project ended.

What we actually did

AreaWork
ArchitectureA full "search to page" map for 70+ categories. Every twin pair separated by intent, with no noindex and no deletions
ContentNew category texts in batches, under one strict rule that no two pages answer the same search
Structured dataJSON-LD for categories plus FAQ blocks marked up for rich results and AI answers
Trust (E-E-A-T)An "About the shop" page and expert blocks, signals that a real seller stands behind the site

You will notice the list has no "bought 200 links" and no "doubled the budget". The shop was losing money because its existing content worked against itself, and a lack of SEO had little to do with it.

Around 100 sales a month from organic search

Once the categories were separated, Google stopped mixing them up. Each page settled into a stable position for its own cluster of searches.

For the first 6–8 weeks rankings levelled out without sharp jumps. After that, clicks on commercial searches grew steadily.

Today the shop makes around 100 sales a month from organic search. The traffic behind those sales costs nothing per click. Buying the same traffic through ads in this niche would cost a lot every month, and it would stop the day the budget ran out.

This is the kind of ecommerce SEO case study I like to show owners who think the answer is always more pages. Here the answer was fewer conflicts.

What this means for your store

Three lessons from this shop apply to almost any online store.

  • If you have many categories and few sales, look for cannibalisation first. The signs are jumping positions, the wrong page appearing in results and impressions that grow without clicks. You can diagnose it in one evening in Search Console.
  • Do not rush to delete or close pages. Every category with real demand is an asset. Ask how to split pages by intent before you ask which ones to remove.
  • New money is not always needed. In this case the result came from putting order into what had already been created and paid for, with the budget unchanged.
Sometimes the most profitable SEO adds nothing new. It ends the internal war on the site.

We met a similar problem on a German project, where 11 pages competed for the same keywords. That is a separate case with its own story.

If you run an online store and these symptoms sound familiar, our ecommerce SEO services page shows how we find and fix them. You can also compare this with a service business in our case study for a building firm.

Questions about this case

How do I know if my store has keyword cannibalisation?

Open Search Console, filter by one search and check which pages get impressions for it. If two or more categories take turns in the results and their positions keep jumping, they are competing with each other.

Why not put the duplicate categories on noindex?

Because each of them had its own search demand. Closing a page gives that demand to competitors, while a new angle for each page lets both of them rank.

How quickly did the results appear?

Rankings levelled out over the first 6–8 weeks, then clicks on commercial searches started to grow. Because we rewrote categories in batches of 8–10, the first gains arrived while work was still under way.

Did the shop need more links or a bigger budget?

No. Link buying and a bigger budget were never part of the plan. The result came from a search map, new category texts, structured data and trust pages built on the content the shop already had.

What clients say on Upwork

Top Rated Plus, $100K+ earned on Upwork. Read every review on the profile.

See the Upwork profile

I had a very professional service from Vitaly. The work was completed to a high standard, and he was extremely helpful throughout. I would definitely hire him again and highly recommend his services.

Upwork client, WordPress site creation · 5.0 of 5

The job was completed. We prepared the high-quality text tests for my website for SEO, and Vitaliy provided excellent consultation throughout our collaboration. He explained everything in detail and educated my team and me.

Upwork client · 5.0 of 5

Everything is connected

This shop grew through SEO. A store earns more still when its site, search, ads and sales figures work as one loop.

  1. Website one category per intent feeds search
  2. SEO organic winners show where ads add little
  3. Google Ads paid data marks the profitable lines
  4. Analytics sales by page reshape the catalogue (back to Website)
One system that earns Website one category per intent feeds search SEO organic winners show where ads add little Google Ads paid data marks the profitable lines Analytics sales by page reshape the catalogue
Vitaliy Hera, founder of BeeTop, at his desk
Vitaliy Herafounder of BeeTop

Find out if your categories compete

Before I add a single page to a store, I check whether the pages it already has are fighting each other.

Send us the store address. In 24 hours you get a free review with the clashing categories marked and a plan to separate them.

SEO for online stores

We reply within an hour on working days.