A soft 404 is a URL that answers 200 OK while the page looks missing, empty or broken. Google leaves it out of its index. Fix it by making the status and the page agree: if the page shouldn’t exist, return a real 404 or 410. If it should, put its content on the page.
What makes Google call a page a soft 404?
Two things at once. The server sends 200 OK, the code that means “here’s your page.” And the page doesn’t look like one. Google’s docs name “an empty page or an error message,” and a friendly “not found” message sent without the 404 code. Redirecting a missing URL to your homepage counts too: Google’s help page on 404s says pages that redirect “such as the homepage, instead of returning a 404” are called soft 404s.
The difference is what Google does next. With a real 404, Google doesn’t index the URL, and “the crawling frequency gradually decreases.” A soft 404 stays out of the index too, but Google keeps coming back: its crawl budget guide says soft 404 pages “will continue to be crawled, and waste your budget.”
How often do startup sites answer 200 for a page that doesn’t exist?
About one in nine, in our test. On November 12, 2026, we picked 300 of the 2,283 active B2B companies in a public copy of Y Combinator’s directory at random and asked each site for a made-up URL. 292 answered, and 253 got it right with a 404. The other 32, 11%, ended on a page that answered 200 OK: 23 at the made-up URL itself, 9 after a redirect, 3 of those to the homepage. A second made-up URL caught the same 32.
For 26 of the 32, the page that came back had the homepage’s title. So a typo in someone’s link, or a page deleted last year, shows Google your homepage again at a new address. Only 3 of the 32 carried a noindex.
How do you fix a soft 404 on a software site?
Find where the 200 comes from. It’s one of five places, and each has its own fix.
Your host answers every URL with the app
A single-page app needs every path to load the same index.html, so hosts have a switch for it, and the switch catches made-up URLs too. On Cloudflare Workers, the single-page-application setting serves “the contents of the /index.html file with a 200 OK status” for any path that matches no file. Netlify’s single-page-app rule is /* /index.html 200, and a status of 200 makes a redirect rule a rewrite. Vercel’s single-page-app example rewrites every path to /index.html. If the marketing site and the app share a domain, the app’s catch-all answers the marketing site’s typos too.
Send missing URLs to a real 404 page instead. On Netlify or Vercel, point the catch-all at the app’s own paths, not every path. Our own site runs on Cloudflare Workers, and this is the whole setting:
In wrangler.jsonc
"assets": {
"directory": "./site/",
"not_found_handling": "404-page"
}
From Cloudflare’s docs on static site routing (updated August 25, 2026). A request that matches no file gets the nearest 404.html with a 404 Not Found status.
Your app decides in the browser
When the router works out in the browser that a page doesn’t exist, the server has already sent its 200. Google’s JavaScript SEO guide gives two ways out: “use a JavaScript redirect to a URL for which the server responds with a 404” (a /not-found page, say), or add <meta name="robots" content="noindex"> to the error page with JavaScript. Pick the redirect: it gives Google a real 404.
Next.js sends not-found after it starts streaming
notFound() returns a 404 when it runs before the response starts. Once the response is streaming (a loading.js file or a Suspense boundary starts it), “it keeps its 200 status” and Next.js adds a noindex tag. Its own docs say some crawlers “may label these responses as ‘soft 404s’.” Run the check that decides a page doesn’t exist before anything streams. On the Pages Router, returning notFound: true from getStaticProps sends a 404. More on how we work with Next.js sites.
A deleted page redirects to the homepage
It feels tidy, and Google still calls it a soft 404. Google’s John Mueller rates it “not great, not terrible.” If the page has a real replacement, 301 to that. If it doesn’t, let it return a 404 or a 410: Google “treats 410s (Gone) the same as 404s.”
The page is empty
A search with no results, a tag with no posts, an integrations page for a partner you dropped. Google reads those as empty pages. Give the page something to say, or noindex it while it’s empty. Mueller has said he doesn’t expect a noticeable difference between the two.
Then check the fix. Try a made-up URL on your own site: curl -I https://yoursite.com/no-such-page should print 404 on its first line. For a real page Google flagged, run the live test in URL Inspection and look at the screenshot of what Google rendered. Then click Validate fix in the report. Google says validation “typically takes up to about two weeks.” If the page moves to another status, our guides to crawled - currently not indexed and discovered - currently not indexed pick up from there.
Which soft 404s can you leave alone?
Most of the ones for pages that really are gone. That’s the report doing its job. Mueller says “it’s fine to have pages be gone, even if it’s tons of them,” and that 404s and 410s “are not a negative quality signal.” The crawl budget warning comes from Google’s guide for large sites, so a handful of dead URLs on a 50-page site costs you little.
Two kinds are worth your time. A page you want found, because a soft 404 keeps it out of Google, and out of AI Overviews too: Google only links pages that are “indexed and eligible to be shown in Google Search with a snippet.” And a site-wide catch-all, because one setting turns every typo anyone links to into a page Google keeps checking. If a real, full page shows up in the list, run the live test before you rewrite it. Google has misread real pages before: in 2021 Mueller blamed “a small change we made in the soft 404 detection.”
Our own site answers 404 for any page it doesn’t have, with a page that reads “This page isn’t indexed.” Google and AI have to know which of your pages exist before anyone can recommend them, so getting a software company’s pages indexed is the first thing we fix, for $2,000 a month. Here’s what the plan covers.