// blog / indexing

How I find and fix soft 404 errors in Search Console

A soft 404 is a page that answers 200 OK but looks empty or missing to Google, so Search Console treats it like a 404 and leaves it out of the index. On WordPress I usually trace it to one of three causes, and each one needs a different fix.

By Muhammad Younus Updated 10 min read Indexing

Indexing and Search Console: illustration for "Finding and fixing soft 404 errors"
// 01 - the status

What makes Google call a page a soft 404?

It's a mismatch between what the server says and what the page shows. The server sends 200, which means everything's fine, but the page itself is empty or reads like an error. Google's documentation on HTTP status codes puts it plainly: when a 2xx response carries an empty page or an error message, Search Console shows a soft 404. Sorting those pages out is a big part of the Search Console indexing fixes for WordPress I'm hired for, and it starts with knowing which kind of empty you're looking at.

Search Console's help for the Page indexing report gives two halves of the fix. Return a real 404 for pages that don't exist, and give pages that should exist enough content that Google can see they aren't errors. A third group is about where a redirect or a host sends the request.

The three causes I see on WordPress sites, and the check that tells them apart
CauseWhat the flagged URL looks likeThe check that proves it
Empty or near-empty archiveA category, tag, author or product category page with no posts or productsIt returns 200 and the rendered page lists nothing
Redirect to an unrelated pageAn old URL that now redirects somewhere with a different topicA header request shows a 301 or 302, and the destination doesn't match the old page
Host serves the homepage for missing URLsAddresses that never existed, typos and old linksA made-up URL returns 200 with the same HTML as the homepage
// 02 - 404 vs soft 404

What's the difference between a 404 and a soft 404?

A 404 is the server telling the truth: nothing lives at this address. A soft 404 is the server saying 200 OK while the page reads like an error, an empty list or a not found message, so Google has to judge it from the content. Neither one gets indexed, but only the soft one keeps getting crawled.

That's the practical difference. Google's crawl budget guide calls a 404 a strong signal not to crawl that URL again, and a 410 gets the same treatment, since its status code documentation says every 4xx except 429 is handled the same way. A soft 404 carries no such signal, so Google keeps coming back to check it.

A 404, a 410 and a soft 404 side by side
ResponseWhat the visitor seesWhat Google does
404 Not FoundA not found page, ideally with a search box and links back into the siteRemoves the URL from the index and crawls it less and less over time
410 GoneThe same kind of page, with the removal marked as deliberateTreats it exactly like a 404
Soft 404 (200 OK)An empty archive, an error message, or the homepage on an address that doesn't existJudges the content, reports a soft 404, leaves the URL out of the index and keeps crawling it
// 03 - the seo cost

Do soft 404s hurt SEO?

Not as a penalty. Google's documentation doesn't describe a sitewide penalty for soft 404s. The cost is narrower: each flagged URL stays out of the index, so if it's a page people search for, like a product that renders empty for Googlebot, its search traffic is gone until the page is fixed.

The second cost is crawling, and it depends on the site's size. Google's crawl budget guide says soft 404 pages "will continue to be crawled, and waste your budget,". The same guide is written mainly for sites with 10,000 or more pages that change daily, or a million or more, and says a site without lots of rapidly changing pages doesn't need it. So on a typical WordPress site the crawling cost is small. The pattern behind a long list isn't, because one bad template or host setting keeps producing new ones.

Rather have me do this? One person, whole job.

Book a call on Upwork
// 04 - wordpress archives

Which WordPress pages turn into soft 404s?

Mostly archives. WordPress core sets the status code in handle_404(), and its own comment spells out the rule. A request that matches no posts gets a 404, unless it matches an existing but empty category, tag or author, or it's a search or the homepage. Those get a 200.

So a tag you created and never used, or used once on a post you later deleted, still has a live URL that answers 200 and lists nothing. The same goes for custom taxonomies, and WooCommerce product categories are custom taxonomy terms, so an empty product category behaves the same way. An author archive for a user who hasn't published anything can do it too.

Search results are a partial exception. They also return 200 when nothing's found, but WordPress adds a noindex robots tag to search pages by default, so they usually show up as excluded by noindex rather than as soft 404s. If search pages appear on your soft 404 list, something's removed that tag, and I check the theme and the SEO plugin first.

Archives with one short excerpt sit on the edge: close enough to empty that Google may call them soft 404s, and thin even when it doesn't. Deciding which to keep, merge or drop is a pruning job across the whole template, not a page by page repair.

// pro tip

Before touching anything, I count how many flagged URLs share a base like /tag/, /author/ or /product-category/. When most of the list comes from one template, the fix is one setting or one cleanup, not hundreds of edits.

// 05 - redirects

How can a redirect cause one?

By landing somewhere that doesn't answer the old page's question. In its guidance on site moves, Google tells you not to send lots of old URLs to a single unrelated page like the new homepage, because that might be treated as a soft 404. Several old pages merged into one new page can all point at it, though.

So the question I ask of each redirect is simple. Would someone who clicked the old link be satisfied with where they end up? A discontinued product that redirects to its own category passes, as long as that category still has products in it. A blog post that redirects to the homepage doesn't. On one WooCommerce store, the old sapphire category went to the new sapphire category, not the homepage, and that's the standard I hold every redirect map to.

Watch for chains of causes, too. A deleted product sent to a product category that's since gone empty fails twice, and fixing only the redirect won't clear it. On a platform move the same discipline applies from day one, which is why the redirect map comes before the import.

// 06 - static hosts

Why do some static hosts create them for every missing URL?

Because they're guessing the site is a single page app. Cloudflare Pages is the clearest documented case. Its docs say that when a deployment has no top-level 404.html, Pages assumes it's a single page application and matches every incoming path to the root. For a normal site it means a typo, a stale backlink or a URL that never existed gets the homepage instead of a not found page.

A headless WordPress front end or a static export often lands on this kind of host, so the CMS is fine and the soft 404s come from the layer in front of it.

The check that proves it takes seconds. I request an address that can't exist, something like /this-page-does-not-exist-123/, and read the status code and the size of the response. If it answers 200 and the HTML matches the homepage byte for byte, the host is doing it. The fix is on the host side: add a 404.html at the root of the deploy, and Pages serves it whenever a file isn't found.

For an app that really does route in the browser, Google's JavaScript SEO guide gives two options: redirect with JavaScript to a URL where the server returns a 404, or add a noindex robots tag to the error view.

// watch out

Don't judge this by eye. A homepage served on a bad URL looks perfectly healthy in a browser. Only the status code and a comparison with the real homepage show what's happening.

// 07 - the method

How I fix soft 404 errors, one cause at a time

The first four steps are diagnosis, and nothing on the site changes until they're done.

  1. Step 01

    Pull the list from the Page indexing report

    In Search Console I open Pages, find Soft 404 in the table of reasons pages aren't indexed, and export the URLs. That export is my working list.

  2. Step 02

    Group the URLs by pattern

    Tags, authors, product categories, old post URLs and unknown addresses each get a pile. Patterns point at causes faster than single URLs.

  3. Step 03

    Run a header check on each pile

    A 200 means the page is the problem, a 301 or 302 means I judge the destination, and a 200 on a URL that shouldn't exist sends me to the host test.

  4. Step 04

    Look at what Google rendered

    A live URL inspection test and its View tested page screenshot catch pages that look fine to me but render empty for Google.

  5. Step 05

    Empty archives: fill, hide or remove

    A term that should have posts gets them. One I keep for visitors but not for search gets a noindex in Yoast or Rank Math. One nobody needs gets deleted, so its URL returns a real 404, or a 410 when it's gone for good.

  6. Step 06

    Bad redirects: repoint or retire

    Each old URL goes to the closest page that answers the same need. When nothing close exists, it returns a 404 or a 410 instead.

  7. Step 07

    Static hosts: add a real not found page

    A 404.html at the root of the deploy, then the made-up URL test again. I only move on when it comes back as a 404, not a 200.

  8. Step 08

    Validate the fix and keep watching

    Once the pages have changed I click Validate fix on the Soft 404 issue. I don't put a date on it, because Google has to recrawl every URL before anything clears.

// watch out

Don't pad an empty page with filler to get it off the list. Generic text on an empty tag archive just trades a soft 404 for a thin page.

// 08 - after the fix

What should Search Console show once the causes are fixed?

The soft 404 count should fall, and the URLs should reappear somewhere more honest. Deleted archives and retired redirects move into Not found (404), which is fine when the page is meant to be gone. Noindexed archives show up as excluded by noindex, and fixed pages drop off the list.

What I don't want to see is the same URLs coming back under a new label that's just as wrong, like a padded archive sitting in Crawled, currently not indexed. Then the problem's moved from status codes to page quality, and I work through it the way I'd handle any page that's crawled but left out of the index.

// when to hand this over

If your Page indexing report shows soft 404s you can't place in one of these three piles, or there are hundreds of them, that's the indexing work I do remotely: the export, the sorting, the fixes and the validation afterwards.

Book a call on Upwork

Is this your site? Send me the URL.

Book a call on Upwork
// questions - indexing

What else do people ask about this?

Will fixing soft 404 errors increase my traffic?

Only when the flagged URLs are pages people search for. Retiring an empty tag archive won't add a visit. Fixing a real product page that rendered empty for Googlebot can, once it's recrawled and indexed again.

Should I redirect soft 404 pages to the homepage?

No. Google's own guidance says redirecting old URLs to an irrelevant page like the homepage might itself be treated as a soft 404. Send each one to its closest match, or let it return a 404.

Can a real page with content be flagged as a soft 404?

Yes, when Google's render looks empty or reads like an error. A page that shows no results, or content that fails to load for Googlebot, can do it. The live test's View tested page screenshot shows what Google saw.

Does Request indexing clear a soft 404?

Not on its own. If the page hasn't changed, Google will see the same empty page again. I fix the cause first, run a live test to confirm it, and then validate the fix in the report.

// sources - checked

Where do these rules come from?

Platform and Google documentation, opened and read on the day this was written. Everything else is how I work.

  1. Google crawler documentation: how HTTP status codes affect Google's crawlers
  2. Google crawling documentation: optimize your crawl budget
  3. Search Console Help: Page indexing report
  4. Google Search Central: site moves with URL changes
  5. Google Search Central: understand the JavaScript SEO basics
  6. Cloudflare Pages docs: serving Pages, not found behavior and single page application rendering
  7. WordPress core source: WP::handle_404() in class-wp.php
  8. WordPress developer reference: wp_robots_noindex_search()
Muhammad Younus, WordPress technical SEO consultant
// who wrote this

One consultant, writing down his own method

I'm Muhammad Younus, a WordPress technical SEO consultant with 8+ years of experience and 100+ client sites fixed. Top Rated Plus on Upwork with a 100% Job Success Score. Every post here is the way I actually do the job, written in the first person because it's one person doing it, remotely, with no team behind the name.

Nothing in these posts is a client I can't name or a number I can't show. Where a figure comes from a client's Search Console, it's from a published case study, and where a rule comes from Google or a platform, the source is linked at the bottom of the post.

// the service behind this post
Muhammad Younus pointing toward the camera with an inviting smile
// next step

Want this done on your own site?

Book a call on Upwork, send the URL and read-only Search Console access, and you'll get a written scope for the search side before any work starts. One person does the whole job, remotely.

Book a call on Upwork