Duplicate without user-selected canonical: how to fix it
Google found duplicate URLs with no canonical and picked one itself. Add one absolute self-referencing canonical per page, and 301 http and www duplicates.
LLaunchScaler·Published ·8 min read
Duplicate without user-selected canonical means Google found two or more URLs with the same content, none of them declares a canonical, and Google picked the one to index on its own. The fix is to add exactly one absolute, self-referencing <link rel="canonical"> to the <head> of every page you want indexed, and to 301 the protocol and host duplicates (http, www) to the version you chose.
How you add that tag depends on your stack, so below is the fix for plain HTML, Next.js and WordPress, followed by the redirects and the parameter rules.
What does "Duplicate without user-selected canonical" mean?
It means Google clustered this URL with another page and chose the other one, because you gave no preference. Search Console's help says: "This page is a duplicate of another page, although it doesn't indicate a preferred canonical page. Google has chosen the other page as the canonical for this page, and so will not serve this page in Search."
The same help entry adds: "This is not an error, but is working as intended, because Google does not serve duplicate pages." If Google picked the URL you would have picked, the status costs you nothing. It becomes a problem in two cases: Google chose a URL you do not want in search, such as an http:// or parameter version, or the listed page is not really a duplicate and should rank on its own.
Google says canonicals are not required and that without one it "will identify which version of the URL is objectively the best version to show to users." Declaring one removes the guesswork, which is why Google recommends it for any page that belongs to a set of duplicates.
How do you see which URL Google chose?
Inspect a listed URL in URL Inspection and read the Page indexing section. User-declared canonical will show None, which is the whole reason for the status. Google-selected canonical shows the URL Google indexed in its place. If that URL is the one you want in search, you can leave this row alone.
Open the "Duplicate without user-selected canonical" row in the Page indexing report and copy a few example URLs.
Questions, answered
What people ask about this
01
What does duplicate without user-selected canonical mean?
Google found that the URL duplicates another page, and neither page declares a canonical, so Google chose which one to index. Google's help calls it not an error but working as intended, because Google does not serve duplicate pages.
02
How do I fix duplicate without user-selected canonical?
Expand Page indexing and read Google-selected canonical.
Decide per URL pattern: is Google's choice the URL you want people to land on?
The help notes that for a page with no alternate versions, "the Google-selected canonical is the inspected URL," and that "if you find an unexpected page here, consider explicitly declaring a canonical version."
What is the fix for every stack?
Put exactly one <link rel="canonical"> in the <head> of each page, holding that page's own absolute URL. Google recommends a self-referential canonical on the canonical page, asks for absolute rather than relative URLs, and only accepts the element "if it appears in the <head> section of the HTML." Duplicates then point at the same URL.
The rules that apply everywhere:
One canonical per page. Two conflicting tags, or a tag and a Link header that disagree, leave Google to pick again.
Absolute URL with the protocol and host you chose: https://example.com/pricing, never /pricing. Google says relative paths "can cause problems in the long run," for example if a test copy of the site gets crawled.
In the raw HTML <head>. Invalid markup above it can close the head early, and a tag that ends up in the body is ignored.
Pointing at a URL that returns 200 and is indexable.
Matching your sitemap and internal links. Google tells you not to name one URL in the sitemap and another in rel="canonical" for the same page.
Plain HTML
Add the tag to each page's head, with that page's URL:
For a static site generator, set it in the page template from the page's own URL variable rather than typing it per file, so a copied page cannot carry another page's canonical.
Next.js App Router
Set metadataBase once in the root layout, then return alternates.canonical per page. The Next.js docs say metadataBase lets URL-based metadata "use a relative path instead of an otherwise required absolute URL," and Next.js composes the two into the absolute tag.
That renders <link rel="canonical" href="https://example.com/blog/your-slug" />. Two cautions. Metadata from a layout is inherited by child pages that do not set the same field, so never set alternates.canonical in the root layout, or every page without its own value inherits the homepage. And a relative path without metadataBase fails the build, which is a useful guard.
WordPress
WordPress core writes the canonical itself, but only on singular views. Its rel_canonical() function "outputs rel=canonical for singular queries" (posts, pages, attachments) using wp_get_canonical_url(), and it runs from wp_head, so a theme that does not call wp_head() gets none. Archives, category, tag and author pages get no canonical from core.
View the source of a post and a category page and search for rel="canonical".
If the post has one and the archive does not, that is core behaviour; an SEO plugin or custom code adds the rest.
If a page shows two canonical tags, the theme and a plugin are both printing one. Turn one off.
Check any per-post canonical field in your SEO plugin: a URL left there from a copied post points the new post at the old one.
Should http and www duplicates get a canonical or a redirect?
A redirect. Protocol and host duplicates are the same page reachable at several addresses, and Google's advice for getting rid of duplicate pages is a permanent redirect: "Pick one of those URLs as your canonical URL, and use redirects to send traffic from the other URLs to your preferred URL." A canonical tag leaves the duplicate live; a 301 removes it.
Check what each variant returns with one command:
for u in http://example.com/pricing https://www.example.com/pricing https://example.com/pricing/; do
curl -s -o /dev/null -w "%{http_code} -> %{redirect_url} $u\n" "$u"
done
Every variant except your chosen one should print 301 (or 308) and the chosen URL. A 200 on any other variant is a live duplicate. On nginx, a pair of server blocks handles protocol and host in one hop each:
Google also prefers HTTPS pages as canonical by default, unless something contradicts it, such as an invalid certificate, an HTTPS page that redirects through HTTP, or an HTTPS page whose canonical names the HTTP version. The www vs non-www guide covers choosing the host.
What canonical should parameter URLs carry?
The clean URL's. A URL with tracking, sort or filter parameters shows the same content as the page without them, so its canonical should name the page without them: /pricing?utm_source=x carries https://example.com/pricing. Once it does, Google usually moves those URLs to Alternate page with proper canonical tag, which needs no action.
Two exceptions. Paginated pages are not duplicates of page 1: Google says "Don't use the first page of a paginated sequence as the canonical page. Instead, give each page its own canonical URL," so ?page=3 carries its own URL. And a filtered URL you want indexed as its own landing page, for example a category filtered to one brand with its own copy, needs a self-referencing canonical and content that differs from the unfiltered page.
Link internally to the clean URLs as well. Google says linking consistently to the canonical "helps Google understand your preference."
What if the pages are not really duplicates?
Then make them different enough that Google stops clustering them. Google groups pages it judges duplicates or near-duplicates, and its troubleshooting guide says "pages will generally split out faster if the difference between the new content and the other clustered pages is clear and significant." A canonical will not separate two pages that look the same.
Typical cases are location or feature pages built from one template with only a name changed, and product variants with identical descriptions. Either give each page content the others lack, or merge them into one page and 301 the rest. After a real change, request indexing on the page in URL Inspection so Google re-evaluates the cluster. If you declared a canonical and Google still picked another URL, the status becomes Duplicate, Google chose different canonical than user, which has its own checks, and the canonical tag mistakes guide lists the errors that cause both.
How do you confirm the fix worked?
Check the served HTML first, then let Google recrawl. The status only changes after Google fetches the pages again, and Google says crawling "can take anywhere from a few days to a few weeks." Once it has, URL Inspection shows your URL under User-declared canonical instead of None.
Open view-source on one page per template and confirm a single rel="canonical" with the page's own absolute URL.
Run Test live URL on that page to confirm it loads and allows indexing. The live test does not evaluate canonical selection, so this only proves the page is fetchable.
Click Request indexing for your most important pages, once each.
Open the report row and click Validate fix, which rechecks every listed URL.
After the recrawl, inspect the same URLs. Variants you tagged should move to Alternate page with proper canonical tag, and pages you made distinct should show as indexed.
Check the canonical each template sends
To see what a page declares before Google's next crawl, run the free scan on LaunchScaler. It takes the URL, needs no account, and runs 156 checks across 6 of its 7 categories for free. Its canonical checks flag a page with no self-referencing canonical, a canonical pointing at a different URL, a canonical aimed at a URL that redirects, returns 404 or is noindexed, and invalid HTML that closes the <head> early and drops the tags below it. It also checks that plain HTTP redirects to HTTPS on the same host in one hop. Run it on one page per template, since one template usually explains the whole row.
Add exactly one self-referencing canonical to each page you want indexed, as an absolute URL in the head. Redirect protocol and host duplicates such as http and www with a 301, and give parameter URLs the canonical of the clean URL.
03
How do I fix duplicate without user-selected canonical in Next.js?
Set metadataBase once in the root layout and return alternates.canonical from generateMetadata on each page, for example /blog/ followed by the slug. Next.js composes the two into an absolute canonical link in the head.
04
Do I need to fix duplicate without user-selected canonical?
Only when Google picked the wrong URL, or when the listed page is not really a duplicate and should rank on its own. If Google chose the URL you want and the listed URLs are variants, the status needs no action.
05
Does WordPress add canonical tags automatically?
WordPress core outputs a canonical only on singular views such as posts, pages and attachments, through its rel_canonical function, and only if the theme calls wp_head. Archives, tag and category pages need an SEO plugin or custom code to get one.
Excluded by noindex tag means Google saw noindex in a robots meta tag or an X-Robots-Tag header. Find which one with curl and view-source, then remove it.