Your canonical tags are pointing the wrong way
A canonical tag is one line in your page's head that says which URL is the real one when several show the same content. Visitors never see it, so it can be wrong for years without anyone noticing. Here are the usual ways it points the wrong way, and what to do about each.
It's a hint, not a command
Start with what the tag is. Google's canonical documentation calls rel="canonical" a strong signal, next to redirects (also strong) and sitemaps (weak). Its canonicalization overview says Google may choose a different page as canonical than you do. Google's 2013 post on rel=canonical mistakes calls the tag a strong hint. So when your canonical disagrees with your other signals, you haven't made a decision. You've handed Google a contradiction to settle.
Pointing at a page that isn't there
That 2013 post ends with a checklist, and one item is to make sure the canonical points to an existing URL with good content: not a 404, or worse, a soft 404. This goes stale quietly. You delete or rename a page, and every canonical that named it still does.
A canonical that points at a URL which then redirects is a smaller version of the same problem. The tag names one URL, the redirect names another, and Google gets two answers to one question. Point canonicals at the final URL, the one that returns 200.
Every page points at the homepage
This happens when a template hard-codes one canonical URL, such as the site root, instead of building it from each page's own address. Now every page claims to be a duplicate of the homepage. The 2013 post covers a close cousin: pointing pages 2 and later of a series at page 1. Those pages aren't duplicates, and the post warns their content could end up not indexed at all. It also says a large portion of the duplicate page's content should be present on the canonical version. Your contact page and your homepage don't pass that test.
Canonicals that argue with redirects and sitemaps
Google's canonical documentation says not to name different URLs as canonical for the same page using different methods, and its example is one URL in the sitemap with a different one in rel="canonical". Redirects work the same way. If http://www.example.com/ redirects to https://example.com/ but that page's canonical names the www version, the redirect and the tag point in opposite directions. I covered that setup in Your homepage has four addresses.
Sitemaps drift the same way. All it takes is a plugin that builds the sitemap with one URL format while the theme writes canonicals in another, and nobody comparing the two.
Two canonicals on one page
The 2013 post names this one directly: a canonical copied in from a template, or a default one added by an SEO plugin on top of the one the theme already writes. With multiple declarations, it says, Google will likely ignore all the rel=canonical hints. A second tag doesn't compete with the first. It can cancel both.
Two smaller rules from the canonical documentation: the tag is only accepted in the <head>, and you should use absolute URLs rather than relative ones.
Canonicals added by JavaScript
Some tools set the canonical in the browser after the page loads. Google's JavaScript SEO basics says not to use JavaScript to change the canonical to something other than what the HTML specified, and if you do set it with JavaScript, to make it the same value as the original HTML. The canonical documentation adds that if you can't set it in the HTML source, leave it out of the HTML and set it only with JavaScript, so there aren't two versions. And crawlers that don't run JavaScript never see a JavaScript canonical at all, which is what we found testing an SEO pixel.
The fix
- Build every canonical from the page's own final URL: absolute, https, your chosen host, in the
<head>, once. - Check that each canonical target returns 200 and doesn't redirect anywhere.
- Make redirects, canonicals, sitemap URLs and internal links all name the same URL for each page.
- Put the canonical in the HTML your server sends. If JavaScript touches it, make it write the same value.
- View source on a few page types (home, article, category) and count the
rel="canonical"lines. More than one usually means two things are writing it, like a theme and a plugin. - Use the URL Inspection tool in Search Console to see which canonical Google actually picked, as Google's canonicalization troubleshooting page recommends. If Google chose a different one, look for the signal that disagrees.