Article: Google Search Console often flags soft 404 errors in Next.js sites, which can waste crawl budget.

What a soft 404 actually is

A real 404 response sends an HTTP 404 status code, telling browsers and bots that the requested resource does not exist. A soft 404, by contrast, returns a 200 OK status while delivering little or no content. Search engines read the 200 as a healthy page, yet the page provides no value. The result is wasted crawl cycles and a signal to Google that the site’s content quality is low.

Why Next.js gets caught in the trap

Next.js’s dynamic routing lets you serve pages like /products/[slug] without hard-coding every URL. When a product disappears from the database, the component still renders, and if the code doesn’t check for missing data, Next.js replies with 200 OK by default. The same thing happens when a user mistypes a URL or when old routes linger after a redesign. The page loads, but it offers no meaningful content, triggering the soft-404 flag in Search Console.

The stakes for site owners

  • Crawl budget waste – Bots allocate a limited number of requests per site. Soft 404s eat that quota, leaving fewer chances for real pages to be indexed.
  • SEO penalty – Repeated soft 404s tell search engines the site is low quality.
  • User experience hit – Visitors who land on an empty page bounce immediately, inflating bounce rates and hurting conversions.

How to turn a soft 404 into a proper 404

1. Use the built-in notFound helper

  • App Router – Import notFound from next/navigation. After fetching data, call notFound() if the result is absent. Next.js then sends a true 404 status.
  • Pages Router – Return { notFound: true } from getStaticProps or getServerSideProps when the data fetch fails. That does the same thing for the older routing API.

2. Deploy a custom 404 page

The default error page leaves users stranded. Create app/not-found.js (App Router) or pages/404.js (Pages Router) with navigation links, a search box, or suggestions for related content. A well-designed 404 keeps visitors on the site instead of sending them straight to the exit.

3. Clean up orphaned routes

Delete static pages that no longer serve a purpose. If a file remains but its content is empty, add a notFound response or remove the file entirely. Regular audits of the pages or app directories stop dead URLs from leaking out.

4. Set up permanent (301) redirects for moved content

When a page’s URL changes, a 301 redirect tells browsers and bots the resource has permanently moved. Add redirects in next.config.js under the redirects key. This prevents the old URL from returning a 200 with no content.

5. Monitor and act on Search Console alerts

Check Google Search Console often to spot soft 404s. Use an automated crawler to surface new errors before they pile up. Treat each alert as a cue to verify the underlying data-fetch logic.

Bottom line

A page that returns 200 OK while delivering no content silently drains SEO value. In Next.js, dynamic routes and unchecked data fetches make soft 404s common, but you can eliminate them. Use notFound, build a helpful custom 404, prune orphaned routes, configure 301 redirects, and stay vigilant in Search Console to protect crawl budget, preserve rankings, and keep visitors on the site.