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:
β¦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:
- Takes the monitored URL and appends a random parameter β e.g.
?utm_wygard=4a5h6t22m. - Fetches that parametrized URL.
- Extracts the
hreffrom<link rel="canonical">. - 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¶
- Reproduce locally by visiting your URL with any query string appended (e.g.
?test=1) and inspecting the<link rel="canonical">tag. - Fix the template so the canonical is always computed from the clean, canonical path β not from the request URL.
- 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.