Skip to content

Vercel deployment errorVercel “404: NOT_FOUND” on a deployment that says Ready

The build passed, the dashboard says Ready, and the site, or part of it, returns 404: NOT_FOUND. Vercel serves pages from routing information created at build time, so the files can be there and still unreachable. Here are the causes in Vercel’s words, in the order to check them, or hand it over at a fixed price.

Short answer

First open the .vercel.app URL. If it works and your own domain doesn’t, fix the DNS records. If both 404, check that the Framework Preset isn’t set to Other and that the Output Directory matches where your build writes files, then redeploy. If only dynamic routes 404, set dynamicParams or render them dynamically.

Why a Ready deployment returns 404, and the fix

  1. 01

    The Framework Preset is set to Other

    “A Framework Preset set to "Other" lets Vercel skip framework-specific manifest generation, so the files exist with no routing instructions behind them.” Vercel, Why is my deployed project giving a 404?

    When the whole site 404s after a clean build, check Project Settings, then Build and Deployment, then Framework Settings. Select the framework you use, such as Next.js, and redeploy. It can work locally because local development doesn’t use Vercel’s routing manifest.

  2. 02

    The Output Directory doesn’t match the build

    “When the Output Directory setting does not match where the build tool drops files, Vercel serves an empty folder and every path 404s.” Vercel, Why is my deployed project giving a 404?

    If the build writes to dist but the project expects another folder, or the reverse, Vercel serves an empty folder. For Next.js the folder comes from distDir in next.config.js; for other frameworks, compare the setting in Project Settings with your build output.

  3. 03

    Only your custom domain returns 404

    “If .vercel.app works and your custom domain 404s, the deployment is healthy and the problem is DNS.” Vercel, Why is my deployed project giving a 404?

    Compare the .vercel.app address with your own domain. If only your domain fails, the build is fine: match the A record (apex domain) or CNAME record (subdomain) to what Vercel shows on the Domains page, and remove records left over from a previous host.

  4. 04

    Only dynamic routes return 404

    “When generateStaticParams returns an empty array and dynamicParams is not set to true, every non-prerendered route 404s.” Vercel, Why is my deployed project giving a 404?

    Static pages load and pages like /posts/[slug] or /api/items/[id] don’t. For pages, set export const dynamicParams = true, so paths that weren’t prerendered still render. For a dynamic route handler such as /api/items/[id] that 404s with no function log, Vercel’s guide adds the exports below; it notes this skips caching, so use it only where the route needs per-request data.

    export const runtime = 'nodejs'
    export const dynamic = 'force-dynamic'
    export const dynamicParams = true

Checked against the vendor’s docs on : Vercel Knowledge Base: Why is my deployed project giving a 404?; Vercel docs: NOT_FOUND.

Rather hand it over?

Fixed scope, fixed price, paid upfront. The work happens in writing; no call needed.

Related: 404 on refresh: Netlify and Vercel · Vercel Module not found · Vercel 413 payload too large · Vercel environment variables undefined

Questions

More on this error

Only refreshing a page returns 404. Is this the same problem?

It’s a related one. Vercel says single-page apps built with tools like Vite need an explicit catch-all rewrite in vercel.json. Our page on 404 on refresh covers that case step by step.

We added rewrites to vercel.json and nothing changed. Why?

Vercel says vercel.json has to live at the repository root and be committed to Git, and that when the file is not committed, the rewrites never apply and Vercel gives you no error. A Framework Preset set to Other can also stop a correct rewrite from taking effect.

Can you fix it for me?

If one bug is the whole problem, the App Fix Ticket covers it: a written diagnosis first, then the fix. If the app has more going on, the Launch Check is a written check of the whole app. Each issue found is rated critical, high, medium or low, with where it is and how it was confirmed. No issues worth fixing, no charge. If the Launch Check finds nothing rated medium or higher, Simon refunds the full $450. You keep the report either way.

A different error?

Describe it and get a written quote

Send the error and what you were doing. You get a written scope, a fixed price and a timeline; we reply by email, usually within one business day.