What I check when every metric says we’re winning
- Home
- portfolio
- Product Management
- What I check when every metric says we’re winning
Four launches called it a win.
One segment was quietly losing.
What I check
when every metric says we're winning.
four releases of "winning," one high-intent segment quietly losing →
Aggregate relevance climbed for four straight releases, while a smaller, higher-intent segment of users quietly got worse the entire time. I almost signed off on a fifth release before I built the habit of checking one more dashboard first.
This is a Personal Anecdote, not an employer engagement. Written to show how I diagnose and structure a product problem in Search & Ranking, the numbers below are original.
What I Check
A metric can be climbing and lying to you at the same time
I almost signed off on a fifth release without a second look. The dashboard was green, the team was proud of the work, and I had two other launches competing for my attention that week. What stopped me was a chart nobody on the review was required to open.
Aggregate metrics are dominated by whatever segment has the most volume, so they can improve release after release while a smaller, higher-intent segment quietly gets worse underneath them and nobody's dashboard is built to catch it. So now, before I sign off on any ranking or relevance launch, I check the smaller, highest-intent segment's numbers on their own, separate from the topline, every single time. That one habit is the whole fix. The rest of this case is just the story of the one time I almost skipped it.
Here's the release that taught me to check, and the four things I built so I'd never have to remember to. 👀
The Case
Role & scope
PM owner for search ranking launch quality. Accountable for the launch-criteria decision, not just the investigation, working across applied science, search engineering, and design.
Stakeholders aligned
Applied science leads (co-designed the threshold), search engineering (implemented the gate), design (the "still learning" UI state), and search eng leadership (accepted the cadence trade-off).
Business problem
Four consecutive ranking releases looked like wins on the topline (NDCG +4.8%, CTR +3.1% cumulative), but an estimated 12% of search sessions, specific multi-word queries with the clearest purchase intent, were converting worse each release. Real, attributable demand was leaking out of search with no metric flagging it.
Goals
Prove the regression was real, find the root cause, and ship a launch-criteria fix that a future release could not repeat, without slowing the team's cadence by more than roughly a week per release or regressing the aggregate metrics that were genuinely healthy.
The Tension
Every ranking release improved the average, while a real, high-intent segment quietly got worse underneath it.
How do you catch a regression that a top-line metric is mathematically incapable of showing you?
Every ranking model release was, individually, a win, aggregate click-through and NDCG both trended up for four consecutive launches (+4.8% NDCG, +3.1% CTR cumulative). I caught the problem in a different dashboard, one nobody on the launch review was required to check, where long-tail query abandonment had quietly climbed from 6% to 9.5% of sessions over the same four releases.
I want to be clear I wasn't uncovering some team's mistake, nobody was doing anything wrong by the metric they were optimizing for. I decided the metric itself was incomplete, not the model. Aggregate relevance is dominated by high-volume head queries, so a model can improve on average while getting meaningfully worse for a smaller, real segment typing specific, multi-word queries, exactly the users with the clearest purchase intent. That distinction, between a bad model and an incomplete objective, is what determined everything I did next.
The forces around one ranking decision
Four forces pulling on the same launch decision, the guardrail had to satisfy all of them at once.
From Draft Query to Confirmed Finding · how the alert first looked
Draft query · week 1
Confirmed query · week 3
A hunch isn't a case yet. Time to go find out if it holds up. 🔎
Research
What the data actually showed
A hunch isn't a decision. Before I brought this to anyone, I ran four separate cuts of the data to rule out the boring explanations first, a data artifact, a tracking bug, seasonality, before treating it as a real product problem worth a team's time.
[1] AGGREGATE METRICS
"NDCG +4.8% and CTR +3.1%, both improved release-over-release across four consecutive launches."
[2] SEGMENT METRICS
"Zero-result rate for 4+ word queries rose from 6% to 9.5% of sessions over the same period, a 58% relative increase."
[3] SESSION BEHAVIOR
"71% of users reformulated toward shorter, generic queries after a zero-result page, a workaround, not an improvement."
[4] MANUAL REVIEW
"Relevant inventory existed for 84% of the zero-result queries I audited by hand, the model just never learned to surface it."
Once the segment-level signal held up, I ruled out the two most likely technical causes before accepting the harder answer, the objective itself.
Draft query · week 2
Confirmed query · week 3
Illustrative, indexed for shape not scale
Two dashboards, same four releases 👀
Both lines climbing is the whole story, they lived in different dashboards.
Query mix vs. failure rate
Small slice, outsized damage
Long-tail queries are a minority of volume but carry most of the zero-result failures.
Problem statement
The ranking objective optimizes for aggregate relevance in a way that is blind to a real, high-intent user segment worth an estimated 12% of sessions.
North-star metric
Zero-result rate (target: back to 6% baseline) and post-zero-result reformulation rate, segmented by query length.
Guardrail metrics
Aggregate NDCG / CTR (must not regress below current +4.8% / +3.1%); p95 latency (must hold under 180ms).
Non-goals
Rebuilding the core ranking model architecture, this was a launch-criteria problem, not an algorithm problem.
This is the exact scorecard I brought into the launch review, so the trade-off would be a group decision, not a private judgment call.
- North star: zero-result rate, 4+ word queries
- Ring 2 , primary guardrail: aggregate NDCG / CTR (must hold flat)
- Ring 3 , secondary guardrail: p95 latency, launch cadence
KPIs I actually tracked week to week
Zero-result rate (4+ words)
Aggregate NDCG
Reformulation rate
p95 latency
Launch cadence
Segment coverage
Four ways to fix it. Only one of them didn't require building something new.
Ideation & Decision
Weighing the alternatives
Four ways to close a 3.5-point zero-result gap, each with a different cost. I scored them on the same two axes so the trade-off would be legible to people who hadn't spent three weeks in the data with me.
Keep shipping on aggregate relevance gains. $0 cost, but provably blind to a regression already costing an estimated 12% of sessions.
Build a separate long-tail-specific ranking model. ~2 quarters, 4 engineers, more precise, but a second system to maintain forever.
Add query-coverage as a guardrail in the existing launch process.Chosen ~3 weeks, 0 new headcount. No new model, just a change to what "good enough to ship" means.
Manually curate fallback results for known long-tail patterns. Cheap up front, caps out around 200 query patterns a quarter, doesn't scale.
I brought this matrix into the room instead of a recommendation memo, so the science team could see me rule out option 2 on evidence, not push it aside on opinion.
Draft query · week 5
Confirmed query · week 6
Impact vs. Effort
Four options, one question: which moves the real problem most for the least new machinery? Option 2 feels like the serious choice because it's the most work, but effort isn't evidence of impact.
The guardrail sits in the same high-impact territory as a whole new model, at a fraction of the engineering cost.
Deciding was the easy part. Getting a whole team to actually want the guardrail was the real work. 🛠
Solution
What if the launch gate simply refused to ship blind spots?
Actors & Inputs
- Search users
- Ranking model
- Applied science team
- Query logs by length
System Change
- Segment-coverage metric added
- Required in every launch review
- Explicit sign-off if regressed
Outcome
- Long-tail queries resolve
- Aggregate relevance protected
- Pattern reused on Recs team
From Draft Query to Confirmed Finding · how I thought through the guardrail logic itself
Draft query · week 7
Confirmed query · week 8
Type the query. Then toggle to see what changed underneath it.
I underestimated one thing going in: the applied science team's incentives were built entirely around aggregate relevance benchmarks used in their own research evaluations, so when I proposed a guardrail that could block a launch on a different metric, I watched it land as a criticism of their model quality, not what I actually meant it as: a gap in the evaluation framework itself.
Design wanted
Rare appearance, worried the "still learning" state looked unpolished
ML wanted
Frequent appearance, worried about overclaiming accuracy
How the quarter actually went
Signal noticed in a side dashboard
Long-tail abandonment flagged during a routine metrics review, unrelated to any launch.
NoticedRoot cause traced to the objective, not model quality
Manual query review confirmed relevant inventory existed; the model just never learned to rank it.
DiagnosedGuardrail proposed, threshold co-designed
Applied science team helped set the regression threshold instead of having one imposed on them.
ProposedFirst threshold too strict, recalibrated
A genuinely good unrelated model improvement nearly got blocked, threshold tuned.
AdjustedShipped, then extended to a second surface
Guardrail live in launch review; recommendations team adopted the same pattern.
Shipped 🎉Proof
| Hypothesis | A model that maintains long-tail coverage while holding aggregate relevance flat will reduce abandonment without sacrificing overall search quality. |
|---|---|
| Design | Candidate model evaluated against both the aggregate benchmark and the new segment-level guardrail before launch eligibility. |
| Primary metric | Zero-result rate for 4+ word queries. |
| Result | Long-tail zero-result rate dropped 31% (9.5% → 6.6% of sessions); aggregate NDCG/CTR held at +4.8% / +3.1%, not regressed; launch cadence slowed by roughly 1 week per release. |
| Follow-up | Same guardrail pattern adopted by the recommendations team the following quarter, protecting an additional ~8% of session volume with 0 new headcount. |
Shipped isn't the same as done. Here's what I'd actually keep, and what I'd do differently. 🕑
Learnings
Key takeaways
What worked
I didn't touch the model architecture, I just made a signal we already had impossible to ignore at launch time, at roughly 1/8th the cost of the alternative model rebuild.
What didn't
I set the first threshold too strict, and it nearly blocked an unrelated, genuinely good improvement in week 9.
Next time
I'd pilot the guardrail as a non-blocking "warn" signal first, so I could calibrate thresholds with less friction and fewer false blocks.
The pattern outlived the project: the recommendations team adopted the same segment-coverage guardrail the following quarter, protecting an additional ~8% of session volume without adding headcount, which is the part of this I'm proudest of, not the fix, the fact that it became a default other teams reached for.
"Metrics are dashboard lights, not the steering wheel."
Principle carried forward"Vision without evidence is theater; evidence without vision is local optimization."
Principle in practiceFrameworks & skills applied
Quick Answers
FAQ
Is this a real project from a specific employer?
I wrote this as a Personal Anecdote to show how I think through a problem in Search & Ranking, not to claim a specific past engagement.
Why a launch-criteria fix instead of a new model?
Once I dug in, the model looked reasonable given its constraints, I decided the evaluation framework was the actual gap, so that's what I fixed.
What would you do differently?
I'd pilot any new guardrail as a non-blocking "warn" signal before making it launch-blocking, I'd have calibrated the threshold with a lot less friction.
How did you get buy-in without formal authority over the science team?
I didn't bring a mandate, I brought the abandonment data and asked the science team to help set the threshold themselves. A guardrail a team co-designs is one they'll defend; one imposed on them is one they'll route around.