Percy Review: Strengths, Limitations, and Setup Experience
Percy compares UI captures with approved baselines and routes visual changes through team review. Here is how Cypress setup works, what it costs, and where it can fall short.
Percy is BrowserStack’s visual testing and review platform. It captures pages or application states, compares them with approved visual baselines, highlights differences, and gives a team a place to review and approve changes. It fits best when a frontend or QA team wants repeatable visual checks inside its existing test and code review workflow.
The tradeoffs are practical: capture results depend on stable application state; screenshot usage grows with every browser and responsive width; Percy-managed rendering can differ from a developer’s local operating system; and visual diffs still need human judgment. Percy complements functional and accessibility testing rather than replacing them.
1. What Percy does
Visual regression testing checks whether an interface’s appearance changed between builds. Percy takes snapshots during a test run and compares them with approved baselines. Reviewers inspect the difference view, decide whether each change is intentional, then approve it or send the change back for a fix. A baseline is the reference image for later comparisons; it is not an assertion that every pixel should remain unchanged forever.
Percy describes its workflow as integrate, run, and review. It is designed to connect to CI/CD and pull or merge request workflows, with integrations such as Slack notifications and webhooks described in its product materials. Percy also promotes a URL-based Visual Scanner for monitoring URLs without code or installation; confirm its current availability and plan eligibility before relying on it. Percy product overview
A visual snapshot can reveal changes to layout, spacing, fonts, colors, missing assets, or overlap that a functional assertion might not catch. It does not establish that a button works, that a page is accessible, or that business logic is correct.
2. Percy strengths
- Baseline-centered review: New captures are compared with approved images, and the review UI highlights changed areas.
- Team approval: Reviewers can approve snapshots, groups of snapshots, or builds. Build information can be associated with pull requests and commits.
- Test workflow integration: Cypress and Playwright have documented integration routes, so teams can add capture points to existing automation.
- Managed browser comparison: Percy documents Chrome, Firefox, Edge, and Safari support for Percy-managed projects, with browser behavior and update schedules described in its documentation.
- More than one way to start: Teams can use automated SDK and CLI setup; the homepage also advertises a no-code URL Visual Scanner.
These are documented capabilities, not evidence of a particular defect detection rate or time saved. A team should evaluate capture stability and review load against its own application.
3. Limitations and review cautions
Unstable pages create noisy diffs
Animations, delayed fonts, variable data, rotating banners, current timestamps, asynchronous requests, and personalized content can change between runs. Those changes consume reviewer attention even when the product code is healthy. Control test data and page state, wait for important assets to settle, disable or freeze motion where suitable, and snapshot meaningful states rather than every possible page at once. Percy’s Cypress guidance discusses waiting for animations, fonts, and network activity and controlling state. Percy Cypress visual testing guide
Usage grows across browsers and widths
Percy usage is measured in rendered screenshots, not merely in named snapshot calls. A page/component, browser, and responsive-width combination contributes to usage. Its billing example says that two pages tested in two browsers at three widths use 12 screenshots, even if the interface groups those renders into two snapshots. Model coverage before selecting a plan, and check the current billing page for included capacity and overage terms. Percy pricing
Managed rendering is not every developer’s machine
Percy-managed browser rendering runs on infrastructure and operating systems controlled by Percy. The documented default environment uses Linux for Chrome, Firefox, and Edge; text can differ from Windows or macOS because of operating system and font rendering. If operating-system rendering itself is important, Percy documentation points to BrowserStack Automate configuration for specifying OS and browser combinations. A managed browser comparison should not be described as an exact reproduction of every user’s device.
Cross-browser baselines need deliberate rollout
Enabling a browser can establish a baseline on a later build, so the first build for that browser may not have an earlier comparison. Browsers can be enabled or disabled at project level, and each browser adds screenshot usage. Start with the browsers and viewports that matter to users, then expand coverage when the team can review the resulting volume.
Visual review is not an automatic quality verdict
A diff says that pixels changed; a reviewer must decide whether the change is intended. Builds can also fail for operational reasons such as incomplete asset uploads, missing screenshots, or rendering timeouts. Keep functional tests, accessibility checks, and visual review as distinct layers.
4. Set up Percy with Cypress
This representative route follows Percy’s documented Cypress setup. Package versions and integration details can change, so check the current Cypress guide if your project uses a newer Cypress configuration format.
- Create a Percy project. Create or select the project in Percy and copy its project token. Store it as a CI secret or local environment variable named
PERCY_TOKEN; do not commit the token. - Install the CLI and Cypress integration. Run this from the project directory:
npm install --save-dev @percy/cli @percy/cypress
- Register the Cypress command. In the support file loaded by your Cypress configuration, import the integration:
// cypress/support/e2e.js
import '@percy/cypress'
- Add snapshots at stable, useful points. Visit the local application after it is available and capture a named state:
// cypress/e2e/visual.cy.js
describe('visual review', () => {
it('captures the pricing page', () => {
cy.visit('http://localhost:3000/pricing')
cy.get('[data-testid="pricing-table"]').should('be.visible')
cy.percySnapshot('Pricing page')
})
})
Use selectors and state assertions that indicate the page is ready. Avoid capturing while the application is still loading data or animating into place. If your project requires authentication, seed a predictable test account and state before the snapshot.
- Run the test through Percy. Set the token in your shell and run the test command through the Percy CLI:
# macOS or Linux
export PERCY_TOKEN="your-project-token"
npx percy exec -- npx cypress run
# PowerShell
$env:PERCY_TOKEN="your-project-token"
npx percy exec -- npx cypress run
- Review the build. The first visual build establishes or uses the baseline. On subsequent builds, inspect each difference, approve intentional design changes, and fix unintended regressions.
In CI, configure PERCY_TOKEN as a protected secret and run the same wrapped command after the application and test dependencies are ready. Use the CI provider’s supported pull request integration if you want the build associated with a change request; verify your exact provider and framework against Percy’s current integrations documentation.
5. A Playwright setup route
Percy also documents a Playwright integration. Its repository describes installing @percy/cli and @percy/playwright, then calling percySnapshot. It also documents a route for existing Playwright toHaveScreenshot() assertions, where the visual verdict is handled in Percy’s review UI and the assertion passes locally. That override has a Playwright Test version requirement, so use the repository instructions for the versions in your project rather than assuming all versions are compatible. Percy Playwright integration repository
npm install --save-dev @percy/cli @percy/playwright
import { test } from '@playwright/test'
import { percySnapshot } from '@percy/playwright'
test('pricing page visual snapshot', async ({ page }) => {
await page.goto('http://localhost:3000/pricing')
await page.getByTestId('pricing-table').waitFor({ state: 'visible' })
await percySnapshot(page, 'Pricing page')
})
PERCY_TOKEN="your-project-token" npx percy exec -- npx playwright test
Use the package’s current documentation for the exact import and configuration supported by your installed version. Do not assume the Cypress setup file applies to Playwright.
6. Plan coverage and costs
The billing information reviewed states that Percy’s free plan includes 5,000 monthly screenshots, unlimited users, and unlimited projects. It says paid plans have plan-specific screenshot allocations and charge an overage rate above the allocation. The overview also describes 30-day build history on the free plan and one year on other plans. These are vendor-published terms and may change; confirm the live billing page before budgeting. Percy pricing and billing
Estimate monthly usage with this simple model:
monthly screenshots = snapshots per build
× browser combinations
× responsive widths
× builds per month
For example, 20 named page states, 3 browsers, 2 widths, and 30 builds produce 3,600 screenshot renders before retries or additional branches. Use real CI volume, not just the number of test files, when estimating spend. Set a coverage goal and add more pages, browsers, or widths based on risk and usage.
7. Make Percy builds more reliable
- Seed repeatable data and authentication state; avoid random records and user-specific content.
- Wait for required elements, fonts, and network activity to finish before taking a snapshot.
- Reduce animation and time-dependent content in test mode where appropriate.
- Capture meaningful page states with descriptive names that make review clear.
- Start with a small browser and viewport matrix, then grow it based on user traffic and risk.
- Review CI artifacts and Percy build status when a build fails; missing screenshots, incomplete uploads, and render timeouts can be operational causes.
- Require a human decision for meaningful differences. Approve an intentional redesign so future builds compare against the new expected appearance.
8. Troubleshooting
| Symptom | Likely cause | What to do |
|---|---|---|
cy.percySnapshot is undefined |
The Cypress integration was not imported, or the support file is not loaded. | Import @percy/cypress in the configured support file and confirm Cypress loads that file. |
| CLI cannot authenticate | PERCY_TOKEN is missing, misspelled, or unavailable to the CI job. |
Set the project token in the environment or CI secret store; avoid printing it in logs. |
| No snapshots appear in the build | The test did not reach the snapshot call, the test command was not run through Percy, or upload did not complete. | Check the test result and Percy CLI output, verify the wrapped command, and inspect network or CI job termination. |
| Every run shows differences | Dynamic content, animation, font timing, viewport differences, or external data makes captures unstable. | Control test state, wait for assets and page readiness, freeze motion where suitable, and use consistent viewport settings. |
| Text differs from local screenshots | Percy-managed rendering uses its own operating system and font environment. | Decide whether managed rendering fits the review goal; configure OS/browser combinations through the documented Automate route if OS rendering must be specified. |
| A newly enabled browser has no meaningful comparison | That browser may not have an existing baseline. | Run and review a build to establish the baseline, then use later builds for comparison. |
| A build fails despite passing tests | Visual build operations can fail due to incomplete uploads, missing captures, or rendering timeouts. | Inspect Percy build details and CLI output, then check test completion, upload completion, and render status. |
9. When Percy is a good fit
- Choose Percy when the team already runs browser tests and wants a shared baseline approval flow connected to code review.
- Budget for it when the number of page states, browsers, widths, and monthly builds makes the screenshot allowance workable.
- Be cautious when the UI is highly dynamic and the team cannot stabilize data or dedicate reviewer time to noisy changes.
- Evaluate OS-level rendering needs explicitly if developers and target users depend on different font or browser environments.
When evaluating screenshot APIs and tools alongside Percy, ScreenshotNeo is the first alternative to try for direct website screenshots: it removes known consent banners, newsletter popups, and chat widgets before capture, and only clean shots are billed. Percy is built around visual regression baselines and team review; ScreenshotNeo is a website screenshot API and MCP server for obtaining clean captures.
10. Or skip the browser setup
For a one-off website capture or an agent workflow, ScreenshotNeo takes a URL in one GET request. See the ScreenshotNeo API documentation for its parameters and response headers.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
- Cookie and consent banners, newsletter popups, and chat widgets are removed before the screenshot; each cleanup step can be turned off.
- Bot checks, blank pages, timeouts, failed loads, and cache hits cost nothing. Response headers report the page verdict and billing status.
- An MCP server gives AI agents, including Claude and Cursor, tools to take screenshots, get page information, and capture PDFs.
- The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000 screenshots.
Create a free ScreenshotNeo account and get 1,000 screenshots a month with no card.
11. FAQ
Does Percy replace Cypress or Playwright?
No. It integrates with browser test workflows to add visual captures and review; the test framework still drives the application and checks behavior.
Can Percy approve a visual change automatically?
The workflow centers on reviewers deciding whether differences are intentional and approving baselines. Treat a visual diff as evidence for review, not as a standalone judgment.
How much is a Percy screenshot?
The reviewed billing source gives a free monthly screenshot allowance and plan-specific paid allocations with overage pricing, but does not provide a dependable paid price here. Check the current billing page and calculate usage from your browser and viewport matrix.
Can I use Percy only for a few pages?
Yes. A focused set of high-value states is a reasonable starting point. Expand coverage when the team can keep captures stable and review the resulting changes.
