A missing canonical tag means the page does not declare its preferred URL with <link rel="canonical">. On its own that is harmless. It becomes a problem the moment the same content is reachable at more than one address, because Google then decides which version to index and rank, and it does not always pick the one you would.
What a canonical tag does
A canonical tag sits in the <head> and names the one URL that should represent the page in search:
<link rel="canonical" href="https://example.com/shoes/trail-runner">
It tells search engines: "If you find this content at other addresses, treat them as copies of this one." Links and ranking signals pointing at the copies are then consolidated onto the canonical URL instead of being split between them.
The canonical is a strong hint, not a command. Google also looks at redirects, internal links, sitemaps and HTTPS when choosing a canonical, so all of those signals should agree with the tag.
Why duplicates happen on almost every site
Most sites never publish duplicate pages on purpose. The duplicates come from URL variations that serve identical content:
http://andhttps://example.comandwww.example.com/shoes/trail-runnerand/shoes/trail-runner/- Tracking parameters such as
?utm_source=newsletter - Sorting and filter parameters such as
?sort=priceor?color=blue - The same product listed under several category paths
Without a canonical, each variant is a separate candidate. Search Console then reports statuses like Duplicate without user-selected canonical or Duplicate, Google chose different canonical than user, and the URL shown in search can be the ugly parameter version. The duplicate content guide covers how to find and consolidate these groups.
Is a missing canonical tag always a problem?
Not always. If a page is only ever reachable at one clean URL, Google will simply index that URL. The reason to add a canonical anyway is that you rarely control every variation: an ad platform appends parameters, a partner links with a trailing slash, a CMS plugin adds a print view. A self-referencing canonical on every page is cheap insurance against all of them.
How to find pages without a canonical tag
- Check a single page. View the source and search for
rel="canonical". Confirm there is exactly one, that it is an absolute URL and that it points at a page returning 200. - Check every page. UpCrawler flags Missing canonical tag on every crawled URL without one, and separately flags Conflicting canonical tags when a page declares more than one, which is just as harmful because Google may ignore all of them. The multiple canonical tags guide covers that case.
- Check what Google chose. In Search Console, use URL Inspection on an important page and compare User-declared canonical with Google-selected canonical.
How to fix it
Add one self-referencing, absolute, HTTPS canonical to the shared page template, with tracking and sorting parameters stripped.
Set metadataBase once in the root layout, then give each page a relative canonical:
export const metadata: Metadata = {
metadataBase: new URL('https://example.com')
}
export async function generateMetadata({ params }: PageProps): Promise<Metadata> {
const { slug } = await params
return {
alternates: { canonical: `/shoes/${slug}` }
}
}
Next.js resolves it to https://example.com/shoes/trail-runner in the rendered <head>. Never set alternates.canonical in the root layout: pages inherit metadata from their layouts, so every page without its own canonical would point at the home page.
On dynamically rendered pages, Next.js can stream metadata after the first HTML. Googlebot reads it, but tools that only read the raw HTML may report the tag as missing. Prerender those pages, or list the tools' user agents in htmlLimitedBots in next.config.ts.
WordPress core already outputs a self-referencing canonical on single posts and pages. SEO plugins such as Yoast SEO and Rank Math extend it to archives and let you override it per page. If the tag is missing, check whether your theme removed the wp_head hook or a plugin disabled it.
Shopify themes output the canonical from the canonical_url Liquid object in theme.liquid:
<link rel="canonical" href="{{ canonical_url }}">
If your theme is missing this line, add it inside <head>. Shopify fills canonical_url for every page, so the line rarely needs changing.
Let AI fix it, page by page.
Paste this prompt into AI with your project open. In UpCrawler, every affected page comes with a prompt like this, already filled in with its URL.
Add a self-referencing absolute-HTTPS <link rel="canonical"> to the shared head template with tracking and faceting params stripped. Point real variants at the main URL and leave genuine paginated series self-canonical.
Rules that keep canonicals working
- One canonical per page. Remove duplicates added by a theme and a plugin at the same time.
- Absolute URLs.
https://example.com/page, not/pageorpage. - Point at a live page. The target must return 200, be indexable and not redirect.
- Keep paginated pages self-canonical. Page 2 of a category should canonicalize to page 2, not to page 1, or Google may stop discovering the products listed there.
- Agree with your other signals. Use the canonical URL in internal links, the sitemap and hreflang annotations. Translated pages are canonical to themselves, never to another language version.
- Keep it in the server HTML. Do not let JavaScript add or change the canonical after the page loads.
- No fragments.
https://example.com/page#reviewsis not a canonical target. - Use the tag, not workarounds. Blocking a duplicate in
robots.txtor removing it with the URL removal tool does not choose a canonical. It only hides the duplicate, so its signals are lost.
Frequently asked questions
Should every page have a self-referencing canonical?
It is not required, but it is a good default. It costs one line in the template and protects every page against parameter and trailing slash duplicates you cannot predict.
Is a canonical tag the same as a 301 redirect?
No. A redirect sends visitors and crawlers to another URL. A canonical keeps the page accessible and only tells search engines which version to index. Use a redirect when the old URL should no longer exist, and a canonical when both versions need to keep working.
Why does Google ignore my canonical tag?
Usually because other signals disagree: internal links or the sitemap point at a different version, the canonical target redirects or returns an error, or the pages are not actually duplicates. Make every signal point at the same URL.
Share it with whoever runs your site’s SEO.