A soft 404 is a page that returns an HTTP 200 OK status while actually showing "not found," "no results," or an empty template to the user. Search engines and AI crawlers treat the 200 as a promise that real content exists, so they keep crawling, indexing, and sometimes citing pages that hold nothing useful. The fix is simple in principle: pages with no real content should return a genuine 404 or 410 status, and only pages with substance should return 200.
Why soft 404s quietly damage your visibility
The damage is indirect but real. Every soft 404 wastes crawl budget: bots spend requests fetching thin or empty pages instead of your important ones. On large sites this adds up fast, and AI crawlers with tight fetch limits may never reach the pages you actually want cited. Google also flags soft 404s in Search Console and can drop them from the index unpredictably, taking legitimate URLs down with them when detection is imperfect.
There is a content-quality cost too. When an AI assistant retrieves a page that says "Sorry, no products match your search," it has learned nothing about your site except that it returned emptiness. Filling the index with hollow URLs dilutes the signal that you are a substantive source. If you want the background on how bots decide what to fetch and keep, our guide on how search engines crawl and index websites explains the pipeline these empty pages disrupt.
Where soft 404s come from
Most soft 404s are generated automatically, not written by hand. Common sources include: empty search results and filtered category pages that return "0 results" but still load with a 200; out-of-stock or discontinued product pages that show a placeholder instead of redirecting or returning 404; expired listings such as jobs, events, or classifieds that keep their URL after the content is gone; and JavaScript apps that render a "page not found" component client-side while the server happily returns 200.
Faceted navigation is a particular offender, because it can spawn thousands of parameter combinations that lead to empty result sets. If that describes your site, pair this fix with the tactics in our crawl budget optimization guide, which covers how to stop bots from wandering into junk URLs in the first place.
How to detect them
Start in Google Search Console under Pages, where the "Soft 404" reason lists URLs Google has already caught. That is your fastest win, but it only shows what Google found, so verify at the source too. Fetch suspect URLs and check the actual status code with a command-line request rather than trusting the browser, which hides status codes behind rendered content.
Look for the tell-tale mismatch: a 200 response whose body contains phrases like "not found," "no results," "0 items," or "this page no longer exists." A quick crawl with any site auditor that reports status code alongside word count will surface pages that return 200 with almost no unique text. For empty search and filter pages, test the parameter patterns directly: search for gibberish on your own site and see what status the results page returns.
How to fix each case correctly
The right fix depends on why the page is empty. For content that is permanently gone (a deleted product with no replacement, an expired listing), return a real 410 Gone or 404 Not Found so bots stop revisiting it. For content that moved, use a 301 redirect to the closest relevant page — not a blanket redirect to the homepage, which Google itself treats as a soft 404. Our breakdown of HTTP status codes and redirects covers exactly when to reach for 301 versus 404 versus 410.
For empty search and filter results, you have two good options. Either return a 404 status when a query genuinely matches nothing, or keep the page but add real value: show related products, popular categories, or helpful next steps so the page is no longer empty. What you must not do is serve a bare "no results" template with a 200 and let it get indexed. For temporary outages — a page that is briefly unavailable — use 503 Service Unavailable, which tells bots to come back later instead of dropping the URL.
If your site is a JavaScript single-page app, remember that the server status code is what crawlers read first, and most AI bots never run your JavaScript at all. Rendering a "not found" view client-side while the server returns 200 is invisible to them as an error. The server must return the correct status. This is the same class of problem we cover in why JavaScript-only websites are invisible to AI assistants.
A quick maintenance habit
Soft 404s creep back as inventory changes, campaigns end, and filters multiply, so treat detection as recurring rather than one-time. Check the Search Console Pages report monthly, spot-check a sample of search and filter URLs after any template change, and confirm that your out-of-stock and expired-content logic returns the status code you intend. A five-minute check each month keeps thousands of hollow URLs out of your index.
Want to know whether crawlers are seeing real content or empty 200s on your pages right now? Run the CheckMy.site scanner to check status codes, crawlability, and what AI bots actually receive when they fetch your site.