User Retention & Engagement Questions
Measuring and improving how users stick with a product after they first convert: retention rate and cohort retention curves (day 1, day 7, day 30, and longer horizons), churn rate, reactivation and resurrection of lapsed users, and engagement-depth signals such as DAU, WAU, MAU, and the DAU/MAU stickiness ratio. Covers defining and computing these metrics, including basic SQL and event-log implementations, diagnosing where and why a retention curve breaks (onboarding gaps, feature-adoption gaps, seasonal or cohort-specific effects), designing experiments and product interventions that deepen habitual usage, cohort-based lifetime value (LTV), and communicating retention findings to stakeholders. This is the post-acquisition, repeat-usage side of the user lifecycle: getting a first-time visitor through signup or first purchase is covered by the companion topic Conversion Funnel Optimization, and pure-SQL implementation depth at large scale (approximate-distinct computation, survival-curve modeling, multi-state subscription churn state machines, and standalone timezone-aware day bucketing) is covered by the companion topic Advanced SQL: Metric Monitoring, Anomaly Detection, and Data Correctness at Scale.
How would you define and measure retention for a product with highly irregular, seasonal usage (for example, a tax-filing service used once a year)? Outline retention definitions, cohorting strategies, appropriate windows, and alternative success metrics that are meaningful for low-frequency products.
Sample Answer
Direct answer
For a product with genuinely low-frequency, seasonal usage, day-based retention windows (day 1, day 7, day 30) are close to meaningless, since the product's natural usage cycle is measured in months or a year, not days; define retention around the product's real usage cycle instead (for a once-a-year tax-filing service, "did the user file again next tax season"), use EVENT cohorts anchored to the triggering occasion rather than pure signup-date cohorts, and supplement with leading, sub-annual signals that do not require waiting a full year to observe.
Structured elaboration
Why day-based windows fail here. A day-1 or day-30 retention number for a tax-filing app will read as catastrophically low almost by construction: nearly every user has no legitimate reason to open the app again 30 days after filing, since their task is complete for the year. Reporting that number without context (or worse, alongside a daily-cadence product's day-30 number) invites a completely wrong read of product health.
Cohorting strategy: event cohorts over pure signup cohorts. Rather than anchoring a cohort to account-creation date, anchor it to the OCCASION the product exists to serve (in this example, "filed a return for tax year N"), and measure whether the same user completes the equivalent occasion in the next cycle ("filed a return for tax year N+1"). This is the general pattern known as event cohorts versus user cohorts: two users who created accounts on the same calendar day but filed in different weeks of the tax season are more comparably grouped by "which tax year they filed for" than by raw signup date.
Appropriate windows. The natural retention window is one full usage cycle (roughly 12 months for an annual product), possibly with a secondary metric for "returned within the SAME season across consecutive years" versus "returned at all, even late." A season-boundary-aware definition also has to decide what counts as the deadline for "this year's occasion" (e.g., the tax filing deadline plus any extension window), since a user who files in October under an extension is still part of that year's cohort, not a straggler from a hypothetical monthly cadence.
Alternative, sub-annual success metrics that ARE meaningful for low-frequency products, since waiting a full year to know whether the product is healthy is operationally unworkable:
- Completion rate within the active season: of users who started a return this season, what fraction finished it. This is available in weeks, not months, and is a genuine leading indicator of a smooth in-season experience.
- In-season engagement depth: number of sessions, documents uploaded, or support contacts per filer during the active window, a proxy for effort and friction rather than for year-over-year retention.
- Pre-season re-engagement signals: did the prior year's filers open a "get ready for this year" reminder or start early, measurable months before the deadline and predictive of whether they will complete this year at all.
- NPS or a direct "will you use this again next year" intent survey, captured right after a successful filing while the experience is fresh, as a stated-intent leading indicator for the true year-over-year outcome that cannot otherwise be observed for another 11 months.
Worked example
A tax-filing service serves 100,000 users in tax year 2025 (filed by the extended October 2025 deadline). Using an event-cohort definition anchored to "filed for tax year 2025," the following year-over-year comparison becomes meaningful in a way day-30 retention never would be:
year-over-year retention=users who filed for tax year 2025users who filed for tax year 2025 AND filed for tax year 2026If 71,000 of the 100,000 2025 filers go on to file again for tax year 2026, year-over-year retention is 71,000/100,000=71%, a single well-defined number computed once a year. Contrast this with the same 100,000 users' day-30 retention (measured 30 days after their 2025 filing date): almost by construction near 0%, since the product gives them no reason to return that soon, illustrating exactly why the metric choice, not the product, is what would be "broken" if day-30 were used here.
Trade-offs and pitfalls
- Forcing a daily-cadence metric onto a seasonal product is the single most common mistake, usually inherited by copying a retention dashboard template built for a different (frequent-use) product without adapting the windows to the product's actual usage rhythm.
- Year-over-year retention alone is a very slow feedback loop. By the time you learn the 2025-to-2026 number, an entire product cycle has passed with no earlier signal; the sub-annual leading indicators above exist specifically to give the team something actionable well before the annual number is available.
- Event cohorts require a clean definition of the triggering event, and for products with genuinely irregular (not just seasonal) usage, that definition itself can be ambiguous (does "started but abandoned a return" count as filing for that year, or not); the retention number is only as trustworthy as that upstream definition is consistent.
You must recommend whether to invest more in acquisition or retention. Build a simple framework using cohort LTV and CAC to justify your recommendation. Describe the calculations, the time horizon you'd use, and how sensitivity to assumptions (e.g., discount rate, churn) affects the decision.
Sample Answer
Direct answer
Build the comparison as LTV:CAC for each candidate acquisition channel against the marginal return on a comparable dollar spent on a retention initiative, using a consistent time horizon and discount rate for both sides, then explicitly stress-test the recommendation against plausible changes in churn and discount-rate assumptions before committing to it, since this decision is exactly the kind where the "right" answer can flip under a fairly small assumption change.
Structured elaboration
The LTV calculation, driving both sides of the comparison. A standard closed-form approximation for subscription LTV is LTV=churn rate+discount rateARPU×gross margin, where ARPU is average revenue per user per period, churn rate and discount rate are both expressed on the SAME period (e.g., both monthly), and gross margin adjusts revenue down to the actual contribution margin the business keeps. This formula comes from treating a subscriber's future cash flows as a geometrically-decaying perpetuity (each period, a (1−churn) fraction of revenue survives to the next period, and each future period is additionally discounted by 1/(1+r)), summed to a closed form.
Time horizon. For the ACQUISITION side, LTV:CAC is naturally evaluated against the full expected customer lifetime (the perpetuity-style formula above implicitly does this). For the RETENTION side, the relevant comparison is the incremental LTV a retention initiative produces (the effect of moving churn down by some amount, holding ARPU fixed) against the retention initiative's own cost, over the SAME horizon convention, so the two sides of the comparison are apples-to-apples rather than one being a full-lifetime figure and the other a single-period figure.
Sensitivity to assumptions. Both churn and discount rate sit in the DENOMINATOR of the LTV formula, so LTV is highly sensitive to small absolute changes in either, especially at low base churn rates (the same 2-point change in churn matters far more when base churn is 3% than when it is 15%, since it represents a much larger RELATIVE change to the denominator). This sensitivity is not a flaw in the model, it is the actual economic reality: a small, sustained improvement in retention compounds into a large LTV improvement precisely because it changes how long, on average, a subscriber survives.
Worked example
ARPU = $50/month, gross margin = 70%, baseline monthly churn = 5%, monthly discount rate = 1%. Base-case LTV =(50×0.70)/(0.05+0.01)=35/0.06≈$583.33. Two acquisition channels: Channel A costs CAC=$300/user (LTV:CAC ≈1.94), Channel B costs CAC=$450/user (LTV:CAC ≈1.30); both clear the common "at least 3:1 is comfortable, above 1:1 is not value-destroying" heuristic threshold at these base assumptions, with Channel A clearly the stronger bet. Now stress-test with a plausible WORSE assumption, churn rising from 5% to 7% (a churn increase that a retention initiative might exist specifically to prevent): LTV falls to (50×0.70)/(0.07+0.01)=35/0.08=$437.50, and Channel B's LTV:CAC falls to 437.50/450≈0.97, BELOW 1, meaning Channel B would flip from marginally-acceptable to value-destroying under the higher-churn scenario, while Channel A's ratio only falls to 437.50/300≈1.46, remaining clearly viable. This is the concrete mechanism by which a retention deterioration can retroactively make an acquisition decision look wrong even though nothing about the channel itself changed: the acquisition-vs-retention trade-off is not static, it depends on which churn regime the business is actually operating in.
Trade-offs and pitfalls
- Treating LTV:CAC as a single static number rather than running it across a plausible RANGE of churn and discount-rate assumptions is the core mistake this question is testing for; the worked example shows a 2-point absolute churn change (a entirely plausible, even modest, real-world swing) is enough to flip a channel from acceptable to value-destroying.
- CAC itself is easier to measure precisely than LTV, which creates an asymmetry in how confidently each side of the ratio should be trusted; a decision based on a precisely-known CAC divided by a highly assumption-sensitive LTV should be presented with that asymmetry made explicit, not as a single clean ratio.
- The formula above assumes constant churn and ARPU over the customer's entire lifetime, which is a simplification; real cohorts typically show declining churn rates as tenure increases (survivors self-select toward being more engaged over time), so a naive constant-churn LTV can understate the true value of longer-tenured segments and should be validated against actual observed cohort curves rather than trusted as a pure formula in isolation.
A practical companion framing: payback period
LTV:CAC answers "is this channel worth it over the long run," but a business with a real cash constraint often needs a second, shorter-horizon question answered too: how many months until the CAC is recouped at all, independent of the full lifetime value. Payback period (CAC divided by monthly gross-margin-adjusted ARPU) for Channel A above is 300/(50×0.70)≈8.6 months, and for Channel B is 450/35≈12.9 months. A business with limited working capital may reasonably prefer Channel A even before running the churn-sensitivity analysis, simply because it ties up cash for a shorter period, a constraint the pure LTV:CAC ratio does not capture on its own.
Explain how you would use cohort analysis to detect whether a feature that increased signups damaged long-term retention (a guardrail). Outline the steps and key cohort metrics you would compute over a 12-week window.
Sample Answer
Direct answer
Compare the retention CURVE (not a single point-in-time number) of users acquired through the feature-driven signup surge against a comparable pre-feature cohort over a full 12-week window, since a feature that inflates signups with lower-intent users can look neutral or even positive on raw signup counts while quietly dragging down the QUALITY-adjusted retention of the resulting cohort, a guardrail effect that only shows up when tracked over enough weeks to separate genuine habit formation from an early novelty bump.
Structured elaboration
Why a single point-in-time retention number cannot serve as the guardrail here. A feature that increases signups could plausibly affect retention in several different ways: it could bring in a genuinely lower-intent population whose curve is uniformly worse at every offset; it could bring in a NORMAL-intent population but pull them in via lower-friction signup steps that leave them less prepared for the product's actual value, showing a normal early curve but a worse LATE curve as their initial curiosity fades; or it could have no real effect on quality at all, with observed differences purely due to cohort-size noise. Only a full curve, tracked over enough weeks to distinguish these shapes from each other, can tell these apart; a single day-7 or day-30 snapshot cannot.
Steps. (1) Identify the feature-exposed cohort precisely: users who signed up specifically via the flow associated with the signup-driving feature, not simply "everyone who signed up after the feature launched" (which would conflate the feature's effect with ordinary calendar-time drift). (2) Select a comparable PRE-feature baseline cohort, ideally matched on acquisition channel mix and seasonality (same time of year, similar marketing spend), not just "whatever cohort came immediately before." (3) Compute both cohorts' full retention curves at consistent offsets (week 0 through week 12) using the SAME "active" event definition for both, so the comparison is apples-to-apples. (4) Compare the curves' SHAPES, not just their endpoints, specifically checking whether any early-weeks similarity diverges into a later-weeks gap (the "normal start, worse ending" pattern described above is the hardest guardrail violation to catch with anything less than a full curve).
Key cohort metrics to compute over the 12-week window. Retention rate at each week offset for both cohorts; the WIDTH of the gap between the two curves at each offset (not just whether a gap exists, but whether it is growing, shrinking, or constant across the window, since a growing gap is the clearest sign of a genuine, compounding quality difference rather than a one-time cohort-composition fluke); and cohort SIZE for both groups, since the guardrail question ultimately needs to weigh a possibly-worse retention RATE against a possibly-much-LARGER cohort size (more total signups) to determine whether the feature is net positive or net negative for the business even if it does depress the retention rate somewhat.
The net-effect calculation the guardrail check ultimately needs to answer. Even a confirmed, statistically real retention-rate decline does not automatically mean the feature should be reverted: if the feature increases signups by 40% while only decreasing 12-week retention by 3 percentage points, the ABSOLUTE number of retained users at week 12 could still be higher than before the feature shipped, depending on the exact magnitudes; the guardrail analysis should compute and report this net comparison explicitly (retained users under the old flow vs. retained users under the new flow, in absolute terms), not stop at "retention rate went down, therefore bad."
Worked example
Pre-feature baseline cohort: 5,000 signups/week, week-12 retention 22%, giving 5,000×0.22=1,100 retained users at week 12. Post-feature cohort: signups rise to 7,200/week (a 44% increase), but week-12 retention comes in at 19% (a real 3-point decline, confirmed by the full curve showing the gap widening steadily from week 4 onward, not just a week-12 snapshot artifact), giving 7,200×0.19=1,368 retained users at week 12. Even with a genuine, statistically confirmed retention-rate decline, the absolute number of retained users is HIGHER under the new feature (1,368 vs. 1,100), a net positive despite failing the naive "did the retention percentage go down" guardrail check; the recommendation here would be to keep the feature but investigate WHY the widening-gap pattern exists (a lower-intent signup population, most likely) with an eye toward improving that population's retention further, rather than reverting a feature that is net-positive in absolute retained users.
Trade-offs and pitfalls
- Treating "the retention rate went down" as an automatic revert signal, without computing the absolute-retained-users comparison, is the single most common way this guardrail check gets misapplied; the worked example shows a real, confirmed rate decline coexisting with a net-positive absolute outcome.
- Comparing against the immediately-prior cohort instead of a properly channel-and-seasonality-matched baseline risks attributing an unrelated seasonal or channel-mix shift to the feature itself; the guardrail's whole credibility depends on the comparison cohort being genuinely comparable.
- Stopping the analysis at week 4 or week 6 instead of running the full 12 weeks risks missing exactly the "normal start, worse ending" pattern this guardrail exists to catch; a shorter window would show the two cohorts looking similar and could clear the feature prematurely, only for the true quality gap to reveal itself later than the truncated analysis looked.
Write an ANSI SQL query that computes cohort lifetime value (LTV) per user acquisition week using tables: users(user_id, acquired_at, channel), purchases(user_id, amount, purchase_date). Compute cumulative LTV at 7, 30, and 90 days after acquisition for each cohort and channel. Explain handling refunds and partial observations.
Sample Answer
Direct answer
Join each purchase back to its user's acquisition week and channel, compute how many days after acquisition each purchase happened, and sum the purchase amounts (which is where refunds, entered as negative amounts, net out correctly) within each of the 7/30/90-day windows, divided by the cohort's total user count so that non-purchasers correctly pull the average down.
Structured elaboration
Cohort key: acquisition week and channel together. date(acquired_at, 'weekday 0', '-6 days') (or, in Postgres, date_trunc('week', acquired_at)) buckets each user into their Monday-anchored acquisition week; grouping by (cohort_week, channel) lets you compare, for example, paid_search's week-1 cohort against organic's week-1 cohort directly, which is usually the point of computing LTV by channel in the first place (channel-level payback economics).
Days-since-acquisition, not calendar date. Every purchase needs days_since_acq = purchase_date - acquired_at, computed per row, so that "cumulative LTV at 30 days" means 30 days after EACH user's own acquisition, not 30 days after a fixed calendar date; this is the same day-offset idea used for retention curves, applied to a monetary metric instead of a binary active/inactive one.
Cumulative windows via conditional SUM, not three separate queries. SUM(CASE WHEN days_since_acq <= 7 THEN amount END) inside one query, run three times for 7/30/90, keeps the three horizons consistent with each other and with a single pass over the purchases table, rather than risking subtly different join logic across three separate queries.
Dividing by cohort size, including non-purchasers. The denominator is cohort_size (all acquired users in that week/channel), not the count of users who made a purchase; a user who never buys anything contributes 0 to the numerator and still counts in the denominator, which is what makes this a genuine per-user LTV rather than an average-order-value-among-buyers number. This requires a LEFT JOIN from users to purchases (so non-purchasing users still appear with amount = NULL), not an INNER JOIN.
Refunds. A refund recorded as a NEGATIVE row in the same purchases table nets out automatically inside the SUM, as long as the refund's OWN purchase_date (not the original purchase's date) is used to determine which window it falls into; a refund issued 40 days after the original purchase correctly reduces ltv_90d but not ltv_7d or ltv_30d, since it wasn't observed yet within those earlier, shorter windows. This is a genuinely important modeling choice: it means LTV at an early horizon can look HIGHER than the same cohort's LTV once you look further out, if a meaningful share of purchases end up refunded a few weeks later, which is a real, useful signal (not a bug) about revenue quality.
Partial observations (censoring). A cohort acquired only 10 days ago cannot have a valid 30-day or 90-day LTV number yet; those cells should read as not-yet-available (e.g., NULL, which a LEFT JOIN-based query naturally produces when there is no purchase row within a window that hasn't fully elapsed) rather than being computed and reported as if they were final, comparable numbers.
Worked example
Schema: users(user_id, acquired_at, channel), purchases(user_id, amount, purchase_date). Four users, two channels, one refund:
CREATE TABLE users (user_id INTEGER, acquired_at TEXT, channel TEXT);
CREATE TABLE purchases (user_id INTEGER, amount REAL, purchase_date TEXT);
INSERT INTO users VALUES
(1,'2026-01-01','paid_search'), (2,'2026-01-01','paid_search'),
(3,'2026-01-02','organic'), (4,'2026-01-02','organic');
INSERT INTO purchases VALUES
(1, 50.0, '2026-01-04'), (1, 30.0, '2026-01-11'), (1, -50.0, '2026-02-10'), -- refund on day 40
(2, 20.0, '2026-01-06'),
(3, 40.0, '2026-01-03'), (3, 40.0, '2026-01-10'), (3, 40.0, '2026-04-07'); -- 3rd purchase at day 95, outside 90d window
WITH cohort AS (
SELECT user_id, date(acquired_at,'weekday 0','-6 days') AS cohort_week, channel, acquired_at
FROM users
),
p AS (
SELECT c.user_id, c.cohort_week, c.channel, pu.amount,
CAST(julianday(pu.purchase_date) - julianday(c.acquired_at) AS INTEGER) AS days_since_acq
FROM cohort c LEFT JOIN purchases pu ON pu.user_id = c.user_id
),
cohort_size AS (
SELECT cohort_week, channel, COUNT(*) AS n_users FROM cohort GROUP BY cohort_week, channel
)
SELECT cs.cohort_week, cs.channel, cs.n_users,
ROUND(COALESCE(SUM(CASE WHEN p.days_since_acq<=7 THEN p.amount END),0)/cs.n_users,2) AS ltv_7d,
ROUND(COALESCE(SUM(CASE WHEN p.days_since_acq<=30 THEN p.amount END),0)/cs.n_users,2) AS ltv_30d,
ROUND(COALESCE(SUM(CASE WHEN p.days_since_acq<=90 THEN p.amount END),0)/cs.n_users,2) AS ltv_90d
FROM cohort_size cs JOIN p ON p.cohort_week=cs.cohort_week AND p.channel=cs.channel
GROUP BY cs.cohort_week, cs.channel, cs.n_users ORDER BY cs.cohort_week, cs.channel;
Executed against SQLite. Output:
cohort_week | channel | n_users | ltv_7d | ltv_30d | ltv_90d
2025-12-29 | organic | 2 | 20.0 | 40.0 | 40.0
2025-12-29 | paid_search | 2 | 35.0 | 50.0 | 25.0
paid_search: ltv_7d = (50+20)/2 = 35.0; ltv_30d = (50+30+20)/2 = 50.0; ltv_90d = (50+30-50+20)/2 = 25.0, the refund pulling the 90-day figure BELOW the 30-day figure for the same cohort, exactly the "refund observed later reduces the longer-horizon number" behavior described above. organic: ltv_7d = 40/2 = 20.0 (only user 3's day-1 purchase qualifies); ltv_30d = (40+40)/2 = 40.0; ltv_90d stays at 40.0 since user 3's third purchase (day 95) falls outside the 90-day window and is correctly excluded, not double-counted.
Trade-offs and pitfalls
- The 90-day LTV going DOWN from the 30-day figure (paid_search's 50.0 to 25.0) looks like a bug on first read but is the refund correctly netting out; reporting only the 90-day number without the 30-day comparison hides that a third of paid_search's cohort revenue was later refunded, which is exactly the kind of signal a channel-economics decision needs.
- Comparing LTV across cohorts of different ages without noting which windows are still censored produces a systematically biased "cohorts are improving" or "cohorts are declining" story that is really just an artifact of older cohorts having had more time to accumulate purchases (and refunds).
- Average LTV alone hides a highly skewed revenue distribution. A cohort's LTV can be dominated by a small number of large purchasers; pairing the average with the purchaser rate (fraction of the cohort with ANY purchase) and, ideally, a percentile view avoids over-indexing decisions on the mean alone.
You have a limited growth budget. Acquisition gives CAC = $30 with expected LTV = $45 per new user. A retention program costs $10k and is expected to raise 6-month LTV by $5 for 500k active users. Which investment gives higher ROI? Show the math and discuss non-financial factors to consider when choosing between acquisition and retention.
Sample Answer
Direct answer
On the numbers as given, the retention program's return dwarfs the acquisition option by roughly two orders of magnitude, but that gap is itself a signal to interrogate the inputs rather than accept at face value: a $10,000 program claiming to durably raise 6-month LTV by $5 for 500,000 already-active users is an extraordinarily cheap lever, and a careful answer says so explicitly before recommending it, alongside the real non-financial factors (feasibility, risk, and diminishing returns) that the raw math cannot capture.
Structured elaboration
The acquisition math. Profit per new user =LTV−CAC=45−30=$15. Return on the CAC investment =15/30=50%, a healthy, ordinary-looking acquisition economics figure.
The retention math. Total value created =$5×500,000=$2,500,000, against a $10,000 cost, for a net gain of $2,490,000 and a return of 2,490,000/10,000=24,900%, or a 250x multiple on spend.
Why this comparison, taken at face value, should raise suspicion rather than immediate confidence. A program costing $10,000 that reliably moves a behavioral metric (LTV) for 500,000 already-existing users is claiming an almost impossibly low per-user cost of intervention, $0.02 per user ($10,000/500,000). Real retention programs (a redesigned onboarding flow, a lifecycle email system, a loyalty mechanic) typically carry both meaningful one-time engineering cost AND ongoing operating cost that scales at least somewhat with user count, neither of which a flat $10,000 figure plausibly captures at this scale. The HONEST analytical move here is not to simply report the 250x figure as the answer, but to name this implausibility directly: either the $10,000 figure is understated (missing engineering time, ongoing maintenance, or opportunity cost), or the claimed $5 LTV lift is itself an optimistic assumption not yet validated by an actual experiment, or both.
Non-financial factors to weigh even after correcting the obvious implausibility. Acquisition scales roughly linearly with spend (doubling ad budget roughly doubles new users, modulo channel saturation), giving management fine-grained, continuous control over growth rate; a retention program's effect size, once shipped, is comparatively fixed and does not scale with additional spend the same way, so the two levers have very different flexibility profiles even when their headline ROI numbers are comparable. Retention improvements also typically compound (a durably retained cohort keeps generating value in FUTURE periods too, not just the one 6-month window this calculation captures), which the CAC comparison, evaluated over a single LTV snapshot, does not fully credit either lever for. Risk profile differs too: an acquisition channel's ROI is relatively easy to measure quickly and stop if it underperforms, while a shipped product change affecting 500,000 users' experience carries real execution risk (a poorly-designed retention mechanic can backfire) that a clean point-estimate LTV lift does not capture.
Worked example
The core arithmetic, run explicitly:
cac = 30
ltv_acq = 45
acq_roi = (ltv_acq - cac) / cac
program_cost = 10000
ltv_lift_per_user = 5
active_users = 500000
total_value_created = ltv_lift_per_user * active_users
retention_roi = (total_value_created - program_cost) / program_cost
cost_per_user = program_cost / active_users
print(f"acquisition profit/user = ${ltv_acq - cac}, ROI = {acq_roi:.0%}")
print(f"retention total value = ${total_value_created:,}, net = ${total_value_created - program_cost:,}")
print(f"retention ROI = {retention_roi:.0%} ({total_value_created/program_cost:.0f}x)")
print(f"implied retention program cost per user = ${cost_per_user}")
Output (actually executed):
acquisition profit/user = $15, ROI = 50%
retention total value = $2,500,000, net = $2,490,000
retention ROI = 24900% (250x)
implied retention program cost per user = $0.02
The final line, $0.02 per user, is the number that should give any candidate pause before recommending the retention program purely on the strength of the 250x figure; flagging it is what separates a senior answer from one that mechanically reports whichever number is larger.
Trade-offs and pitfalls
- Recommending the retention program purely because 250x beats 50% is the single most common shortcut this question invites, and it is exactly the shortcut a careful candidate should resist by naming the implausibility of the underlying cost assumption before accepting the conclusion.
- Even after adjusting for a more realistic program cost, retention and acquisition are not perfectly substitutable levers, since one scales continuously with spend and the other does not; a real budget decision typically wants BOTH, allocated according to their respective marginal returns at the CURRENT margin, not an all-or-nothing choice between the two options as stated.
- A single 6-month LTV snapshot undercounts a durable retention improvement's TRUE value, since a retained cohort keeps contributing in periods beyond the one measured; this cuts in favor of the retention option being under-, not over-, valued by the given numbers, a genuine tension with the cost-implausibility concern raised above and worth naming as an open question rather than resolved in either direction.
Unlock Full Question Bank
Get access to all 44 User Retention & Engagement interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.