Canonical Tags: How They Work and Where They Break
Canonical tags are a hint, not a rule. Here is how a search engine picks the canonical URL, the signals that override your tag, and how to audit yours.

Canonical tags get treated as an instruction, and they are not one. Google's documentation calls a canonical preference "a hint, not a rule", so your tag is one input into a decision that also weighs your redirects, your sitemap and your protocol. Nearly every canonical bug people chase is a disagreement between those inputs, and retyping the tag does nothing to settle it. Below is the signal model that explains the failures, the two Search Console statuses that get the same wrong fix, and a ten minute audit you can run on any URL.
The short answer
A canonical tag names the URL you consider the real one for content that lives at more than one address. It asks for the duplicates to be grouped and their signals consolidated onto the URL you named. It does not delete them, block them, or keep them from being crawled.
Google's canonicalization documentation is explicit about the rest:
"You can indicate your preference to Google using these techniques, but Google may choose a different page as canonical than you do, for various reasons. That is, indicating a canonical preference is a hint, not a rule."
So when a canonical "doesn't work", there are exactly two possibilities. Either the tag was never read, or it was read and outweighed. One is a five minute template fix. The other is a content problem no amount of markup will solve.
What a canonical tag actually does
Canonicalization is the process of picking one representative URL for a piece of content. A search engine does this whether or not you participate. Your tag is how you get a vote.
Duplicate URLs are rarely created on purpose. They accumulate.
| Where the duplicate comes from | Example | Usual cause |
|---|---|---|
| Site functions | `/shop/?sort=price`, `/shop/?page=2&sort=price` | Sorting, filtering and faceted navigation |
| Tracking parameters | `/blog/example-post/?ref=newsletter` | Campaign tags appended to shared links |
| Protocol and host variants | `http://` and `https://`, `www` and bare domain | Server config that answers on all four |
| Trailing slash variants | `/pricing` and `/pricing/` | A router that serves both without redirecting |
| Device or region variants | A separate mobile host, country subfolders | Legacy architecture, localization |
| Accidental variants | `/blog/example-post/` and `/blog/example-post/index.html` | A CMS exposing two routes to one template |
When it works, one URL is indexed and served, the rest are grouped with it, and their signals are treated as belonging to the winner. When it goes wrong, you either split those signals across several URLs or hand them to a URL you did not want representing you.
Stuck on page two?
Real human clicks that lift your CTR and move you up the rankings.
It is a hint, and here is what it competes with
This is the framing that makes canonical debugging tractable, and almost no guide states it: your tag is not evaluated alone. Google's documentation names the factors.
"There are a handful of factors that play a role in canonicalization: whether the page is served over HTTP or HTTPS, redirects, presence of the URL in a sitemap, and
rel="canonical"link annotations."
The same documentation grades them, and the grades are the useful part.
| Signal | What it argues | Strength, in Google's own wording |
|---|---|---|
| A redirect | The redirect target should win | "A strong signal that the target of the redirect should become canonical" |
| `rel="canonical"` | The named URL should win | "A strong signal that the specified URL should become canonical" |
| Presence in an XML sitemap | The listed URL is one you treat as real | "A weak signal that helps the URLs that are included in a sitemap become canonical" |
| HTTPS over HTTP | The secure version should win | Named as a factor, no strength given |
Two strong signals, one weak one, and a tiebreaker. Read it against your own site and the classic failures stop looking like typos.
Your canonical points at /product/blue-widget/. Your sitemap lists /shop/blue-widget/. Your navigation links to a third URL, and Google's guidance is to "link to the canonical URL rather than a duplicate URL", so your link graph is arguing too. Nothing here is malformed. You have cast four votes for three candidates, and the engine resolved the contest without you.
The audit that follows is not "is my tag correct". It is "do all my signals for this URL name the same target". That reframe beats any checklist of syntax errors, because syntax errors are rare and signal conflicts are everywhere.
The four ways to declare a canonical
| Method | Where it lives | Use it for |
|---|---|---|
| `` | The `` of the HTML | The default for every HTML page |
| `Link:` HTTP header | The response header, per RFC5988 | Non-HTML files. Google: "You can return a `rel="canonical"` HTTP header to tell Googlebot what is the canonical URL for the non-HTML files" |
| A 301 or 308 redirect | The server | Retiring a URL for good, when nobody needs the duplicate |
| Inclusion in an XML sitemap | The sitemap file | Reinforcement only. Google: "Google must still determine the associated duplicate for any canonicals that you declare in the sitemap" |
Three rules from the documentation cost nothing to follow. Use absolute paths: "Use absolute paths rather than relative paths with the rel="canonical" link element." Put a self-referencing canonical on the canonical page too, which Google recommends explicitly. And declare one canonical per page, by one method: "Don't specify different URLs as canonical for the same page using different canonicalization techniques." That last rule usually breaks because a plugin and a theme each write one, neither aware of the other.
The two Search Console statuses everyone conflates
The Page indexing report has three canonical-related rows. Two of them read almost identically and mean opposite things.
| Status, verbatim | What Google says it means | What it tells you |
|---|---|---|
| `Alternate page with proper canonical tag` | "This page correctly points to the canonical page, which is indexed, so there is nothing you need to do" | Working as designed. Not a problem |
| `Duplicate without user-selected canonical` | "This page is a duplicate of another page, although it doesn't indicate a preferred canonical page" | You declared nothing. The engine picked for you |
| `Duplicate, Google chose different canonical than user` | "This page is marked as canonical for a set of pages, but Google thinks another URL makes a better canonical" | You declared something and were overruled |
Almost every article about canonical problems gives both duplicate rows the same advice: add a canonical tag. It is correct for exactly one of them.
| `Duplicate without user-selected canonical` | `Duplicate, Google chose different canonical than user` | |
|---|---|---|
| Did you declare a canonical? | No | Yes |
| What the engine did | Filled the gap | Rejected your choice |
| Does adding a tag help? | Yes, this is the fix | No, you already have one |
| Real cause | Missing self-referencing canonical, usually template-wide | The pages are too similar, or your signals conflict |
| Realistic effort | Minutes, one template change | Weeks, differentiate or accept the grouping |
If you take one operational thing from this post, take that table. The right-hand column is not a markup problem wearing a markup label. It is the engine telling you two of your pages are the same page, which is a selection decision about content, not HTML.
Worked example: audit one URL's canonical signals
Every figure below is an illustrative example, not SparkCliks data.
Say https://www.sparkcliks.com/blog/example-post/ stopped picking up impressions and you suspect a canonical problem.
1. Read the two canonical fields. Paste the full URL into the Search Console inspection bar. Open the Page indexing panel and find User-declared canonical and Google-selected canonical. Google defines the first as "If your page explicitly declares a canonical URL, it will be shown here" and the second as "The page that Google selected as the canonical (authoritative) URL when it found similar pages on your site."
2. Note which version you are reading. The help page is explicit: "This is not a live test. The results shown are from most recently indexed version of a page, not the live version on the web." If you fixed a canonical last week and the fields still show the old target, you may be reading a verdict that predates the fix. Click Test live URL for the current page.
3. Compare the two fields. This is the whole diagnosis.
| User-declared | Google-selected | Reading |
|---|---|---|
| Empty | Another URL | Nothing declared. Add a self-referencing canonical |
| This URL | This URL | Working. Look elsewhere for your traffic problem |
| Another URL | The same other URL | Working as intended. This page is meant to be an alternate |
| This URL | Another URL | You were overruled. Go to step 4 |
| Another URL | A third URL | Signal conflict. Go to step 4 |
4. Build the signal table by hand. For the URL in question, write down what each signal says. It takes about five minutes and it is where the answer usually is.
| Signal | How to check it | Example finding |
|---|---|---|
| `rel="canonical"` | View source, search for `rel="canonical"`. Count the matches | 2 matches, different targets |
| Redirect | `curl -sIL` the URL and read the `Location` headers | 200, no redirect |
| Sitemap | Search your sitemap file for the path | Present, but the parameterized version is listed too |
| Internal links | Site search or a crawl for links to the path | Navigation links to the `?ref=nav` variant |
| Protocol and host | Compare the canonical string against the live URL | Canonical says `http://`, site serves HTTPS |
Two canonical tags and a protocol mismatch in one audit is a normal result: three components giving three different answers.
5. Size it before you fix one page. Open Indexing, then Pages, and click the Duplicate, Google chose different canonical than user row. Export the URLs and group them by path prefix. Example: 214 URLs, 197 of them under /shop/ and carrying a ?sort= parameter. That distribution answers the question faster than inspecting any single URL, and it tells you the fix is one faceted-navigation decision rather than 214 edits.
6. Set a re-check window, not a re-check habit. Wait for the URL to be re-crawled before judging the result. Compare the same two fields after three to four weeks, against a control set of similar pages you deliberately did not touch. If the untouched controls moved the same way, you did not measure your fix, you measured something site-wide.
When the search engine is right and you are wrong
Everyone treats Duplicate, Google chose different canonical than user as damage to be undone. Google's own troubleshooting documentation does not. It tells you to "think about whether the Google-selected canonical makes more sense than your preferred canonical URL for your users coming from Google Search."
That is a different instruction from the usual advice, and it is often the correct one. If the engine consolidated your three near-identical location pages onto the one with real content, links and traffic, the grouping reflects something true about your site. Forcing your preference gets you a URL that wins a technical argument and still has nothing distinct to offer.
The honest test is one sentence long: what does the URL you prefer give a reader that the URL the engine picked does not? If you can answer it, differentiate the pages until the answer is visible on the page itself, and the selection tends to follow. If you cannot, the search engine has already made your consolidation decision, and accepting it costs you nothing.
What a canonical tag cannot do
| What people expect | What actually happens |
|---|---|
| Stop duplicates from being crawled | The duplicate has to be fetched for the tag to be read at all. Canonicals consolidate indexing, not crawling |
| Force a URL out of the index | It is a hint. `noindex` is the removal tool |
| Fix thin or duplicate content | It groups near-identical pages. It does not make them worth indexing |
| Work across a robots.txt block | A blocked URL cannot be fetched, so its canonical is never read |
| Take effect immediately | It applies at the next crawl and assessment of that URL |
One more, stated plainly because SparkCliks sells click and traffic services: sending clicks or visits to a URL has no effect on which URL is selected as canonical. Selection is decided from what the crawler fetches and how similar your pages are to each other. Visits are not an input, and a page grouped under a different canonical has no separate listing for anyone to click. Click work like SERP Clicks applies to pages that already rank as themselves and already collect impressions you can see in the Performance report. SparkCliks' own FAQ puts the general version well: there are no guarantees in SEO, unless you happen to own the search engine.
Canonicals sit in the indexing half of the pipeline, and if that half is not solid the rest never gets a chance. What technical SEO covers walks the full path from crawl to serve.
Frequently asked questions
FAQ
A hint. Google's canonicalization documentation states that "indicating a canonical preference is a hint, not a rule", and that a different page may be chosen as canonical for various reasons. Redirects carry comparable strength, and a sitemap entry carries less.
It means you declared a canonical and it was rejected in favor of another URL, because the engine judged that URL a better representative of the group. Adding or re-checking your canonical tag will not change it, since the tag was already read. The pages need to be genuinely different, or the grouping needs to be accepted.
You can put both on a page, but they ask for contradictory outcomes and Google advises against it: "We don't recommend using noindex to prevent selection of a canonical page within a single site, because it will completely block the page from Search." Decide whether the page should be consolidated or removed, then use only the matching tag.
No. A crawler has to fetch the duplicate before it can read the canonical tag inside it, so the URL is still requested. Canonical tags consolidate what gets indexed and served, not what gets crawled.
It is the recommended default. Google suggests "adding this same self-referential rel="canonical" link element to the canonical page itself as well", and it closes the gap that produces Duplicate without user-selected canonical. Paginated sequences follow the same rule: each page points at itself, not at page one.
There is no published timeframe, because the change is only assessed when the URL is next crawled and compared against its group. Check the URL Inspection canonical fields after a few weeks rather than after a few days, and remember the tool reports the most recently indexed version rather than the live page.
Related articles

Schema Markup for Beginners: What It Is and Where to Start
Schema markup is structured data that tells a search engine what a page is about. What it does, which types earn their keep, and how to validate it.

How to Fix Location Page Duplicate Content at Scale
Location page duplicate content is a sameness problem, not a copying one. Here is how to measure sibling distinctness and fix the pages worth keeping.

How to Submit a Sitemap and Check Indexed Pages
Submit a sitemap in minutes, then use the per sitemap filter in the Page indexing report to see exactly which of your submitted URLs got indexed.
