← Back to the index
SEO-07 · SEC. 07 SEO & GEO
Canonical Tag and Duplicate Content Resolver Loop
Cluster near-duplicate pages, pick one canonical each, and stop them competing.
- FORMAT
- loop
- DIFFICULTY
- advanced
- TIME
- 25 min
- TOOLS
- universal
- MODELS
- any
- COPIES
- 0 so far
When to use this
Search Console shows multiple URLs on your site weakly ranking for the same query, or you suspect parameter, filter, or print URLs are splitting authority. Use this loop before merging or redirecting anything, so you don't collapse a page that actually has unique value into one that doesn't.
The pattern
Pastes as plain text
Below the line is a list of URLs on my site that may be duplicate or near-duplicate content. Each row has the URL, title, word count, a short content summary, and organic traffic where I have it. Run this loop: 1. Cluster the URLs into groups that target the same search intent. State the shared intent for each cluster in one line. 2. For each cluster with more than one URL, check for genuinely unique content in every URL before deciding it's a true duplicate — different data, different examples, different sub-topic. List what's unique, if anything, per URL. 3. If a cluster is a true duplicate (no meaningfully unique content across URLs), pick ONE canonical URL based on, in order: highest current organic traffic, then shortest/cleanest URL path, then most complete content. State which rule decided it. 4. If a cluster has real differences, do NOT canonicalize. Flag it as "needs differentiation" and say what would need to change in the non-canonical URLs to justify them existing separately. 5. For every true-duplicate cluster, output the exact <link rel="canonical"> tag to add to each non-canonical URL, pointing at the chosen canonical. 6. Flag any canonical decision where a non-canonical URL has MORE organic traffic than the chosen canonical — that's a signal to re-check the pick before applying it. Do not canonicalize a cluster until step 2 is complete for every URL in it. Paste the URL list below this line:
Real example output
Cluster 1 — intent: "compare pricing plans" URLs: /pricing, /plans, /pricing-2024 Step 2: /pricing (890 words, current tiers, live) — /plans (901 words, identical tier copy, same table, no unique content) — /pricing-2024 (612 words, stale Q1 2024 prices, no unique content) Step 3: True duplicate. Canonical = /pricing (highest traffic: 4,100 sessions/mo vs. 310 for /plans and 40 for /pricing-2024). Step 5: Add <link rel="canonical" href="https://acme.com/pricing"> to /plans and /pricing-2024. Step 6: No flag — /pricing already has the most traffic. Cluster 2 — intent: "invoice automation overview" URLs: /features/invoice-automation, /solutions/invoicing Step 2: /features/invoice-automation (1,200 words, product screenshots, setup steps) — /solutions/invoicing (980 words, industry use-case framing for accounting firms, different examples, distinct CTA) Step 4: NEEDS DIFFERENTIATION, not a true duplicate. /solutions/invoicing should be rewritten to lead with the accounting-firm use case explicitly in its title and H1 instead of restating the general feature description.
Why it works
Canonicalizing on instinct kills pages that were actually serving a different intent, which loses real traffic instead of consolidating it. Requiring evidence of uniqueness before merging, and flagging traffic mismatches before they get applied, catches both failure modes: false duplicates and a wrong canonical pick.