Soft 404 Errors in Search Console: How to Fix Them
A soft 404 is a URL that answers with a success code, 200 OK, while the page itself says the content does not exist, is empty or looks like an error. Google treats it as missing and leaves it out of search. The fix is to return a real 404 or 410, redirect to a true replacement, or give the page real content.
Most soft 404s come from a template, so one change in the code clears hundreds of URLs at once. It is the kind of fix covered by Google indexing fixes.
Soft 404 vs 404 vs 410
| Response | Status code | What Google does | Use it when |
|---|---|---|---|
| 404 Not Found | 404 | Treats the content as missing and drops the URL from the index | The page is gone and has no replacement |
| 410 Gone | 410 | The same as 404: Google handles all 4xx errors except 429 alike | The page is gone and you want to say so explicitly |
| 301 redirect | 301 | Takes it as a strong signal that the destination is the canonical URL | The content moved to an equivalent page |
| Soft 404 | 200 | Treats the page as missing anyway and reports the mismatch | Never on purpose: it is the bug to fix |
Real 404 errors are normal and, according to Google, do not hurt a site's performance in search. What causes trouble is hiding them: fake content, blanket redirects to the home page, or blocking missing URLs in robots.txt.
Why Google flags a page as a soft 404
Single-page apps
The app shows "not found" for a missing route, but the server already answered 200, because client-side routing cannot change the status code.
Empty categories and searches
Categories with no products, tag pages with no posts and internal search results with no hits look like error pages.
Unavailable products
A product page reduced to "this item is unavailable", with nothing else on it, reads as an empty page.
Deleted pages sent to the home page
Redirecting removed URLs to the home page or an unrelated page gives Google something other than what was asked for.
Thin templates
Pages with a title and little else, like placeholder locations or profiles without data.
Error messages on a 200 page
A template that prints "no results" or "something went wrong" when an API call fails, while the server still reports success.
How to check the real status code
Run this in a terminal with a URL that should not exist on your site:
curl -I https://example.com/this-page-does-not-exist - Read the first line. It is the status the server sends before any JavaScript runs. A missing page should say 404 or 410, not 200.
- Compare with a real page. If a made-up URL and a real page both return 200, every mistyped link to your site creates a soft 404.
- Look at what Google rendered. In URL Inspection, View crawled page and Test live URL show the HTTP response and the rendered HTML.
How to fix soft 404 errors
- Export the examples. In the Page indexing report, open "Soft 404" and export the URLs. Group them by template: products, categories, search, profiles or app routes.
- Decide if each group should exist. A page that is gone needs a real error code. A page that should rank needs content. The answer decides the fix.
- Return a real 404 or 410 for missing pages. Set the status on the server, so the very first response already says the page does not exist.
- Redirect only to true replacements. Send moved content to its new address with a 301. Do not send everything to the home page.
- Give real pages real content. Fill thin templates with the information visitors came for, or keep them out of the index until they have it.
- Check what Google sees. Use URL Inspection, Test live URL, to confirm the status code and that the rendered HTML shows the content.
- Validate the fix. Click Validate fix in Search Console once the template is deployed.
Returning a real 404 in JavaScript frameworks
When the server renders the page, set the status there. In SvelteKit, calling error() in a load function sets the response status to 404 and renders the error page:
import { error } from '@sveltejs/kit';
export async function load({ params }) {
const post = await getPost(params.slug);
if (!post) error(404, 'Not found');
return { post };
} In the Next.js App Router, notFound() renders the not-found page. Called
before the response starts streaming, it returns a 404. Once streaming has started, the status stays
200 and Next.js adds a noindex tag instead, so check missing records before any Suspense boundary
streams.
import { notFound } from 'next/navigation';
export default async function Page({ params }) {
const { slug } = await params;
const post = await getPost(slug);
if (!post) notFound();
// ...
} In Angular with server-side rendering, the not-found component sets the status through
the RESPONSE_INIT token. The token is null in the browser and during prerendering, so
this works only for routes rendered on the server at request time.
import { Component, inject, RESPONSE_INIT } from '@angular/core';
@Component({ selector: 'app-not-found', template: '<h1>Page not found</h1>' })
export class NotFound {
constructor() {
const response = inject(RESPONSE_INIT);
if (response) response.status = 404;
}
} A single-page app with no server rendering cannot change the status code. Google's JavaScript SEO
guide gives two alternatives: redirect with JavaScript to a URL that returns a real 404, such as /not-found, or add <meta name="robots" content="noindex"> to the error
view.
Out-of-stock products: keep, redirect or 404?
- Back in stock soon: keep the page live with the full product details, the availability shown on the page and in the Product structured data, and links to similar products.
- Replaced by a new model: redirect with a 301 to the new product.
- Gone for good, no replacement: return 404 or 410. If the page still earns links or searches, keep it with clear alternatives instead of an empty notice.
Stores with thousands of variants and seasonal products have more cases like this, covered in ecommerce technical SEO.
Questions about soft 404 errors
What is a soft 404?
A soft 404 is a URL that returns a success code, 200 OK, while the page tells visitors the content does not exist, or shows almost nothing. Google treats it as a missing page, leaves it out of the index and reports it as "Soft 404" in Search Console.
Do soft 404 errors hurt SEO?
The flagged URL is not indexed, which is correct when the page really is missing. The cost comes when real pages are flagged by mistake, like thin product or location pages, or when every mistyped URL on the site answers 200 and creates a new page for Google to crawl.
Should a missing page return 404 or 410?
Either works. Google treats all 4xx errors except 429 the same way: the content does not exist, and the URL is dropped from the index if it was there. A 410 simply states more explicitly that the page is gone for good.
Why is a real page reported as a soft 404?
Google judged the rendered page as empty or as an error. Check the rendered HTML in URL Inspection: content that depends on a failed API call, a script Google could not load or a thin template can make a real page look like an error.
Can I redirect all my 404 pages to the home page?
It is better not to. Google advises against redirecting missing pages to the home page, and those redirects can be reported as soft 404s anyway. Redirect only to a page that replaces the old one, and let the rest return 404.
Real pages reported as soft 404?
Email the site and one URL from the report. I reply with why Google sees it as empty and how I would fix the template.
- Email: calebe.development@gmail.com
- WhatsApp: +55 11 98838-5247
- Who replies: Calebe Araujo, the developer who does the work
Page updated on .