Design Metrics and Impact Measurement Questions
Connecting design work to measurable outcomes: choosing success metrics, KPIs and guardrails for a specific change, writing measurable problem statements and testable hypotheses, and judging when quantitative data should and should not override design judgment. Covers instrumentation and tracking plans (event taxonomy, identity resolution across platforms, data quality and privacy constraints), reading funnels, cohorts, retention and adoption curves, and reconciling behavioral analytics with survey and qualitative signal. Experimentation is a large part of this topic: A/B, multivariate and quasi-experimental design, sample size and minimum detectable effect, stopping rules, multiple-comparison and confounding traps, and isolating a design's effect when a clean test is not possible. Also covers post-launch monitoring, rollback criteria and post-mortems, ROI and business cases for design work including design systems and design programs, and reporting impact to executives and stakeholders.
You implemented accessibility improvements targeting keyboard-only and screen-reader users. Design a mixed analysis plan to demonstrate impact: list quantitative KPIs and instrumentation events to track in production, describe recruitment and test design for assisted-technology usability sessions, propose statistical or descriptive analyses for small samples, and outline how you'd report limitations.
Sample Answer
Direct answer
Because the population of keyboard-only and screen-reader users in a typical product is small, both in raw numbers and in how reliably production analytics can even identify them, I'd run two analyses in parallel rather than trusting either alone: a lightweight production instrumentation layer to see behavioral change at whatever scale is available, and a small moderated usability study with actual assistive technology (AT, meaning tools like screen readers, switch devices, or voice control that a person uses to operate software) users to explain the "why" behind the numbers. The core skill this question is testing is not usability-test methodology in isolation, it's knowing how to weigh thin quantitative signal against rich but small-sample qualitative signal when arguing the redesign actually worked.
Structured elaboration
Quantitative KPIs and instrumentation: keyboard-only task completion rate and time-on-task, tracked separately from mouse users by detecting keyboard-only navigation patterns (no mouse-move or click events during a session, exclusively keydown events for navigation). Focus-trap and mis-tab events (a focus that gets stuck in a widget or a tab order that skips visible content), rage-tab events (repeated rapid Tab or Shift+Tab presses, a reasonable proxy for a frustrated user who can't find the next control), and ARIA (Accessible Rich Internet Applications, a spec for making dynamic content readable by screen readers) live-region announcement success or failure where instrumentable. Note upfront, honestly, that production analytics chronically undercounts this population, because assistive technology usage is not reliably detectable from standard web analytics, so any production-only read is a lower bound, not a full picture.
Recruitment and test design for the usability sessions: this part of the plan borrows directly from standard usability-research practice rather than reinventing it, recruit 6 to 8 habitual AT users (via a specialized panel or a screener that verifies real daily AT use, not just familiarity), run moderated remote sessions comparing the pre- and post-change experience on the same core tasks, with a think-aloud protocol so friction points surface in the user's own words, not just as a stopwatch number.
Statistical or descriptive analysis for small samples: with n = 6 to 8, a p-value from a standard significance test is close to meaningless, the sample is too small to distinguish a real effect from noise with any useful power. Instead, report descriptive results with an interval that's honest about the sample size: the Wilson score interval (a confidence interval for a proportion that stays well-behaved at small sample sizes, unlike the standard interval which can produce nonsensical bounds like a negative percentage when n is small) is the right tool for a completion-rate proportion here. If the same participants were tested both before and after (a paired design), a non-parametric test (one that compares the ranking of scores rather than assuming a bell-curve distribution, which a sample of 6 to 8 is too small to verify anyway), like the Wilcoxon signed-rank test, is appropriate; with an unpaired small sample, stick to descriptive reporting with intervals rather than forcing a significance test the sample can't support.
Reporting limitations: state plainly that n = 6 to 8 is hypothesis-generating, not confirmatory, that recruiting through a panel selects for people comfortable being observed and may not represent the full range of AT setups and severities, and that a single moderated session captures one point in time, not habitual real-world use.
Worked example
Baseline task completion, 8 keyboard-only participants attempting the flow before the redesign: 3 of 8 succeed unaided.
p^before=83=37.5%,Wilson 95% CI≈(13.7%, 69.4%)Post-redesign, same task, a new set of 8 participants: 6 of 8 succeed.
p^after=86=75.0%,Wilson 95% CI≈(40.9%, 92.9%)Both intervals are wide, and they do not merely graze each other, they overlap heavily: the shared region runs from 40.9% to 69.4%, a span of 28.5 percentage points, which is more than half the width of either interval (55.7 and 51.9 points respectively). Quantifying that overlap rather than eyeballing it is the honest and useful conclusion to report: the point estimates moved a lot (37.5% to 75.0%), but a sample this small cannot rule out that the entire gap is noise: a Fisher exact test on the same 3-of-8 versus 6-of-8 table returns a two-sided p of about 0.31, so this is not a near-miss on significance, it is nowhere near it, and saying so out loud is what stops the 37.5-to-75.0 jump from being quoted later as if it were a result. Paired with think-aloud notes showing the specific focus-trap that was fixed and participants explicitly saying the new flow was easier to follow, the qualitative account is doing real evidentiary work that the thin quantitative sample can't do alone, and a strong candidate says exactly that rather than presenting the 37.5% to 75.0% jump as if it were statistically airtight.
Trade-offs and pitfalls
The trap is treating this like a standard A/B test with a small sample, forcing a p-value onto 8 data points manufactures false confidence in either direction. The other trap is dismissing the qualitative findings as "just anecdotes" because they're not statistically significant. For a population this hard to instrument and this small in absolute numbers, the qualitative account of specific, fixed friction points, corroborated by even a directionally positive but statistically uncertain completion-rate shift, is often the strongest evidence available, and knowing how to weight it appropriately (not overclaiming precision, not dismissing it either) is exactly what separates a senior answer here from a junior one that reaches for the wrong tool.
Compare Net Promoter Score (NPS), System Usability Scale (SUS), and Customer Satisfaction (CSAT). For a B2B SaaS onboarding flow, when would you choose each metric, how do you interpret scores, and how would you combine them with behavioral metrics to form an actionable picture?
Sample Answer
Direct answer
For a B2B SaaS onboarding flow (software sold to other businesses, usually as a subscription), use CSAT (Customer Satisfaction) for individual moments inside onboarding, SUS (System Usability Scale) once a user has attempted a core onboarding task to judge how usable the flow itself was, and NPS (Net Promoter Score) some weeks later to gauge whether the account is on a path to renew and refer. None of the three replaces behavioral data: they tell you how people feel, and you pair that with what people actually did (activation, time-to-value, drop-off) before acting.
Structured elaboration
- CSAT: a single "how satisfied were you with X" question, usually a 1-5 or 1-7 scale, asked right after a specific interaction (finishing a setup wizard, completing a guided tour). It is tactical: it flags which touchpoint is causing friction, not whether the overall product is good.
- SUS: a fixed 10-item questionnaire (5 positively worded, 5 negatively worded, alternating) answered on a 1-5 agreement scale, producing one number from 0 to 100 that measures perceived usability of a specific task or flow. Give it once a user has attempted a representative onboarding task, not on day one before they have done anything.
- NPS: a single "how likely are you to recommend us to a colleague" question on a 0-10 scale. Respondents scoring 9-10 are promoters, 7-8 are passives, 0-6 are detractors; NPS equals percent promoters minus percent detractors, so it ranges from -100 to +100. It is strategic and relationship-level, best asked after someone has had time to form a real opinion, often 30-90 days after onboarding for a B2B product.
Interpreting scores:
- CSAT: look at the distribution and the percent giving a top-two-box (satisfied or very satisfied) rating, not just the mean; a bimodal result, some love it and some hate it, hides inside an average.
- SUS: 68 is the widely cited average across many products, so treat that as okay, not good. Above 80 is strong, below 50 signals a usability problem worth fixing before the flow ships more broadly.
- NPS: any positive score is healthy, 30+ is strong, 50+ is exceptional, but the number only means something benchmarked against your own segment; B2B enterprise NPS norms typically run lower than consumer.
Combining with behavioral metrics: treat CSAT, SUS, and NPS as the why, and time-to-first-value, onboarding completion rate, and 30-day retention as the what. A drop in SUS on the setup step plus a spike in abandonment at that exact step is a design problem with a clear fix. A low NPS alongside strong activation and retention is more often a pricing, support, or expectations problem than a usability one, and redesigning onboarding screens will not move it.
Worked example
Survey 100 new B2B accounts after onboarding. On the recommend question, 45 respond 9-10 (promoters), 40 respond 7-8 (passives), 15 respond 0-6 (detractors):
NPS=10045×100−10015×100=45−15=30An NPS of 30 is solidly positive for a B2B SaaS product.
Separately, 20 users complete a 10-item SUS survey right after finishing the setup wizard. Each item is scored 1-5; odd-numbered items are positively worded (contribution equals response minus 1) and even-numbered items are negatively worded (contribution equals 5 minus response). One respondent's raw answers are 4, 2, 5, 1, 4, 2, 4, 1, 3, 2, giving contributions 3, 3, 4, 4, 3, 3, 3, 4, 2, 3, which sum to 32:
SUS=32×2.5=80An 80 is well above the 68 benchmark, so the setup wizard itself is usable even though NPS says the wider relationship is not yet strong. That combination tells you design is not the bottleneck right now, something else (value delivered, price, support) is.
Trade-offs & pitfalls
- Do not average NPS, SUS, and CSAT into one health score. They measure different things at different time horizons, and blending them hides which lever to pull.
- SUS measures perceived ease of a specific task, not whether the task is worth doing; a flow can score high on SUS and still fail to activate users because it is usable but pointless.
- Sample size matters more for NPS than people expect: with n=100, a 10-15 point swing from a handful of respondents is common, so treat a single-period NPS move as noise until a trend shows across several surveys.
- Survey fatigue is real in B2B: stacking CSAT after every micro-step plus a SUS plus an NPS invites response bias toward whoever is unusually happy or unusually annoyed. Sequence and space them out.
Given the following weekly retention snapshot for a new feature cohort: Week0: 1000 users, Week1: 400 users, Week2: 300 users, Week3: 260 users. Interpret what this retention curve suggests, calculate week-over-week percentage drops, and propose three product or UX interventions you would test to improve retention. State which metric you would use to measure success for each intervention.
Sample Answer
Direct answer
To interpret this curve: it shows heavy front-loaded churn inside a cohort (a group of users who all started using the feature at the same time, tracked together over the following weeks): 60% of the cohort is gone after week 1 alone, and the drop-off rate slows sharply after that. That pattern points at an activation problem, users not reaching a first moment of value, rather than a slow-building dissatisfaction with the product over time, which changes what kind of intervention is worth testing first.
Structured elaboration
Retention and drop formulas:
Retentiont=Cohort size at week 0Active users at week t×100% Dropt=Userst−1Userst−1−Userst×100%Week-over-week percentage drops, computed from the given cohort (Week0: 1,000, Week1: 400, Week2: 300, Week3: 260):
- Week 0 to Week 1: (1000−400)/1000=60% drop (40% retained)
- Week 1 to Week 2: (400−300)/400=25% drop (75% of Week 1 retained)
- Week 2 to Week 3: (300−260)/300≈13.3% drop (about 87% of Week 2 retained)
- Overall retention at Week 3 relative to Week 0: 260/1000=26%
The shape (a steep first drop, then a fast-flattening curve) is the classic signature of an activation failure, not a slow product-fit erosion: most of the churn happens before users ever build a habit, and the users who make it past Week 1 are increasingly likely to stick around.
Worked example
Three interventions, each targeting a different point in the curve, with a distinct metric to judge each one:
- Guided first-run onboarding, aimed at the biggest single drop (Week 0 to Week 1). Success metric: Week 1 retention, plus the share of users reaching a defined "aha" activation event within their first session. Target: move the 40% Week 1 retention meaningfully upward.
- Reduce friction in the core flow (fewer required fields, prefilled data, progressive disclosure, revealing only the fields or options needed right now and surfacing more as the user moves forward instead of showing everything at once), aimed at users who activated but stalled shortly after. Success metric: core-action completion rate and Week 2 retention, since easing the flow should show up first as more completions, then as more people still active a week later.
- Targeted re-engagement nudges (an email or push notification sent 48 to 72 hours after signup to users showing early churn signals), aimed at recovering users on the edge of dropping. Success metric: 7-day reactivation rate for nudged users compared to a held-out control group, since the nudge only matters if it beats doing nothing.
Trade-offs and pitfalls
Treating this as a generic "retention problem" and reaching for a loyalty or rewards mechanism would target the wrong stage entirely; the data says the fix belongs at first-run activation, not long-term engagement. Watch for a subtler trap too: the 400 users who make it to Week 1 aren't a random sample of the original 1,000, they're already the more-engaged subset, so a rising retention curve among survivors can look like "the fix is working" even if it's partly just measuring who was already going to stick around. And running all three interventions on the same cohort at once would make it impossible to attribute any resulting change to a specific one; each needs its own randomized test against a real control.
Design a measurement and attribution framework to connect specific design changes to business outcomes in a product with many overlapping experiments, feature flags, and concurrent releases. Address event taxonomy, instrumentation practices, experiment orchestration to avoid interference, and approaches for handling confounding factors.
Sample Answer
Direct answer
The core problem with many overlapping experiments and concurrent releases is that the naive approach (one A/B test per team, sharing the same users) breaks two assumptions at once: it makes attribution ambiguous (which change caused the movement?) and it makes interference likely (does variant A's effect depend on which variant of test B a user also saw?). I'd build the framework around three pillars: a shared event taxonomy so every change is measurable on common ground, an experimentation orchestration layer that either isolates or explicitly crosses experiments, and an analysis layer built to detect and adjust for confounding rather than assume it away.
Structured elaboration
Event taxonomy and instrumentation
- A central event schema/registry (e.g.
object_actionnaming:checkout_button_clicked,plan_upgraded) with mandatory shared properties on every event: user ID, session ID, timestamp, platform, and (critically) the list of active experiment IDs and assigned variants for that user at that moment. - Every design change ships behind a feature flag (a runtime toggle that turns a feature on/off without a code deploy) even when it isn't formally an A/B test, so "which version of the product did this user actually experience" is always reconstructable after the fact, not just for tests you remembered to instrument.
- Schema versioning: when an event's shape changes, bump a version field rather than silently redefining the event, or historical and new data silently stop being comparable.
Experiment orchestration to avoid interference
- Organize experiments into layers (mutually exclusive slots covering the same users, e.g. one "layer" for pricing tests, one for navigation tests) and domains (a domain owns a slice of traffic end-to-end). Two experiments in the same layer are mutually exclusive (a user only ever sees one); experiments in different layers can run concurrently on the same user, which is fine as long as they don't touch the same UI surface or metric mechanically (e.g. one changes checkout button color, another changes checkout page layout: keep those in the same layer, not different ones).
- Maintain an experiment registry with declared surfaces touched (which pages, which components) so a new experiment proposal gets flagged automatically if it collides with a live one on the same surface.
- For flag-driven gradual rollouts (5% then 25% then 100%), treat the ramp itself as a confound: a metric change coinciding with a ramp step should be attributed to the ramp, not a concurrent experiment, unless the two are staggered in time.
Handling confounding factors
- Randomization unit consistency: assign at the user level (not session or request level) and persist the assignment, so a user isn't reshuffled between the treatment and control experience.
- Holdback/holdout groups: keep a small (e.g. 5%) slice of users out of all new releases for a rolling window, to measure the cumulative effect of "everything shipped this quarter" independent of any single test, and to sanity-check that individually-significant experiments sum to a plausible aggregate.
- Pre-period covariate adjustment (CUPED): use a user's pre-experiment behavior (e.g. last week's engagement) as a covariate to strip out variance that has nothing to do with the treatment, which shrinks confidence intervals and shortens how long a test needs to run before the analysis is trustworthy, directly reducing the exposure window where interference can occur.
- Interaction checks: for experiments sharing a layer boundary or a metric, run a factorial-style analysis on the 2x2 (or more) cell design to test whether the effect of A depends on which variant of B a user got, rather than assuming effects are additive.
Worked example
Take the CUPED adjustment concretely. Suppose a metric's outcome is correlated with a pre-period covariate at ρ=0.6 (e.g. last-week session count predicts this-week conversion reasonably well). CUPED's variance reduction is:
Var(Yadjusted)=Var(Y)(1−ρ2)Intuition: you're subtracting out the part of a user's outcome that pre-experiment data already predicted, leaving only the variance the experiment itself could plausibly explain.
With ρ=0.6, 1−ρ2=0.64, a 36% reduction in variance. If an unadjusted test needed 20,000 users per arm to hit its target power, the CUPED-adjusted test needs roughly 20,000×0.64=12,800 per arm for the same power, which is a directly usable lever when the goal is "spend less time exposed to overlapping-experiment risk," not just "spend less traffic."
Trade-offs & pitfalls
Layering trades simplicity for coverage: too few layers and unrelated teams collide constantly (velocity dies); too many layers and each individual test only gets a thin traffic slice (tests take forever to reach power). The holdback group has a real cost (a percentage of users never get any improvement, which shows up as a permanent tax on the top-line number) and needs an explicit sunset policy or it becomes politically impossible to keep. Finally, resist the urge to build attribution purely from correlation: two changes shipping in the same week will always be correlated with the same metric movement, and only a design with actual randomization (or a credible quasi-experimental method like difference-in-differences, comparing the change in the metric for the exposed group against the change for a comparable unexposed group over the same period, run with a clean pre-period) can separate them.
Describe how you'd instrument feature-flagged rollouts to support causal analysis and safe rollback. Specify what metadata to log (flag id, variant, assignment timestamp), how to ensure exposure is recorded atomically with user actions, and how to analyze partial rollouts for metrics and anomalies.
Sample Answer
Direct answer
Every exposure needs to be logged server-side, at the exact moment a user is bucketed into a variant, with enough metadata to reconstruct who saw what and when, and the bucketing itself needs to be deterministic (the same user always lands in the same variant) so a partial rollout and a cross-platform experiment don't silently split the same person across two experiences. Getting exposure logging and deterministic bucketing right is most of what makes causal analysis of a partial rollout trustworthy; getting it wrong is the single most common way an experiment result turns out to be unreliable without anyone noticing until much later.
Structured elaboration
Metadata to log per exposure: flag id and flag key, the variant or treatment id assigned, the user id (or anonymous id for logged-out users), the assignment timestamp, the bucketing hash and salt used, which targeting rule matched (in case of overlapping flags), platform and app version, and session id. This needs to be its own event, not something inferred later from behavior, because inferring exposure after the fact systematically misses users who were bucketed but never triggered a loggable action.
Recording exposure atomically with user actions: log the exposure event server-side, at flag-evaluation time, not client-side after render, because a client-side log can be dropped by an ad blocker, a slow network, or a user closing the tab before the event fires, which biases the sample toward users with better connectivity or more patience. The exposure event and the outcome events it will later be joined against need to come from the same timestamp source and the same event pipeline, so there's no clock-skew between "was exposed" and "did the thing," which would otherwise misattribute actions that happened just before or after the boundary.
What makes rollback safe: because the variant is decided by the flag system at evaluation time rather than baked into a code deploy, turning the flag's rollout percentage back to 0 (or hitting a kill switch) reverts every user's experience immediately, with no redeploy and no waiting on a build pipeline. This only works cleanly if the exposure metadata above was actually logged: the flag id and assignment timestamp let you precisely identify every user who was exposed during the bad window, exclude their data from downstream analysis, and confirm the rollback actually took effect (exposure events for that flag should drop to zero within one evaluation cycle of flipping it). A rollback with no exposure log behind it can turn the feature off, but it can't tell you who was affected or prove the rollback worked.
Deterministic bucketing: hash a stable identifier (user id, or a device id for logged-out sessions) together with a per-flag salt, then take the result modulo 100 to get a percentile bucket.
bucket(u)=hash(salt∥u)mod100Using a salt per flag means the same user gets an independent bucket assignment for each experiment, avoiding correlated assignment across flags. Because the hash is a pure function of the user id and salt, the same user always lands in the same bucket on every request, on every platform, as long as both platforms implement the identical hash function and salt (a genuinely common bug is the web SDK and the mobile SDK using slightly different hash implementations or a mismatched salt, which silently unbalances the split between platforms without either team noticing).
Cross-platform validation: before trusting a rollout that spans web and mobile, run an offline reconciliation job on a sample of shared user ids, recompute the bucket assignment using both platforms' actual SDK code, and confirm they agree. Any mismatch rate above a small tolerance (well under 1%) is a signal the two implementations have drifted and needs to be fixed before the experiment's results can be trusted.
Analyzing partial rollouts: ramp gradually (1%, then 5%, then 25%, then 50%) and check guardrails at each step before increasing exposure further. At each stage, run a sample ratio mismatch (SRM) check, comparing the actual split between variants against the intended split with a chi-square test, since an SRM is one of the most reliable early signals that something in the bucketing or logging pipeline is broken, independent of what the outcome metrics say.
χ2=i∑Ei(Oi−Ei)2Worked example
Deterministic bucketing in practice: hashing three example user ids against the salt checkout_redesign_v2 and taking the result modulo 100 (treatment if the bucket is below 50):
| user id | bucket (0-99) | assignment |
|---|---|---|
| u48213 | 7 | treatment |
| u91007 | 97 | control |
| u10442 | 99 | control |
Because the hash is deterministic, any of these three users gets the same bucket and the same assignment every time this exact hash function and salt run, on any platform.
For the sample ratio mismatch check: an experiment intended as a 50/50 split shows 9,700 users in treatment and 10,300 in control out of 20,000 total.
E=220,000=10,000,χ2=10,000(9,700−10,000)2+10,000(10,300−10,000)2=18.0A chi-square value of 18 on 1 degree of freedom is far beyond the threshold (about 3.84) for a 5% significance level, so this is a real sample ratio mismatch, not noise, and the outcome metrics from this experiment should not be trusted until the bucketing or logging bug that caused the skew is found and fixed.
Trade-offs and pitfalls
The most expensive mistake is trusting an experiment's headline result without running the SRM check first; the imbalance that invalidates a result is far too small to catch by eye. Rearranging the chi-square above for this sample size: with 20,000 users and an expected 10,000 per arm, the 3.84 threshold is crossed once an arm deviates by about 139 users (2d2/10,000=3.84⇒d≈139), which is a 49.3/50.7 split, a gap of only about 1.4 percentage points between the arms. The worked example above is more than twice that at 48.5/51.5, and a split that unremarkable on a dashboard can still produce a completely fabricated "win" or "loss" if the imbalance correlates with a confound like device type or acquisition channel. A more advanced technique worth naming briefly, though it's rarely required at interview depth, is CUPED (Controlled-experiment Using Pre-Experiment Data), which uses each user's pre-experiment behavior to reduce variance in the outcome metric and can shrink the sample size needed to detect a given effect; it's a genuinely useful tool for a low-traffic partial rollout but not something to lead with unless asked.
Unlock Full Question Bank
Get access to all Design Metrics and Impact Measurement interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.