All posts

Error-Rate Monitoring During a Gradual Rollout Tells You the Feature Didn't Crash — Not That It Worked

·5 min read·
progressive deliveryobservabilityproduct metrics

Progressive delivery gave us a remarkable piece of machinery and then convinced most teams to use maybe a third of it. The moment you put a change behind a flag and ramp it from 1% to 5% to 20%, you have done something that experimentation platforms charge real money for: you've split your users into an exposed cohort and a control cohort, running against identical traffic, at the same time of day, under the same upstream weather, differing only in the code they touch. That split is a live, perfectly matched controlled experiment. And almost every team I talk to points it at exactly one question: did it break?

Error rate. p99 latency. Exception counts. Failed health checks. That's what rollout error monitoring during a gradual feature rollout almost always means in practice — a watch for the change that throws. It's a necessary question. It's also the trivial one. "Didn't crash" is the floor of what you should want to know about a change you're pushing to a hundred percent of your users, and we've quietly agreed to treat it as the ceiling.

The deploy that passes every dashboard and still costs you money

Here's the failure mode nobody instruments for. A change ships behind a flag. It ramps cleanly. Error rate is flat. Latency is flat. Every graph in the ops channel is green, the SPRT never fires, the on-call engineer never gets paged. The rollout advances to 100% and gets written up as a non-event. And over the following week, checkout completion drops a point and a half, or new-user activation slips, or support ticket volume for one workflow creeps up, or revenue per session bleeds four percent — and nobody connects it to the deploy, because the deploy was, by every signal anyone was watching, a success.

It was a success. It successfully shipped a worse product. The code was correct and the idea was wrong, or the implementation was subtly worse in a way that no exception counter can represent: a form that's technically functional but confusing, a default that nudges users the wrong direction, a "performance improvement" that trades a tail-latency win for a conversion loss. These are not silent failures in the bug sense — nothing is broken. They're successful deployments of regressions that live entirely outside the error budget. And they are, in my experience, the more expensive class of incident precisely because nothing ever declares them an incident.

The reason we don't catch them is structural, and it's the same reason teams historically under-invested in latency monitoring before they got burned: error rate is a cheap, binary-ish, universal signal that lives in the same system as the deploy. Whether a feature worked is a continuous, delayed, product-specific signal that lives in Amplitude or Mixpanel or a warehouse table three ETL hops away from anything that could halt a ramp. So we monitor what's easy to monitor and call it rollout safety.

Your abort criteria are missing half the question

The standard advice on how to set rollout abort criteria before deployment is good as far as it goes: decide, in advance, which signals would make you stop, and encode them so a calm engineer's judgment governs the ramp instead of a panicked one's. But look at what goes into those criteria in practice and it's always the same list — error rate deltas, latency percentiles, saturation. Infrastructure health. The abort criteria answer "is this change hurting the system?" and never "is this change hurting the business the system exists to run?"

Those are different questions with different answers. A change can be flawless by the first and a disaster by the second. If your rollout can halt on a 500 spike but not on a conversion drop, you've built a very sophisticated smoke detector for a building and left the "is anyone actually buying anything in here" question to a weekly dashboard review that happens long after the flag hit 100%.

Real abort criteria for a checkout change should include checkout completion. For a signup flow change, activation. For a search change, result click-through and zero-result rate. These are guardrail metrics — the product outcomes you would never knowingly trade away for a refactor or a redesign — and they belong in the rollout control plane next to error rate, with thresholds set before the ramp starts.

The control group is the whole point

The objection I hear immediately is that business metrics are too noisy and too lagging to gate a rollout on. Conversion swings for a dozen reasons that have nothing to do with your deploy; by the time you have a trustworthy weekly number, the flag's been at 100% for days. That objection is correct if you ask the naive question — "is conversion down?" — because that number is confounded by seasonality, traffic mix, marketing, and the weather. It's the wrong question.

The flag already handed you the fix. You're not asking whether conversion is down in absolute terms; you're asking whether the exposed cohort is converting worse than the control cohort, right now, on comparable traffic. That's a two-sample comparison between two groups that differ only in the code they're running — exactly the same statistical move the good rollback systems already make on error rate, just pointed at a metric that matters to the P&L. The seasonality cancels because it hits both cohorts equally. You don't need a clean weekly number; you need a significant delta between twins. Progressive delivery and A/B experimentation are, mechanically, the identical apparatus. Most organizations run them as two disconnected systems owned by two different teams, and throw away the experimental result of every single rollout because the ramp was wired to the ops stack instead of the analytics stack.

This changes who owns the rollout

Taking this seriously has an organizational consequence worth naming: the abort criterion for a checkout change is a growth metric, which means product and engineering co-own the conditions under which a deploy proceeds. That's uncomfortable for teams used to treating rollout safety as a purely SRE concern, but it's correct. The question "should this change reach everyone" was never only "will it stay up." It was always "is it better." We just didn't have a cheap way to ask the second half during the ramp, so we pretended the first half was the whole question.

This is the gap we're building DeployRamp to close. When the system wraps a change in a flag and ramps it, it's already holding the exposed cohort up against the unflagged control across error rate and latency — the easy, necessary half. The harder and more valuable half is extending that same cohort comparison to the guardrail metrics that define whether the change was actually good, and giving the ramp the authority to halt on a product regression, not just a crash. A rollout that can only tell you the feature didn't throw an exception is answering the cheapest question you can ask about a change. The flag already set up the experiment. The least you can do is read the result.

Let DeployRamp handle the flags

Install the GitHub App, drop in the SDK, and ship a flagged PR in minutes. Book a demo and we'll show you how.

We use cookies to analyze site usage and improve your experience.