# IndieCanonical

> Check a page's canonical URL and hreflang links for conflicts, chains, and missing return links.

See the canonical, conflicts, chains, and hreflang returns for one page.

The canonical page is https://indiecanonical.com/.

## Use the tool

Open [IndieCanonical](https://indiecanonical.com/) to complete the job. The questions below describe the supported input, result, and limits. Every answer names its source next to it.

Source: [Google Search Central](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls).

## Questions and limits

### What is a canonical URL?

A canonical URL is the one address you want search engines to index when several addresses show the same page: with and without `www`, with a tracking parameter, or on HTTP and HTTPS. You declare it with `<link rel="canonical" href="...">` in the HTML head or with a `Link` header in the HTTP response. Google treats it as a strong preference when consolidating duplicate or similar pages, but it can select a different canonical. Its rules are in [Search Central](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls).

### What is hreflang?

Hreflang tells search engines which language or region each version of a page serves, so a searcher in Germany gets the German page and not the English one. Each version carries a `<link rel="alternate" hreflang="de" href="...">` for every version in the set, including itself. The value is a language code, optionally with a script or region, such as `pt-BR`, or `x-default` for the page that serves everyone else. Every target must be a full URL.

### What is a canonical chain?

A canonical chain is a canonical that does not end where it points. The page names URL B as canonical, but B redirects to C, or B names D as its own canonical, or B has no canonical of its own to close the preference. Each hop is a chance for a search engine to pick a different URL than you meant.

IndieCanonical fetches the declared target, reads its redirects and its own canonical declaration, and reports the hop it found. Fix it by naming the final URL directly on the page you entered, and by giving that final page a canonical that names itself, so the preference closes in one step.

### Why does the check say an hreflang return link is missing?

Hreflang works in pairs. If the English page says the German page is its `de` version, the German page must say the English page is its `en` version. Google states that two pages without matching return links may have their tags ignored. IndieCanonical fetches each declared alternate, up to twelve per check, and looks in its head and headers for a link back to the page you entered, at its exact final URL.

When the target answered and its return link is missing, add that link on the target page using the full URL of the page you entered. Copy the page checklist or download its JSON to keep the observed source and target pages, timestamp, rule links, and unchecked pairs together. An unavailable or unmeasured target needs verification before an edit. The result includes an editable link block built from the declarations that did return, with the unresolved languages kept as comments and their reason beside them, ready to review and paste into every page in the set.

### How do I fix a canonical conflict?

A conflict is two canonical declarations that name different URLs, usually one in the HTML head and another in the HTTP `Link` header, or two tags left behind by a plugin and a template. Search engines receive two preferences and choose for you. Keep one declaration, in one place, with one absolute URL. On the preferred page itself, that URL is its own address.

Google also recommends absolute URLs over relative ones, so a staging host or a base path change cannot point the canonical at the wrong site. A relative value that resolves correctly shows as a warning, not a failure, and the result prints the full URL to write in its place.

### Does the check show which canonical Google chose?

No. IndieCanonical reads what the page declares: the HTTP headers and the HTML head the server sends, without running JavaScript. It does not read your sitemap, compare page content, or see Google's index. Google can select a different canonical than the one declared, and only the URL Inspection tool in Search Console shows that choice. A clean result here means the declarations agree and close, which is the part you control.

## Promises

- The core is free: no account, no card, no premium plan, no upgrade nag, no hidden paywall.
- Private lookup activity is never published.
- Analytics is currently off. Private lookup activity is never published or sent to a tracker. No lookup history becomes public inventory.

## More

- [Notes](https://indiecanonical.com/blog.md): posts by the maker, newest first
- [More tools](https://indiecanonical.com/tools.md): the other tools by turushan
- [security.txt](https://indiecanonical.com/.well-known/security.txt): how to report a vulnerability

Made by turushan, https://twitter.com/turushan.
