How to use this tool

Bulk Canonical Tag Checker & Validator

Data checkedCanonical

How to use the bulk canonical URL checker

Back to the tool

Each URL is fetched once and every canonical it declares is listed raw, from the HTML head and from the Link response header alike.

  1. 01

    Enter the URLs to check

    Single mode checks one address and runs on Enter. Switch to Bulk to paste a list, one URL per line, up to 30 per run. Duplicate pages are the ones worth pasting together: a page and its printer version, its query-tagged copy, its www and non-www forms.

  2. 02

    Choose the URL normalization level

    Normalize URL rewrites each address before fetching. Full URL keeps the path and query but drops tracking parameters and the fragment; No query removes the query string; Domain only keeps the domain. Here it matters most: a query parameter is what splits a page in two, so dropping it checks the page you trust, not the suspect copy.

  3. 03

    Read the Canonical column

    Rows appear as URLs finish. The column lists what the page declares and judges nothing, so a self-referencing tag, a cross-domain one and a page declaring two look like what they are. Compare each entry with the URL column: the same address means the page nominates itself; a different one hands indexing elsewhere. A page that declared nothing shows —.

  4. 04

    Inspect a row and export the results

    View opens the one place a declaration is judged, and where each one’s source is shown: [html] for a tag in the head, [header] for a Link header. Two sources naming two addresses is what a plain column cannot expose. Copy table copies the rows tab-separated; Export CSV writes them to a file. Both keep every declaration with its source.

How to read the canonical tag report

A row reads left to right: the address checked, where it landed, and the address that page nominates for indexing.

Result table columns

URL
The address exactly as it was checked — after normalization, not always what you typed.
Resolved URL
Where the request ended and the status it ended on. Redirects are followed first, and the canonical is read from that final page.
Canonical
Every canonical the final page declares, one per line, resolved to a full address. — means none was declared.
Result
Whether the row finished, is still running, or stopped on an error. It says nothing about the canonical itself.
Actions
View opens the detail panel for that row; Retry appears instead when the request never got through.

Detail panel verdicts

Canonical points to the checked URL itself.
The page nominates itself. The ordinary, healthy case, and the one every indexable page should show.
Canonical points elsewhere — this URL will not be indexed.
The page hands indexing to another address. Correct for a duplicate; a mistake on a page meant to rank, and common after a site move leaves canonicals pointing at the old domain.
No canonical declared.
Nothing was declared. Not an error, since Google then indexes the address it crawled, but it leaves the choice to Google on any page reachable by more than one URL.
2 canonical tags — with more than one, Google ignores them all.
More than one declaration on the same page. Google discards all of them and picks for itself, so the page ends up with no canonical rather than two.

Where a declaration can come from

[html]
A <link rel="canonical"> tag in the head of the page. The usual place, and the only one most sites use.
[header]
A Link: …; rel="canonical" response header. The only way to declare a canonical for a file with no head, such as a PDF, an image or a feed, and easy to forget because nothing on the page shows it.