Canonical tags done right: how to fix duplicate content

The same page reachable under four addresses, and Google shows the wrong one. Why a canonical is only a recommendation, and how to see which address Google actually picked.

16 minute readUpdated September 3, 2026Read in German

Your most important service page is reachable under four addresses, and you chose none of them:

http://acmeroofing.com/services/roof-repair
https://acmeroofing.com/services/roof-repair
https://www.acmeroofing.com/services/roof-repair/
https://www.acmeroofing.com/services/roof-repair/?utm_source=newsletter

Four addresses, one page. The version that ends up in Google search results is the one with utm_source on it, because somebody linked exactly that from a newsletter. So you set a canonical pointing at the clean address, wait two weeks, and Search Console still reports that Google picked a different canonical.

This piece rests on a single sentence: a canonical is a recommendation, not an instruction. It clears away the duplicate content penalty myth, gives you a table for the "canonical, redirect or noindex" question, and ends with the check that shows you which address Google actually uses.

There is no penalty for duplicate content

Start with the myth, because it burns the most energy. There is no duplicate content penalty. Google's own documentation says duplicate content is not grounds for action unless it looks like an attempt to manipulate search results. Two addresses for the same service page are everyday plumbing, not deception.

What happens instead: Google notices that several addresses serve the same content, groups them together and picks one of the group as the canonical. All the signals get consolidated onto that one. The rest drop out of the results. Nothing is punished, things are merged.

The problem is not the choice, it is that the choice is not yours. Your canonical is one signal among many: Google weighs it against redirects, against the address you link in your own menu, against your sitemap and against hreflang groups. That is why the documentation says "strong signal" and not "instruction". The message about Google picking a different canonical is not an error, it is Google overruling you.

One case does not belong here. If two pages genuinely compete for the same query because you wrote about the same thing twice, no tag will fix that. Merge the two texts instead, see updating existing content.

Where duplicates come from when you never created any

Almost nobody builds duplicates on purpose. They come out of server config, shop software and marketing:

  • With and without www, plus http and https: four homepages, unless three of them 301 to the fourth.
  • Trailing slash, /services versus /services/, plus index.php or /home as a second route to the homepage.
  • Upper and lower case in the path: /Services/ and /services/ are two documents on a Linux server.
  • Tracking parameters like utm_source, gclid from Google Ads and fbclid from Facebook.
  • Session IDs in the address: every visitor generates a fresh URL for the same page.
  • Print views at ?print=1 or /print/article.
  • Filters and sorting in a shop: five filters with three values each produce more addresses than the category has products.
  • Pagination from ?page=2 through ?page=17, each carrying the same category description.
  • Content living on a second domain: the old domain from before the rebrand, a .co.uk version with identical copy, a press release a partner reprinted word for word.
  • The staging site in the index: staging.acmeroofing.com, online without a password, linked from somewhere and crawled diligently. The only case in this list you do not solve with a canonical, but with a password.

How to set a canonical Google will not ignore

The baseline is a self-referencing canonical on every page: each page names itself as the canonical address. That sounds like a statement of nothing, and it is not. It catches the cases where somebody links your page with a parameter attached, because the version with ?utm_source=newsletter then hands Google a canonical pointing at the version without it.

<head>
  <link rel="canonical" href="https://www.acmeroofing.com/services/roof-repair/" />
</head>

Four rules go with it. First: an absolute address with protocol and hostname, never /services/roof-repair/. Second: exactly one canonical per page. Two contradictory tags, one from the theme and one from the SEO plugin, and Google ignores both. Third, the tag belongs in the <head>; if broken markup pushes it into the <body>, it is not read. Fourth, canonical, sitemap and internal links have to name the same address. Three different answers to one question are the most common reason Google decides for itself.

The same rules, shown as the mistakes they prevent. Every one of these ships on real websites:

<!-- Wrong: relative path. Ambiguous with http/https, www and staging in play. -->
<link rel="canonical" href="/services/roof-repair/" />

<!-- Wrong: two tags, one from the theme, one from the plugin. Google skips both. -->
<link rel="canonical" href="https://www.acmeroofing.com/services/roof-repair/" />
<link rel="canonical" href="https://acmeroofing.com/services/roof-repair" />

<!-- Wrong: names the http address, which 301s to https. A waypoint, not a target. -->
<link rel="canonical" href="http://www.acmeroofing.com/services/roof-repair/" />

<!-- Wrong: every subpage names the homepage. The plugin classic from the curl
     check further down: the whole site collapses onto one indexed page. -->
<link rel="canonical" href="https://www.acmeroofing.com/" />

For PDFs and anything else without a <head>, there is exactly one route, the Link header in the HTTP response:

Link: <https://www.acmeroofing.com/downloads/price-list-2026.pdf>; rel="canonical"

And now the rule most people fall over: the target of a canonical has to be indexable itself. Google only follows a recommendation that is free of contradictions. These combinations get your canonical quietly ignored:

  • The target carries a noindex. You are saying "use the other page" and "do not use it" at the same time. Worst case, both disappear.
  • The target is blocked in robots.txt. Google is not allowed to fetch it, cannot compare the content, and picks for itself. Why blocking and noindex behave so differently is covered in robots.txt and noindex.
  • The target redirects. Point at the final address, not at a waypoint.
  • The target returns 404 or 410.
  • The target names a third page as its own canonical. Google does not resolve those chains reliably.
  • The target has substantially different content. An address that does not resemble the page being checked never gets picked.
  • The canonical contradicts your language markup. Inside an hreflang group every language version names itself as canonical; if the English page points at the German one, the group falls apart. See setting up hreflang.

Canonical, redirect or noindex: which tool when

SituationToolWhy
Two addresses, same content, both stay reachablecanonicalconsolidates signals without closing the page
Old page permanently replaced or moved301 redirectstrongest signal, nobody needs the old address
Filter and sort pages in a shopnoindex, canonical in rare casesendless variants, never meant as entry points
Print view of a pagecanonical to the normal versionsame content, still has to be reachable
Addresses with utm_*, gclid, fbclidself-referencing canonical, nothing elseGoogle normalizes known parameters itself
Page 2 and beyond of a listnothing, just self-referencelater pages have to stay crawlable
Your text runs on a partner domaincross-domain canonical over theresends the signals back to the original

The row that matters most is canonical versus redirect, and it comes down to one question: does a human still need the second address? Print view, filter, tracking link: yes, so canonical. Old product page after the platform switch, old URL structure after a relaunch: no, so 301. Using a canonical where a redirect belongs is the most expensive mistake in this table. Both addresses stay live, visitors keep landing on the old one, and you water a yes down to a maybe. In a relaunch every old address belongs on a redirect list, see relaunch without losing traffic.

If a trade association reprints your text word for word, there is nothing you can do on your own site. The canonical has to sit on their page and point at yours, which works fine across domains. If they refuse, the next best ask is a noindex.

Why page 2 of a list should not canonicalize to page 1

This is where a stubborn myth lives, left over from the days when Google still processed rel="next" and rel="prev". Since 2019 it is confirmed that Google no longer uses those. What survived is half the advice: canonicalize every later page to page one and the duplicates go away. Google's pagination documentation says the opposite in plain words. Do not use the first page of a sequence as the canonical for the others, give each page its own.

The reason matters more than the rule. If page 2 points at page 1, Google treats page 2 as a duplicate, keeps it out of the index and crawls it less often over time. Except pages 2 through 17 are where your products live, and that list is the only route to them. A workwear shop in Portland with 480 items in one category loses the path to 456 of them, not overnight, but as a slow thinning out across months.

The boring version is the correct one: every page in the sequence names itself as canonical, the pages are connected by real <a href> links instead of click handlers loading more, and page one carries the category copy. On page 2 that looks like this, parameter included:

<!-- On https://www.acmeroofing.com/shop/workwear?page=2 -->
<link rel="canonical" href="https://www.acmeroofing.com/shop/workwear?page=2" />

A noindex on the later pages is not a good idea either, because Google crawls permanently excluded pages less often.

Filters and sorting in a shop: a judgement call, not a rule

There is no clean answer here, and anyone selling you one has not understood the case.

Your "running shoes" category at ?color=blue&size=10&sort=price_asc returns a subset of the same products in a different order. Addresses like that exist in the hundreds, nobody searches for them, and they eat crawl time. Canonicalizing those to the unfiltered category is defensible. For faceted navigation, though, Google recommends the blunter instrument: keep unwanted variants out with a noindex robots meta tag, or exclude the URL patterns from crawling in robots.txt. A canonical is a recommendation, remember, and on heavily linked filter pages Google happily overrules it. Pick one of the two: block the pattern in robots.txt and Google can no longer read the canonical on those pages.

The other half of the judgement gets overlooked. Some filter pages deserve their own indexable page, namely when people search for exactly that. "Safety boots size 12 waterproof" is a real query with real buying intent, and canonicalizing it wholesale to the parent category hands it to the competitor who built a page for it.

Draw the line at three conditions: there is demonstrable search demand for the combination, the page gets its own heading and a few lines of its own copy, and it is reachable from the navigation without anyone clicking filters. Then it gets a self-referencing canonical and belongs in the sitemap. Sort orders stay out: the same products in a different order are not a separate page.

How to check which page Google treats as canonical

The most useful diagnostic sits in Search Console and gets skipped by most people. Put the address into URL Inspection, open the Page indexing section and look for two lines: User-declared canonical is what your tag says, Google-selected canonical is what Google actually uses.

If both lines show the same address, you are fine. If the first line is empty, Google did not find your canonical even though you set one. If the two diverge, Google has overruled you, and the answer is almost always in your internal links: Google trusts the address you link most often more than it trusts the tag.

Three messages in the Page indexing report belong to this topic:

  • "Alternate page with proper canonical tag": all good, Google understood and followed your canonical. Not an error, even though the row sits under "Not indexed". This one gets its own section below, because it causes the most confusion.
  • "Duplicate without user-selected canonical": there is no canonical on the page, so Google decided. Set one.
  • "Duplicate, Google chose different canonical than user": your canonical exists and got overruled. Walk the contradiction list further up.

How to read the rest of the messages in that report is covered in page not indexed.

The second move exposes the most common trap of all. Pull the HTML your server actually sends for three different pages:

curl -s https://www.acmeroofing.com/services/roof-repair/ | grep -i canonical

If the same address comes back all three times, usually the homepage, a plugin or theme has hard-coded a canonical. That is the classic that collapses an entire website down to one indexed page, and nobody notices because everything looks normal in the browser. If nothing comes back although the browser shows a canonical, it is being injected by JavaScript, and a canonical that only appears after rendering will not reliably override one in the HTML.

"Alternate page with proper canonical tag" is not asking you to fix anything

Of the three messages, this one triggers the most unnecessary work, so it gets its own section. It reads like a defect and describes a success. Decoded, it says: this address is a duplicate, your canonical names a different version, and Google agrees with you. The page stays out of the index because the version you picked is in it. That is your canonical doing its job, reported in the tone of a problem.

The confusion starts with where the message lives, under "Why pages aren't indexed", next to genuine errors. The count feeds it: every tracking link, every print view, every www variant with a correct canonical files a row here, so the number grows with the site and means nothing by itself. Chasing it down to zero would require removing canonicals, which moves those pages into the two duplicate messages instead and hands the choice back to Google.

Two findings in that list do justify action:

  • A page you want ranking shows up as an "alternate". Then its canonical points somewhere it should not, and Google is faithfully following a wrong tag. The usual suspect is the hard-coded plugin canonical from the curl check above. Fix the tag, and the message disappears on its own.
  • The canonical target is not the address you chose. Open a few rows and check which URL Google names as the canonical. If it is your clean address, close the report. If it is the utm version or the old domain, the contradiction list further up is your route.

Everything else in that list is bookkeeping, not a to-do.

Where to start

  1. Load your homepage under all four variants, with and without www, http and https. Three of them have to 301 onto the fourth. If they do not, start here, that is the root of most duplicates.
  2. Pull the canonical of three different pages with curl: exactly one tag, absolute address, pointing at itself.
  3. Run your three most important pages through URL Inspection and compare the two canonical lines.
  4. Open the page indexing report and expand the two duplicate messages. The pattern is usually obvious within two minutes: a parameter, a slash, a forgotten staging site.
  5. Only then go near filters and pagination. They earn nothing while the basics are shaky.

Crawling every page and matching the canonicals against the addresses that actually resolve is the mechanical part Traffalyzer's crawler takes off your hands. If completely different things surface while you do this, the wider sweep in finding SEO problems is the better order of work.

Frequently asked questions

What is a canonical tag?

A line in the <head> of a page that tells Google which address is the authoritative version of a piece of content. All the signals are supposed to consolidate there, and only that address should show up in search results. The nature of the statement is what matters: it is a recommendation, not an instruction.

Does Google penalize duplicate content?

No. There is no penalty as long as it does not look like an attempt to manipulate search results. Google groups addresses with the same content, picks one and shows only that one. The damage comes from the choice: if Google picks the address with the tracking parameter, or the old http version, that is what sits in the results.

Does every page need a canonical tag?

It is not mandatory, Google copes without one and then chooses for itself. A self-referencing canonical is still worth having on every page, because it catches the case where somebody links your page with a parameter attached. In any common CMS or shop platform it is a single setting.

What does "Alternate page with proper canonical tag" mean?

That your canonical works. Google found the page, recognized it as a duplicate of another address, read your tag and followed it. The page is not indexed because the version your canonical names is indexed in its place — which is exactly what you asked for. The number of affected pages can be large and stays harmless; it grows with every tracking link and every URL variant. Only act if a page in that list should be ranking on its own, because then its canonical points at the wrong target.

What does "Duplicate, Google chose different canonical than user" mean?

You set a canonical and Google went with a different address anyway. The inspected page is not indexed, and its signals flow to the address Google selected.

The cause is usually contradictory signals: internal links, the sitemap or a redirect point somewhere other than your canonical. Or the target is unusable because it carries a noindex, is blocked, redirects, or differs too much in content.

Canonical or 301 redirect, which one when?

Decide it with one question: does a human still need the second address? If yes, as with a print view, a filter or a tracking link, use the canonical, because the page stays reachable. If no, as with an old product page or a domain change, use the permanent redirect. It is the strongest signal you have.

How do I check which page Google treats as canonical?

Through URL Inspection in Search Console. The Page indexing section lists User-declared canonical and Google-selected canonical separately. If they match, you are fine. If they diverge, Google has overruled you and you go looking for the contradictory signal, usually in your internal linking.

What do I do about utm parameters and gclid in URLs?

As a rule, nothing. Google recognizes the well-known tracking parameters and treats those addresses as the same page. The Search Console tool that used to let you describe parameters yourself was retired in 2022. Your safety net is the self-referencing canonical. Do not block these addresses in robots.txt, because then Google cannot read the canonical at all.

How do I handle canonicals with pagination?

Every page in the sequence names itself as canonical. Google explicitly recommends not using the first page as the canonical for the later ones, and it stopped processing rel="next" and rel="prev" back in 2019. Canonicalizing page 2 to page 1 makes Google treat the later pages as duplicates, crawl them less, and lose the only route to every product linked from them.

Can a canonical point to a different domain?

Yes, and Google supports it for the case where your content also runs on someone else's site. The tag has to sit on their page and point at yours, not the other way round. For language versions of the same company across several domains it is the wrong tool: that is what hreflang is for.

Keep reading