You can check one URL's canonical tag easily. You can't catch a circular canonical that way — you'd need to check both pages and cross-reference. Circular canonicals quietly tank both pages because Google can't pick a winner and treats the signal as conflicting.
Same with canonical-to-noindex. Page A declares page B as its canonical. Page B is noindex. Google consolidates A's signals into B, which is noindex, so the signals disappear entirely. Both pages lose.
Canonical Cluster + Conflict Map fetches every URL in your sitemap, builds the canonical-target graph, clusters by target, and flags every conflict type.
Five conflict types
- Circular canonical. A → B, B → A, neither is the canonical of anything else. Fix: pick a primary, emit self-canonical on both pages pointing at the primary.
- Missing self-canonical. Page has no
<link rel="canonical">at all. Google picks its own favorite URL as the implicit canonical — usually wrong when query parameters or trailing slashes are involved. - Canonical → noindex. Page A canonical to Page B where Page B is noindex. Kill signal. Fix: either remove noindex from B or drop canonical from A.
- Canonical → external. Canonical points outside the set (could be legitimate cross-domain consolidation or a broken hardcoded URL).
- Cross-protocol. HTTP page canonical to HTTPS (fine) or HTTPS canonical to HTTP (bad — protocol downgrade). Almost always a template bug.
Why graph view beats per-URL view
The conflicts that matter most are relational. You can't detect a circular canonical from one page; you need to see both canonical claims. The mapper builds the full graph across your sitemap and surfaces every edge type.
A clean cluster looks like: one target URL (the canonical destination) with one or more variant URLs all canonicalizing to it. A dirty cluster has circular edges, missing edges, or edges pointing at noindex / external / wrong-protocol targets.
The fix workflow
- Run the mapper.
- For each circular pair, pick the primary (usually the shorter or more-semantic URL) and update both pages' canonical.
- For each missing self-canonical, emit a template-level
<link rel="canonical" href="NaN">rule. - For each canonical → noindex conflict, either remove the noindex (if the target should be indexed) or drop the canonical (if the source should canonicalize elsewhere).
- Deploy. Rerun the mapper to confirm.
Related reading
- Redirect Chain Audit — 301 chains (distinct from canonical chains)
- Index Coverage Delta — what's actually indexed
- Sitemap Audit — XML hygiene
Fact-check notes and sources
- Google canonicalization: developers.google.com/search/docs/crawling-indexing/canonicalization
- Consolidate duplicate URLs: developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
The $100 Network covers keeping canonical graphs clean across site networks, where template drift multiplies fast. The mapper is the quarterly audit.