Overview
Vercel is the fastest zero-config host for Next.js, Astro, and most other Node-based frameworks. This guide covers the full lifecycle: project import, environment variables, build override, custom domain, and preview deploys. The deep-dive on Vercel-specific optimizations (Edge Middleware, ISR, split testing) lives in vercel.
Prerequisites
- A GitHub, GitLab, or Bitbucket account with the repository you want to deploy.
- A Vercel account. The Hobby plan covers personal projects; Pro is required for team features and custom preview domain suffixes.
- The
vercelCLI installed locally (optional but useful for debugging):npm i -g vercel.
Steps
1. Import the project
- Log in at vercel.com and click Add New > Project.
- Connect the Git provider if you have not already. Authorize Vercel to read repositories.
- Find your repository in the list and click Import.
- Vercel auto-detects the framework (Next.js, Astro, Vite, etc.) and pre-fills build settings. Verify them before continuing.
2. Set environment variables
Click Environment Variables before the first deploy. Add each variable Vercel needs at build time or runtime.
DATABASE_URL = postgresql://...
NEXT_PUBLIC_API_URL = https://api.example.com
SECRET_KEY = <generate with openssl rand -hex 32>
Mark variables Preview or Production only when their values differ between environments. Variables prefixed NEXT_PUBLIC_ are inlined into the client bundle; never put secrets in them. See vercel for the encrypted secrets workflow.
3. Override build settings if needed
For most frameworks the defaults are correct. Override when:
- The build command is non-standard, e.g.,
npm run build:prod. - The output directory differs from the framework default (
out/,dist/,.next/). - The install command must be
npm ciinstead ofnpm install.
Set these under Settings > Build & Development Settings after the first deploy, or in vercel.json at the repo root:
{
"buildCommand": "npm run build:prod",
"outputDirectory": "dist",
"installCommand": "npm ci"
}4. Deploy
Click Deploy. Vercel clones the repo, installs dependencies, runs the build command, and uploads the output. The first deploy takes 1 to 3 minutes. Watch the build log for errors; they appear in real time.
5. Attach a custom domain
- Go to Settings > Domains on the project page.
- Type your domain, e.g.,
example.com, and click Add. - Vercel shows a DNS record. Add it at your registrar or at cloudflare if DNS is proxied through Cloudflare.
- If Cloudflare proxies the domain, use a
CNAMEtocname.vercel-dns.comwith the Cloudflare proxy off (grey cloud), or configure a Cloudflare Worker to forward requests. Vercel’s TLS provisioning fails through an orange-cloud proxy.
- If Cloudflare proxies the domain, use a
- Vercel provisions a Let’s Encrypt certificate automatically once the DNS record resolves.
6. Enable preview deploys
Preview deploys are on by default. Every push to a non-production branch gets its own URL at <branch>--<project>.vercel.app. Share it with reviewers before merging.
Configure branch-specific environment variable overrides under Settings > Environment Variables by selecting the target branches. This lets staging use a staging database without a separate project.
Verify it worked
# 1. Production URL returns 200.
curl -sI https://example.com | head -3
# HTTP/2 200
# 2. SSL certificate is valid and issued by Let's Encrypt.
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -issuer
# 3. A push to a feature branch creates a preview URL.
git checkout -b test/preview-deploy
git commit --allow-empty -m "test: trigger preview deploy"
git push origin test/preview-deploy
# Vercel bot posts a comment to the PR with the preview URL.Common errors
- Build fails with “Command not found”. The framework CLI is not in
devDependencies. Add it topackage.jsonand redeploy. - Environment variable is undefined at runtime. The variable was set as
Preview-only but the deploy isProduction, or vice versa. Check the scope in Settings > Environment Variables. - Custom domain shows “Invalid Configuration”. Cloudflare orange-cloud proxy is interfering with Vercel’s TLS challenge. Set the Cloudflare proxy to DNS-only for the
wwwrecord until the certificate provisions, then re-enable the proxy. - 404 on all routes except
/. The framework uses client-side routing but the output directory contains only anindex.html. Add avercel.jsonwith"rewrites": [{"source": "/(.*)", "destination": "/index.html"}]. - Old code appears after deploy. Vercel cached a CDN edge node. Trigger a redeploy from the Vercel dashboard, or run
vercel --forcefrom the CLI.