Duplicate Without User-Selected Canonical, When You Have a Canonical
The error does not mean you forgot the tag. It means Google either could not see your canonical or saw it and overruled it, and Search Console reports both under one label.

Like it ? share it
Search Console says your page is a duplicate without user-selected canonical. You open the source and the canonical tag is right there in the head, pointing at the URL you wanted. So either the report is wrong, or the message means something other than what it says. It is the second one.
The label describes Google's conclusion, not your HTML
"User-selected" means selected by you. "Without" does not mean you failed to write the tag. It means Google reached its decision without using one.
Two different situations produce that sentence. Google could not see your canonical, or Google saw it and picked a different URL anyway. Search Console files both under the same wording, which is why so many people check their HTML, find the tag, and stop there with nothing left to try.
The two lines that tell you which one you have
Inspect the flagged URL in Search Console and find the pair labelled User-declared canonical and Google-selected canonical.
Someone posting in r/Wordpress about their own site pasted exactly what they were looking at: "User-declared canonical: None" and "Google-selected canonical: https://www.SITENAME.com." Their home page was the non-www address, and it would not index. Google had crawled a URL, found no declared canonical on it, and folded it into the www version.
Read the pair like this. If it says None and your HTML has a tag, Google did not see the tag on the URL it fetched. If the two lines are filled in and disagree, Google saw your tag and overruled it, which is almost always a judgement about the page rather than the markup.
The same page living at two addresses
The classic pair is example.com/ and example.com/index.html. A poster in r/SEO described a site where the sitemap listed only the clean URL and the canonical inside index.html pointed at that same clean URL, and the error fired regardless. A commenter's reply was that the server still serves index.html at its own address and something is linking to it, plus an Apache rewrite rule to strip index.html out of the request. Some servers use default.html the same way.
The tag on that page can be perfect and it still will not save you. If both addresses return 200 and both get crawled, you have two URLs. The canonical is a vote about which one wins, not a mechanism that makes the other one stop existing.
www, http, and the trailing slash
Another poster complained that Google "makes a huge distinction between the http and https versions of the very same page" even though there is only one file. That is exactly right, and it is not Google being awkward. http://example.com/page and https://example.com/page are two URLs, and nothing except your server's response tells a crawler they are the same thing.
Checking this is mechanical. Take one page, request every variant you can construct, and see what comes back. Our Redirect Detector follows a URL's redirect chain and lists each hop with its URL and HTTP status code, then the final destination. That is enough to tell you whether http://example.com/ ends up at https://www.example.com/ through a 301, or whether it answers 200 on its own and has been a second copy of your site the whole time.
What you want to see is one variant returning 200 and every other variant returning a 301 that lands on it.
Parameter URLs you never created
Someone running a roughly 400-page store wrote that every page had a canonical and Google was still flagging all the WooCommerce category pages, which in their words was eating crawl budget. Another poster found example.com/dental-implants/ flagged in the form example.com/dental-implants/?gclid=Cj0KCQ... and said they had never created a URL like that. A commenter pointed out that gclid is a Google Click ID generated by Google Ads, and suggested a self-referencing canonical in the head of that document.
That advice is right when the parameter version really is the same page. It stops being enough when the parameter changes what the page shows. A filtered category listing is a different set of products, and Google decides for itself whether that difference is worth a separate entry.
The canonical that arrives too late
This is the one almost nobody checks. In a thread about programmatic pages, one reply said to make sure the metadata including the canonical tag is not loaded asynchronously, and that the correct metadata is set as soon as the page opens. It matters most on a single-page app with no server-side rendering.
So view source rather than trusting the browser inspector. The inspector shows you the DOM after JavaScript has run. View source shows the HTML your server actually sent. If your canonical appears in one and not the other, you have found why Search Console says None.
A page blocked in robots.txt has the same outcome for a different reason: Google cannot read a canonical it is not allowed to fetch. Our robots.txt fetcher will show you what your site is serving there.
Sometimes the tag is fine and the pages are not
One poster had 135 of 150 programmatic pages flagged. They picked a single page, added two to three thousand words, changed its title and meta description, requested indexing again, and got the same result. The replies were blunt. "Google has clearly found red flags in your content, and the average red flags over 135 pages will not be resolved by a small change to just one page." Someone else asked whether the pages had been copied and pasted out of ChatGPT.
Nothing is broken in that scenario. The canonical tag is doing precisely what a canonical tag does, which is state a preference. Google looked at 150 pages, decided they were not distinct enough to deserve 150 entries, and collapsed them. Rewriting one of them says nothing about the other 134. That is a content problem wearing a technical error message, and no amount of markup will argue Google out of it.
Worth deciding which case you are in before you spend a week writing rewrite rules.
The order to check things in
- View source on the exact URL Search Console flagged, not the URL you meant to publish. Confirm the canonical is in the HTML your server sends.
- Confirm there is only one canonical tag on the page.
- Request the http, https, www, non-www and trailing-slash variants of that page and see which ones return 200 rather than a redirect.
- Ask whether the tag exists before JavaScript runs or only after.
- Only once all of that is clean, ask whether the flagged pages are genuinely different from each other.
Steps 1 through 4 are things you can fix. Step 5 is a decision about whether those pages should exist as separate pages at all, and it is a slower and more honest piece of work than the first four.
A canonical is a hint
Google treats rel="canonical" as a signal, not an instruction. It is allowed to pick a different URL, and on sites with thin or near-identical pages it regularly does. That is the part the error message hides behind its wording.
Reread the label as what it actually reports. Not "you forgot a canonical" but "we chose one for you". Once you read it that way, the question stops being where the tag went and starts being why Google did not take your side.
There is a separate problem worth ruling out while you are in the source: a canonical that is present and readable but aimed at the wrong URL entirely. Nothing in Search Console flags that one, because as far as Google is concerned you asked for it. See the canonical error nothing warns you about.