A soft 404 is a page that tells visitors it does not exist, or shows almost nothing, while the server still answers 200 OK. Google flags it in Search Console because the signals disagree. Fix it by returning a real 404 or 410 for gone pages, redirecting moved ones, or filling genuinely empty pages with content.
| Situation | Best response |
|---|---|
| Page is gone for good | 404 Not Found or 410 Gone |
| Page moved to a new address | 301 redirect to the new page |
| Product sold out but coming back | Keep 200 and show real details plus a restock note |
| Search or category page with no results | noindex, or add useful content |
| Single-page app route that does not exist | Redirect to a URL that returns 404, or add noindex with JavaScript |
Updated
Search engines read two things: the status code your server sends and the words on the page. When the words say error and the code says success, Google calls it a soft 404 and keeps it out of results. Pick the status code and paste the visible text of an affected page below to see whether it looks like one.
Status code the server sends: 200
Visible text of the page: Sorry, this product is no longer available. Browse our other mugs.
Likely soft 404: the server says OK but the text reads like an error. Return 404 or 410, redirect, or add real content.
Error-like phrases found: no longer available, sorry
11 words.
This is a rough check based on common error wording and length. Google does not publish its exact rules.
When the route has no data, either send the visitor to an address your server answers with 404, or tell crawlers not to index the view.
Your server must return status 404 for /not-found for this to work.
const res = await fetch(`/api/products/${slug}`);
if (res.ok) {
renderProduct(await res.json());
} else {
window.location.href = "/not-found";
}Use this when you want to keep the visitor on the same address.
const tag = document.createElement("meta");
tag.name = "robots";
tag.content = "noindex";
document.head.appendChild(tag);
Google's Page indexing help defines it plainly: the request returns a user-friendly not found message but not a 404 HTTP response code. Its status code documentation adds that empty pages and error messages served with a 2xx code are reported the same way.
So the fix is always to make the two signals agree. Either the page is real and has content, or it is gone and says so with its status code.
Out-of-stock products are the classic case. If the page keeps the product name, photos, description and a clear availability note, it is a real page and should stay 200. If it collapses to a single line saying this item is unavailable, it reads as an error.
Empty filtered listings, such as a category with zero products in a given size, are better kept out of the index with noindex than left as near-blank pages.
No. It only means Google will not index that address. The cost is indirect: Google's crawl budget guide notes that soft 404 pages keep being crawled, which wastes visits that could go to real pages.
Either works. Google's HTTP status code documentation groups 404 and 410 with the other 4xx codes and says it does not index URLs that return them. Use 410 if you want to say the removal is deliberate.
A single-page app usually serves the same HTML shell with status 200 for every address, then shows a not found message in the browser. Google's JavaScript SEO guide gives two fixes: redirect to an address that returns 404, or add a noindex meta tag with JavaScript.
Yes. Pages with very little text, words like unavailable or out of stock in the main content, or a failed script that leaves the page blank can all look like errors. Use URL Inspection's live test to see what Google rendered.
Open the browser developer tools, go to the Network tab, reload the page and look at the Status column for the first document request.
Related: HTTP status codes, 404 page examples, Redirect checker, Noindex tag, Crawled - currently not indexed.
Start for free or see all free tools. We.Inc is free to start, with no card needed. AI building is on paid plans from $20 a month.
We.Inc is an AI-powered website builder you can resell under your own brand. Launch a branded client dashboard, bill on Stripe Connect, and deliver AI-generated websites in minutes. White-label plans start at $99 a month for 25 client sites, with a 7-day free trial and no per-site fees.