Soft 404s and thin pages, the quiet index polluters
A soft 404 is a page that tells crawlers everything is fine (HTTP 200) while telling users the opposite: nothing here, no results, page not found. The status code and the content disagree, and Google trusts the content.
These turn up in almost every audit, usually in the hundreds or thousands, and usually nobody knows they exist. They waste crawl and drag on the site's quality profile.
How Google detects and reports them
Google classifies soft 404s by looking at what the page actually says and shows. Telltale phrases ("not found", "no longer available", "0 results"), near-empty main content, error templates, and pages that render blank after JavaScript runs all trigger the classification. It also flags redirects that dump users somewhere irrelevant, like every dead product URL redirecting to the homepage.
Once classified, the URL is treated like a real 404: dropped from the index and crawled less over time. The Soft 404 list in Search Console's Page indexing report is a sample, not a census, so treat each listed URL as a representative of a pattern and find its siblings with a crawl.
Where they come from
In most audits the sources are boringly consistent:
Empty category and filter pages: the ecommerce classic. Inventory sells out, the category renders a grid with zero products, and the template happily returns 200.
Internal search and "no results" pages: a results template with nothing in it, sometimes indexable and generating infinite empty URLs from crawled query parameters.
JS error states: single-page apps that respond 200 for any path and render a "page not found" component client-side, making every dead URL on the site a soft 404.
Expired content: classifieds, job listings, events past their date, all showing a stub that says the thing is over.
Placeholder and stub pages: auto-generated location or tag pages with a heading, boilerplate, and no actual content.
Lazy redirects: everything dead sent to the homepage, which Google explicitly treats as a soft 404.
Why you should care
The direct cost is crawl waste: Googlebot keeps checking thousands of URLs that will never be worth indexing instead of discovering your real pages. The indirect cost is worse: quality is evaluated in aggregate, and a site where a third of discoverable URLs are empty shells looks thin as a whole, especially since helpful content signals went sitewide. Thin pages also dilute internal linking: every template link pointing at an empty page is authority routed into a dead end.
Fixing patterns, case by case
A soft 404 is a symptom with several diseases, so match the fix to the source:
Empty categories: if the emptiness is temporary, keep the page useful: show related products and drop it from sitemaps until it refills. If the category is dead, return 410 or redirect to the closest real parent.
Internal search results: keep them out of the crawl entirely with a robots.txt disallow on the search path, and noindex the template as a backstop for anything already indexed.
SPA error states: make the server return a real 404 for unknown routes. If the architecture makes that hard, at minimum have the router send users to a dedicated /404 URL that genuinely returns 404.
Expired listings: return 410 once the content is truly gone, or redirect to a live equivalent if one exists. For recurring events, keep one canonical URL alive year over year.
Stub pages: either make them real pages with actual content, or remove them and the template logic that generates them. Stop producing them rather than noindexing thousands and calling it done.
Homepage redirects: replace with per-URL decisions, even if the honest answer for most is a plain 404.
Verify the fix
After fixing, verify. curl -I confirms the status code the server actually returns. URL Inspection in Search Console shows how the rendered page is classified, which is essential for the JavaScript cases. Then crawl with Screaming Frog and sort by word count to surface the remaining thin templates before Google does.
The principle underneath all of this: say what you mean with status codes. If a page has nothing to offer, tell crawlers honestly. A clean 404 is not a failure. Ten thousand fake 200s are.