๐ ๐ ๐ฅ๐ฒ๐ฑ๐ถ๐ฟ๐ฒ๐ฐ๐๐ ๐ช๐ผ๐ฟ๐ธ๐ฒ๐ฑ ๐ถ๐ป ๐๐ต๐ฒ ๐๐ฟ๐ผ๐๐๐ฒ๐ฟ, ๐ฏ๐๐ ๐๐ผ๐ผ๐ด๐น๐ฒ ๐๐ฎ๐ ๐ฆ๐ผ๐ณ๐ ๐ฐ๐ฌ๐ฐ๐
Google Search Console flagged six URLs as Soft 404.
I checked them with a curl command. Every URL returned a 200 OK status. The pages looked fine to me. So why did Google think they were not found?
The problem was a technical trap in my Single Page App (SPA).
A hard 404 is honest. The server says the page is gone. A Soft 404 is a lie. The server says "here is your page" with a 200 OK status, but the content looks like an error or an empty page to Google.
Here is how it happened:
The site used React and Vercel. We used a prerender layer to show real HTML to crawlers. If a route was prerendered, it worked. If not, it fell back to the app shell. This shell is basically the homepage HTML.
I had three redirects working in the code. They used the React Router Navigate component.
In a browser, it works. The app loads, the JavaScript runs, and the user moves to the new URL.
But Googlebot works differently:
- Googlebot requests the old URL.
- The server sends the app shell with a 200 OK status.
- The crawler sees the homepage content instead of the blog post.
- The crawler stops there. It does not wait for the JavaScript to run the redirect.
To Google, you served a page that has nothing to do with the URL. That is a Soft 404.
The fix is simple: move the redirect from the app to the server.
Use a server-side 3xx redirect. On Vercel, add a redirect rule in your vercel.json file. This sends a 308 permanent redirect. Now, Google gets the correct instruction before any JavaScript loads.
Two important lessons from this:
GSC reports are snapshots. They are not live. Always check the lastCrawlTime in the API. You might spend hours fixing a bug that Google already knows you fixed.
Do not submit redirect sources to the Indexing API. It is a waste of time. Use the Validate Fix button in Search Console for redirects. Only submit the actual live pages you want indexed.
A 200 status does not mean Google sees a real page. If your content does not match your URL, Google will call it a Soft 404.