# Indexability checks

> Exact triggers and fixes for SEOFix's canonical, noindex, nofollow, duplicate and hreflang check codes.

Source: https://seofix.ai/help/checks-indexability · Category: Issue reference · Updated: 2026-10-08

These checks cover the signals that decide which of your URLs search engines index: canonical tags, robots meta tags, duplicates and hreflang. Some are read from one page and are recheckable; the rest compare pages across the whole audit and are re-verified by the next full audit.

Definitions used below:

- **Robots meta tag**: the first `<meta name="robots" content="...">` in the page. SEOFix matches `noindex` and `nofollow` in its `content`, case-insensitively. The `X-Robots-Tag` HTTP header is not read.
- **Indexable page**: no `noindex` in the robots meta tag, and either no canonical or a canonical equal to the page's own URL.
- **URL comparison**: URLs are compared after normalising (absolute, lowercase host, no default port, no fragment). `http` vs `https`, `www` vs no `www`, and a trailing slash are differences, so `https://example.com/a/` canonicalising to `https://example.com/a` counts as pointing elsewhere.

## Canonicals

### CANONICAL_MISSING — Missing canonical tag

- **Severity**: notice. **Recheckable**: yes.
- **Trigger**: a 200 HTML page has no `<link rel="canonical" href="...">`, or its `href` is empty.
- **Why it matters**: without a canonical, URL variants (query parameters, trailing slashes, tracking tags) can split ranking signals between several URLs.
- **How to fix**: add a canonical in `<head>` with the absolute URL of the preferred version of the page, usually the page itself without query parameters.

```html
<link rel="canonical" href="https://example.com/jobs/senior-accountant-dubai">
```

### CANONICAL_TO_BROKEN — Canonical points to a broken page

- **Severity**: error. **Recheckable**: no (needs a full audit).
- **Trigger**: the page's canonical URL was crawled in the same audit and answered `4xx` or `5xx` (not a firewall block).
- **Details**: `canonical_url`, `status_code`.
- **Why it matters**: a canonical pointing to an error page is ignored, or can get the page dropped from the index.
- **How to fix**: point the canonical at a working `200` URL, usually the page itself. Look for canonicals built from an outdated base URL, a removed path prefix, or a wrong slug field.

### CANONICAL_TO_REDIRECT — Canonical points to a redirect

- **Severity**: warning. **Recheckable**: no (needs a full audit).
- **Trigger**: the canonical points to another URL, and that URL was crawled in the same audit and answered `3xx`.
- **Details**: `canonical_url`, `status_code`, `redirect_to`, and `final_url` when following the redirects (at most 10 hops) ends on a URL that answered `200` in the audit.
- **Why it matters**: a canonical to a redirecting URL is a weak signal that search engines often ignore.
- **How to fix**: use the final `200` URL as the canonical (`final_url` when present). Common causes: `http` vs `https`, `www` vs apex, or a trailing slash mismatch between how canonicals are built and how the server redirects.

## Robots meta tags

### NOINDEX_PAGE — Page marked noindex

- **Severity**: notice. **Recheckable**: yes.
- **Trigger**: a 200 HTML page's robots meta tag contains `noindex`.
- **Details**: `meta_robots`.
- **Why it matters**: the page asks search engines to keep it out of results. That is right for search results pages, carts or account pages, and a costly mistake on pages that should rank.
- **How to fix**: if the page should rank, remove `noindex` from the robots meta tag (and from any `X-Robots-Tag` header your server sends). If it is intentional, ignore this notice.

```html
<!-- before -->
<meta name="robots" content="noindex, follow">
<!-- after: remove the tag, or -->
<meta name="robots" content="index, follow">
```

### NOFOLLOW_PAGE — Page marked nofollow

- **Severity**: notice. **Recheckable**: no (needs a full audit).
- **Trigger**: a page that answered `200` has a robots meta tag containing `nofollow`.
- **Details**: `meta_robots`.
- **Why it matters**: search engines won't follow any link on the page, so the pages it links to get no link equity from it.
- **How to fix**: remove `nofollow` from the robots meta tag unless none of the page's links should be followed. To keep single links unfollowed, use `rel="nofollow"` on those links only.

### NOINDEX_RECEIVES_TRAFFIC — Noindex page gets search traffic

- **Severity**: warning. **Recheckable**: no (needs a full audit).
- **Trigger**: a 200 page with `noindex` in its robots meta tag still has clicks or impressions in Search Console over the last 28 days (any `www`/scheme/trailing-slash variant of the URL). Only for sites with Search Console data.
- **Details**: `clicks_28d`, `impressions_28d`, `meta_robots`.
- **Why it matters**: the page is about to drop out of Google, taking that traffic with it, or the `noindex` is a mistake.
- **How to fix**: if the page should rank, remove `noindex`. If not, expect the traffic to go and make sure visitors can reach the right page (link or redirect to it).

## Duplicates

Duplicate checks compare indexable pages that answered `200`. A noindex page or one canonicalised elsewhere is never counted, because that is already how the site resolves the duplicate. Every page in a duplicate group gets its own issue.

All three are recheckable: a recheck compares each rechecked page with the other rechecked pages and with the rest of the site's latest full audit.

**Details** (all three): `duplicates` (up to 10 other URLs with the same value), `pages` (size of the group).

### DUPLICATE_CONTENT — Duplicate content

- **Severity**: warning. **Recheckable**: yes.
- **Trigger**: two or more indexable 200 pages have identical body text. The text of `<body>` is compared without `<script>` and `<style>`, with whitespace collapsed and case ignored.
- **Why it matters**: identical pages compete with each other and split ranking signals; search engines pick one and may pick the wrong one.
- **How to fix**: make each page's content unique, or point duplicates at one URL with a canonical or a 301 redirect. Typical causes: the same page under several paths, parameter variants, empty listing or search pages that render only the layout, and pages whose content loads with JavaScript (the raw HTML is identical).

### DUPLICATE_TITLE — Duplicate title

- **Severity**: warning. **Recheckable**: yes.
- **Trigger**: two or more indexable 200 pages have exactly the same `<title>` text.
- **Why it matters**: identical titles make pages indistinguishable in search results.
- **How to fix**: build titles from what makes each page unique (name, location, category, page number for paginated lists). A template that outputs only the site name is the usual cause.

### DUPLICATE_META_DESCRIPTION — Duplicate meta description

- **Severity**: notice. **Recheckable**: yes.
- **Trigger**: two or more indexable 200 pages have exactly the same meta description.
- **Why it matters**: identical descriptions make pages look the same in search results.
- **How to fix**: generate each description from the page's own content, or remove a site-wide default description so search engines pick a page-specific snippet.

## Hreflang

Hreflang tells search engines which language or regional version of a page to show. SEOFix reads `<link rel="alternate" hreflang="..." href="...">` tags in the HTML. Hreflang in HTTP headers or XML sitemaps is not read.

### HREFLANG_NO_RETURN — Hreflang missing return tag

- **Severity**: warning. **Recheckable**: no (needs a full audit).
- **Trigger**: page A declares an hreflang alternate B (a different URL), B was crawled and answered `200`, and B's own hreflang tags do not link back to A.
- **Details**: `target` (B).
- **Why it matters**: search engines ignore hreflang pairs that are not confirmed from both sides.
- **How to fix**: on the target page, add an hreflang link back to the page. Every version should list every version, including itself, with the same URLs (same scheme, host and trailing slash) that the pages are served at.

```html
<!-- on both https://example.com/en/jobs and https://example.com/ar/jobs -->
<link rel="alternate" hreflang="en" href="https://example.com/en/jobs">
<link rel="alternate" hreflang="ar" href="https://example.com/ar/jobs">
<link rel="alternate" hreflang="x-default" href="https://example.com/en/jobs">
```

### HREFLANG_MISSING_X_DEFAULT — Hreflang without x-default

- **Severity**: notice. **Recheckable**: no (needs a full audit).
- **Trigger**: an indexable 200 page has hreflang tags but none with `hreflang="x-default"` (case-insensitive).
- **Details**: `langs` (up to 10 declared values).
- **Why it matters**: `x-default` tells search engines which version to show users whose language matches no alternate.
- **How to fix**: add `<link rel="alternate" hreflang="x-default" href="...">` pointing at the default version, usually the language picker or the main-language page, on every version.

## Related

- [Issue reference](https://seofix.ai/help/issue-reference.md)
- [Site structure and sitemap checks](https://seofix.ai/help/checks-structure.md)
- [Changes since the last audit](https://seofix.ai/help/checks-changes.md)
- [Verify a fix](https://seofix.ai/help/verify-fix.md)
