What "Alternate Page With Proper Canonical Tag" Actually Means

Search Console says alternate — it's not an error. Here's how to read it.

When you open Search Console’s “Pages” report and find a pile of URLs under “Alternate page with proper canonical tag,” most people assume Google is refusing to index them. It isn’t. This is an informational status: Google sees these URLs are non-preferred versions of some canonical page, respects the <link rel="canonical"> you set, and deliberately doesn’t index this one in favor of the canonical you nominated. Google is cooperating, not rejecting.

The status you should actually watch is the adjacent one: “Duplicate, Google chose different canonical than user.” That one means Google ignored you. Don’t confuse them.

Common causes

1. You legitimately declared multiple URLs pointing to one canonical

The most common case: you have /article-a?utm=twitter, /article-a?ref=newsletter, /article-a/, and they all have <link rel="canonical" href="https://yourdomain.com/article-a/"> in their head. Google reports back “got it, won’t index this variant, will index the main version” — and each variant lands in the alternate bucket.

How to confirm: Click any alternate URL in the report and look at the two fields Search Console returns: “User-declared canonical” and “Google-selected canonical.” If they match, this is working as intended.

2. Pagination or parameter variants

/blog/?page=2, /blog/?page=3 pointing to /blog/, or /products?color=red pointing to /products. Google won’t double-index, but it lists them here.

How to confirm: The URL contains query params like ?page=, ?sort=, ?utm_, ?ref=.

3. hreflang alternates

If you’ve set <link rel="alternate" hreflang="zh-CN" href="...">, each language version cross-references the others as canonical alternates. Google lists the non-active-locale versions in this report by design.

How to confirm: URL path contains a locale segment like /en/, /zh/, /ja/.

4. Mobile / AMP / PWA subdomains

m.yourdomain.com/article or amp.yourdomain.com/article pointing to the main site canonical. The main site indexes; the mobile / AMP version goes to alternate.

Shortest path to fix

99% of the time the fix is: don’t fix it. Mark “known good” and move on. But run these checks first so you know it’s actually fine.

Step 1: Sample-verify canonical consistency

Randomly pick 5-10 alternate URLs from the report. For each:

  1. Click the URL → opens URL Inspection tool
  2. Read these two fields:
    • User-declared canonical: what your <link rel="canonical"> says
    • Google-selected canonical: what Google is actually treating as the main version
  3. Match → mark “OK”
  4. Mismatch → this URL doesn’t belong in “alternate,” it belongs in “Duplicate, Google chose different canonical.” Handle it under that status (see Related).

For a batch check:

for u in url1 url2 url3; do
  echo "=== $u ==="
  curl -sL "$u" | grep -oE '<link rel="canonical" href="[^"]+"'
done

Step 2: Find any URL that’s incorrectly classified as alternate

Not all entries are harmless. If you discover a URL you actually want indexed on its own is sitting in the alternate bucket, your canonical is backwards. Examples:

  • /blog/2026/comparison should index independently, but its head says <link rel="canonical" href="/blog/comparison">
  • A localized /zh/page whose canonical wrongly points to /en/page

Fix:

<!-- Wrong -->
<link rel="canonical" href="https://yourdomain.com/blog/comparison" />

<!-- Right (self-canonical) -->
<link rel="canonical" href="https://yourdomain.com/blog/2026/comparison" />

After deploy, hit “Request indexing” in Search Console and re-check 14 days later.

Step 3: Trim alternate noise (optional)

If the report list is too long to skim, prune it:

  • UTM / tracking params: add Disallow: /*?utm_* to robots.txt (Google can still discover the canonical, but won’t list every utm variant)
  • Pagination: if paginated pages aren’t worth indexing on their own, add <meta name="robots" content="noindex,follow"> to remove them from the alternate report
  • Filter / sort URLs: ideally 301 them server-side to the param-less version

But don’t block the actual canonical page in robots.txt — that prevents Google from reading your canonical declaration at all and produces messier reports.

Step 4: Triage your monitoring as informational vs. blocking

In whichever Search Console dashboard you check regularly, split statuses into two groups:

BucketStatusAction?
InformationalAlternate page with proper canonical tagNo
InformationalPage with redirectNo
BlockingDuplicate, Google chose different canonicalYes
BlockingCrawled - currently not indexedYes
BlockingDiscovered - currently not indexedYes
BlockingExcluded by ‘noindex’ tagDepends

Collapse informational into a folded section. Don’t re-litigate it weekly.

Easy to misdiagnose

  • Treating it as an error: the report title has no “Error” label and these URLs don’t count against “Not indexed” — they’re a normal category.
  • Trying to zero it out: on a healthy growing site this number rises forever (hreflang, param variants). Zero isn’t the goal.
  • Confusing with “Page with redirect”: 301/302 redirects go to “Page with redirect,” not here.
  • Thinking you can just delete the canonical: skipping <link rel="canonical"> lets Google pick on its own, which is worse.

Prevention

  • Default to self-canonical (each URL points to itself); only point to a master version for true variants (params, pagination)
  • Split monitoring into informational and blocking buckets; this status goes in informational
  • Strip UTM / tracking noise with Disallow: /*?utm_* in robots.txt
  • Generate hreflang with one shared helper so cross-references can’t be hand-broken

Tags: #SEO #Google #Search Console #Indexing