Soft 404s: pages that say 200 and mean nothing

Search Console is reporting soft 404s and you want to know what is generating them.

Short answer

A soft 404 is a URL that returns a success status while serving content the engine judges to be a not-found or empty page. Engines flag them because the status code is lying: crawlers keep returning to a URL that has nothing, and the honest answer, a real 404 or 410, would have removed it cleanly.

Why the status code matters

Status codes are the contract. A 200 says "here is the content you asked for", and a crawler acts on that: it indexes the page and comes back. When the content is an error message, the crawler has been told to keep spending requests on a URL that will never be worth anything.

Cause one: the catch-all redirect

Redirecting every unmatched URL to the homepage. It feels tidy and it produces a soft 404 for every dead URL, because the engine asked for one page and got a completely different one with a success status. A 404 would have been more useful to everyone.

Cause two: the single-page application fallback

A client-rendered app that serves the same shell for every path returns 200 for URLs that do not exist, then renders a not-found view in JavaScript. The first-pass crawler sees a successful empty page. This is the most common modern source and the least visible, because it works perfectly for humans.

Cause three: genuinely empty pages

Category pages with no products, tag archives with no posts, search result pages with no results, profiles with no content. They exist, they return 200, and they contain nothing worth indexing. Engines classify them the same way.

Why it is worse than a real 404

A real 404 is unambiguous: the crawler drops it and moves on. A soft 404 keeps the URL in circulation, keeps consuming crawl, and clutters your reporting with pages that appear to exist. It is a slow leak rather than a clean break.

How to fix each case

Return a genuine 404 or 410 from the server for URLs that do not exist, including in your SPA fallback. Redirect only where a real equivalent exists. For empty-by-design pages, either noindex them or hold them back until they have content.

Checking your own

Request a URL you know does not exist and read the status code, not the page. If your site returns 200 for a deliberately nonsense path, every deleted page you ever publish will soft-404 forever, which is a permanent condition created by one configuration line.

Questions

Is a soft 404 a penalty?
No. It is a classification, and the consequence is that the URL is not indexed while continuing to consume crawl. There is no manual action attached to it.
Should I use 404 or 410?
404 says not found, 410 says deliberately gone. 410 can be processed slightly faster. For most sites the difference is not worth engineering around; returning either honestly is what matters.
My SPA returns 200 for everything. How bad is that?
Bad in proportion to how many URLs you have removed or mistyped. On a small stable site it is close to harmless. It becomes a real problem the first time you delete pages that had accumulated traffic.

Measured, not asserted

This site has the condition and knows it: its fallback serves the app shell for unmatched paths, so a removed page returns 200 rather than 404. On ihatepdf.cv, taken to 100,542 users across 160 pages, the equivalent risk was real, because 22 pages earned nothing and pruning any of them cleanly requires the server to say 404 and mean it.

Free tool for this: Crawler View. No account, nothing uploaded.

Where this goes deeper

Every number on this page comes from one complete dataset: one product taken from zero to 100K+ users on search alone, with nothing spent on advertising. The full argument is Chapter 10 and Chapter 17 of the book. Five chapters are free to read.

Related