A soft 404 is a page that tells the visitor "nothing found" while telling the server "everything is fine". Search Console defines it as a request that "returns a user-friendly 'not found' message but not a 404 HTTP response code". The mismatch is the whole problem: the status says the page exists, the content says it does not, and Google has to decide which to believe.
That makes it the one indexing problem a crawl cannot find. Every other status is visible in a status column — a 403 to Googlebot, a 404, a redirect chain. A soft 404 answers 200, so a crawl of your site, including a crawl with our own site crawler, will show a healthy page. The signal is in the content, not the header.
How Google decides a page is a soft 404
The crawling documentation states the rule inside the 2xx row: Google considers the content for processing, and "If the content suggests an error for Google Search, an empty page or an error message, Search Console will show a soft 404 error." The same page adds the part people skip: "For Google Search, an HTTP 2xx (success) status code doesn't guarantee indexing."
So there is no list of banned phrases and no threshold published. What is documented is the direction of the judgement: content that reads like an error, or has nothing in it, is treated as an error no matter what the header said. Search Console's own advice follows from that — "We recommend returning a 404 response code for truly 'not found' pages and adding more information on the page to let us know that it is not a soft 404."
Where soft 404s come from
| Page | Why it reads as an error |
|---|---|
| Empty category or filter combination | The template renders, the listing is empty. For a reader and for Google the page has no subject. |
| Out-of-stock product kept online | Price, description and buy button are gone; what is left is a notice. |
| Internal search results with no matches | "Nothing found for your query" is literally an error message, served with 200. |
| Removed page redirected to the home page | The request was for something specific and the answer is a different page. The original URL still has no content behind it. |
| Single-page app that fails to load data | The shell renders, the content never arrives, and the status was 200 before any of that happened. |
| Expired listing, past event, closed vacancy | The page survives with one line explaining it is over. |
Single-page apps are the common case now
Client-side routing cannot set a status code, because the status was decided when the shell was served. Google documents this directly and names two strategies to avoid soft 404 errors in single-page apps:
- redirect in JavaScript to a URL for which the server responds with a 404 — for example
/not-found; - add
<meta name="robots" content="noindex">to error pages with JavaScript.
The same document explains why the problem arises at all: "All pages with a 200 HTTP status code are sent to the rendering queue, no matter whether JavaScript is present on the page." The shell gets its 200 long before anyone knows whether the data exists.
How to find them
- Start with Search Console, because only it knows. The page indexing report has a status named exactly "Soft 404". Our indexing cleanup groups those URLs so you can see whether it is one template, one folder or the whole catalogue.
- Look at the page as Google rendered it. Search Console's advice is to run a live URL inspection and open "View tested page" for a screenshot. An empty block there, where your browser shows products, is the answer.
- Check what the page contains after rendering. If the rendered text is a heading and one sentence, it will read as an error regardless of intent. The page analyzer shows what is actually on the page.
- Watch the pages that still earn clicks. Some soft 404s have traffic and inbound links. Organic 404 finds URLs that still receive search traffic while answering like an error — those get a redirect, not a delete.
What to return instead
The fix depends on why the page is empty, not on what is convenient.
| Situation | Correct response |
|---|---|
| The page is genuinely gone | 404, or 410 if you know it will not return. Google's recommendation for truly not-found pages is explicit. |
| The content moved | 301 to the page that answers the same request — not to the home page. |
| Product is temporarily out of stock | Keep 200, keep the description and specifications, say when it returns. The page still has a subject. |
| Category is empty but the section exists | Keep 200 and add content: description, related categories, nearby filters. Or noindex it while it is empty. |
| Internal search results | Block them in robots.txt. They should not be crawled at all. |
| Error state in a single-page app | One of the two documented strategies above — a redirect to a real 404 URL, or a noindex added in JavaScript. |
The rest of the status-code decisions, including when 410 beats 404, are collected in our reference of HTTP status codes.
What changes after the fix
A page that starts answering 404 leaves the index, which is the point. Expect the count under "Soft 404" to fall and the count under "Not found (404)" to rise — that is the fix working, not a new problem. Pages you filled with content instead stay at 200 and have to be re-crawled and re-assessed, and Google publishes no timescale for that. The one thing worth watching for is a soft 404 count that does not move at all: it usually means the template was fixed on one page and not on the hundred others built from it.