Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 194% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 416% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 250% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 505% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 302% | 0% |
Deploy and manage projects on Vercel using the CLI with token-based authentication, without relying on vercel login.
Before running any Vercel CLI commands, identify where the token is coming from. Work through these scenarios in order:
VERCEL_TOKEN is already set in the environmentbash[ -n "${VERCEL_TOKEN:-}" ] && printf 'VERCEL_TOKEN is set\n'
If this reports a configured token, you're ready. Skip to Step 2.
.env file under VERCEL_TOKENbashgrep -q '^VERCEL_TOKEN=' .env 2>/dev/null && printf 'VERCEL_TOKEN is present in .env\n'
If found, export it:
bashVERCEL_TOKEN="$(sed -n 's/^VERCEL_TOKEN=//p' .env | tail -n 1)" export VERCEL_TOKEN
.env file under a different nameLook for any variable that looks like a Vercel token (Vercel tokens typically start with vca_):
bashgrep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
Inspect the output to identify which variable holds the token, then export it as VERCEL_TOKEN:
bashvercel_var="<VARIABLE_NAME>" VERCEL_TOKEN="$(sed -n "s/^${vercel_var}=//p" .env | tail -n 1)" export VERCEL_TOKEN
If none of the above yield a token, ask the user to provide one. They can create a Vercel access token at vercel.com/account/tokens.
Important: Once VERCEL_TOKEN is exported as an environment variable, the Vercel CLI reads it natively — do not pass it as a --token flag. Putting secrets in command-line arguments exposes them in shell history and process listings.
bash# Bad — token visible in shell history and process listings vercel deploy --token "vca_abc123" # Good — CLI reads VERCEL_TOKEN from the environment [ -n "${VERCEL_TOKEN:-}" ] || { echo "Set VERCEL_TOKEN first" >&2; exit 1; } vercel deploy
Similarly, check for the project ID and team scope. These let the CLI target the right project without needing vercel link.
bash# Check environment [ -n "${VERCEL_PROJECT_ID:-}" ] && printf 'VERCEL_PROJECT_ID is set\n' [ -n "${VERCEL_ORG_ID:-}" ] && printf 'VERCEL_ORG_ID is set\n' # Or check .env grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
If you have a project URL (e.g. https://vercel.com/my-team/my-project), extract the team slug:
bash# e.g. "my-team" from "https://vercel.com/my-team/my-project" echo "$PROJECT_URL" | sed 's|https://vercel.com/||' | cut -d/ -f1
If you have both VERCEL_ORG_ID and VERCEL_PROJECT_ID in your environment, export them — the CLI will use these automatically and skip any .vercel/ directory:
bashexport VERCEL_ORG_ID="<org-id>" export VERCEL_PROJECT_ID="<project-id>"
Note: VERCEL_ORG_ID and VERCEL_PROJECT_ID must be set together — setting only one causes an error.
Ensure the Vercel CLI is installed and up to date:
bashnpm install -g vercel vercel --version
Always deploy as preview unless the user explicitly requests production. Choose a method based on what you have available.
When VERCEL_TOKEN and VERCEL_PROJECT_ID are set in the environment, deploy directly:
bashvercel deploy -y --no-wait
With a team scope (either via VERCEL_ORG_ID or --scope):
bashvercel deploy --scope <team-slug> -y --no-wait
Production (only when explicitly requested):
bashvercel deploy --prod --scope <team-slug> -y --no-wait
Check status:
bashvercel inspect <deployment-url>
Use this when you have a token and team but no pre-existing project ID.
bash# Does the project have a git remote? git remote get-url origin 2>/dev/null # Is it already linked to a Vercel project? cat .vercel/project.json 2>/dev/null || cat .vercel/repo.json 2>/dev/null
With git remote (preferred):
bashvercel link --repo --scope <team-slug> -y
Reads the git remote and connects to the matching Vercel project. Creates .vercel/repo.json. More reliable than plain vercel link, which matches by directory name.
Without git remote:
bashvercel link --scope <team-slug> -y
Creates .vercel/project.json.
Link to a specific project by name:
bashvercel link --project <project-name> --scope <team-slug> -y
If the project is already linked, check orgId in .vercel/project.json or .vercel/repo.json to verify it matches the intended team.
A) Git Push Deploy — has git remote (preferred)
Git pushes trigger automatic Vercel deployments.
bash git add . git commit -m "deploy: <description of changes>" git push
bash sleep 5 vercel ls --format json --scope <team-slug> Find the latest entry in the deployments array.
B) CLI Deploy — no git remote
bashvercel deploy --scope <team-slug> -y --no-wait
Check status:
bashvercel inspect <deployment-url>
bash git clone <repo-url> cd <repo-name>
bash vercel link --repo --scope <team-slug> -y
.vercel/ DirectoryA linked project has either:
.vercel/project.json — from vercel link. Contains projectId and orgId..vercel/repo.json — from vercel link --repo. Contains orgId, remoteName, and a projects map.Not needed when VERCEL_ORG_ID + VERCEL_PROJECT_ID are both set in the environment.
Do NOT run vercel project inspect or vercel link in an unlinked directory to detect state — they will interactively prompt or silently link as a side-effect. vercel ls is safe (in an unlinked directory it defaults to showing all deployments for the scope). vercel whoami is safe anywhere.
bash# Set for all environments echo "value" | vercel env add VAR_NAME --scope <team-slug> # Set for a specific environment (production, preview, development) echo "value" | vercel env add VAR_NAME production --scope <team-slug> # List environment variables vercel env ls --scope <team-slug> # Pull env vars to local .env.local file vercel env pull --scope <team-slug> # Remove a variable vercel env rm VAR_NAME --scope <team-slug> -y
bash# List recent deployments vercel ls --format json --scope <team-slug> # Inspect a specific deployment vercel inspect <deployment-url> # View build logs (requires Vercel CLI v35+) vercel inspect <deployment-url> --logs # View runtime request logs (follows live by default; add --no-follow for a one-shot snapshot) vercel logs <deployment-url>
bash# List domains vercel domains ls --scope <team-slug> # Add a domain to the project — linked or env-linked directory (1 arg) vercel domains add <domain> --scope <team-slug> # Add a domain — unlinked directory (requires <project> positional) vercel domains add <domain> <project> --scope <team-slug>
If this project is managed by Stripe Projects. Ask the user before running any paid or destructive plan change — upgrades bill a real card, downgrades remove seats.
First run stripe projects status --json to confirm the Vercel resource's local name. The examples below assume the default (vercel-plan); substitute the actual name if it was renamed at stripe projects add time.
stripe projects add vercel/pro (or stripe projects upgrade vercel-plan pro)stripe projects downgrade vercel-plan hobbyFull details: https://vercel.com/docs/plans/pro-plan
VERCEL_TOKEN as a --token flag. Export it as an environment variable and let the CLI read it natively..env files first..vercel/ files directly. The CLI manages this directory. Reading them (e.g. to verify orgId) is fine.--format json when structured output will help with follow-up steps.-y on commands that prompt for confirmation to avoid interactive blocking.Check the environment and any .env files present:
bashenv | grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' grep -Eio '^[A-Z0-9_]*VERCEL[A-Z0-9_]*(?==)' .env 2>/dev/null
If the CLI fails with Authentication required:
vercel whoami (uses VERCEL_TOKEN from environment).Verify the scope is correct:
bashvercel whoami --scope <team-slug>
Check the build logs:
bashvercel inspect <deployment-url> --logs
Common causes:
package.json is complete and committed.vercel env add.vercel.json. Vercel auto-detects frameworks (Next.js, Remix, Vite, etc.) from package.json; override with vercel.json if detection is wrong.bashnpm install -g vercel
Other measured skills in the registry, with their headline benchmark lift.