Overview
Deploy Verify is a post-deployment verification service that validates real user-facing behavior using AI-powered browser automation. After you deploy your web application, Deploy Verify launches a headless browser, follows the steps you define, and verifies that everything works correctly from a real user's perspective.
What makes Deploy Verify different?
- Natural language tests — Write instructions like "Click the login button" instead of
document.querySelector('.btn-login').click() - AI-powered browser — An AI agent understands your page and interacts with it like a real user
- Post-deploy verification — Automatically runs after every deployment via webhooks
- CI/CD integration — Trigger from GitHub Actions, GitLab CI, CircleCI, or any pipeline with a single curl command
- Screenshots & artifacts — See exactly what the browser saw during each test run
Quick Start Guide
Get up and running in four steps:
Create a Site
Add your website by providing a name and base URL (e.g., https://myapp.com). This is the domain where all your tests will run.
Write a Test
Create a test with natural language instructions describing what a user should do, and assertions describing what should be true after those actions.
Run it Manually
Click "Run Test Now" to verify your test works. Review the results, screenshots, and any failures.
Add the Webhook to Your Pipeline
Copy your site's webhook URL and add a curl command to your CI/CD pipeline. Tests will run automatically after every deploy.
Key Concepts
Understanding the core data model helps you get the most out of Deploy Verify:
Site
A website you want to test. Each site has a base URL, a webhook for triggering runs, and one or more tests.
Test
A user interaction flow described in natural language. For example, "Log in and verify the dashboard loads." Each test belongs to a site.
Webhook
A unique URL for each site that triggers a verification run when called. Add it to your CI/CD pipeline to automate testing.
Run
A single verification execution. When triggered, a run executes all active tests for the site and reports pass/fail results.
Artifact
Output captured during a test run: screenshots, HTML snapshots, console logs, and more. Artifacts help you debug failures.
Creating a Site
A site represents a web application you want to verify after deployments. To create one:
- Click "Sites" in the top navigation bar, or click "Add Your First Site" from the dashboard.
- Click the "Add Site" button.
- Fill in the required fields:
- Site Name — A descriptive name for your site (e.g., "Production App", "Staging Environment").
- Base URL — The root URL of your site (e.g.,
https://myapp.com). All test paths are relative to this URL.
- Optionally add a description for your own reference.
- Click "Create Site".
After creation, you'll be taken to the site detail page where you can set up your webhook and create tests.
Site Settings
Each site has the following configurable properties:
| Setting | Description |
|---|---|
Site Name |
Display name for the site. Used in the dashboard, notifications, and run results. |
Base URL |
The root URL of your application. Test starting paths are appended to this URL. Include the protocol (e.g., https://). |
Description |
Optional notes about the site for your own reference. |
Active |
When disabled, the site's webhook will reject trigger requests and no runs will be created. |
Auth Config |
Encrypted credentials for sites that require authentication. See Authentication Config. |
To edit a site, navigate to the site detail page and click the "Edit" button.
Authentication Config
If your site requires authentication (e.g., login credentials to access protected pages), you can configure an authentication config on the site. This is stored encrypted and is used by the browser automation agent to log in before running tests.
The auth config is provided as a JSON object when editing a site. The browser agent uses these credentials to perform authentication before executing your tests.
Managing Sites
The Sites page shows all your registered sites in a searchable grid view. Each site card displays:
- Site name and base URL
- Active/inactive status indicator
- Number of tests configured
- Recent run results
Click on any site card to view its detail page, where you can manage tests, view the webhook URL, and see recent run history.
Searching Sites
Use the search bar at the top of the Sites page to filter sites by name. The search updates in real-time as you type.
Deleting a Site
To delete a site, go to the site's edit page and use the delete option. Deleting a site also removes all associated tests, webhooks, runs, and artifacts.
Creating Tests
Tests define what Deploy Verify should do when verifying your site. Each test describes a user flow using natural language instructions and assertions.
To create a test:
- Navigate to a site's detail page.
- Click the "Create Test" button.
- Fill in the test form:
- Test Name — A descriptive name (e.g., "Login flow", "Homepage loads correctly").
- Description — Optional notes about the test for your own reference. (e.g., "Confirming login functionality with test user").
- Starting Path — The URL path where the test begins (e.g.,
/login,/). This is appended to the site's base URL. - Instructions — Natural language steps for the AI browser agent to follow. The easiest way to write these is with the AI Assistant.
- Assertions — What should be verified after the instructions are executed.
- Click "Save Test".
AI Assistant
The fastest way to write test instructions is with the AI writing assistant. Describe what you want to test in plain English, and it will generate detailed step-by-step instructions for you. You can then review and refine them.
Using the AI Assistant
- In the test editor, expand the "AI Writing Assistant" panel.
- Describe what you want to test in plain English (e.g., "Test that a user can log in and see their profile").
- Click "Generate Instructions".
- The AI will generate detailed step-by-step instructions for your test.
- Review and edit the generated instructions as needed.
Writing Instructions
Whether you started with the AI Assistant or are writing from scratch, your instructions should be clear, step-by-step actions in plain English that tell the AI browser agent exactly what to do on your site.
Best Practices
- Be direct and specific — Say exactly what to do: "Click the Sign In button" not "Find a way to log in."
- Include concrete values — Use actual text: "Type '[email protected]' in the email field" not "Enter an email."
- One action per line — Break complex flows into sequential steps for reliability.
- Reference visible text — Refer to elements by their visible label text rather than CSS classes or IDs.
Example: Login Flow
Click the "Sign In" link in the navigation bar
Type "[email protected]" in the Email field
Type "password123" in the Password field
Click the "Log In" button
Wait for the dashboard page to load
Example: E-commerce Checkout
Click on the first product in the product grid
Click the "Add to Cart" button
Click the cart icon in the header
Verify the cart shows 1 item
Click "Proceed to Checkout"
Fill in the shipping form with test data
Click "Place Order"
Example: Form Submission
Click the "Contact Us" link in the footer
Type "John Doe" in the Name field
Type "[email protected]" in the Email field
Type "This is a test message" in the Message field
Click the "Send Message" button
window.open()) are not supported. The browser agent operates within a single page context, so it cannot interact with or verify content in secondary windows. If your site opens a popup, consider testing the destination URL directly as a separate test instead.
Writing Assertions
Assertions define what should be true after your instructions have been executed. They are the "verification" part of Deploy Verify — if any assertion fails, the test fails.
Write assertions as plain English statements describing what the AI should check:
Example Assertions
The page should display "Welcome back, John"
The URL should contain "/dashboard"
A navigation menu should be visible
The "Log Out" button should be present
No error messages should be visible on the page
Assertion Types
Deploy Verify supports a wide range of assertion types for granular verification:
| Type | What It Checks | Example |
|---|---|---|
Text is visible |
Specific text appears on the page | "Welcome back" is visible |
Text is not visible |
Specific text does NOT appear | "Error" is not visible |
Element exists |
A DOM element is present | A <nav> element exists |
Element not exists |
A DOM element is NOT present | No error modal exists |
Element visible |
An element is visible on screen | The submit button is visible |
Element not visible |
An element is hidden | The loading spinner is hidden |
URL equals |
Current URL matches exactly | URL is /dashboard |
URL contains |
Current URL contains a substring | URL contains /account |
URL matches |
Current URL matches a pattern | URL matches /users/\d+ |
Title equals |
Page title matches exactly | Title is "Dashboard - MyApp" |
Title contains |
Page title contains a substring | Title contains "Dashboard" |
Attribute equals |
Element attribute has exact value | Input has type="email" |
Attribute contains |
Element attribute contains value | Class contains active |
Input value |
Form input has specific value | Email field contains test@ |
Element count |
Number of matching elements | 3 list items are present |
Smart Assertions Instant
Smart assertions are evaluated directly via Playwright's browser DOM APIs — they return results instantly with no AI processing. When your assertion text matches one of the patterns below, Deploy Verify skips the AI evaluation entirely.
Pattern Reference
CSS selectors must be wrapped in quotes (single or double) to trigger smart matching.
| Category | Pattern | Example |
|---|---|---|
| URL | URL contains | The URL contains "/dashboard" |
| URL equals / is / matches | The URL equals "https://example.com/home" |
|
| Page Title | Title contains | The page title contains "Dashboard" |
| Title equals / is | The page title is "My App" |
|
| Text | Text is visible | text "Welcome back" is visible |
| Text is not visible | text "Error" is not visible |
|
| Page contains | page contains "Success" |
|
| Page does not contain | page does not contain "404" |
|
| Element (CSS) | Element exists | element "#logout-btn" exists |
| Element does not exist | element ".error-modal" does not exist |
|
| Element is visible | element "nav.main-menu" is visible |
|
| Element is not visible / hidden | element ".loading-spinner" is hidden |
|
| Count (CSS) | N elements matching | 3 elements matching ".product-card" |
| Input (CSS) | Input has value | input "#email" has value "[email protected]" |
| Input contains | input "#search" contains "deploy" |
|
| Checkbox (CSS) | Checkbox is checked | checkbox "#terms" is checked |
| Checkbox is not checked | checkbox "#newsletter" is not checked |
|
| Attribute (CSS) | Attribute equals | element "#email" attribute "type" equals "email" |
| Attribute contains | element ".btn" attribute "class" contains "active" |
AI-Evaluated Assertions (Fallback)
Any assertion that doesn't match a smart pattern above is automatically sent to the AI model for evaluation. This is useful for subjective or visual checks:
The page looks like a login form
A navigation menu is visible with at least 5 items
The overall layout appears correct
Best Practices
- Prefer smart patterns — use the table above whenever the check can be expressed as a URL, text, or DOM query.
- Quote CSS selectors —
element "#my-id" existstriggers smart matching;element #my-id existsdoes not. - Use specific selectors — IDs (
#logout-btn) are more reliable than class-based selectors that may change. - Reserve AI assertions for subjective checks — "the page looks correct" or "no errors are visible" are good uses of AI evaluation.
- Check execution logs — smart assertions show as
assertion_programmaticin the run detail page, confirming they bypassed the AI.
Test Settings
Each test has the following configurable properties:
| Setting | Description | Default |
|---|---|---|
Name |
Display name for the test, shown in run results and notifications. | — |
Starting Path |
The URL path appended to the site's base URL where the test begins (e.g., /login). |
/ |
Instructions |
Natural language steps for the browser agent to execute. | — |
Assertions |
Natural language descriptions of what should be verified. | — |
Description |
Optional notes about the test purpose for your own reference. | — |
Timeout |
Maximum time in seconds the test is allowed to run before being marked as failed. Range: 10–600 seconds. | 300s |
Active |
Whether this test is included when a webhook triggers a run. Inactive tests are skipped. | Active |
Running Tests Manually
You can run any test manually without triggering the webhook. This is useful for developing and debugging tests.
- Navigate to the test editor by clicking "Edit" on a test from the site detail page.
- Click the "Run Test Now" button.
- You'll be taken to the test runner page where you can watch the run progress in real-time.
- Once complete, review the results including pass/fail status, step-by-step details, and captured artifacts.
Manual runs are tagged differently from webhook-triggered runs in the dashboard, so you can easily distinguish between the two.
Webhook Setup
Each site automatically gets a webhook when created. The webhook provides a unique URL that you can call to trigger a verification run across all active tests for that site.
Finding Your Webhook URL
- Navigate to your site's detail page.
- The webhook URL is displayed prominently at the top of the page.
- Click the copy button to copy the URL to your clipboard.
The webhook URL has the format:
https://deployverify.com/api/webhook/YOUR_UNIQUE_TOKEN
Regenerating the Token
If your webhook token is compromised, you can regenerate it from the site detail page. Click the "Regenerate" button next to the webhook URL. This will invalidate the old token immediately — make sure to update your CI/CD pipelines with the new URL.
Triggering Webhooks
Trigger a verification run by sending a POST request to your webhook URL:
curl -X POST https://deployverify.com/api/webhook/YOUR_TOKEN
You can optionally include metadata about the deployment in the request body:
curl -X POST https://deployverify.com/api/webhook/YOUR_TOKEN \
-H "Content-Type: application/json" \
-d '{
"commit": "abc123f",
"branch": "main",
"environment": "production",
"actor": "jane.doe",
"repository": "my-org/my-app"
}'
Response
A successful trigger returns a 202 Accepted response with the run ID:
{
"message": "Verification run queued successfully",
"run_id": 42,
"status_url": "https://deployverify.com/api/runs/42"
}
Use the status_url to poll for run results. Authenticate with the same webhook token using a Bearer header (see Run Status API).
GitHub Integration
Connect your GitHub repositories to enrich deployment data with commit details. When a verification run is triggered, Deploy Verify automatically fetches commit messages, authors, and links — giving you full context when diagnosing failures.
One-Click Connection
The recommended way to connect GitHub is through the one-click GitHub App flow:
- Go to Site Settings and click Connect to GitHub
- You'll be redirected to GitHub to authorize the Deploy Verify app
- Select which repositories to grant access to
- You'll be redirected back and can choose which repository to use for this site
The GitHub App uses short-lived installation tokens (1 hour) instead of long-lived personal access tokens, improving security. Multiple sites can share the same GitHub App installation with different repositories.
CI/CD Integration
Add Deploy Verify to your deployment pipeline to automatically verify your site after every deploy. Here are examples for popular CI/CD platforms:
GitHub Actions
- name: Trigger Deploy Verify
if: success()
run: |
curl -X POST ${{ secrets.DEPLOY_VERIFY_WEBHOOK_URL }} \
-H "Content-Type: application/json" \
-d '{
"commit": "${{ github.sha }}",
"branch": "${{ github.ref_name }}",
"actor": "${{ github.actor }}",
"repository": "${{ github.repository }}"
}'
GitLab CI
verify_deployment:
stage: post-deploy
script:
- |
curl -X POST $DEPLOY_VERIFY_WEBHOOK_URL \
-H "Content-Type: application/json" \
-d "{
\"commit\": \"$CI_COMMIT_SHA\",
\"branch\": \"$CI_COMMIT_REF_NAME\",
\"actor\": \"$GITLAB_USER_LOGIN\",
\"repository\": \"$CI_PROJECT_PATH\"
}"
only:
- main
CircleCI
- run:
name: Trigger Deploy Verify
command: |
curl -X POST $DEPLOY_VERIFY_WEBHOOK_URL \
-H "Content-Type: application/json" \
-d "{
\"commit\": \"$CIRCLE_SHA1\",
\"branch\": \"$CIRCLE_BRANCH\",
\"actor\": \"$CIRCLE_USERNAME\",
\"repository\": \"$CIRCLE_PROJECT_REPONAME\"
}"
Laravel Forge
Add the following to the end of your Forge deployment script:
# Trigger Deploy Verify after deployment
curl -X POST https://deployverify.com/api/webhook/YOUR_TOKEN \
-H "Content-Type: application/json" \
-d "{\"environment\": \"production\", \"branch\": \"main\"}"
Generic / Other Platforms
For any platform, add a curl command after your deployment step. Store the webhook URL as an environment variable or secret:
#!/bin/bash
# After deployment completes...
curl -X POST "$DEPLOY_VERIFY_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d '{"environment": "production"}'
Webhook Metadata
Deploy Verify automatically extracts CI/CD metadata from your webhook requests. This metadata is stored with each run and displayed on the run detail page, in run lists, and in email notifications — helping you trace verification results back to specific deployments.
POST with no body triggers the same verification as one with full metadata.
Supported Request Body Fields
| Field | Description |
|---|---|
commit |
The commit SHA that was deployed |
branch |
The branch that was deployed |
ref |
The git ref (branch, tag, or SHA) |
sha |
Alternative field for commit SHA |
environment |
Deployment environment (e.g., "production", "staging") |
deployment_id |
Platform-specific deployment identifier |
actor |
Who triggered the deployment |
repository |
The repository name (e.g., "org/repo") |
Auto-Detected Headers
Deploy Verify also reads platform-specific headers for additional context:
X-GitHub-EventandX-GitHub-Delivery— GitHub webhook headersX-GitLab-EventandX-GitLab-Token— GitLab webhook headersX-CircleCI-Signature— CircleCI webhook signature
Additionally, every run automatically records the triggered_at timestamp, request ip_address, and user_agent.
Understanding Runs
A run is a single verification execution that tests all active tests for a site. Runs can be triggered in two ways:
- Webhook — Automatically triggered by your CI/CD pipeline after a deployment.
- Manual — Triggered by clicking "Run Test Now" from the test editor.
When a run is triggered:
- A run record is created with Pending status.
- The run is queued for processing.
- Each active test is executed as a Test Run within the run.
- The AI browser agent visits the starting URL, follows the instructions, and checks the assertions.
- Screenshots and other artifacts are captured during execution.
- The run is marked as Passed (all tests pass) or Failed (one or more tests fail).
Run Statuses
Runs and individual test runs progress through the following statuses:
The run has been created and is queued for processing. It has not started executing yet.
The run is actively executing. The browser agent is navigating, clicking, and verifying.
All tests and assertions completed successfully. Your site is verified.
One or more tests or assertions did not pass. Check the test run details for specifics.
The run was stopped before completion, either due to a timeout or manual cancellation.
Test Run Details
Each run contains one or more test runs — one for each active test. A test run provides detailed results about the individual test execution:
| Metric | Description |
|---|---|
Status |
Pass/fail status of this individual test |
Duration |
How long the test took to execute (in milliseconds) |
Steps Passed/Failed |
How many instruction steps completed vs. failed |
Assertions Passed/Failed |
How many assertions passed vs. failed |
Failed at Step |
If the test failed, which step number caused the failure |
Error Message |
A description of what went wrong (for failed tests) |
Artifacts |
Screenshots, HTML snapshots, and other outputs captured during execution |
Artifacts
Artifacts are outputs captured during test execution that help you understand what happened and debug failures. They are attached to individual test runs.
Artifact Types
| Type | Format | Description |
|---|---|---|
Screenshot |
PNG image | A screenshot of the page at a specific step. Useful for seeing exactly what the browser saw. |
HTML |
HTML file | The full HTML source of the page at a specific step. Useful for inspecting DOM structure. |
Console Log |
JSON file | Browser console output (errors, warnings, logs). Useful for catching JavaScript errors. |
Network Log |
JSON file | HTTP requests and responses during the test. Useful for debugging API failures. |
Video |
WebM video | A recording of the entire browser session. Useful for watching the full interaction flow. |
Artifact Retention
Artifacts are stored for a limited retention period (default: 30 days). After the retention period expires, artifacts are automatically purged. Screenshots included in email notifications use signed URLs that also expire after the retention period.
Notification Preferences
Deploy Verify can notify you when your verification runs complete via email and Slack. Configure your preferences to control when and how you receive notifications.
To set your notification preferences:
- Click your avatar in the top-right corner of the navigation bar.
- Select "Notifications" from the dropdown menu.
- Choose your preferred notification level.
- Click "Save Preferences".
Email Notifications
Notification emails include key details about your verification run:
- Site name and overall pass/fail status
- Number of tests that passed and failed
- Total run duration
- For failed runs: which tests failed and the error messages
- Screenshots captured during the run (with signed URLs)
- A direct link to view the full run details in Deploy Verify
Slack Notifications Plus
Get real-time verification results delivered directly to your Slack workspace. Slack notifications are available on the Plus and Pro plans.
Setting Up Slack Notifications
- Go to "Notifications" from the avatar dropdown menu.
- Switch to the "Slack" tab.
- Enable the "Send Slack notifications" toggle.
- Create a Slack Incoming Webhook:
- Go to api.slack.com/apps and click "Create New App" → "From scratch".
- Navigate to "Incoming Webhooks" in the sidebar and activate them.
- Click "Add New Webhook to Workspace" and select the channel where you want notifications.
- Copy the webhook URL (it starts with
https://hooks.slack.com/services/).
- Paste the webhook URL into the "Webhook URL" field.
- Choose your notification preference: "All Runs" or "Failures Only".
- Click "Save Slack Settings".
- Optionally click "Send Test Message" to verify the integration is working.
What's Included in Slack Messages
Each Slack notification includes:
- Overall pass/fail status with the site name
- Run number and test summary (e.g., "3 tests passed" or "1 failed, 2 passed")
- How the run was triggered (GitHub push, GitLab, manual, etc.)
- Total run duration
- For failed runs: the names of failing tests and their error messages
- A "View Run Details" button linking directly to the run in Deploy Verify
Notification Preferences
You can choose when Slack notifications are sent:
- All Runs — Get notified after every verification run completes, whether it passes or fails.
- Failures Only — Only get notified when a run fails or is cancelled. Useful for reducing noise in busy channels.
API: Trigger Webhook
Trigger a verification run for a site.
/api/webhook/{token}
Parameters
| Parameter | Location | Required | Description |
|---|---|---|---|
token |
URL path | Yes | The webhook's unique 64-character token |
Optional Request Body (JSON)
| Field | Type | Description |
|---|---|---|
commit |
string | Commit SHA |
branch |
string | Branch name |
ref |
string | Git ref |
sha |
string | Commit SHA (alternative) |
environment |
string | Deployment environment |
deployment_id |
string | Deployment identifier |
actor |
string | Who triggered the deployment |
repository |
string | Repository name |
Response
202 Accepted
{
"message": "Verification run queued successfully",
"run_id": 42,
"status_url": "https://deployverify.com/api/runs/42"
}
Error Responses
| Status | Reason |
|---|---|
404 |
Webhook token not found or webhook is inactive |
422 |
Site is inactive or has no active tests |
API: Webhook Info
Retrieve metadata about a webhook.
/api/webhook/{token}
Response
200 OK
{
"id": 1,
"name": "Default Webhook",
"is_active": true,
"site": "My Production Site",
"trigger_count": 47,
"last_triggered_at": "2025-01-15T10:30:00Z"
}
API: Run Status
Get the status and results of a verification run.
/api/runs/{id}
Authentication
Authenticate using your webhook token in the Authorization header:
curl https://deployverify.com/api/runs/42 \
-H "Authorization: Bearer YOUR_WEBHOOK_TOKEN" \
-H "Accept: application/json"
This is the same token from your webhook URL. Authenticated site owners can also access this endpoint via their browser session.
Response
200 OK
{
"id": 42,
"status": "passed",
"site": "My Production Site",
"started_at": "2025-01-15T10:30:05Z",
"completed_at": "2025-01-15T10:31:22Z",
"duration_ms": 77000,
"passed_count": 3,
"failed_count": 0,
"error_message": null,
"ai_summary": "All tests passed successfully.",
"test_runs": [
{
"id": 101,
"test": "Login Flow",
"status": "passed",
"duration_ms": 25000,
"steps_passed": 5,
"steps_failed": 0,
"assertions_passed": 3,
"assertions_failed": 0,
"error_message": null,
"failed_at_step": null
}
]
}
pending or running, poll the endpoint periodically (e.g., every 10 seconds) until the status becomes passed, failed, or cancelled.
Profile Settings
Access your profile settings by clicking your avatar in the top-right corner and selecting "Profile".
From the profile page you can:
- Update your name and email address
- Change your password
- Delete your account
Contact Us
Have a question, found a bug, or need help getting set up? Reach out to our support team and we'll get back to you as soon as possible.
Reach out via our contact page and we'll get back to you as soon as possible.