# Soft 404: when a page says 200 and Google reads not found

A soft 404 wastes crawl and trust. Your server says 200, Google reads not found. You will find them in the Page indexing report and fix them per case: real 404 or 410, content, or a redirect to the page that answers.

Updated 2026-09-14 · Source: https://porteur.ai/guides/soft-404

## What a soft 404 is, in plain terms

Your server returns 200 OK. The page looks to Google like an error or an empty page. Google treats it as not found. That is a soft 404.

It often happens on thin category pages with no items. Also on templates that show error text but still answer 200. Or when you redirect many dead URLs to the home page and keep 200 there.

A correct error returns 404 or 410. A correct redirect goes to a specific replacement and returns 301 or 302. A useful page returns 200 and has content that answers.

## How Google detects a soft 404

- Empty or near-empty HTML after render. A category at /videos/editing with zero products, one sentence and a header.
- Error-like language on a 200 page. Text like “Page not found”, “No results”, “We could not find that”, or an error template.
- Aggressive redirects to the home page or a hub. Old deep URLs 200 at / and carry no match to the original intent.
- Thin boilerplate pages and tag pages with little unique text or only pagination.
- Parameter or filter URLs that collapse to the same content as a canonical page and still return 200 each.
- Out of stock or deleted items kept live with a “not available” message and no alternatives.

Detection happens after fetch and render. Google reads the rendered HTML and the pattern of redirects. It judges if the page earns a place.

## Why soft 404s hurt a small site

- Crawl wasted. Googlebot spends fetches on pages it will not index. Real pages wait longer.
- Signals diluted. A 200 on a dead page sends mixed signals. Internal links and sitemaps point to fluff.
- Quality judgement. As of 2026, Google’s indexing reasons point at overall site quality. Too many thin 200s lower trust. Real pages are judged by the company they keep.
- Lost recovery. Old URLs with links that 200 at the home page throw equity away. A targeted 301 keeps more value than a catch-all.

## Find soft 404s in Search Console

Use the Page indexing report. It lists every URL Google knows for your property as Indexed or Not indexed, with a reason for each.

1. **Open Page indexing** In Search Console, pick your property. Open Indexing, then Page indexing.
2. **Filter to Soft 404** Scroll to Not indexed. Click Soft 404. You will see example URLs, up to 1,000.
3. **Export for audit** Export the list. Group by template: product, collection, blog, tag, parameter, locale.
4. **Inspect a sample** Use URL Inspection on a few. Check last crawl date, discovery path, Google-selected canonical and any enhancements.
5. **Test live** Click Test live URL. Review the rendered HTML, screenshot, HTTP response, blocked resources and console messages in View tested page.

Request indexing if you ship a fix on one URL. There is a small daily quota per property. It does not guarantee indexing.

> Validate fix after batch changes. It starts a re-check that can take about two weeks.

## Decide the right fix per case

Pick one of three outcomes: return a real 404 or 410, add content and keep 200, or redirect to a page that answers. Do not keep a 200 that says nothing.

| Case | Keep 200 with content | Return 404 or 410 | Redirect 301 or 302 |
| --- | --- | --- | --- |
| A mistyped or junk URL, never existed | No | Yes | No |
| Deleted page with no close replacement | No | Yes, 410 if permanently gone | Maybe 410 after a grace period if links are low |
| Deleted page with a clear successor | No | No | Yes, to the nearest equivalent |
| Out of stock product, returns soon | Yes, with status, alternatives and links | No | No |
| Empty category, no items yet | Prefer to hide or noindex until ready | If removed | If merged into a parent |
| Tag or filter URL that mirrors a canonical page | No | Prefer noindex or block crawling of parameters | No |
| Catch-all redirect to home for many dead URLs | No | Prefer page-level decision | If a real hub replaces the topic |

A fixed page looks specific. Example: /guides/getting-started shows a title, an intro, steps, internal links and a last updated date. No error text. No empty grid.

## Fix patterns and exact steps

- Error templates that still 200: change the controller to return 404 or 410. Keep the same look and feel so users are not jarred.
- Home-page redirects for dead URLs: replace the catch-all with page-level 301s to the closest match. Update internal links and the XML sitemap.
- Empty categories: hide navigation and indexation until stocked. Option A, noindex and remove from sitemap. Option B, merge into parent and 301.
- Out of stock products: keep 200 if it will return soon. Add availability, a date if known, strong alternatives, and links to a parent category.
- Parameter and filter URLs: add rel=canonical to the base page. Consider noindex on crawlable facets. Remove unneeded parameters from the sitemap.
- Near-duplicate templates: consolidate to one URL pattern. Use rel=canonical on variants. Avoid printing zero-content pages by default.
- Paginated or “no results” search pages: return 404 for site search queries with no results, or keep 200 with helpful next steps and internal links.

For a SaaS docs site: do not publish stub pages. If you scaffold /docs/api-v2 with only headers and “coming soon”, either add real content or keep it out of the sitemap and noindex until ready.

For a store: remove empty size or colour pages that 200 but show no stock. Either redirect to the parent product or render only stocked variants as separate URLs.

## Audit example: from soft 404 to a clean 404 or a useful 200

1. **Find the cluster** In Page indexing, Soft 404 shows a cluster of URLs. The examples are /blog/tag/announcements and empty /category/ai-tools variants.
2. **Triage the types** Tag pages have one or zero posts. Category pages have no items. A few old posts were deleted and now redirect to / with 200.
3. **Set the rules** Tag pages with zero posts return 404. Tag pages with one post keep 200 but show the post and add links. Old posts 301 to the most related live post.
4. **Ship the changes** Update router rules. Adjust the tag template to hide the “no results” state. Replace the catch-all redirect with a map file.
5. **Re-test and validate** Use Test live URL on a sample of each case. Request indexing on five representative URLs. Click Validate fix on the soft 404 reason.

After the fix, /blog/tag/announcements shows three posts and a short intro. /blog/tag/dead-tag returns a clean 404 with navigation and a link to /blog/.

## How to prevent soft 404s

- Do not publish empty templates. Hide drafts and stubs from crawl and sitemaps until they answer a query.
- Return the right status code. Wire 404 or 410 for missing pages. Use 301s to specific replacements, not the home page.
- Keep the XML sitemap clean. Only list canonical, indexable, 200 URLs that you want indexed.
- Guard parameters. Decide which filters create pages worth indexing. Noindex or block the rest and avoid linking to them.
- Design empty states with substance. If you keep 200, add alternatives, popular items, internal links, and copy that answers.
- Review redirects quarterly. Replace broad rules with specific targets. Remove long chains and loops.
- Monitor new content types. When you add a feature like user profiles, test empty, deleted and private states in Search Console.

> One rule: never 200 a page that says “not found” or shows nothing useful.

## Work with the URL Inspection tool when a fix resists

- Compare user-declared canonical and Google-selected canonical. If Google picked another URL, your page may be thin or duplicative.
- Check discovery. If the referring page or sitemap is wrong, fix the link path and the sitemap entry.
- Read the rendered HTML. If the main content is hidden by JS or blocked resources, Google may see an empty page.
- Look for console errors. JS errors can stop render. Fix them and re-test.
- Check HTTP response. Proxies or CDNs sometimes map a custom 404 to 200. Correct the origin rule.

If a fix is correct and still shows as soft 404, wait. Validate fix runs can take about two weeks for re-checks to settle. Keep shipping the same rule across the whole type, not just one URL.

## What success looks like in Search Console

- Soft 404 count drops after Validate fix completes. Some URLs move to Not found (404). Others index, or show Page with redirect.
- Crawled, currently not indexed may rise for a week. That is normal as Google re-evaluates thin templates. Keep improving content and links.
- Page with redirect becomes the home for deleted posts that now 301 to a nearest equivalent. Update internal links so users do not see the hop.
- Sitemaps show only stable 200 URLs. Discovered, currently not indexed shrinks as crawl is spent on real pages.

## Questions

### What is the difference between a hard 404 and a soft 404?

A hard 404 returns HTTP 404 or 410. It tells both users and crawlers the page is missing. A soft 404 returns 200 but looks like an error or empty. Google treats it as not found.

### Should I redirect soft 404s to the home page?

No, not by default. Redirect to the nearest equivalent page. If there is no close match, return 404 or 410. A blanket home redirect keeps the problem and wastes signals.

### How do I fix soft 404 errors in Google Search Console?

Open the Page indexing report, filter to Soft 404 and export samples. Inspect and test live. Then, per case, return 404 or 410, add content, or 301 to a specific replacement. Validate fix. Re-checks can take about two weeks.

### Why does a page with some text still get a soft 404?

If the page is thin, near-duplicate or reads like an error, Google can still treat it as not found. Add specific content that answers. Strengthen internal links. Ensure the template does not show error language.

### Can request indexing force a soft 404 to index?

No. Request indexing only queues a crawl and has a small daily quota. It does not guarantee indexing. Fix the page or status code first, then request.

### Is 410 better than 404 for deleted pages?

Use either. 410 says gone for good. 404 says not found. If a page will never return and has no close replacement, 410 is fine. If it had links, consider a 301 to the nearest equivalent instead.

## Read next

- [How to use Google Search Console in ten minutes a week](https://porteur.ai/guides/how-to-use-google-search-console): A quick weekly routine: set four filters, compare 28 days, check pages then queries, and fix three findings, without getting lost in noise.
- [How to use the URL Inspection tool in Search Console](https://porteur.ai/guides/url-inspection-tool): Read each panel, run Test live URL, and know when to request indexing. Fix new pages, dropped pages, and canonicals Google ignores.
- [How to fix 404 errors reported in Search Console](https://porteur.ai/guides/how-to-fix-404-errors-in-google-search-console): Decide which 404s to fix, find the ones with links or traffic, choose redirect, restore or 410, clean internal links and sitemaps, and revalidate.
- [Page with redirect in Search Console: normal, until it is not](https://porteur.ai/guides/page-with-redirect): “Page with redirect” is normal after a move. Fix it only when your sitemap or internal links still hit the old URL, or you have a chain or a loop.
- [Crawled, currently not indexed: what it means and what to do](https://porteur.ai/guides/crawled-currently-not-indexed): What “Crawled, currently not indexed” means in Search Console, how to tell why it happened on your site, and what to change that gets pages indexed.
- [Alternate page with proper canonical tag: what Search Console means](https://porteur.ai/guides/alternate-page-with-proper-canonical-tag): What this Search Console status means, when to ignore it, when it hides the wrong page, and the exact checks and fixes to set the right canonical.

Want to see if your site returns soft 404s or empty templates, and which rivals win those searches, from one URL in about thirty seconds, free? Free check: https://porteur.ai/
