CI/CD Testing Guide

How to Test Vercel Deploy Flow with Playwright: Complete 2026 Guide

A scenario-by-scenario walkthrough of testing Vercel deployment pipelines with Playwright. Git-backed deploys, build log streaming, preview URL generation, environment variable management, domain assignment, and the pitfalls that break real deploy verification suites.

Millions

Vercel processes millions of deployments per month, serving teams from solo developers to enterprises like Washington Post and Under Armour, with each deploy generating unique preview URLs, build logs, and domain assignments.

Vercel

0Deploy stages tested
0sAvg build time
0Scenarios covered
0%Fewer lines with Assrt

Vercel Deploy End-to-End Flow

DeveloperGit ProviderVercel PlatformBuild SystemCDN Edgegit push origin mainWebhook: push eventClone repo, install depsStream build logsBuild complete, artifacts readyDeploy to edge networkPreview URL liveDeploy ready notification

1. Why Testing Vercel Deploy Flows Is Harder Than It Looks

Vercel deployments look simple on the surface: push code, get a URL. But the machinery behind that experience involves a surprisingly deep pipeline of git webhooks, build queuing, artifact packaging, edge propagation, and domain routing. Each stage introduces asynchronous state transitions that your test suite must handle gracefully. A naive approach of “push and check the URL” will fail in CI more often than it succeeds, because build times are non-deterministic and preview URLs are not live until edge propagation completes.

There are five structural reasons this flow is difficult to test reliably. First, git-backed deploys are inherently asynchronous. The push triggers a webhook, Vercel queues the build, and the actual deployment may not start for several seconds. Second, build logs are streamed in real time through a WebSocket connection, which means your test cannot simply poll a REST endpoint for completion. Third, preview URLs are generated dynamically with hashed subdomains that are not predictable before the build starts. Fourth, environment variables are scoped to deployment targets (production, preview, development) and encrypted at rest, so verifying correct injection requires actual deployment output. Fifth, domain assignment involves DNS propagation delays that can take seconds to minutes, introducing timing uncertainty into any assertion.

Beyond the asynchronous nature, Vercel's dashboard is a React application with dynamic rendering, skeleton loading states, and real-time updates via server-sent events. Selectors that work during the “Building” phase may not exist during “Ready” because the DOM restructures when the deployment status changes. Your Playwright tests must account for these intermediate states rather than assuming a static page structure.

Vercel Deployment Pipeline

🌐

Git Push

Commit lands on branch

🔔

Webhook

GitHub/GitLab notifies Vercel

⚙️

Queue

Build enters queue

⚙️

Build

Install, compile, optimize

↪️

Deploy

Artifacts pushed to edge

Preview URL

Unique URL assigned

Domain Assignment Sub-Flow

🌐

Add Domain

Custom domain configured

⚙️

DNS Check

CNAME or A record verified

🔒

TLS Cert

Let's Encrypt provisioned

↪️

Edge Route

Domain mapped to deployment

Live

Traffic served at domain

A thorough Vercel deploy test suite covers all of these surfaces. The sections below walk through each scenario you need, with runnable Playwright TypeScript code you can copy directly into your project.

2. Setting Up Your Test Environment

Before writing any deploy verification tests, you need a dedicated Vercel project connected to a test repository. Never run deployment tests against your production project. Vercel's free Hobby tier supports preview deployments and the REST API, which is sufficient for most test scenarios. For teams, the Pro tier adds the Deployments API v6 with richer metadata and concurrent builds.

Vercel Deploy Test Setup Checklist

  • Create a dedicated Vercel project linked to a test repository
  • Generate a Vercel API token with deployment read/write scopes
  • Store the token, project ID, and team ID as CI environment variables
  • Install the Vercel CLI locally and in CI (npm i -g vercel)
  • Configure the test repo with a minimal Next.js or static site
  • Add a vercel.json with predictable build settings for test stability
  • Set up a GitHub webhook secret for verifying push event signatures
  • Create separate environment variable groups for preview and production

Environment Variables

.env.test

Vercel API Helper for Test Orchestration

Most deploy test scenarios need to trigger deployments programmatically and poll for status. The Vercel REST API v6 provides endpoints for creating deployments, listing deployments, and fetching build logs. Wrap these in a helper class that your Playwright tests can import.

test/helpers/vercel-api.ts

Playwright Configuration for Deploy Testing

Deploy tests run against the Vercel dashboard, which is a client-rendered React app with loading states and real-time updates. Set generous navigation timeouts and use a headed browser for debugging. The configuration below separates deploy tests from application tests using Playwright projects.

playwright.config.ts
Install dependencies

3. Scenario: Git Push Triggers a New Deployment

The foundational scenario for any Vercel deploy test is verifying that a git push actually triggers a deployment. This sounds trivial, but it involves webhook delivery, Vercel's git integration picking up the commit, and the deployment appearing in both the API and the dashboard. If this test fails, nothing else in your suite matters.

1

Git Push Triggers Deployment

Moderate

Goal

Push a commit to the test repository and verify that Vercel creates a new deployment within 30 seconds, with the correct commit SHA visible in the deployment metadata.

Preconditions

  • Test repository linked to a Vercel project with git integration enabled
  • Vercel API token with deployment read access
  • Git configured with push permissions to the test repository

Playwright Implementation

test/deploy/git-push-trigger.spec.ts

What to Assert Beyond the UI

  • The Vercel API returns a deployment with the matching commit SHA in meta.githubCommitSha
  • The deployment state transitions from QUEUED to BUILDING within 30 seconds
  • The deployment branch matches the pushed branch name

Git Push Deploy Verification

import { test, expect } from '@playwright/test';
import { execSync } from 'child_process';
import { VercelTestClient } from '../helpers/vercel-api';

const vercel = new VercelTestClient(
  process.env.VERCEL_TOKEN!,
  process.env.VERCEL_PROJECT_ID!,
);

test('git push triggers deployment', async ({ page }) => {
  const before = await vercel.listDeployments(1);
  execSync('cd /tmp/fixture && echo "// test" >> trigger.ts && git add -A && git commit -m "test" && git push');
  const sha = execSync('cd /tmp/fixture && git rev-parse HEAD', { encoding: 'utf-8' }).trim();

  let found = null;
  for (let i = 0; i < 10; i++) {
    const deps = await vercel.listDeployments(3);
    found = deps.find(d => d.id !== before[0]?.id);
    if (found) break;
    await page.waitForTimeout(3000);
  }
  expect(found).not.toBeNull();
  await page.goto(`/project/${found!.id}`);
  await expect(page.getByText(sha.slice(0, 7))).toBeVisible();
});
55% fewer lines

4. Scenario: Build Log Streaming and Status Transitions

Once a deployment is triggered, Vercel streams build logs in real time to the dashboard. Testing this involves verifying that logs appear progressively, that status transitions are reflected in the UI, and that the final state matches the expected outcome. Build logs are delivered through a combination of server-sent events and polling, which makes them particularly tricky to assert against.

2

Build Log Streaming Verification

Complex

Goal

Navigate to an active deployment's build page and verify that build logs stream in progressively, status badges update from “Building” to “Ready,” and the final log contains the expected build output markers.

Playwright Implementation

test/deploy/build-logs.spec.ts

What to Assert Beyond the UI

  • Build log line count increases over time during the “Building” phase
  • The Vercel API status matches the dashboard badge (no stale UI state)
  • Build duration reported in the UI is within 10% of the API-reported value
Example build log output

Try Assrt for free

Open-source AI testing framework. No signup required.

Get Started

5. Scenario: Preview URL Generation and Accessibility

Every Vercel deployment generates a unique preview URL. For branch deploys, this URL follows the pattern {project}-{hash}-{team}.vercel.app. Testing that the preview URL is actually accessible (returns HTTP 200), renders the correct content, and reflects the pushed commit is critical for teams that use preview deployments for PR reviews.

3

Preview URL Generation

Moderate

Goal

After a deployment completes, extract the preview URL from both the Vercel API and the dashboard, navigate to it, and verify that the deployed application renders correctly with the expected commit's changes.

Preconditions

  • A deployment in READY state
  • The test commit includes a visible change (e.g., a timestamp in the footer)
  • No password protection on preview deployments

Playwright Implementation

test/deploy/preview-url.spec.ts

What to Assert Beyond the UI

  • The preview URL responds with correct x-vercel-id headers
  • The x-vercel-deployment-url header matches the expected URL
  • Static assets (JS, CSS) load without 404 errors on the preview domain

Preview URL Verification

import { test, expect } from '@playwright/test';
import { VercelTestClient } from '../helpers/vercel-api';

const vercel = new VercelTestClient(
  process.env.VERCEL_TOKEN!,
  process.env.VERCEL_PROJECT_ID!,
);

test('preview URL accessible', async ({ page }) => {
  const deps = await vercel.listDeployments(5);
  const ready = deps.find(d => d.state === 'READY');
  expect(ready).toBeDefined();

  const res = await page.goto(`https://${ready!.url}`);
  expect(res?.status()).toBe(200);
  await expect(page.locator('body')).not.toContainText('404');
  expect(ready!.url).toMatch(/\.vercel\.app$/);
});
53% fewer lines

6. Scenario: Environment Variable Configuration

Vercel environment variables are scoped to deployment targets: Production, Preview, and Development. Each variable can be plain text, a secret (encrypted), or a system-level variable. A common failure mode in real projects is configuring a variable for Production but forgetting to add it to Preview, causing preview deployments to crash with missing configuration. Testing this flow means verifying that variables are correctly set via the API, visible in the dashboard settings, and actually injected into the deployed application.

4

Environment Variable Injection

Complex

Goal

Create an environment variable via the Vercel API, trigger a deployment, and verify the variable is available in the deployed application's runtime. Then verify the variable appears correctly in the Vercel dashboard settings page.

Playwright Implementation

test/deploy/env-vars.spec.ts

What to Assert Beyond the UI

  • The API reports the correct target scopes (preview, production, or both)
  • Encrypted variables show as masked in the dashboard but are decrypted in the runtime
  • Removing a variable and redeploying causes the app to no longer see it
Environment variable management via CLI

7. Scenario: Custom Domain Assignment and DNS Verification

Assigning a custom domain to a Vercel project involves configuring DNS records (CNAME or A records), waiting for Vercel to verify ownership, and then provisioning a TLS certificate via Let's Encrypt. The entire process can take anywhere from seconds to several minutes, and each step has its own failure modes: incorrect DNS records, propagation delays, certificate authority rate limits, and conflicting domain configurations on other Vercel projects.

5

Custom Domain Assignment

Complex

Goal

Add a custom domain to the test project via the Vercel API, verify DNS configuration status in the dashboard, and confirm that the domain serves the deployed application with a valid TLS certificate.

Playwright Implementation

test/deploy/domain-assignment.spec.ts

What to Assert Beyond the UI

  • The API domain object shows verified: true before navigating
  • The TLS certificate subject matches the custom domain
  • The x-vercel-deployment-url header on the custom domain points to the same deployment as the preview URL

8. Scenario: Production Promotion from Preview

Vercel supports promoting a preview deployment to production without triggering a rebuild. This is a powerful workflow for teams that want to test a preview deployment thoroughly before making it live. The promotion is instant because the build artifacts are already compiled and cached on the edge network. Testing this flow verifies that the promotion API works, the production domain switches to the promoted deployment, and the previous production deployment is gracefully replaced.

6

Preview to Production Promotion

Moderate

Goal

Take a READY preview deployment, promote it to production via the API, verify the production URL now serves the promoted deployment's content, and confirm the dashboard reflects the promotion.

Playwright Implementation

test/deploy/production-promotion.spec.ts

What to Assert Beyond the UI

  • The production domain's x-vercel-id header contains the promoted deployment's region
  • The previous production deployment is still accessible at its original preview URL
  • Promotion does not trigger a new build (no new build logs appear)

Production Promotion

import { test, expect } from '@playwright/test';
import { VercelTestClient } from '../helpers/vercel-api';

const VERCEL_API = 'https://api.vercel.com';
const vercel = new VercelTestClient(
  process.env.VERCEL_TOKEN!,
  process.env.VERCEL_PROJECT_ID!,
);

test('promote preview to production', async ({ page, request }) => {
  const deps = await vercel.listDeployments(10);
  const preview = deps.find(d => d.state === 'READY');
  expect(preview).toBeDefined();

  const res = await request.post(
    `${VERCEL_API}/v10/projects/${process.env.VERCEL_PROJECT_ID}/promote/${preview!.id}`,
    { headers: { Authorization: `Bearer ${process.env.VERCEL_TOKEN}` } },
  );
  expect(res.status()).toBeLessThan(400);
  await page.waitForTimeout(5000);

  const prodPage = await page.goto(`https://${process.env.VERCEL_PRODUCTION_DOMAIN}`);
  expect(prodPage?.status()).toBe(200);
});
62% fewer lines

9. Common Pitfalls That Break Vercel Deploy Test Suites

After working through the scenarios above, here are the most frequently reported issues that cause Vercel deploy tests to fail in CI. Each of these has been sourced from real GitHub issues, Vercel community discussions, and production debugging sessions.

Pitfalls to Avoid

  • Hardcoding preview URLs instead of extracting them from the API. Preview URLs contain build-specific hashes that change every deployment.
  • Setting insufficient timeouts for builds. Framework builds (Next.js, Nuxt) can take 60 to 120 seconds. A 30-second timeout will cause intermittent failures.
  • Ignoring deployment queue delays. During peak hours, Vercel may queue builds for several seconds before starting. Poll the API for BUILDING state before asserting on logs.
  • Testing against the production project. Always use a dedicated test project. Accidental production promotions from test scripts can take down your live site.
  • Forgetting to scope environment variables to the correct target. A variable set only for Production will not be available in Preview deployments, causing silent crashes.
  • Not accounting for edge propagation delay. A deployment state of READY means the build is done, but edge propagation may take 1 to 3 additional seconds. Add a short delay before hitting the preview URL.
  • Relying on dashboard DOM selectors that change between Vercel releases. Vercel ships frequent UI updates. Prefer API-based assertions over dashboard scraping for critical checks.
  • Running parallel deploys on the same project. Vercel processes one build at a time per project on the Hobby plan. Concurrent pushes queue and can cause unexpected ordering.

Edge Propagation Timing

A deployment entering the READY state in the Vercel API does not guarantee the preview URL responds immediately. Edge regions around the world pick up the new deployment at slightly different times. In tests, add a 2 to 3 second buffer after the API reports READY before making HTTP requests to the preview URL. Without this buffer, you will see intermittent 404 or 502 responses, especially from edge regions distant from the build region.

Common failure: hitting preview URL too early

API Rate Limits

The Vercel REST API enforces rate limits per token. On the Hobby plan, you get approximately 100 requests per 60 seconds. If your test suite polls aggressively (every 500ms), you can exhaust this limit during a single build wait. Use 3-second polling intervals and cache API responses where possible. The rate limit headers x-ratelimit-remaining and x-ratelimit-reset are included in every API response; log them during test development so you can tune polling frequency.

10. Writing These Scenarios in Plain English with Assrt

The Playwright tests in this guide are effective but verbose. Each scenario requires importing test helpers, constructing API clients, managing polling loops, and writing precise locator chains for the Vercel dashboard. When Vercel ships a UI update (which happens frequently), selectors break and you have a substantial maintenance burden. Assrt lets you describe the scenario in plain English, generates the equivalent Playwright code, and regenerates the selectors automatically when the underlying page changes.

The preview URL scenario from Section 5 demonstrates this well. In raw Playwright, you need to know the exact API endpoint for listing deployments, how to filter for READY state, how to construct the preview URL from the deployment object, and which locators to use on the Vercel dashboard to cross-reference. In Assrt, you describe the intent and let the framework handle the implementation details.

scenarios/vercel-deploy-suite.assrt

Assrt compiles each scenario block into the same Playwright TypeScript you saw in the preceding sections, committed to your repo as real tests you can read, run, and modify. When Vercel updates their dashboard layout, renames a status label, or restructures the deployment detail page, Assrt detects the failure, analyzes the new DOM, and opens a pull request with the updated locators. Your scenario files stay untouched.

Start with the git push trigger scenario. Once it is green in your CI, add the preview URL verification, then the environment variable injection test, then the production promotion, then the domain assignment flow. In a single afternoon you can have complete Vercel deploy pipeline coverage that most teams never manage to achieve by hand.

Related Guides

Ready to automate your testing?

Assrt discovers test scenarios, writes Playwright tests from plain English, and self-heals when your UI changes.

$npm install @assrt/sdk