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.
| Cause | What the flagged URL looks like | The check that proves it |
|---|---|---|
| Empty or near-empty archive | A category, tag, author or product category page with no posts or products | It returns 200 and the rendered page lists nothing |
| Redirect to an unrelated page | An old URL that now redirects somewhere with a different topic | A header request shows a 301 or 302, and the destination doesn't match the old page |
| Host serves the homepage for missing URLs | Addresses that never existed, typos and old links | A made-up URL returns 200 with the same HTML as the homepage |
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.
| Response | What the visitor sees | What Google does |
|---|---|---|
| 404 Not Found | A not found page, ideally with a search box and links back into the site | Removes the URL from the index and crawls it less and less over time |
| 410 Gone | The same kind of page, with the removal marked as deliberate | Treats it exactly like a 404 |
| Soft 404 (200 OK) | An empty archive, an error message, or the homepage on an address that doesn't exist | Judges the content, reports a soft 404, leaves the URL out of the index and keeps crawling it |
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 UpworkWhich 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.
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.
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.
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.
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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Step 07
Static hosts: add a real not found page
A
404.htmlat 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. - 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.
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.
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.
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
