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
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.
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.
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.
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.
- from $450App Fix TicketOne reproducible bug in an existing mobile or web app, diagnosed and fixed.See scope and start
- from $450AI-Built App RescueA Lovable, Bolt or Cursor app checked end to end in 3 days, then its worst problems fixed at a fixed price.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.See scope and start
Related: 404 on refresh: Netlify and Vercel · Vercel Module not found · Vercel 413 payload too large · Vercel environment variables undefined