Soft 404

No Comments
Soft 404

A soft 404 is a page that tells users "nothing to see here" while telling crawlers "200 OK, all good" — an error page wearing a success code. Google spots the contradiction, slaps the "Soft 404" label on it in Search Console, and treats the URL as junk regardless of what your server claimed.

The cost compounds quietly. Each soft 404 keeps getting recrawled like a real page (a genuine 404 gets demoted in the crawl queue; a 200 doesn't), so at scale — think thousands of empty category pages or discontinued products — you're spending real crawl capacity on URLs Google has already written off. Worse, the classification isn't limited to obvious error pages: Google will soft-404 thin-but-legitimate pages and badly-targeted redirects too, which means actual content can get swept into the bin.

Catching the server in the act

The diagnostic is one command — compare what the page says with what the header says:

curl -sI https://example.com/products/discontinued-widget/ | head -1

HTTP/2 200

...while the rendered page shows "Sorry, this product is no longer available" and three navigation links. That mismatch is the entire defect. You'll see the pattern most often from:

# SPA router: any unknown path renders a "not found" view,
# but the server returned 200 before JS ever ran
GET /whatever-you-typed/  →  200  →  <NotFound /> component

# CMS: deleted product keeps its URL as an empty shell
GET /products/discontinued-widget/  →  200, no content block

# Search page with zero results, indexable
GET /search?q=asdfghjkl  →  200, "0 results found"

None of these were built to deceive anyone. They're all defaults nobody questioned, and Google penalizes the sloppiness the same either way.

Causes → detection → fix

CauseHow you detect itThe fix
Error/"not found" template served with 200curl -I a nonsense URL; GSC flags it under Soft 404Configure server/prerenderer to emit a real 404 status with the template
Deleted product or listing leaves an empty shell pageCrawl filtered by low word count on 200 URLs410 if gone for good; 301 to the successor product or parent category if one truly substitutes
Empty category, tag, or zero-result search pagesCrawl + GSC Soft 404 export, look for the URL patternNoindex while empty, or stop generating/linking them at all
Blanket redirects to the homepage or an unrelated pageGSC labels the redirect source soft 404Re-point each redirect to a genuinely equivalent page, or let it 404 honestly
Thin page Google judges to have no standalone valueSoft 404 flag on a page you consider realAdd the substance the URL promises, or consolidate it into a stronger page
JS framework catch-all routeNetwork tab shows 200 on garbage pathsReturn 404 at the edge/server level for unknown routes, not just in the client router

How to check it on your own site

  1. Open GSC Indexing → Pages → Soft 404 and export the list. Group by URL pattern before touching individual URLs — soft 404s are almost always a template problem, and the pattern tells you which template.
  2. Run the nonsense-URL test against every distinct system on the domain: main site, blog subfolder, search, and any subdomain. Mixed stacks fail independently; your WordPress can be honest while your React storefront lies.
  3. Crawl with Screaming Frog and sort 200-status HTML by word count, ascending. Everything under a couple hundred words deserves a look: real page, empty shell, or dead product?
  4. Audit your redirect targets. If you bulk-redirected a retired section to the homepage, inspect a few source URLs in GSC — you'll likely find them reclassified as soft 404s. I proved this reclassification happens with live data here.
  5. Recheck two to four weeks after fixing: the Soft 404 report clears only as Google recrawls, so use URL Inspection on a sample to confirm the new status is being picked up rather than waiting on the aggregate graph.

The step-by-step remediation for each scenario is in Soft 404s: what they are and how to fix them, with an older but still-valid walkthrough in the identification and solutions guide.

Common mistakes

  • Fixing the symptom URL instead of the template. You 410 the twelve URLs GSC showed you while the CMS keeps minting new empty shells daily. Fix: patch the code path that produces them; the report sample is never the full population.
  • "Solving" soft 404s with homepage redirects. This converts one soft 404 flavor into another — Google treats the irrelevant redirect as soft 404 too. Fix: equivalent target or honest 404, nothing in between.
  • Letting zero-result search and filter pages stay indexable. Faceted nav plus empty result sets is a soft-404 factory. Fix: noindex empty states, and don't link to filter combinations that can't produce results.
  • Trusting the client-side router's error handling. The user sees a lovely 404 view; the server sent 200 before React loaded. Fix: status codes are the server's job — handle unknown routes at the edge or in SSR.
  • Treating the GSC Soft 404 flag as always wrong when it hits a "real" page. Sometimes Google is telling you the page is thinner than you think it is. Fix: read the flagged page as a stranger would; if it doesn't deliver what the URL promises, that's your answer.

FAQ

Is a soft 404 an actual HTTP status code?

No — there's nothing in the HTTP spec called a soft 404. It's Google's internal classification for a mismatch between a success status and error-like or valueless content. Your server logs will never show it; only GSC will.

Do soft 404s get indexed?

Once classified, no — Google excludes them, which functionally equals deindexing. The difference from a real 404 is upstream: the URL keeps consuming crawl capacity like a live page, and the classification can misfire onto content you wanted indexed.

Why is Google flagging my legitimate page as a soft 404?

Usually one of: the main content is invisible to the crawler (blocked resources, JS rendering failure), the page is genuinely thin, or boilerplate phrases like "not found" or "no longer available" appear prominently. Inspect the rendered HTML in URL Inspection before assuming Google is wrong.

Should an out-of-stock product page return 404?

Not if it's coming back — keep it live with restock info, alternatives, and real content so it doesn't look empty. Permanently discontinued with no successor: 410. Replaced by a newer model: 301 to it. The only wrong choice is a gutted page limping along at 200.

How is a soft 404 different from a regular 404?

A regular 404 is the server telling the truth about a missing page; a soft 404 is the server claiming success while delivering nothing. Truth gets processed efficiently and dropped cleanly. The lie forces Google to figure out the truth itself — and its guesses sometimes take your good pages with it.

Claude Vincent is a technical SEO consultant focused on crawlability, rendering, and AI-search visibility. He writes the field guides and case studies at SEO ProCheck, with a bias toward the durable, unglamorous work that decides whether search engines and AI answer engines can actually read and cite a site.

About SEO ProCheck

Technical SEO consulting and GEO strategy with 20 years of enterprise experience. Case studies, resources, and tools for search and AI visibility.

Work With Me

Technical SEO audits, GEO strategy, site migrations, and international SEO. Hourly consulting for teams who need hands-on support, not just reports.

Subscribe to our newsletter!

More from our blog