Quality Assurance·

Vercel deployment_status vs repository_dispatch: Triggering Tests on a Preview

Vercel now recommends repository_dispatch over deployment_status for GitHub Actions. What changes for tests on preview deployments, and which event to use for a merge gate.

QA.tech team

Abstract glass and brass trigger mechanism representing tests starting on a Vercel preview

In April 2025 Vercel started recommending repository_dispatch over deployment_status for running GitHub Actions after a deploy. deployment_status keeps working for backwards compatibility. The two events reach the same workflow file, but they attach the run to different commits, and for tests on a pull request that decides whether the result shows up where the reviewer is looking.

deployment_status vs repository_dispatch at a glance

deployment_statusrepository_dispatch
Sent by VercelBy default, unless you turn it off in Git settingsWhen the deployment status changes
Event to listen fordeployment_status, then check the statetypes: [vercel.deployment.success]
Preview URLgithub.event.deployment_status.environment_urlgithub.event.client_payload.url
GITHUB_SHAThe commit being deployedThe last commit on the default branch
Workflow file must be onThe branch being deployedThe default branch

The GITHUB_SHA row comes from GitHub's event reference, and it's the one that matters. A check created by a deployment_status run lands on the pull request's commit. A repository_dispatch run belongs to your default branch, so its result doesn't appear as a check on the pull request unless you post it there yourself.

Scenario: you want a red check that blocks the merge

Use deployment_status. Filter out production and anything that isn't a success, and run against the URL from the event:

name: Critical paths on preview
on: deployment_status

jobs:
  e2e:
    if: >
      github.event.deployment_status.state == 'success' &&
      github.event.deployment.environment != 'production'
    runs-on: ubuntu-latest
    steps:
      - uses: QAdottech/run-action@v4
        with:
          project_short_id: 'proj_abc123'
          api_token: ${{ secrets.QATECH_API_TOKEN }}
          test_plan_short_id: 'pln_abc123' # your critical-path plan
          blocking: true
          applications_config: |
            {
              "applications": {
                "app_abc123": {
                  "environment": {
                    "url": "${{ github.event.deployment_status.environment_url }}"
                  }
                }
              }
            }

deployment_status fires for production deploys too, and for every Vercel project in the repo, which is why the if: is there. Check the exact environment names on one of your pull requests, since a monorepo has one per project. With blocking: true the step waits for the run and fails on a failed result, and you can make the job required in branch protection.

Keep this plan small. Sign-up, login, checkout, whatever must never break. Everything else on the pull request is better chosen from the change.

Scenario: you want the deployment details Vercel adds

Use repository_dispatch when the job doesn't need to report on the pull request: posting to Slack when a preview is ready, warming a cache, running a smoke check against production after a promotion. Vercel's GitHub docs list event types for each state, including vercel.deployment.success, vercel.deployment.error and vercel.deployment.promoted, and the payload carries the deployment URL and environment.

on:
  repository_dispatch:
    types: [vercel.deployment.success]

jobs:
  notify:
    if: github.event.client_payload.environment != 'production'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Preview ready at ${{ github.event.client_payload.url }}"

The workflow only runs once this file is on your default branch, so a pull request that adds it won't trigger it until it merges.

Scenario: you turned off deployment_status events

Vercel's Git settings have a toggle for deployment_status events, and the docs tell you to check that no workflow depends on them first. Any workflow written as in the first scenario stops running. If your pull request reviews come from a GitHub App that reads deployments rather than a workflow, open a test pull request after flipping the toggle and confirm the review still starts. If it doesn't, you can always start one by commenting @qa.tech with the preview URL.

You may not need a workflow at all

Both events exist so that a workflow can find the preview. A tool that reads the deployment record on the pull request finds it without one. That's how PR testing from QA.tech, an AI testing platform, works on Vercel: the agent reads the diff and the PR description, picks the test cases that cover the change, writes new ones for gaps, runs them on the preview and posts a review with a QA.tech / PR Review check you can require before merge. It can't test a change with no UI behind it, and it needs the preview to be reachable, so set up Vercel preview protection first.

The QA.tech pull request list with a review tooltip: 4 tests passed, no regressions found

The common setup is both: a small critical-path plan on deployment_status, plus a review chosen from each pull request. For the full picture, start with Vercel preview protection.

FAQ

Is Vercel's deployment_status event deprecated? No. Vercel recommends repository_dispatch for new workflows, and says deployment_status events continue to work for backwards compatibility. You can turn them off per project in Git settings.

How do I get the Vercel preview URL in GitHub Actions? On deployment_status, read github.event.deployment_status.environment_url. On repository_dispatch, read github.event.client_payload.url.

Why doesn't my repository_dispatch workflow show a check on the pull request? GitHub runs repository_dispatch workflows against the last commit on the default branch, so the run isn't attached to the pull request's commit.

Why didn't my repository_dispatch workflow run? The workflow file has to exist on the default branch. A pull request that adds it won't trigger it before merge.

Which Vercel event should trigger end-to-end tests on a pull request? deployment_status, filtered to successful non-production deployments, because its run is attached to the commit being deployed and its checks appear on the pull request.

Your team moves fast. Can your testing keep up?

Our QA agents test your product autonomously, so moving fast never means shipping broken. Start free or get a 30-minute demo.