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

What each response tells Google about a page that is not there
ResponseStatus codeWhat Google doesUse it when
404 Not Found404Treats the content as missing and drops the URL from the indexThe page is gone and has no replacement
410 Gone410The same as 404: Google handles all 4xx errors except 429 alikeThe page is gone and you want to say so explicitly
301 redirect301Takes it as a strong signal that the destination is the canonical URLThe content moved to an equivalent page
Soft 404200Treats the page as missing anyway and reports the mismatchNever 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

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

How to fix soft 404 errors

  1. 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.
  2. 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.
  3. 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.
  4. Redirect only to true replacements. Send moved content to its new address with a 301. Do not send everything to the home page.
  5. 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.
  6. Check what Google sees. Use URL Inspection, Test live URL, to confirm the status code and that the rendered HTML shows the content.
  7. 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?

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.

Have me fix the template

Page updated on .