Indexability
Whether a page can be indexed at all: canonicals, noindex directives, soft 404s and the size limits Googlebot works within.
Title, canonical or structured data past the 2 MB fetch limit
Move the title, canonical link and JSON-LD to the top of the document — Googlebot stops reading at 2 MB and ignores everything after it.
Googlebot reads the first two megabytes of a page's code and puts the rest down. The title, canonical or structured data of this page sit further than that. Everything beyond that does not exist for Google. The page has a title and a canonical, but Google does not see them, because it stopped reading earlier. Usually it is a huge block of styles or scripts pasted into the head, an image embedded in base64, or the whole application state written into the code. Slim the head: critical tags at the very top, heavy things into separate files.
- Id
- HEAD_ELEMENTS_BEYOND_FETCH_LIMIT
- Fires at
- > 2 MB
- Fix estimate
- 60 min per page
Homepage is set to noindex
The homepage is asking Google not to show it. This setting is almost never deliberate, and its effect is the largest possible: your company name stops leading to your site. Usually it is left over from a staging copy where noindex protected against accidental indexing, or the "discourage search engines" option in WordPress ticked at install and never unticked. Check it today, before Google returns for the homepage and obeys.
- Id
- HOMEPAGE_NOINDEX
- Fix estimate
- 5 min per page
The page may not be quoted at all
nosnippet, or max-snippet:0, leaves the result with a title and no text and rules the page out as a source for AI answers: remove it, or confirm this page is meant to be unquotable.
The page forbids Google to show any fragment of its content. The nosnippet directive means the results carry a title and nothing else: no description, no quote, no answer in AI Overviews or in an assistant. To an answer engine the page is mute. Sometimes that is deliberate, on paid or legally sensitive content. On a page meant to sell or to answer questions it is an advertisement without text. Find where it comes from: most often an option in an SEO plugin ticked without knowing the consequences.
- Id
- SNIPPET_SUPPRESSED
- Fix estimate
- 10 min per page
Canonical added by JavaScript
Put the canonical in the HTML the server sends: the version added after scripts run is not always the one that counts.
The canonical appears on the page only once the scripts have run. In the code the server sends, it is not there. Google does run scripts, but later and not always, so for part of the time it sees an unsigned page, and on large sites some pages never get their turn at rendering. Other crawlers do not run scripts at all. This is typical of JavaScript applications that "add SEO" in the browser. Canonical, title and robots must be in the HTML from the server.
- Id
- CANONICAL_ONLY_IN_RENDERED_HTML
- Fix estimate
- 25 min per page
Canonical tag printed outside the head
Move the canonical link into <head>; anywhere else it is ignored.
The canonical is on the page but in the wrong place: outside the head section, so Google does not read it. Usually nobody put it there; something earlier broke the head: a blank line before the doctype, a PHP warning printed at the top, an unclosed tag in the template. The browser repairs it silently and the page looks fine, while for a crawler the whole head has landed in the body. Fix whatever comes first in the page code; the canonical returns to its place by itself.
- Id
- CANONICAL_OUTSIDE_HEAD
- Fix estimate
- 6 min per page
The page and the server name different canonicals
The canonical tag in the page and the Link header from the server point at different addresses, and search engines may then ignore both. Keep one of them, usually the tag, and make the other agree or remove it.
The page names two different originals: one in the page code, another in the HTTP header sent by the server. Google sees the contradiction and usually ignores both. The header is most often added by the CDN, the server or a caching plugin, which nobody on the team remembers because everything looks fine in the CMS. Decide which place should tell the truth and switch the other off.
- Id
- CANONICAL_SOURCE_CONFLICT
- Fix estimate
- 10 min per page
Canonical points at the http address
Point the canonical at the https address, so the secure page is the one indexed.
The canonical names the http version of a page whose secure version works over https. You are telling Google "the original is the unprotected one", so the results may show an address with a browser warning, and the signals of the https page are credited to http. This is almost always a trace of the https migration, in which hard-coded canonicals stayed as they were. Change them to https, ideally with one setting in the CMS that covers every page at once.
- Id
- CANONICAL_TO_INSECURE
- Fix estimate
- 6 min per page
Canonical points to a non-indexable URL
The canonical points at a page that is itself unfit for the index: it carries a noindex, answers with an error or is blocked. It is like giving as your postal address a building that does not exist. Google cannot credit this page to the original, because the original is void, so it either ignores the canonical or, worse, decides both pages should go. Usually this is a trace of a restructuring: the original was moved or switched off and the canonicals on the copies stayed as they were. Point them at a page that really belongs in the index.
- Id
- CANONICAL_TO_NONCANONICAL
- Fix estimate
- 6 min per page
Google knows the address but has never fetched it
Google found this URL and did not crawl it, so the page itself is not the question. Link to it from pages Google reads often, list it in the sitemap, and check how fast the server answers Googlebot.
Google says of this page: "I know it exists, but I never went in." Content is beside the point, because nobody read it. The page sits too deep, too few links lead to it, or the server answers too slowly, so the crawler puts it off for later, and later never comes. On large sites this is the most common line in the report and the one most often confused with the previous one. The cure differs from "crawled, not indexed": here the road to the page needs fixing, and the text can wait. Link the page from strong, frequently visited pages, make sure it is in the sitemap, and check in Crawl stats whether the server response time is climbing. If there are thousands of such pages, the better question is whether all of them are needed.
- Id
- GSC_DISCOVERED_NOT_INDEXED
- Fix estimate
- 10 min per page
Page earns impressions but Google reports it is not indexed
The page collects impressions while Google says it is not in the index. Both can be true at once: the impression data is from the last weeks, the index status is from today. Most often it means the page was in the index and has just fallen out, so something changed: a new noindex after a deploy, a canonical moved to another address, a server error that lasted a few days. This is a letter to open at once, because the traffic the page had is disappearing right now. Check the address in URL Inspection: it says outright why Google is not keeping it.
- Id
- GSC_URL_NOT_INDEXED
- Fires at
- ≥ 50 impressions
- Fix estimate
- 6 min per page
Two canonical tags that disagree
Leave one canonical tag on the page; when several disagree, search engines ignore all of them.
The page carries two "the original is me" signatures, each naming a different address. In that situation Google ignores both, so the page ends up with no canonical at all. The most common cause is two SEO plugins running at once, or a theme adding its own canonical next to the plugin's. Keep one source and switch the other off; two plugins that both "do SEO" almost always undo each other.
- Id
- MULTIPLE_CANONICALS
- Fix estimate
- 6 min per page
Noindex page listed in sitemap
Either remove the noindex tag or take the URL out of the sitemap — the two signals contradict each other.
With the sitemap you tell Google "these are the pages I want shown", and with a noindex on the same page "not this one". Two letters, two contradictory requests. Google obeys the noindex but keeps receiving the invitation, so it wastes visits on a page you yourself told it to skip. The excluded list in the Pages report grows with it, until decision and mistake can no longer be told apart. Decide which request is yours. If the page belongs in Google, remove the noindex. If it does not, strike it from the map. The map is a list of what you want shown; whatever else sits on the server has no place in it.
- Id
- NOINDEX_PAGE_IN_SITEMAP
- Fix estimate
- 5 min per page
Kept out of search by a header alone
The noindex arrives in the X-Robots-Tag header and is invisible in the page source: confirm it is deliberate, or drop it.
The page is kept out of the index by an HTTP header, so nothing in the page code gives it away. Whoever looks for the cause in the CMS will not find it, because it sits in the server configuration, on the CDN, or in a plugin that adds an X-Robots-Tag header. Google honours that header exactly like a meta robots tag. If the exclusion is deliberate, fine, but it is worth knowing where it lives. If it is not, look outside the template: in .htaccess, in the server rules, or in the CDN settings.
- Id
- NOINDEX_VIA_HEADER_ONLY
- Fix estimate
- 15 min per page
The page is sent as a file to download
Remove the Content-Disposition: attachment header from HTML responses; browsers save the page instead of showing it, and search engines do not index a download.
- Id
- PAGE_SERVED_AS_DOWNLOAD
- Fix estimate
- 15 min per page
Noindex page still receiving search impressions
This page still shows in results while asking Google not to show it. Noindex works with a delay: Google has to come back, read it, and only then drop the page from the index. The impressions in the report are an echo from before that moment. If the noindex is deliberate, do nothing; the traffic will go, and that was the plan. If it is not, remove it today, because in a few days this page's traffic will cease to exist. The classic case is a noindex carried over from the staging server when a new version of the site went live, or a plugin that "hid" a category with one click.
- Id
- RANKING_PAGE_NOINDEX
- Fires at
- ≥ 50 impressions
- Fix estimate
- 6 min per page
Canonical tags form a loop
Break the cycle — exactly one URL in the loop should be canonical, and every other page should point straight at it.
Page A says "the original is B", and page B says "the original is A". Two people pointing at each other and nobody owns anything. Google has no way to settle it, so it ignores both signatures and chooses by itself, sometimes a third page. Usually these are two versions of the same address, each with a canonical rewritten by a different rule: with and without the slash, with and without www. Decide which is the original and point both at it.
- Id
- RECURSIVE_CANONICAL
- Fix estimate
- 8 min per page
Indexing rule rewritten by JavaScript
Serve the final indexing directive in the HTML: a rule that changes after render can be read either way.
A script changes the indexing rule on this page: the server sends one thing, and after the scripts run the code says another. Most often the HTML says "index" and the script adds a noindex, or the other way round. Google may see both versions at different times and apply the stricter one, so the page is in the results one day and gone the next with no visible cause. This is typical of cookie consent plugins and A/B testing tools that tamper with the head. The robots rule should be one, and it should come from the server.
- Id
- ROBOTS_CHANGED_BY_JS
- Fix estimate
- 25 min per page
Robots tag and header disagree
Decide whether the page belongs in search and say it once, in the meta tag or the header; the two currently disagree.
The page tells Google one thing in its code and another in its HTTP header. One place asks to be indexed, the other forbids it. Google takes the more restrictive of the two, so if either says noindex, the page leaves the results even while everything looks fine in the CMS. This is the classic trace of two SEO plugins, or of a server rule nobody remembers. Decide what should apply and leave a single source of truth.
- Id
- ROBOTS_META_HEADER_CONFLICT
- Fix estimate
- 15 min per page
Soft 404 — "not found" served as 200
Return a real 404 (or 410) status for missing content, or restore genuine content at this URL.
A real 404 is honest, and a soft 404 lies. The server answers "all fine" but shows "not found", an empty category, a product with no offer or a search with no results. Google sees this, recognises it as a soft 404 and treats the page as if it did not exist. Except that in your reports the address looks healthy, so nobody cleans it up. What usually hides here: sold-out categories, sales that ended, "no products match your criteria" pages, and articles deleted in a CMS that shows a template with an empty middle instead of a 404. Either put real content back at this address, or let the server answer 404 or 410 and stop pretending.
- Id
- SOFT_404
- Fix estimate
- 8 min per page
Page set to drop out of search on a date already past
Remove the unavailable_after directive, or move the date, if the page should still be found.
The page carries a date after which it should leave the results, and that date has passed. This is the unavailable_after directive: useful for a promotion with a deadline, a job posting or an event. If the page has really lost its purpose, fine, Google will retire it. If it lives on, because the promotion was extended or the article is still current, Google will stop showing it anyway, because that is what its code says. Update the date or remove the directive.
- Id
- UNAVAILABLE_AFTER_PAST
- Fix estimate
- 5 min per page
One crawler is told something else
A per-crawler rule contradicts the page-wide one, usually left over from a migration: remove it or apply it to all.
One crawler gets a different instruction on this page than the others. A robots tag addressed to a named crawler, say only Googlebot, applies to it alone, while the rest read the general rule. It can be deliberate, but more often it is left over from an experiment, or from an attempt to "hide the page from Google but not from Bing" that a year later means nothing to anyone. Check whether the difference is intended; if not, leave one rule for all.
- Id
- BOT_SPECIFIC_ROBOTS_DIRECTIVE
- Fix estimate
- 15 min per page
Canonical differs from the page only in letter case
To a server /Shoes and /shoes are two addresses, and the one in the canonical may not exist at all. Write the canonical exactly as the page is addressed.
- Id
- CANONICAL_CASE_MISMATCH
- Fix estimate
- 5 min per page
Canonical chain (A → B → C)
Point the canonical straight at the final URL instead of another canonicalized page.
The canonical points at a page that itself points at yet another. Like a letter sending you to room B, where a note says "go to C". Google allows a single step, so with two or more it usually stops trusting any of them and picks the original itself. Usually it is left over from two consecutive migrations, or from a plugin that canonicalises the version without the parameter, which in turn names the version without the slash. Point every canonical straight at the final address.
- Id
- CANONICAL_CHAIN
- Fix estimate
- 6 min per page
A canonical that hands the page to another domain
Right when the page is a syndicated copy; wrong when the template was copied from another site. If this page is the original, point the canonical at itself.
The canonical hands this page to another domain: it tells Google "the original is theirs." That can be deliberate, for syndicated content or after a brand move, and then this page knowingly leaves the results in favour of that one. If that was not the plan, you are giving away your visibility for free. Usually it is a trace of a template copied from another site, or a language version canonicalising to its original on another domain. Check whether you want this content counted towards someone else's account.
- Id
- CANONICAL_CROSS_DOMAIN
- Fix estimate
- 5 min per page
Canonical keeps campaign parameters
The canonical still carries utm_ or click-id parameters, so search engines are asked to index the campaign address. Point it at the clean address, without the parameters.
The canonical names an address with campaign parameters, utm_source and the like. You are telling Google "the original is the version tagged from the newsletter", so an address that should not exist as a separate page goes into the index, and your analytics sees fake campaign traffic because people click a utm address in the results. Usually the template copies the current address into the canonical instead of the clean one. A canonical should always name the address without tracking parameters.
- Id
- CANONICAL_KEEPS_TRACKING_PARAMS
- Fix estimate
- 5 min per page
Canonical points to a URL we could not confirm
The canonical names a URL the crawl never reached as a live page. Point it at the page itself, or at a real, crawlable URL of the same content.
The canonical names an address our reader could not confirm as a working page. It may be a typo in the template, an address from before a domain change, or a page that answers only to logged-in users. To Google a canonical that cannot be checked is suspect and usually ignored. The page is then left unsigned, as if it had no canonical at all. Open the named address in a browser: if it does not show the same content with a 200, the canonical needs fixing.
- Id
- CANONICAL_MISMATCH
- Fix estimate
- 6 min per page
Canonical points to a redirect
Point the canonical at the redirect’s final destination.
The canonical names an address that redirects elsewhere. Google first has to follow the redirect to learn where the original really is, and on such detours it often gives up and chooses by itself. Usually this is a hard-coded canonical from before the addresses changed: the move to https, the addition of www, a new directory structure. Point the canonical straight at the redirect's target, the address that answers 200.
- Id
- CANONICAL_TO_REDIRECT
- Fix estimate
- 6 min per page
A canonical that names a fragment
Search engines drop everything after # and read the canonical as a different address; point it at the page itself, without the fragment.
- Id
- CANONICAL_WITH_FRAGMENT
- Fix estimate
- 5 min per page
Canonicalised URL listed in sitemap
The sitemap invites Google to a page that itself says "the original is elsewhere." The map should hold only originals, so Google gets a contradictory signal and wastes visits on addresses you yourself say are not the right ones. Usually it is a sitemap generator taking every address from the database, with canonicals set afterwards by hand or by a plugin. Drop from the map whatever has its canonical elsewhere, or fix the canonical if this is the original after all.
- Id
- CANONICALIZED_IN_SITEMAP
- Fix estimate
- 4 min per page
Same page answers on more than one spelling of its address
Pick one spelling, with or without the trailing slash and without index.html, and 301 the others to it, so each page exists at exactly one address.
The same page answers under several spellings of its address: with and without a trailing slash, in upper and lower case, with and without index.html. To a reader that is one page, to Google several, each collecting signals on its own. Half the links reach one version, half the other, and the results show whichever Google deems the original, which may well be the uglier one. Choose one spelling, redirect the rest to it, and make sure internal links use only that one.
- Id
- DUPLICATE_URL_FORMS
- Fix estimate
- 15 min per page
Google read the page and chose not to index it
Google fetched this page and decided it adds nothing to the index: crawl budget is not the problem. Give it something no other page says, merge it into a stronger page, or let it go with noindex or 410.
Google says of this page: "I was there and I do not want it." It came, read it, and decided the index would gain nothing. This is a content problem, and neither crawl budget nor the technical side is to blame: the page adds nothing Google does not already have. What usually hides here: thin categories with one or two products, manufacturer descriptions copied one to one from the wholesaler, blog tags, monthly archives, and filter pages nobody ever wrote anything on. Before you fix anything, ask one question of every address: do I want it in Google or not? If you do and Google does not, you have a page to improve: content no other page has, or a merge into a stronger one. If you do not, you have a page for noindex or removal, and everything works as it should. The problem exists only where Google's decision parts from yours. And do not confuse this with "discovered, not indexed": there Google never even came in, so rewriting the text changes nothing.
- Id
- GSC_CRAWLED_NOT_INDEXED
- Fix estimate
- 30 min per page
Links route through the URL fragment
Links like /#/products name views a search engine cannot request: everything after # is dropped, so each view is the same address; switch the router to real paths (history mode) and serve them.
The links on the page lead to addresses with a hash, such as /#/products. To the browser that is navigation within one page, to Google it is always the same page: everything after the hash is ignored. Your application may have a hundred views, and Google sees one address, one page, one title. This is left over from older single-page applications. Move to ordinary paths, /products instead of /#/products; every modern router can, and the server has to answer those paths with the same HTML.
- Id
- HASH_ROUTED_LINKS
- Fix estimate
- 30 min per page
Site reachable on multiple host variants
Redirect the www/non-www and http variants to one canonical origin with a 301 so the site exists at exactly one address.
The site answers under several variants of its domain at once: with www and without, over http and over https, each showing the same content without a redirect. To Google that is four sites with identical content, and for you four accounts your links are scattered across. Choose one variant, ideally https with your preferred spelling, and redirect the other three to it with a 301. One rule on the server tidies the whole site.
- Id
- HOST_NOT_CANONICALIZED
- Fix estimate
- 20 min per page
HTML larger than the 2 MB Googlebot fetches
Trim the HTML below 2 MB — Googlebot truncates the download there and indexes the fragment as if it were the complete page.
The code of this page is larger than two megabytes, which is how much Googlebot fetches before it stops. Everything below that line does not exist for Google: the further content, the links, the footer. The page looks normal, because the browser fetches it all. Usually it is a product list without pagination, styles and scripts pasted into the code instead of separate files, or images embedded directly in the HTML. Move the heavy things into separate files and split very long lists.
- Id
- HTML_EXCEEDS_FETCH_LIMIT
- Fires at
- > 2 MB
- Fix estimate
- 45 min per page
Noindex and canonical cancel out
Pick one: noindex drops the page, a canonical merges it into another. Asking for both leaves the outcome undefined.
The page tells Google two things that cancel out. The canonical: "the original is over there, count me towards it." The noindex: "do not consider me at all." Google cannot pass signals from a page it was told to ignore, so it usually ignores the canonical, and sometimes mistakenly stretches the noindex over the original. If the page is a duplicate, keep the canonical and drop the noindex. If it should vanish from results, keep the noindex and drop the canonical. Leave only one of the two in place.
- Id
- NOINDEX_WITH_CANONICAL_ELSEWHERE
- Fix estimate
- 15 min per page
data-nosnippet covers the main content
Narrow data-nosnippet to the part that really must stay out of the preview: it currently covers the heading, the opening paragraph or most of the text.
- Id
- NOSNIPPET_HIDES_MAIN_CONTENT
- Fires at
- > 0.2 %
- Fix estimate
- 20 min per page
Every link on the page is dropped
A page-wide nofollow stops the pages linked from here being discovered: remove it unless that is what you meant.
The page tells Google: "do not follow any link you find here." Every link from this page, to categories, products and articles, stops leading the crawler on and stops passing its weight. Sometimes that is deliberate, on a page of comments or a list of outside addresses. On a homepage, a category or an article it is usually a mistake: one click in an SEO plugin that cut off a whole branch of the site. Check whether anyone meant it.
- Id
- PAGE_LEVEL_NOFOLLOW
- Fix estimate
- 15 min per page
Later pages canonicalise to the first
Let each page in the sequence canonicalise to itself: pointing them at page one tells search engines their contents are page one.
The second, third and later pages of a list tell Google that their original is page one. It sounds logical, but the effect is that Google treats them as copies of the first and stops walking through them. Products and articles reachable only from the later pages are left without a way in and drop out of the index. Every page of a paginated list should be its own original, with a canonical pointing at itself.
- Id
- PAGINATION_CANONICAL_TO_FIRST
- Fix estimate
- 20 min per page
Two SEO plugins write the same head
Two plugins each write a canonical, a robots meta and Open Graph tags; keep one, the other wins or loses by load order and that changes on update.
Two SEO plugins write to the same head section, and each adds its own: two titles, two descriptions, two canonicals, two sets of structured data. With contradictory tags Google often ignores both, so the effect is worse than with no plugin at all. Usually it is left over from a plugin change where the old one was never uninstalled, or a theme with its own SEO module next to the plugin. Keep one and switch the other off; then check the page source for one of each in the head.
- Id
- SEO_PLUGINS_COMPETING
- Fix estimate
- 20 min per page
Only a fragment of the page may be quoted
max-snippet caps how much of the page may be shown: raise it, or set max-snippet:-1 and let the length be chosen for the query.
- Id
- SNIPPET_BUDGET_LIMITED
- Fires at
- < 160 characters
- Fix estimate
- 10 min per page
The page and the header disagree about snippets
The stricter of the two wins, and it is the one nobody can see in the page source: keep the preview directives in one place.
- Id
- SNIPPET_DIRECTIVE_CONFLICT
- Fix estimate
- 15 min per page
Critical head tags sit deep in the document
Keep the title, canonical link and structured data near the start of the HTML so they stay comfortably inside the 2 MB Googlebot reads.
- Id
- HEAD_ELEMENTS_LATE_IN_DOCUMENT
- Fires at
- > 1 MB
- Fix estimate
- 30 min per page
Noindex page linked internally
You lead to this page with links while asking Google not to show it. In itself that is no error: a login page, a cart, a cookie policy can be linked and kept out of the index. The question is whether the list holds a page that should be earning. Go through it once, looking for one thing: a category, product or article someone excluded by mistake. If every exclusion is deliberate, mark it on the card and the next reading stops reminding you.
- Id
- NOINDEX_PAGE_LINKED_INTERNALLY
- Fix estimate
- 5 min per page
Missing canonical tag
Add a self-referencing canonical tag so search engines know which URL is the original.
A canonical is the signature under a page: "the original is me." Without it Google decides for itself which of several similar addresses is the right one, and to Google the same address with a parameter, a trailing slash or a capital letter is already another page. It usually guesses well, sometimes not, and then the results show the version with a campaign parameter instead of the clean one. On a small site this is housekeeping. On a shop with filters and sorting, missing canonicals are the main source of duplicates. Add a canonical pointing at the page itself; most CMSs do it with one setting.
- Id
- MISSING_CANONICAL
- Fix estimate
- 5 min per page