Canonical Tag Checker

Fetches a URL you choose for real, reads its canonical link tag(s), and -- when there is exactly one -- fetches that URL too, then classifies the evidence into named canonicalization misconfiguration patterns: multiple conflicting canonical tags, a relative or cross-domain canonical, a protocol mismatch, and a canonical target that is unreachable, redirects, or is itself marked noindex.

1. Run the CLI against your page

Node.js, no dependencies to install:

node cli/check.mjs https://example.com/some/page --json

Get check.mjs, probe.mjs, and analyze.mjs from the repo — plain Node, nothing to install. It only ever talks to the page's URL, and (when relevant) the one canonical URL it names; nothing goes through this site.

2. Paste the JSON output here

Paste the JSON from step 1 and click Check.

Common questions

What does a canonical tag actually do?

A link tag with rel=canonical and an href in a page's head tells search engines which URL is the authoritative version of this content, so duplicate or near-duplicate URLs (with tracking parameters, alternate sort orders, http vs https, www vs no-www) consolidate their ranking signal onto one page instead of splitting it.

Why does this need a CLI instead of just checking a URL I type into the page?

Reading another origin's response headers and body from inside a browser tab is CORS-gated, and most sites set no Access-Control-Allow-Origin at all -- so a page running in your browser cannot reliably fetch an arbitrary URL and read what came back, even a URL you own. Only a non-browser HTTP client, like the CLI here (or curl), can do that. Run the CLI, then paste its JSON output here for a rendered report.

Why does it sometimes make a second request?

When the page names exactly one canonical URL that differs from the page you fetched, the tool follows it -- the same way a search engine would -- to check the canonical target actually resolves, does not redirect further, and is not itself marked noindex. A canonical is only useful if the page it points at is a real, indexable page.

Is a cross-domain canonical always wrong?

No -- it is a real, supported pattern for syndicated content, where a republished article points its canonical back at the original source. It is flagged as a notice worth checking because it is also exactly what a hardcoded staging URL or a copy-pasted template leaves behind, and either mistake silently tells search engines to index a different site's page instead of yours.

Does a clean report mean the page has no SEO issues?

No. This checks canonical-tag evidence from one or two real fetches -- it is not a full SEO audit, does not crawl your whole site, and cannot see an issue outside what a canonical tag and its target page can show. Treat a clean report as evidence about this specific page's canonicalization, not a determination that the page or site has no other SEO problems.

Already running a full-site crawl? See how this checker compares to Screaming Frog SEO Spider — a one-URL CI gate next to a whole-site crawler, and when each one is the right tool. Only checking one page yourself? See how this compares to reading a canonical tag in view-source — the difference is whether anyone fetches the page the tag points at.

Seeing a "danger" finding on a page with a tag on it, not a missing one? See why two canonical tags is worse than none — a plugin and a template can both emit one, and only the first is ever honored. Got a report back with several findings at once? See which one to fix first.