seoder

200 Soft 404 (a 200 that should be a 404)

A URL with nothing behind it that returns HTTP 200 anyway. The status line claims success and the body says the page is missing. Crawlers believe the status line.

The definition is in the glossary entry. This page is about finding them and getting rid of them.

What causes it

Single-page applications are the largest source by volume. The server has no route table for the client-side router, so every unrecognized path returns the application shell with a 200. A site with a client router and no server-side route validation has an unbounded number of soft 404s by construction, one per URL anyone ever invents.

Content management systems that render an error view without setting the status. Deleted products that fall back to a category or a "no longer available" template. Search results pages with zero matches. Category pages that emptied out. Any redirect to the homepage from a URL that does not exist, which is a soft 404 wearing a 301.

How to diagnose it

Search Console reports them under Pages, in the not indexed group. Use that as a starting point rather than a full list, because the detection is content-based and approximate. It will miss an empty page that looks structurally like a real one.

The direct test is to ask for something that cannot exist:

curl -s -o /dev/null -w "%{http_code}\n" https://example.com/this-page-does-not-exist-9f3a
curl -s -o /dev/null -w "%{http_code}\n" https://example.com/products/deleted-item-9f3a

Anything other than 404 or 410 is the bug, and you have just found it in ten seconds. Run the same check against a few path shapes, since routing often differs between the top level and a nested section.

To find them at scale, crawl your own site and look for 200 responses whose body length clusters tightly around a small value, or whose text contains your error copy. Both signals are crude and both work.

How to fix it

Return the right code. 404 when the URL has nothing, 410 when the content is permanently gone and you want it retired faster.

For a single-page application, validate the route on the server before returning the shell. Frameworks with file-based routing mostly do this already; hand-rolled routers mostly do not. If you prerender, the build already knows which paths exist, so the check is free.

For a deleted item, redirect only to something genuinely equivalent. A replacement product is equivalent. The category is arguable. The homepage is not, and redirecting there converts one soft 404 into another.

For a temporarily empty page, 200 is fine if the page explains the state and will fill up again. Permanently empty is a 404.

Fixing this usually returns a noticeable amount of crawl budget, because a soft 404 never retires. A real 404 leaves the schedule; a 200 stays in it forever, and on a large catalogue that is the difference between new pages being crawled this week or next quarter.

Questions

Where does Search Console report soft 404s?

Under Pages, in the not indexed group, as Soft 404. The detection is content-based rather than status-based, so it lags and it misses cases where the empty page looks like a real one.

Do soft 404s affect other crawlers?

They affect them more. AI crawlers generally do not attempt soft 404 detection at all, so they read the 200, treat the page as content, and keep it in their fetch schedule indefinitely.

Is an empty category page a soft 404?

It depends on whether it is permanently empty. A category with no items right now can return 200 with an explanation. A category that will never have items should return 404 or 410.