---
title: "How to Fix Indexing Issues in Vue"
description: "Investigate Search Console indexing states, Vue response content, and canonical preferences before choosing a focused repair."
canonical_url: "https://nuxtseo.com/learn-seo/vue/launch-and-listen/indexing-issues"
last_updated: "2026-10-08"
---

> Index of every page on this site: [llms.txt](https://nuxtseo.com/llms.txt)

::key-takeaways
- "Crawled - currently not indexed" means Google saw your page but chose not to index it, which also keeps it out of AI Overviews since those cite from the same index
- Google processes pages in three phases: crawling, rendering, indexing. A client-rendered SPA waits in the render queue with no fixed timeline
- Verify SSR or prerendering by checking View Source for your content, not just DevTools
- Requesting indexing through URL Inspection doesn't guarantee a result; Google still evaluates the page and prioritizes fast inclusion of useful content
::

Google crawled your page but hasn't indexed it. The Page indexing report supplies statuses. A status alone may not explain the cause; inspect the response, content, and canonical preferences.

## Understanding Page Indexing Status

Search Console's Page Indexing report lists indexing states and exclusion reasons. See the [full list](https://support.google.com/webmasters/answer/7440203) for every reason. Start with these states: crawled-not-indexed, discovered-not-indexed, and the excluded statuses worth ruling out first.

**Indexed**: your page is in Google's index. This is a prerequisite for appearing in AI Overviews, which [cite from the same index Google Search uses](https://developers.google.com/search/docs/appearance/ai-features) rather than a separate crawl.

**Discovered - currently not indexed**: Google found your page, often via your sitemap, but hasn't crawled it yet.

**Crawled - currently not indexed**: Google crawled your page and chose not to index it.

**Excluded by [robots.txt](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/robots-txt)**: your robots.txt file blocks Google from accessing the page. Crawl blocking can prevent fetching content or metadata. A linked blocked URL can still appear in search without its content.

**Blocked by [noindex tag](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/meta-tags)**: the page has a `noindex` meta tag, so Google won't index it or use it as an AI Overviews source.

**[Duplicate without user-selected canonical](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/canonical-urls)**: Google identified a duplicate without a user-selected canonical preference. It may choose a canonical automatically.

**Soft 404**: the page returns a `200 OK` status but reads like a "not found" page to Google. Return a real 404 for missing content instead.

## Fixing "Crawled - Currently Not Indexed"

Google does not expose a specific cause for every crawled-not-indexed URL. Compare affected responses, content, and reported canonicals before choosing a repair.

### Thin or Low-Quality Content

Inspect whether the page provides useful, original content. An indexing state alone does not establish a quality problem. [Google AI features](https://developers.google.com/search/docs/appearance/ai-features) require an indexed, snippet-eligible page. Use structured data that matches the visible content; markup alone does not guarantee an AI appearance.

### Duplicate Content

Duplicate URLs can consume crawling resources; Google may consolidate equivalent versions automatically. See the [Duplicate Content guide](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/duplicate-content) for a full detection and resolution workflow. Compare content before consolidating URLs. Distinct pagination, filters, or archives can serve useful independent content.

For equivalent versions, set a consistent [canonical preference](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/canonical-urls). This component excerpt requires installed Unhead; use this fixed URL only on the matching equivalent page:

```vue
<script setup lang="ts">
import { useHead } from '@unhead/vue'

useHead({
  link: [
    { rel: 'canonical', href: 'https://yoursite.com/primary-page' }
  ]
})
</script>
```

### Too Many Similar Pages

Compare variant content before deciding whether it is equivalent or distinct. Use consistent canonical signals for equivalent versions and noindex when exclusion is the intended policy. Keep pages crawlable so Google can read their metadata. Do not blanket-exclude all filters or query URLs.

### Poor Internal Linking

Crawlable links help Google discover pages and help readers navigate. Missing links are worth repairing but do not prove why a URL was not indexed. See the [internal linking guide](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/internal-linking). Plain anchors are crawlable:

```html
<nav>
  <a href="/important-page">Important Page</a>
</nav>
```

### Low Site Authority (E-E-A-T)

Do not infer a trust score or stricter indexing threshold from this status. Build useful content and relevant relationships for readers. See the [backlink guide](https://nuxtseo.com/learn-seo/backlinks) for supported approaches.

## Fixing "Discovered - Currently Not Indexed"

### Site Too New

Google publishes no fixed timeline for crawling new sites. A new domain alone does not establish the cause of a delay. Submit a sitemap, maintain useful crawlable links, and use URL Inspection for infrequent, important changes.

### Crawl Budget Issues

Check crawl access, response reliability, and reported Crawl Stats before diagnosing a capacity problem. Google’s [crawl-budget guide](https://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget) targets large or frequently changing sites; its sizes are rough estimates.

Cache only where the application and hosting policy permit. Protect authenticated or personalized responses. Robots rules do not protect private data. Keep URLs crawlable when Google needs to process canonical or noindex metadata.

## Vue SPA-Specific Issues

For client-rendered routes, compare the initial response with the rendered page. A missing initial value can also reflect failed setup or absent data.

### JavaScript Rendering Problems

[Google can render JavaScript](https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics). Its stages are crawling, rendering, and indexing. Eligible HTTP 200 pages can enter the rendering queue regardless of whether initial HTML contains content. Google publishes no fixed processing deadline.

Compare View Source with a successful live URL Inspection test. If intended content needs to be visible before JavaScript executes, use [SSR or prerendering](https://nuxtseo.com/learn-seo/vue/routes-and-rendering/rendering). Initial HTML does not guarantee indexing.

```bash
# Inspect the initial response
curl -s https://yoursite.com/page | grep "expected content"
```

### Content Loaded After Initial Render

A client-only fetch starts after mounting and leaves its data absent from the initial response. For initial catalog HTML, load data in the server or prerender pipeline, then pass it to the component. A relative fetch URL does not automatically resolve to your application in Node.

This Vue 3.5+ component accepts app-owned, already-loaded product props. Its parent must supply those props during SSR and hydrate with matching serialized data. Upstream failures must propagate separately from legitimate missing data. It is a rendering excerpt, not a server loader:

```vue
<script setup lang="ts">
const { products } = defineProps<{
  products: Array<{ id: string, name: string }>
}>()
</script>

<template>
  <main>
    <h1>Product Catalog</h1>
    <ul>
      <li v-for="product in products" :key="product.id">
        {{ product.name }}
      </li>
    </ul>
  </main>
</template>
```

Use the [complete Vite SSR setup](https://nuxtseo.com/learn-seo/vue/ssr-frameworks/vite-ssr) for the server/client entry and response integration. A loading message does not expose the actual catalog.

### Client-Side Routing Issues

Use crawlable links to published destinations. A [sitemap](https://nuxtseo.com/learn-seo/vue/controlling-crawlers/sitemaps) supplements discovery; route definitions with dynamic placeholders are not a published URL inventory. Supply actual known URLs and real modification dates. Vue Router does not generate XML automatically.

### Testing JavaScript Rendering

Use Search Console's URL Inspection tool to inspect the successful live test’s rendering:

1. Open Search Console → URL Inspection
2. Enter your page URL, click "Test Live URL"
3. Click "View Tested Page" → "Screenshot"

For a successful live test, compare tested content, response time, resources, and errors with your browser. This is a live observation, not proof of the last indexed crawl or a guaranteed future result.

## AI Visibility Gaps

Indexing does not guarantee an AI appearance. Check eligibility and readability separately, without diagnosing an absent appearance from a formatting preference:

- Check indexed and snippet eligibility
- Confirm inclusion in [Search generative AI features in Search Console](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)
- Use readable headings and useful content for people
- Inspect nosnippet and related controls; structured data is not a special AI requirement

## Requesting Re-Indexing

After fixing an issue, request re-indexing via URL Inspection:

1. Search Console → URL Inspection
2. Enter the fixed URL
3. Click "Request Indexing"

[A crawl request doesn't guarantee inclusion](https://developers.google.com/search/docs/crawling-indexing/ask-google-to-recrawl): "Requesting a crawl does not guarantee that inclusion in search results will happen instantly or even at all. Our systems prioritize the fast inclusion of high quality, useful content." Google's crawlers also revisit indexed pages on their own to [pick up changes](https://developers.google.com/search/docs/crawling-indexing/large-site-managing-crawl-budget), so save manual requests for infrequent, important changes.

Google’s [Indexing API](https://developers.google.com/search/apis/indexing-api/v3/quickstart) only covers JobPosting or livestream VideoObject containing BroadcastEvent. Use supported URL Inspection procedures, links, and sitemaps for ordinary pages; a third-party tool does not remove this restriction.

Google must crawl a page before processing its content for indexing. The [reported Google process timings](https://nuxtseo.com/learn-seo/google-search-timelines) describe separate stages, whose delays can accumulate. A recent fix or accepted request starts no guaranteed indexing countdown.

## Monitoring Progress

Track indexing status changes over time:

1. Search Console → Page Indexing
2. Check the "Not indexed" count weekly
3. Look for status changes from "Crawled - not indexed" to "Indexed"

Google re-evaluates pages on its own schedule, not on demand, so there's no fixed timeline for a status change to show up.

Use reported states to group investigation. A product integration cannot supply a cause Google does not expose. [Nuxt SEO Pro](https://nuxtseo.com/pro) reads Search Console evidence for the registered host; inspect its current report scope.

Using Nuxt instead of plain Vue? Nuxt enables SSR by default and supports configured prerendering. These features still need the app’s data and response setup. See the [Nuxt indexing guide](https://nuxtseo.com/learn-seo/nuxt/launch-and-listen/indexing-issues) for framework-specific fixes.

## Checklist

::checklist{#vue-indexing-issues}
- For routes needing initial HTML, inspect View Source; otherwise compare successful rendered output
- When content needs initial HTML, load data before server rendering or prerendering
- Duplicate pages have a canonical tag pointing to one primary version
- Filter/query policies follow the actual content; canonical and noindex metadata remain crawlable
- The sitemap lists actual published URLs; rendered crawlable links supplement discovery
- Important changes use URL Inspection or sitemaps; Indexing API only covers supported page types
::

## Sitemap

See the full [sitemap](https://nuxtseo.com/sitemap.md) for all pages.
