Skip to content

Self-canonical

Wygard appends a random query parameter to your URL, fetches that parametrized version, and checks that the canonical tag still points to the clean URL.

Scope Tier Default Alert
Per URL Basic Off β€” opt-in per URL πŸ”΄ Danger

Why it matters

Many CMS and SSR layers regenerate the canonical tag dynamically based on the URL they were served. When a visitor lands on /product?utm_source=google, a misconfigured template may emit:

<link rel="canonical" href="/product?utm_source=google">

…instead of the clean /product. Search engines then treat every campaign URL, filter combination, and tracked link as a separate page, splitting the indexing signals across thousands of near-duplicates. It's a silent indexation killer that's especially common on parametrized e-commerce pages β€” and the site itself gives no visible hint that anything is wrong.

The standard Canonical test can't catch this: it only sees the clean URL. Self-canonical deliberately pokes the parametrized path to force the regression to surface.

What Wygard checks

On every run, the crawler:

  1. Takes the monitored URL and appends a random parameter β€” e.g. ?utm_wygard=4a5h6t22m.
  2. Fetches that parametrized URL.
  3. Extracts the href from <link rel="canonical">.
  4. Compares it against the clean (unparametrized) URL.

A healthy page returns a canonical pointing at the clean URL regardless of what parameters were added. A broken template echoes the full parametrized URL back in the canonical β€” and that's the alert Wygard fires.

The parameter name is unique per run

Wygard uses a randomised parameter name (like utm_wygard=<hash>) rather than a common one like utm_source. That way the test isn't accidentally intercepted by parameter-handling rules on your site that already know how to strip utm_*.

Common alerts

  • Canonical echoes the parametrized URL β€” the template regenerated the canonical to include the query string.
  • Canonical points to a different clean URL β€” the parametrized version redirects the canonical to an unrelated page.
  • Canonical missing on parametrized version β€” the tag is emitted on the clean URL but not when parameters are present.

Responding to an alert

  1. Reproduce locally by visiting your URL with any query string appended (e.g. ?test=1) and inspecting the <link rel="canonical"> tag.
  2. Fix the template so the canonical is always computed from the clean, canonical path β€” not from the request URL.
  3. Re-run the test from the alert card to confirm the fix.

When to turn this on

If your site serves any parametrized URLs β€” tracked campaigns, faceted filters, session IDs, on-site search β€” enable Self-canonical on your most important templates (homepage, category pages, product pages). The test is off by default because not every site needs it, but when it matters, it matters a lot.