Why does Search Console say "Duplicate without user-selected canonical"?
Google found several URLs serving the same content, you did not tell it which one counts, so it picked one itself - and it does not have to pick the one you would have.
By Sapun Lamichhane · Arcetis
It means Google found several URLs serving the same content, could not find a declaration of which one you consider real, and made the decision on your behalf. The report is describing a choice it already made.
Nothing is penalised. Duplicates are consolidated, not punished. The problem is narrower and more annoying: Google's pick does not have to be yours, and once it has picked, your rankings, your reporting and your internal links can all be pointing at a URL that is no longer the one in the index.
Where the duplicates come from
Almost never from writing the same page twice. They come from your URLs having more variants than you realised:
- `https://` and `http://`, `www.` and bare, resolving without redirecting.
- Trailing slash and no trailing slash, when the server serves both.
- Uppercase and lowercase paths. `/Sapun_Lamichhane` and `/sapun-lamichhane` are two URLs to Google - paths are case-sensitive, hostnames are not.
- Tracking parameters. `?utm_source=…` produces a distinct URL for every campaign you have ever run.
- Pagination, filters and sort orders that return overlapping result sets.
- The same article reachable at `/blog/post` and `/category/post`.
Why the wrong URL gets chosen
Google weighs several signals and the canonical tag is only one of them. When they disagree, the tag frequently loses. The usual conflicts:
- 1Your canonical says one URL, your internal links point at another. Internal links are a vote cast repeatedly across your whole site; the tag is stated once.
- 2Your sitemap lists the non-canonical variant.
- 3The canonical URL redirects somewhere else, making the declaration self-contradictory.
- 4The canonical is relative and resolves incorrectly, or is injected by JavaScript and absent from the HTML Google fetched.
- 5The canonical points at a page that is `noindex`, which asks Google to consolidate into a page it has been told to exclude.
Making the choice stick
One URL per piece of content, declared the same way everywhere. Every signal has to agree:
- Self-referencing canonical on every page, absolute, in the server-rendered HTML.
- 301 the variants. Pick `https://` with or without `www.`, pick a trailing-slash convention, redirect everything else once - not through a chain.
- Lowercase your paths and 301 uppercase variants into them. Use hyphens, not underscores: Google splits tokens on hyphens and not on underscores, so `two_words` is read as one term and never matches a search for either.
- List only canonical URLs in your sitemap.
- Point internal links at the canonical form. Every inconsistent link is a vote against your own declaration.
Checking it
Read the canonical out of the raw HTML rather than the inspector, so JavaScript-injected tags cannot mislead you:
curl -s https://example.com/page | grep -i 'rel="canonical"'Then request the variants and confirm each returns a single 301 to the canonical form - not a 200, and not a chain. The URL Inspection tool in Search Console will tell you the "Google-selected canonical" for any URL, which is the only opinion that actually matters.
Our meta tag checker reads the canonical from the served HTML, resolves it to an absolute URL, and reports when it points at a redirect, a `noindex` page or a different host - the three cases where a canonical is present, looks correct in a template, and is quietly being ignored.