How to test on every deploy without a CI pipeline to maintain
"Test your critical flows on every deploy" is advice nobody argues with and almost nobody does. Not because founders are careless, but because the advice quietly assumes you have already solved the hard part: a working pipeline that spins up a real browser, drives your app, and reports back, every single time you ship. Building that is its own project, and maintaining it is a second one. So the tests never get written, and every deploy is a small bet that nothing important broke.
The pipeline is the hard part, not the tests
Writing a test that clicks through signup is not the bottleneck. The bottleneck is everything around it. You need a headless browser running in CI, which is flaky and slow and breaks on its own schedule. You need to manage secrets, handle parallelism, keep the browser version in sync, and debug the runner when it fails for reasons that have nothing to do with your app. You end up maintaining a testing pipeline as a piece of infrastructure, and infrastructure you maintain grudgingly is infrastructure that rots. The tests are the point. The pipeline is the tax, and the tax is what kills it.
Deploys break things in two different ways
There are two reasons a flow that worked yesterday is broken today, and you need to catch both.
- Something you changed. You shipped a refactor, bumped a dependency, or touched a shared component, and a flow three screens away quietly broke. This is what testing on every deploy is for: catch it in the minutes after you ship, while the change is still fresh in your head, instead of in a support ticket next week.
- Something that drifted. Nobody changed anything, and it broke anyway. A third-party API changed a response, a certificate expired, an upstream service started rate-limiting you, a payment provider tweaked a script. Deploy-triggered tests will not catch this, because there was no deploy. This is why you also want the same flows running on a schedule, so drift gets caught even on the days you do not ship.
A real safety net covers both: run on every deploy, and run on a schedule between deploys.
What "always-on" should actually look like
You do not need a CI pipeline to get there. You need three things, and none of them require you to run a browser yourself.
- A trigger you can call from wherever you already deploy. If your deploy step can make one HTTP request, it can kick off a full browser test of your critical flow and gate the deploy on the result. No runner to maintain, no browser to install.
- Automatic runs on pull requests. A GitHub App that reruns your saved flows on every PR and posts the result as a check means a broken signup blocks the merge before it ever reaches production, with zero YAML on your side.
- A schedule. The same flows, run hourly or daily, so the drift that no deploy would ever catch still gets caught.
The tests should live somewhere you already look, and a failure should tell you exactly which step broke and show you the evidence, so triaging it takes a minute, not an afternoon.
How VeriWasp fits
VeriWasp is built around exactly this. You describe a flow once, and from then on you can run it three ways without owning any test infrastructure. Every saved flow has a trigger URL you can hit from a single line in your existing deploy step. The GitHub App reruns your flows on every pull request and posts a check that can block the merge. And any flow can be put on an hourly, daily, or weekly schedule to catch the drift that happens between deploys. The browser runs on our side, so there is no runner, no browser version to pin, and no pipeline YAML to babysit. When something breaks, you get a report that ties the failure to the exact step, with the console errors, network traffic, and a video of the run attached.
You can set up a flow and wire it into your deploys with a few free runs, no card required. Get the always-on coverage without the pipeline that usually stops you from having it.
