When rel=”canonical” tags, XML sitemaps, and internal links all agree on the same URL but Google still indexes a different one, the cause almost never lives in the on-page markup you’ve already checked. Google’s canonicalization system is explicitly hint-based, not directive-based, and it weighs a set of signals that sit outside the page itself. The diagnostic approach that actually surfaces the cause is to work through three off-page explanations in order: external signal contradiction, a similarity judgment that failed before canonicalization even applied, and historical indexing precedent. The starting point for the diagnosis, not the fix, is Search Console’s URL Inspection tool, specifically the “Google-selected canonical” field, which tells you what Google chose and gives you the raw material to work backward from.
Why on-page consistency doesn’t guarantee canonical compliance
Google’s own documentation on consolidating duplicate URLs lists rel=”canonical”, sitemaps, and redirects as hints, alongside signals it gathers independently: which URL has more or higher-quality inbound links (internal and external), which URL appears in a sitemap, whether URLs redirect to each other, and which version Google’s systems judge to be more likely to serve users well. Crucially, this list is not weighted in the order it’s presented, and Google has repeatedly said through John Mueller and others that a canonical tag is “a hint, not a directive.” That framing matters diagnostically: if your on-page hints are unanimous, that only guarantees you’ve maximized the hints you control. It says nothing about the hints you don’t, which is where the actual divergence usually originates.
There are three off-page mechanisms that most commonly override a technically clean canonical setup.
External signal contradiction. If the majority of external backlinks, or the highest-authority ones, point to a URL variant other than your declared canonical (a non-preferred parameter version, an HTTP version, a www vs non-www variant, or an old URL structure), Google’s algorithm can conclude that the link graph disagrees with your declared preference. Because backlinks are one of the clustering signals Google explicitly uses, a strong external contradiction can outweigh consistent internal hints. This is common after migrations, where old URLs retain years of accumulated link equity that new URLs haven’t replicated yet, and after acquisitions or syndication where third-party sites link to a version you no longer consider canonical.
A failed similarity judgment. Canonicalization only applies once Google’s systems have determined that two or more URLs are duplicates or near-duplicates in the first place. If your “duplicate” pages are similar to a human eye but not similar enough by Google’s content-similarity assessment (differences in structured data, embedded media, comment threads, localized pricing, or substantive amounts of unique surrounding content), Google may simply not be treating them as a canonicalization set at all. In that case there’s no override happening: Google is indexing what it considers a legitimately distinct page, and your canonical tag is being disregarded because the premise it depends on (these are duplicates) was never accepted. This is a distinct failure mode from signal contradiction, and it requires a different fix (increase differentiation or increase actual similarity, rather than fighting for signal weight).
Historical indexing precedent. Google’s index is not stateless. If an older URL was crawled, indexed, and accumulating engagement and link signals long before your current canonical was declared, that URL carries inertia. Google doesn’t automatically re-run canonicalization from scratch every time a canonical tag changes; the incumbent URL can persist as the selected canonical until new signals accumulate enough to challenge it. This is especially common after site restructures where a new URL was declared canonical on day one but the old URL had months or years of indexing history behind it.
A hypothetical walkthrough of the diagnostic sequence
Imagine a hypothetical site, “Example Furniture Co.,” that migrated its product URLs a year ago from a query-parameter structure to clean paths, updated every canonical tag, sitemap entry, and internal link to point at the new URLs consistently. Hypothetically, Google keeps indexing the old parameter-based URL for a specific popular product instead. Working through the diagnostic sequence: checking backlinks might reveal, hypothetically, that a large number of external sites, built up over several years before the migration, still link to the old parameter URL, none of which the site controls or can quickly change. That hypothetical finding would point to external signal contradiction as the likely cause, not a technical error in the new setup, and the practical fix would be a 301 redirect from the old URL to the new one, so the accumulated external signal transfers forward instead of continuing to compete with it.
What to do about it: the diagnostic sequence
Start in Search Console’s URL Inspection tool on both the declared canonical and the URL you suspect Google is actually choosing. The report shows a “User-declared canonical” field and a “Google-selected canonical” field side by side. If these differ, that confirms the mismatch is real rather than a caching artifact, and tells you exactly which URL Google is favoring, which is the URL you now need to investigate as the source of competing signals.
From there, check backlinks pointing at each URL variant (via Search Console’s Links report or a third-party backlink tool) to test the external signal contradiction hypothesis first, since it’s the most common and most actionable cause. If the non-preferred URL has meaningfully more or stronger external links, your remediation path is either 301 redirecting that URL to the preferred one (which passes the accumulated signals forward) or actively acquiring links to the preferred URL to shift the balance.
If backlinks are roughly even, check whether the two URLs are similar enough to be treated as duplicates at all. Pull both pages and compare beyond the visible text: structured data blocks, canonical chains, hreflang annotations, and any auto-generated content differences. If they’re more different than you assumed, the fix is either to make them genuinely near-identical or to accept they’re separate pages and stop expecting canonicalization to apply.
If neither of those explains it, check indexing history. Google’s index coverage report and the crawl stats data will show when each URL was first discovered and how consistently it’s been crawled since. An older URL with a long crawl history is the signal of historical precedent, and the practical fix is patience combined with a 301 redirect: redirecting collapses ambiguity because Google no longer has to choose between two live URLs, it only has one destination to index.
The important framing throughout this diagnostic process is that none of these outcomes represent a bug. Google has been explicit that canonical tags are hints that get weighed against other evidence, precisely so that it can override a webmaster’s declared preference when other signals suggest the declared preference doesn’t reflect the URL users and other sites actually treat as authoritative. Treating a canonical mismatch as a signal-strength problem to diagnose, rather than a technical error to fix, is what actually leads to a resolution.