A canonical tag, <link rel="canonical"> in a page's code, tells Google which of several similar addresses is the main one and should rank. You need it whenever the same content opens at different URLs: filters and sorting in an online store, http and https, www and non-www, UTM parameters, print versions. Canonical mistakes are invisible from the outside, the site keeps working as before, while traffic quietly leaks across duplicates or disappears together with the main page you accidentally "handed over" to another one. Below we cover when the tag is needed, how to check it and the eight mistakes we find most often in audits.

Google does not like duplicate pages. When it finds five addresses with the same text, it has to pick one for the results and treat the rest as copies. It makes that choice itself, by its own signals, and not always the way you would like. The canonical tag gives it a hint: "of these five, this one is the original". It sits in the <head> and looks like this:
<link rel="canonical" href="https://example.com/catalog/chairs/">
Two things matter here. First, it is a hint, not a command. Google can ignore it if it decides you made a mistake, for example by pointing the canonical at a page with different content. Second, a canonical does not hide the page from visitors and does not redirect them. A person can open any of the addresses and see the content; the only thing that changes is which address appears in search and where Google consolidates the signals, including links pointing at the duplicates. The official description of the mechanism is in Google's documentation on consolidating duplicate URLs.
Three tools solve a similar problem ("hide the extra stuff") but behave differently. Mixing them up is the most expensive mistake of all.
| Tool | What it does | Link equity | When to use |
|---|---|---|---|
| rel="canonical" | Points to the main version | Passes to the canonical | Filters, UTM, sorting |
| 301 redirect | Redirects everyone | Passes to the new URL | Moves, merged pages |
| noindex | Hides from search | Not passed | Cart, account, site search |
rel="canonical" stays visible to users; every URL opens.301 the old URL opens the new one straight away, for people and bots.noindex page opens but drops out of the results.A simple rule: if people need the page but Google does not, and it has an "older sibling" with the same content, that is a canonical. If nobody needs the page, that is a 301. If people need the page but it has no equivalent and has no business in search, that is noindex.
/chairs/?color=black&sort=price shows the same category as /chairs/. Without a canonical, Google sees hundreds of variants of one page. The exception: filters you deliberately turn into separate landing pages with their own copy and search demand ("black office chairs"); those need a canonical pointing at themselves./blog/?page=2 are not duplicates of the first page, they hold a different list. A canonical from page two to page one hides every article that sits deeper from Google. Each pagination page should point to itself.?utm_source=facebook, ?gclid=..., ?fbclid=...: a tagged address should carry a canonical to the clean address. This is the most common reason dozens of "advertising" copies of the home page end up in the index./article/print/ or m.example.com point to the full version./office/chair-x/ and as /sale/chair-x/, pick the main path and put it in the canonical on both.
What is written in the code and what Google chose are two different things. Search Console has the URL Inspection tool: paste an address into the bar at the top, and in the Indexing block you will see two fields: "User-declared canonical" and "Google-selected canonical". If they match, all is well. If not, Google disagreed with something and you need to find out what: most often the pages are not identical, or the "canonical" target redirects, or it is blocked from indexing.
For a bulk check, any crawler such as Screaming Frog will do: it shows the canonical of every page and flags the ones that do not point to themselves. A quick manual check is to open the page source (Ctrl+U) and search for rel="canonical". If there are two tags, that is already a mistake. One more place a canonical can hide is the HTTP Link: header, visible in the developer tools on the Network tab or through an online header checker.
In our audit experience, the canonical setup is broken in one way or another on roughly every third site that comes to us. Here is what we run into most often.
href="/catalog/chairs/" instead of the full https://example.com/catalog/chairs/ technically works, but any error in the base path turns it into something like https://example.com/catalog/catalog/chairs/. Absolute URLs only.hreflang, and each has its own canonical.A separate word on a hidden mistake: a canonical that changes depending on the parameter. The page /chairs/?page=3 has the canonical /chairs/?page=3, while /chairs/?page=3&sort=price suddenly gets /chairs/. The logic of "strip only some parameters" has to be spelled out explicitly, otherwise the programmer does whatever is simplest. All of this is a standard part of a detailed SEO audit, and that is where it should be caught, not after the rankings drop.

| Platform | How it is set | Watch out for |
|---|---|---|
| WordPress | Yoast SEO or Rank Math | Duplicate tag from theme, archives |
| OpenCart | Built in for products, categories | Filters with route= and path= |
| Shopify | Automatic | Do not rewrite the tag in the theme |
| Magento | Configuration option | Layered Navigation separately |
| Custom build | In the template from the clean URL | Allowed parameters in the spec |
/collections/x/products/y, already points to /products/y.page), cover with tests.On any platform, run a crawler after implementation and check three groups: filter pages, pagination and UTM-tagged addresses. That is where something is most often off. At Query we usually do this as part of technical optimization together with redirects, robots.txt and the sitemap, because these things only work as a set.
?utm_source=test to a category address and check whether the canonical stayed clean.