$151,308a year less than Percy.
For 300 stories at 3 viewports and 400 builds a month, 360,000 screenshots.
Percy sends your DOM to BrowserStack and renders it again at every browser and width. stateofpixel reviews the screenshots from your own test run, and bills for storage, not screenshots.
Facts about Percy checked on 27 September 2026, with 6 sources.
A month of visual tests
300 stories, 3 viewports, 400 builds, 360,000 screenshots
- stateofpixelFree, 5.5 GB stored$0
PercyDesktop 25k $549 + 335,000 extra at $36 per 1,000$12,609
One build, step by step.
Percy
- 1Your tests capture the DOM
- 2The SDK uploads the DOM and assets
- 3Percy renders each browser and width
- 4Percy compares and sets the check
stateofpixel
- 1Your tests take screenshots900 screenshots
- 2The CLI hashes and compares them on the runner900 hashes
- 3Only images we have not seen upload45 changed
- 4The review page and the GitHub check
What changes when you switch.
What your reviewers get.
- Four views. Side by side, diff, slider and flip.
- Keyboard first. j and k to move, a to approve, r to reject.
- One check. Green when every change is approved.

Price it for your suite.
Screenshots a month360,000
$151,308 a year less than Percy.
Screenshots are stories x viewports x browsers x builds. For stateofpixel, 5% of screenshots change per build at 80 KB each, and pull request images are kept 60 days. The cheapest list plan for each tool, before tax, from Percy pricing on 27 September 2026. Percy prices are month to month; yearly billing is lower.
stateofpixel and Percy, row by row.
Where Percy is ahead.
Switch in one pull request.
- 1Install the GitHub AppPick the repositories. On GitHub Actions there is no token to copy.
- 2Swap percySnapshot() for snapshot()Import it from stateofpixel/playwright and add the reporter. It waits for fonts and disables animations.
- 3Merge to mainThat build becomes the baseline, and pull requests compare against it.
Before
steps:
- run: npx percy exec -- npx playwright test
env:
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}After
permissions:
contents: read
id-token: write
steps:
- run: npx playwright testimport { defineConfig } from "@playwright/test";
export default defineConfig({
reporter: [["list"], ["stateofpixel/playwright"]],
});Questions.
Sources
Read on 27 September 2026. Prices are list prices before tax. The stateofpixel column comes from our docs.