Flaky Tests Are a Tax on Every Deploy. Here's What Paying It Actually Costs You
One spec, nineteen reruns in ten days. The CI minutes were cheap. The ten minutes of doubt before each rerun ate a short work week.

The cost of a flaky test is not the rerun. It is the doubt that teaches a team to treat red as noise, which then lets a real bug through. On one team a single spec was rerun nineteen times in ten days. Pulling specs that fail without a product change off the merge path, with an owner and a fourteen-day deadline, made red mean the diff again.
- Count reruns before you buy a faster runner. One spec can eat a work week of doubt.
- If a test does not fail when the behavior breaks, it is not coverage.
- Take repeat offenders off the merge path with an owner and a date.
- Guilt will not keep tests current. A deadline on the blocking job will.
There's a spec on a team of about forty that fails when the build agent is busy. Not always. Often enough that the Slack reaction is a rerun emoji. Last quarter I asked them to count it instead of joking about it. Nineteen reruns in ten working days, just for that one spec. Each rerun is a few minutes of CI. The expensive part was the ten minutes before the rerun, while someone decided whether the failure was the date picker or their actual change. Nineteen times ten minutes is a short work week, gone, and that's one test.
The tax is the doubt
People price flakes as machine time. Machine time is the cheap line. The costly line is the moment "CI is red" stops meaning "stop typing." Once the team believes red is probably noise, a real red gets the emoji too. I watched that happen with a permissions check. It failed for a reason. It got rerun twice, passed on the third try because the fixture raced, and the hole shipped. The flake didn't just waste the afternoon. It laundered a bug.
At forty people you can still see it. At a bigger org it becomes culture, and culture is hard to put in a spreadsheet. New hires learn the emoji before they learn the product.
The suite rots because the product moves
Most of these tests didn't start flaky. A selector changed. A modal grew a step. An API field flipped from a number to a string and the test still parsed the old shape on Tuesdays when the stub won the race. The product moved and the test stayed, so the test stopped describing behavior and started describing a memory of the UI. Keeping up by hand means every change owes the suite a visit. That visit loses to the feature. It always does. Then you "stabilize" in a sprint that gets cut, and the emoji stays.
Deleting the test feels like giving up coverage. Leaving it in the blocking job taxes every deploy. Both feel bad. Only one of them is honest. If a test doesn't fail when the behavior breaks, it isn't coverage. It's a toll booth.
What we did instead of a motivation speech
We took any spec that failed twice in a week without a product change off the merge path. Not into a void. Onto a list with an owner and a date. Fourteen days. Fix it, rewrite it, or delete it in the review. The date-picker spec was a sleep waiting out an animation. We waited on the element. The failure stopped. Another spec asserted a tooltip the designer had removed. We deleted it in the same PR as the admission that we were afraid to. The merge job got quieter in a way people noticed by Wednesday, because red meant their diff again.
The maintenance didn't vanish. It got a boundary. The person on call for flakes wasn't also expected to invent coverage for the new checkout. Those were separate hours. Mixing them is how the flake list becomes permanent.
A red build has to be allowed to hurt
If you can merge through a failure because "it's probably that one," you don't have a signal. You have a suggestion. I'd rather run fewer tests that the team believes than a thousand the team has learned to negotiate with. Belief is the whole point of the job. When it goes, QA is a department that produces badges, and engineering ships on vibes with extra steps.
I don't buy the idea that this is a discipline problem, as in "if people cared they'd update the tests." They care. They're also late for a demo. A system that relies on guilt will lose to the demo every week. The list with a date works because it doesn't ask anyone to be a hero. It asks the merge job to stop pretending a known-bad spec is information.
Count the reruns for a week before you buy a new runner. If one spec shows up more than twice, it doesn't get to sit on the merge button while you "get to it." Give it a name and a deadline. The tax is already being collected. You might as well see the bill.
Frequently Asked Questions
Less in machine minutes than in the pause where someone decides whether the failure is real. Once red means maybe noise, real failures get the same shrug.
Ship bug-free features faster with QA Assist
Join engineering and QA teams who have streamlined test management, sprint coordination, and reporting.
Get Early Access FreeRelated Articles
Continue reading top guides and articles

A Bug Report Nobody Can Reproduce Is Just a Rumor
"Checkout broken on iPhone" can sit in a queue for days, and the fix is often quick once someone can see it. Five boring lines would save the week.
QA Didn't Pick the Release Date
The date was promised in a customer call three weeks earlier. QA wasn't in the call. By Thursday they were "blocking" a sentence someone else had already said out loud.
How to Cut Your Test Suite Runtime by 70%
A payments team stopped waiting on a 74-minute suite. The pull-request run fell to 19 minutes because of a cache key, a smaller job, and a few tests they finally stopped rerunning.