You’ve run into a real limitation of how Convex + Vercel work when you use vercel --prod --skip-domain: Convex deploys are immediate, while Vercel “stages” the new frontend and only flips traffic when you promote, so there’s a window where:
- New Convex backend is live
- Old frontend is still serving → calling functions that may have been removed/changed
The docs and support threads don’t describe a magic flag to make Convex wait for Vercel promotion, and they don’t cover --skip-domain specifically, so there’s no officially documented way to make these two promotions atomic. The recommended mitigation is to structure your deploys and changes to avoid breaking old clients.
Here’s what is documented and what you can do:
1. Use the documented Vercel build pattern
The official pattern is to make Vercel’s Build Command:
npx convex deploy --cmd 'npm run build'
Convex will:
- Run your frontend build (
npm run build) with CONVEX_URL set to the production deployment.
- Only after that, typecheck, bundle, and push functions to production. [Vercel hosting; CLI deploy]
This coordinates the builds so Convex doesn’t deploy if your frontend build fails. It does not change the fact that once npx convex deploy finishes, the new backend is live immediately, while Vercel may still be serving the old frontend until promotion.
So this pattern helps with “build succeeds/fails together”, but not with the “staged then promote” skew you’re seeing.
2. Make backend changes backwards compatible