Same page, different addresses
https://site.com/shoes
https://www.site.com/shoes
http://site.com/shoes
https://site.com/shoes/
www and non-www, http and https, trailing slash or not. Four URLs, one page, and Google has to choose.
Check rel=canonical tags: present, self-referencing where they should be, resolving to live 200 URLs, and never pointing at a redirect.
Nobody sets out to publish the same page six times. Each of these appears on its own — a migration, a server default, a filter, a link someone shared — and to a crawler every one is a separate page competing with the others.
http://site.com/shoesthe pre-HTTPS address, still resolvinghttps://www.site.com/shoeswww and bare domain both answeringhttps://site.com/shoesthe same path with and without ithttps://site.com/shoes/?color=reda facet that narrows but does not change the pagehttps://site.com/shoes/?utm_source=mailadded by the newsletter, not by youhttps://site.com/shoes/index.htmlthe file the directory already serveshttps://site.com/shoes/Every link, every mention and every bit of ranking history from the six above counts towards this URL instead of being divided between them.
Without this Google still picks a winner, but it picks on its own evidence, and the other five keep their share of the links.
Google treats the canonical as a strong signal, not an instruction, and weighs it against everything else the page says [1]. When the tag contradicts another signal, the tag is what gets dropped — and Google chooses a URL on its own evidence. These are the six contradictions the checker looks for, in the order it tests them.
The canonical names a URL that answers with a 301.
GoogleIt follows the redirect and usually canonicalises to the destination instead, so your declared URL never wins.
FixPoint the canonical at the final URL, the one that returns 200. Never at a URL you also redirect.
The canonical names a URL returning 404, 410 or a 5xx.
GoogleIt cannot index a page that is not there, so the tag is discarded and the choice is made without you.
FixFetch the canonical target yourself and confirm it returns 200. A canonical to a dead URL is worse than none.
A names B as canonical, and B names C. The chain has no end on the page you started from.
GoogleIt does not follow canonical chains the way it follows redirects, so a chained tag is unreliable and may be dropped entirely.
FixFlatten the chain. Every duplicate should name the final URL directly, never a page that itself canonicalises elsewhere.
The page says index this one instead, and that one says do not index me.
GoogleThe two directives contradict, so the signal is unreliable and both pages may fall out.
FixDecide which you meant. If the target should be indexed, remove its noindex; if it should not, canonicalise somewhere else.
Two rel="canonical" tags on one page, usually a theme and an SEO plugin both writing one.
GoogleConflicting tags are treated as unreliable and Google may ignore both.
FixFind which plugin emits which and switch one off. View-source and count the tags; there must be exactly one.
The <link> tag names one URL and the HTTP Link: header names another.
GoogleSame contradiction, harder to spot, because the header never appears in view-source.
FixCheck the response headers as well as the HTML. Serve the directive one way only, usually the tag, and drop the header.
Most failures come down to one character in the wrong place.
<linkrel="canonical"href="https://site.com/shoes/">
A quick decision table for the page types the checker sees most often.
It is the same page reachable at several addresses, which happens on its own: a store adds filters, a CMS keeps both www and non-www alive, a campaign link picks up a tracking parameter. Google then has to pick one URL to keep, and it splits the signals between them until it does [1].
https://site.com/shoes
https://www.site.com/shoes
http://site.com/shoes
https://site.com/shoes/
www and non-www, http and https, trailing slash or not. Four URLs, one page, and Google has to choose.
/shoes?color=red&sort=price
/shoes?sort=price&color=red
/shoes?utm_source=newsletter
/shoes?ref=homepage
Filters, sort orders and tracking tags multiply one page into hundreds, each looking distinct to a crawler.
/shoes/running/model-x
/sale/model-x
/brands/acme/model-x
/search?q=model-x
Category paths, campaign landing pages and internal search results that all render the same item.
There is no penalty for any of this. The cost is quieter: links and ranking signals divided between duplicates, crawl budget spent fetching the same content repeatedly, and the version Google keeps possibly not being the one you would have chosen [1].
What the search engines document about each check this tool runs, with every claim linked to its source.
Google uses rel="canonical" as one signal among several when picking which URL to index, and may choose differently [1]. When it does, Search Console reports the URL it chose rather than yours.
<!-- on /product?color=red -->A clear instruction, correctly formed.
<link rel="canonical"
href="https://site.com/product">
User-declared canonicalUsually because other signals disagreed: internal links, the sitemap, or redirects pointing the other way [2].
https://site.com/product
Google-selected canonical
https://site.com/product?color=red
A canonical naming a URL that redirects, 404s or carries a noindex is a nomination Google cannot honour [1], so it falls back to choosing on its own evidence.
canonical → /old → 301 to /newEach one asks Google to index something it has just been told not to index.
canonical → /gone → 404
canonical → /draft → noindex
canonical → /newLive, final, and naming itself. The last line is the one people forget [1].
GET /new → 200 OK
/new canonical → itself
Google supports the <link> element and the HTTP Link: header [2]. Using several at once, or emitting the tag twice, is how a correct URL ends up ignored.
<!-- theme -->Two tags, two answers. View-source and count; there must be exactly one.
<link rel="canonical" href="/page">
<!-- SEO plugin -->
<link rel="canonical" href="/page?v=2">
HTTP/1.1 200 OKThe header never appears in view-source, so this contradiction survives every visual check [2].
Link: <https://site.com/a>; rel="canonical"
<link rel="canonical" href="/b">
Every page in an hreflang cluster should carry a self-referencing canonical, and hreflang annotations must point at canonical URLs [4]. Canonicalising the translations to one language removes them from the index.
<!-- on /de/produkt -->Translations are not duplicates, and a canonical says they are.
<link rel="canonical" href="/en/product">
→ the German page asks not to be indexed
<!-- on /de/produkt -->Self-canonical, plus the cluster, on every page including itself [4].
<link rel="canonical" href="/de/produkt">
<link hreflang="en" href="/en/product">
<link hreflang="de" href="/de/produkt">
Google uses sitemaps among the signals for choosing a canonical [1][5]. Listing non-canonical URLs is a common way to weaken the tag without anyone editing a page.
<!-- sitemap.xml -->The sitemap nominates one URL, the page nominates another.
<loc>https://site.com/p?sort=new</loc>
<!-- that page says -->
canonical → https://site.com/p
• canonical URLs onlyA sitemap listing only canonical URLs reinforces every tag in it [5].
• each returning 200
• each self-referencing
→ the file agrees with the pages
Google supports canonicals across domains for syndicated content, which lets the original keep the ranking [1]. The risk is pointing at a domain you do not control, or being pointed at by one.
<!-- on partner.com/article -->The partner nominates you. Agree it before syndicating, because you cannot add it yourself [1].
<link rel="canonical"
href="https://you.com/article">
→ credit stays with the original
<!-- on your page -->Usually a template copied between projects, or a staging domain left in the build.
<link rel="canonical"
href="https://othersite.com/…">
→ you nominated someone else
Google crawls the HTML, queues the page, then renders it and reads what is there [6]. A canonical injected at render time is therefore slower to take effect and fails entirely when the script does.
<!-- served HTML -->Google may act on the first before it ever renders the second [6].
<link rel="canonical" href="/default">
<!-- after JS -->
<link rel="canonical" href="/real-page">
view-source → canonical AAny difference is a window where the wrong URL is the one Google sees.
rendered DOM → canonical B
→ they should be identical
A canonical consolidates ranking signals to the chosen URL [1]. The duplicates are still crawled, so canonicals are not a way to save crawl budget on thousands of parameter URLs.
indexing → one URL keptAll three are often assumed to move together. Only the first two do [1].
ranking → signals consolidated
crawling → unchanged
filters nobody should land onDifferent problems, different tools. A canonical answers only the duplicate question.
→ robots.txt disallow
pages that should never rank
→ noindex
A canonical is almost never wrong on one page alone. It is wrong in the layout that writes it, and that layout renders every product, every category, every paginated page. Checking one URL proves the tag is wrong. The full audit runs 21 canonical checks across every URL you have and groups the failures by the template that caused them.
Following each one to its destination: canonicals pointing at redirects, at 404s, at noindex pages, or chaining through several URLs before they stop.
The sitemap naming one URL while the canonical names another, hreflang pointing at non-canonical pages, internal links sending authority to the version you did not choose.
Pages where Search Console reports a different canonical from the one you declared, which is the signal that your hint was not convincing enough.