Discuss project

Duplicate Content: How to Find and Fix Duplicate Pages

Duplicate content splits your ranking signals and wastes crawl budget. Here is where duplicate pages come from, how to find them in Search Console and what to consolidate them with.

Vladislav KrivorutskoAugust 20, 202610 min read
Contents

TL;DR - key points

  • Duplicate content means the same or nearly the same page is reachable at several URLs; there is no penalty for it, but Google picks which URL to show and often picks the wrong one
  • On a normal site most duplicates come from technical variants of one address — trailing slash, www, http, parameters, pagination, filters — not from copied text
  • The most reliable report for finding them is Page Indexing in Search Console, specifically the duplicate and 'Google chose a different canonical than the user' statuses
  • Pick the tool by the job: 301 when the old URL is no longer needed, canonical when both must stay reachable, noindex when the page is for people but not for search
  • Language versions are not duplicates: Estonian, Russian and English pages are connected with hreflang, never consolidated with canonical

The short answer

Duplicate content means several URLs return the same or nearly the same page. There is no penalty for it: Google says internal duplication is a technical situation, not a violation. The actual problem is that the search engine then decides on its own which address to show — and it does not always pick the one you have been building links and content for.

On a normal site the overwhelming majority of duplicates come not from copied text but from the way the CMS generates addresses: a trailing slash, www, http, UTM tags, sorting parameters, a product sitting in two categories. Three tools fix this — a 301 redirect, a canonical tag and noindex — and which one you pick depends on a single question: does a real visitor need that second URL?


Where duplicates actually come from

When a client says "we have duplicate content", they usually mean copied text. Working with Estonian sites, I run into copied product descriptions far less often than into technical duplicates. Here are the sources in the order of how frequently I see them.

Source of duplicatesExampleUsual cause
Variants of one address/services and /services/, www and non-www, http and httpsNo single URL format enforced at server level
GET parameters?utm_source=, ?sort=price, ?sessionid=Ad tags and internal catalogue features
Product in several categories/lamps/desk-lamp and /for-office/desk-lampCMS builds the URL from the category path
Filters and faceted navigation?color=black&size=xl in any combinationThe catalogue returns 200 for any parameter combination
Technical copiesprint view, AMP leftovers, /index.phpLegacy of old templates and migrations
CMS auto-generated pagesdate, tag and author archives, WordPress attachment pagesOn by default, never switched off
Identical text across pagestemplated location or city pagesLanding pages mass-produced without unique content

The important consequence: duplicates almost always arrive in classes, not one by one. If you found one product reachable at two addresses, the entire catalogue is reachable at two addresses. That is why, when I find a duplicate, the first thing I look for is the rule that created it rather than the individual page.

It is also worth separating duplicates from keyword cannibalization. A duplicate is the same content at different addresses. Cannibalization is different pages with different content competing for the same query. The first is fixed by consolidation, the second by reworking structure and content, and confusing the two costs weeks.


What duplicates actually cost you

Three effects, of very different size.

Google shows the wrong URL. This is the big one. The search engine picks the canonical address itself, weighing links, sitemap entries, canonical tags and internal linking. When those signals contradict each other, a URL with a UTM tag or a product from a secondary category can end up in the results. Traffic looks fine on the surface, but the accumulated signals are spread across addresses.

Crawl budget is wasted. On a site of a few thousand pages this is usually not a concern — Googlebot will get through everything. On a catalogue where filters generate tens of thousands of combinations it changes: the crawler spends its visits on junk addresses while new product pages wait weeks for indexing. The symptoms overlap with what I described in the article on why Google is not indexing your pages.

Internal link equity is split. If some internal links point to /services and others to /services/, the equity is divided between two addresses instead of one. A smaller effect than the first two, but it disappears for free once the linking is cleaned up.

What duplicates do not do is demote the whole site. If someone tells you your site is "filtered for duplicate content", ask to see the specific report. In the vast majority of cases that phrase covers an ordinary ranking drop with a different cause.


How to find duplicates: three sources

No single source gives the full picture, so I always check all three.

1. Search Console, the Page Indexing report. The most honest source: it shows not what you think is a duplicate but what Google treats as one. The statuses that matter:

  • "Duplicate without user-selected canonical" — Google found identical content and consolidated the addresses itself because you did not set a canonical.
  • "Duplicate, Google chose different canonical than user" — you set a canonical and Google disagreed. That is a signal either that the pages really are different, or that your internal links and sitemap contradict your canonical.
  • "Page with redirect" in large numbers — often a trace of redirects working correctly while internal links still point at the old addresses.

2. A crawl of the site. Run Screaming Frog, Sitebulb or any other crawler and sort the result by three fields: title, H1 and content hash. Matching titles are the fastest indicator of a duplicate class. Check separately whether the site returns 200 for an address with an arbitrary parameter appended: if /services?foo=bar opens as a normal page, you have a potentially infinite number of duplicates.

3. The search results themselves. A query like site:yourdomain.ee "a snippet of text in quotes" shows how many addresses Google keeps in the index with that text. A blunt instrument, but it catches what never made it into the reports: old subdomains, staging copies, leftovers from an unfinished migration.

A fourth source people forget is sitemap.xml. If your sitemap lists parameterised or redirecting addresses, you are telling Google with your own hands that those URLs are canonical. How it should be set up is covered in my article on sitemap.xml and robots.txt.


What to consolidate with: 301, canonical or noindex

One question decides the tool: does a real visitor need the second URL?

SituationToolWhy
Old address after a structure change301 redirectURL is no longer needed, signals pass on, address leaves search
Trailing slash, www, http301 at server levelOne canonical format for the whole site
UTM tags and sorting parameterscanonical to the clean URLThe link must work, but it should not be indexed
Product in two categoriescanonical to the primary pathBoth pages are needed in navigation
Paginationself-referencing canonicalPages 2+ list different products and are not duplicates
Print view, PDF copycanonical to the HTML versionUseful to people, not to search
Cart, account, internal searchnoindexNeeded by visitors, useless in results
Genuinely worthless auto-generated archivesnoindex, then removalNo value to anyone

Three things I regularly see done wrong:

  1. A canonical is a hint, not a directive. Google weighs it against other signals and can ignore it. If you set a canonical to page A while every internal link and the sitemap point to B, B wins. The signals have to agree.
  2. Do not block duplicates in robots.txt. A page disallowed in robots.txt is never fetched, so the crawler never sees the canonical or the noindex on it. The address stays in the index as "indexed, though blocked by robots.txt" and no consolidation happens. Robots.txt is for saving crawl effort, not for removing pages from the index.
  3. Do not combine noindex and canonical on the same page. That is a contradictory instruction: the canonical says "pass signals over there", noindex says "drop me". Pick one.

Language versions are not duplicates

On the Estonian market this is the most expensive mistake on the list, because nearly every site here is multilingual.

The Estonian, Russian and English versions of a page contain different text and address different audiences — by definition they are not duplicates, even when images, prices and layout match. Worse: a canonical from the Estonian version to the Russian one removes the Estonian page from Estonian-language results entirely, handing that local traffic to a competitor.

The correct setup is simple: every language version has a self-referencing canonical, and the versions are tied together with hreflang, including a self-reference. The typical mistakes in that markup and how to verify it are in my separate article on hreflang setup.

A separate case is one language across several domains or subdomains — for example .ee and .com carrying the same English text. Those are genuine cross-site duplicates, and the answer is either a cross-domain canonical or an honest split of the content.


What I see in practice

A few observations from Estonian projects that repeat again and again.

The most common duplicate is not in the catalogue but on the home page. The site opens at four addresses at once: with and without www, over https and http. This is configured once at server or CDN level and closes an entire class of problems before anyone even looks at product pages.

Second most common are parameters from internal features. Sorting, items per page, session identifiers, traces of an old filter. Each of them doubles or triples the number of catalogue addresses.

After a migration duplicates appear even when the redirects are correct. The redirects get done, but internal links in the menu, in article text and in the sitemap keep pointing at the old addresses. Formally everything works; in practice Googlebot walks redirect chains and receives contradictory signals. The check is simple: after a move, a crawl should not find a single internal link to an address that returns 301.

Duplicates often sit next to orphan pages. Both come from the same root cause — the real structure of the site and what the CMS believes about it have drifted apart. While you are sorting out one class, it makes sense to check the other; how to find them is in the article on orphan pages.

An honest limit: everything above applies to sites up to a few tens of thousands of URLs, which is what I work with most. On large marketplaces, parameter handling becomes an engineering problem of its own, and the decisions are made at the level of catalogue architecture rather than CMS settings.


The order of work

  1. Check whether the site opens at several variants of the home address and set up a 301 to one canonical format.
  2. Open the Page Indexing report in Search Console and list the pages with duplicate and foreign-canonical statuses.
  3. Run a crawl and group pages by matching titles and H1s — that reveals classes rather than isolated cases.
  4. For each class, decide whether a visitor needs the second URL and pick the tool from the table above.
  5. Bring internal links and sitemap.xml in line with the canonical addresses you chose — that is half the effect.
  6. Verify that language versions are connected with hreflang rather than consolidated with canonical.
  7. Come back to the Page Indexing report in three to four weeks and check whether Google agreed with your choice.

That last step is skipped most often, and it is the actual verification: if Google still chooses a different canonical, a contradicting signal is still in place somewhere. If the right addresses need to be built into the architecture of a new site instead, that is a web development task rather than a set of point fixes.

Frequently asked questions

What is duplicate content in simple terms?
It is a situation where the same content is available at more than one URL. A product may open at /product/lamp, at /catalog/lamps/lamp?utm_source=fb and at /product/lamp/ with a trailing slash. For a visitor that is one page; for a search engine it is three different addresses with identical text, and it has to choose between them.
Does Google penalise duplicate content?
No. Google states plainly that duplicate content within a site is not grounds for a penalty — it is a technical situation, not a violation. A manual action is only realistic for deliberate large-scale copying of other people's text. The real damage from ordinary duplicates is different: signals are split between addresses, crawl budget is wasted, and the wrong version of the page ends up in search results.
How do I find duplicate pages on my site?
Start with the Page Indexing report in Search Console and look for 'Duplicate without user-selected canonical' and 'Duplicate, Google chose different canonical than user'. Then run a crawl (Screaming Frog, Sitebulb or your own crawler) and sort pages by title, H1 and a content hash. A third source is a site: query on your domain combined with a snippet of text in quotes.
Should I use a 301 redirect, a canonical or noindex?
Use a 301 when the old URL is no longer useful to a visitor: it passes signals and removes the address from search for good. Use a canonical when both pages must stay reachable — a filtered listing, a print view, a product in two categories — keeping in mind it is a hint, not a directive. Use noindex when the page is genuinely needed by people but useless in search: cart, account area, internal search results.
Are pages in different languages considered duplicates?
No. The Estonian, Russian and English versions of a page are not duplicates, even when layout, images and prices match. They must not be consolidated with a canonical: pointing a canonical at another language version removes the page from search results in its own language. Connect them with hreflang instead, and give every version a self-referencing canonical.
Should pagination and filters be blocked from indexing?
Pagination almost never: pages 2, 3 and 4 list different products, so they are not duplicates, and a canonical from them to page one makes deep product pages harder to discover. Filters depend on demand: combinations with real search volume can stay as indexable landing pages, the rest should be closed. Indexing every filter combination is not an option — on an average store that means tens of thousands of near-identical pages.

Conclusion

Duplicates are almost never a single-page accident — they are a by-product of how your CMS builds URLs. Fixing them one at a time is therefore pointless: close the source (one address format, rules for parameters, canonical by template) and the whole class disappears at once. I always start from the Page Indexing report, because it shows not what you consider a duplicate but what Google considers one. If you would rather not dig into it yourself, this is part of the work I do as [SEO services](/en/seo).

About the author

Vladislav Krivorutsko — founder of ADLAB
Vladislav Krivorutsko

Founder of ADLAB OÜ · SEO and Google Ads

Over 20 years in search traffic and monetization, and on the Estonian market since 2017. I work solo: I run the audit, build the strategy and deliver the project myself — no subcontractors, no templates. I only write about what I have tested on my own and client sites.

  • 20+ years in search traffic
  • 50+ end-to-end projects
  • Own sites in competitive niches
  • SEO for ru/et/en in one market
More about me

Read next