Duplicate without user-selected canonical: how to fix it

·8 min read

"Duplicate without user-selected canonical" is a Search Console status for a URL that Google judged to be a copy of another page on your site. The URL declares no canonical of its own, so Google picked the other page as the canonical and leaves this one out of search results. If the excluded URL is a variant nobody should land on, such as a ?utm_source= link or the http version of a page, leave it alone. If it is a page you want ranked, open URL Inspection to see which URL Google kept, then point a rel=canonical tag or a 301 redirect at the version you want.

What "duplicate without user-selected canonical" means

The status sits in the Page indexing report under "Why pages aren't indexed", and Google's definition has three parts. The URL duplicates another page. It names no preferred version with a rel=canonical tag or header. So Google chose the other page as canonical and will not show this URL in Search.

Google's help page calls this "working as intended, because Google does not serve duplicate pages." Its canonicalization docs add that some duplicate content is normal and does not break its spam policies. Nothing is being punished. The only question is whether Google kept the right copy.

Duplicate without user-selected canonical vs "Google chose different canonical than user"

The sibling statuses differ on two things. Did the URL declare a canonical, and did Google go along with it?

Status Canonical declared on the URL? What Google did What you do
Duplicate without user-selected canonical No Treated it as a duplicate and chose another URL as canonical Check the URL Google chose. Act only if it is the wrong one
Duplicate, Google chose different canonical than user Yes Overruled your choice and indexed a URL it considers a better canonical Compare your canonical with Google's and remove the signals that point elsewhere
Alternate page with proper canonical tag Yes, pointing at another URL Accepted it and indexed that canonical Nothing

The third status is where your variants should end up after a fix.

One line in Google's help for the second status applies to both. If the canonical you declare is not similar to the page, Google will never choose it. A canonical picks between near-identical pages. It cannot merge two different ones.

Is duplicate without user-selected canonical a problem?

Usually it is not. Open the example URLs and look at what Google left out. These are fine to leave:

  • https://www.example.com/pricing?utm_source=newsletter&utm_medium=email, with /pricing indexed
  • http://example.com/about, with the https www version indexed
  • https://www.example.com/shoes/?sort=price-asc, with /shoes/ indexed

Act when the excluded URL is a page you want in results, or when Google's pick is a URL you never meant to publish. These patterns need a fix:

  • A product, service or article page was folded into a different one. That usually means the shared template outweighs the unique text.
  • Google kept a parameter, staging or http URL over your clean one. Your own signals point the wrong way.
  • The count jumped after a deploy, a CMS migration or a new filter feature.

How to see which URL Google chose as canonical

URL Inspection shows the URL Google kept. To find it:

  1. In Search Console, open Indexing > Pages and click "Duplicate without user-selected canonical" in the "Why pages aren't indexed" table.
  2. Click an example URL and inspect it.
  3. In the Page indexing section, read "User-declared canonical" and "Google-selected canonical". The first should be empty for this status. The second is the URL Google kept.
  4. Open both URLs in a browser and compare the main content.

Read it from the indexed result. Google's help says the live test cannot show Google's canonical choice, because Google makes that choice at indexing time.

The report lists at most 1,000 example URLs. On a large site, export them and sort by URL pattern. Twenty thousand ?sort= URLs are one fix.

Common causes of duplicate content in Search Console

Most cases come from a few URL patterns. Google's canonicalization docs name protocol variants and sorting and filtering among the usual sources.

Source Excluded duplicate Likely canonical
Protocol http://www.example.com/pricing https://www.example.com/pricing
Host https://example.com/pricing https://www.example.com/pricing
Trailing slash https://www.example.com/shoes https://www.example.com/shoes/
Tracking parameters /pricing?utm_source=newsletter, /pricing?gclid=abc123 /pricing
Sort and filter parameters /shoes/?sort=price-asc, /shoes/?color=all /shoes/
Printer version /recipes/lasagna/print /recipes/lasagna
Pagination /blog/?page=1 /blog/
Location pages /plumbing/round-rock /plumbing/austin

Google treats /shoes and /shoes/ as two separate URLs. The root is the exception, where example.com and example.com/ are the same.

Pagination trips people up in the other direction. Google says each page in a paginated series is its own page and should get its own canonical, so never point page 2 at page 1. The real duplicate is a ?page=1 URL that repeats the first page.

A working AMP page links to its canonical and lands in "Alternate page with proper canonical tag". If AMP URLs show up here, check that your template still outputs that link.

Location pages are the hard case. If /plumbing/round-rock and /plumbing/austin share every sentence except the city name, Google sees one page. Its doorway abuse policy also names city pages that funnel users to one page, so a canonical tag will not save them.

How to fix duplicate without user-selected canonical

Work through these fixes in order. The first one covers most sites.

1. Add a canonical tag to every version

Put one canonical link in the <head> of each duplicate, pointing at the URL you want indexed. The canonical page gets a tag that points at itself.

<!-- On /shoes/?sort=price-asc, /shoes/?color=all and /shoes/ itself -->
<link rel="canonical" href="https://www.example.com/shoes/" />

Use an absolute URL with the right scheme and host, as Google recommends. Google accepts the tag only inside <head>, and it ignores head elements that follow an invalid one such as <img> or <iframe>, so keep the canonical above them. Point it at a URL that returns 200 and carries no noindex.

PDFs and other files have no <head>, so send the canonical as an HTTP Link header. Google supports this for web search results.

HTTP/1.1 200 OK
Content-Type: application/pdf
Link: <https://www.example.com/downloads/size-chart.pdf>; rel="canonical"

On Apache with mod_headers:

<Files "size-chart.pdf">
  Header set Link "<https://www.example.com/downloads/size-chart.pdf>; rel=\"canonical\""
</Files>

If a URL sends both a header and a tag, they must name the same URL. Google warns against declaring different canonicals for one page with different methods.

2. 301 redirect true duplicates

When a variant has no reason to exist, redirect it. Protocol, host and trailing slash duplicates belong here. Google calls a permanent redirect a strong canonical signal and recommends it for retiring a duplicate page.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://www.example.com$request_uri;
}

The bare https://example.com host needs the same 301 in its own server block with its certificate. Our post on 301 vs 302 redirects covers which status code to use, and the redirect and host checker confirms that http, https, www and bare hosts all end at one URL.

Do not redirect tracking URLs to the clean URL. The redirect strips the utm_ parameters before your analytics script reads them, and the canonical tag already covers those URLs.

Google tells you to link to the canonical URL internally, and it treats every URL in a sitemap as a suggested canonical. If your menu links to /shoes, your sitemap lists /shoes/ and neither page declares a canonical, you are voting for two URLs at once. Pick one and update templates, breadcrumbs and the sitemap generator.

Once redirects are live, paste the exported URL list into the bulk HTTP status checker to confirm every old URL now returns a 301 and see where each one points.

4. Merge or rewrite near-duplicate pages

Thin location pages and near-identical product variants need a content decision. Merge them into one strong page and 301 the rest, or give each page a reason to exist. Local prices, the crew that covers the area, job photos and reviews from that town all count.

Skip the shortcuts. Google says not to use robots.txt or its URL removal tool for canonicalization, since the removal tool hides every version of the URL, and it does not recommend noindex for steering canonical choice within one site. Huge faceted catalogs are a separate crawl budget case, where Google's faceted navigation guide prefers a robots.txt disallow for filter URLs.

How to validate the fix in Search Console

Validation asks Google to recrawl the URLs listed under the status and confirm the issue is gone.

  1. Fix every pattern first. Validation stops as soon as Google finds one remaining instance.
  2. Open the status in the Page indexing report and click Validate fix. Do not click it again until it passes or fails.
  3. Wait. Google says validation typically takes up to about two weeks and sometimes much longer, and it notifies you when it succeeds or fails.

Google recrawls only the URLs listed under this issue. Fixed URLs should move to "Alternate page with proper canonical tag" or "Page with redirect", and both are the result you want.

Validation is optional, because Google updates the counts whenever it recrawls affected pages. Skip it for harmless parameter duplicates. Run it for product pages Google wrongly folded together, so the notification tells you when the fix has landed.

Check a page's canonical and indexability

Our Indexing & Canonical Checker reads the signals you control on one URL. It reports the canonical in the HTML and in the Link header, whether the two agree, and whether the canonical is missing, outside <head>, split across several URLs or not an http(s) URL. It then fetches the canonical target and flags one that errors, redirects, carries noindex, points on to a third URL or points back. The same run checks the HTTP status, robots.txt rules for Googlebot, noindex in meta robots or X-Robots-Tag, and the snippet controls Google and Bing read. Each finding names the tag or header to change, and a run costs 8 credits.

Run it on the excluded URL and on the URL Google kept. If both report "No canonical tag", add a self-referencing canonical to the keeper and point the other URL at it.

The checker reads what your pages declare. It cannot confirm that a URL is in Google's index or tell you which canonical Google chose, so use URL Inspection for that. It does not render JavaScript, so it will not see a canonical added by a script, and it is not a full robots.txt or sitemap audit.

Keep reading