Pricing Strategy and Business Model Questions
Setting and evolving prices and the monetization model they sit in. Covers pricing metrics and structure (per-seat, tiered, usage-based, hybrid, outcome-based), packaging and bundling, freemium versus paid versus ad-supported monetization, and migrating between pricing models, including from perpetual licences to subscription and consumption billing. Includes estimating willingness to pay and price elasticity (van Westendorp, Gabor-Granger, conjoint, observational and causal methods), designing and analysing price tests and reporting their results, discount and deal-desk policy, regional and personalized pricing, and quantifying the revenue, churn, LTV and margin impact of a price or packaging change. Also covers fee design and surge pricing on two-sided marketplaces, responding to competitor price cuts, and rolling out algorithmic pricing safely. Assesses commercial judgment and quantitative rigor on pricing decisions from product, sales, finance and analytics angles. Business-model archetype selection, unit-economics definitions and go-to-market execution are adjacent topics, not the focus.
Evaluate a 15% price increase across enterprise, mid-market and SMB customers that differ in price sensitivity and contract terms. Estimate the net revenue change and churn by segment, and propose mitigations.
Sample Answer
Direct answer
Do not apply a flat 15% to everyone. A price increase only creates revenue if the customers who stay pay enough extra to outweigh the ones who leave, and that balance differs by segment: enterprise customers (large accounts on multi-year contracts) tolerate it, mid-market (mid-sized accounts on annual contracts) sits near neutral, and SMB (small businesses on monthly plans) can lose revenue. With the illustrative elasticities below, a flat 15% adds about $0.17M of revenue in the first 12 months (what actually lands in the next year, because most contracts have not yet reached a renewal) and about $2.44M of annualised run-rate (the yearly revenue change once every customer is on the new price), while SMB loses revenue and roughly 19% of its renewing revenue. A tiered increase (enterprise 20%, mid-market 12%, SMB 5%) does better on both measures, +$0.57M and +$3.49M. Treat the numbers as a structure, because the elasticities are assumptions I would replace with segment data.
Method
- Split by segment and by contract timing. A multi-year enterprise contract cannot be repriced until renewal, so only the share of revenue reaching a renewal inside the window is exposed, and it is exposed for only the months left after renewal. Monthly SMB plans are exposed almost immediately (after the notice period, the advance warning the contract requires before a price change, 30 days in the example).
- Assign an elasticity to each segment (percentage change in buyers for a 1% price change; negative). Use renewal history and quote data where the uplift varied, or a test on new buyers as a proxy.
- Compute for each segment: volume kept = (1 + 15%) to the power of elasticity; revenue factor = 1.15 x volume kept; change in 12-month revenue = ARR x share renewing in window x (months at new price / 12) x (revenue factor - 1). ARR (annual recurring revenue) is the yearly value of subscriptions.
- Report churn and revenue per segment. Extra revenue churn = share renewing x (1 - volume kept), as a percentage of segment ARR.
- Convert to profit. Fewer customers also means lower cost to serve and support load; add the margin per segment before deciding.
Worked example (illustrative inputs)
Assumed: Enterprise $24M ARR on 3-year contracts (one third reaches renewal in the window, 6 months on average at the new price), elasticity -0.3. Mid-market $18M ARR on annual contracts (all renew in the window, 6 months), elasticity -0.8. SMB $8M ARR on monthly plans (all exposed, 11 months at the new price after 30 days notice), elasticity -1.5.
# name, ARR $M, share of ARR that reaches a renewal inside 12 months,
# average months at the new price for those renewals, assumed elasticity
segments = [
("Enterprise", 24.0, 1/3, 6, -0.3), # 3-year contracts, renewals spread evenly
("Mid-market", 18.0, 1.0, 6, -0.8), # annual contracts, renewals spread evenly
("SMB", 8.0, 1.0, 11, -1.5), # monthly plans, 30 days notice
]
def evaluate(rises):
total, run_total = 0.0, 0.0
for (name, arr, share, months, e), rise in zip(segments, rises):
vol = (1 + rise) ** e # share of exposed revenue that stays
window = arr * share * months / 12 # $M of revenue that sees the new price
delta = window * ((1 + rise) * vol - 1) # $M change in 12-month revenue
extra_churn = share * (1 - vol) * 100 # extra revenue churn, % of segment ARR
run_rate = arr * ((1 + rise) * vol - 1) # $M ARR change once fully repriced
total += delta
run_total += run_rate
print(f"{name:<10} +{rise*100:.0f}% | elasticity {e:>4} | stay {vol*100:5.1f}% | "
f"12-mo revenue {delta:+6.2f}M | extra churn {extra_churn:4.1f}% of ARR | run-rate {run_rate:+6.2f}M")
print(f"total 12-month revenue change: {total:+.2f}M, run-rate ARR change: {run_total:+.2f}M, on {sum(s[1] for s in segments):.0f}M ARR\n")
print("Flat 15%"); evaluate([0.15, 0.15, 0.15])
print("Tiered: Enterprise 20, Mid-market 12, SMB 5"); evaluate([0.20, 0.12, 0.05])
Output:
Flat 15%
Enterprise +15% | elasticity -0.3 | stay 95.9% | 12-mo revenue +0.41M | extra churn 1.4% of ARR | run-rate +2.47M
Mid-market +15% | elasticity -0.8 | stay 89.4% | 12-mo revenue +0.26M | extra churn 10.6% of ARR | run-rate +0.51M
SMB +15% | elasticity -1.5 | stay 81.1% | 12-mo revenue -0.49M | extra churn 18.9% of ARR | run-rate -0.54M
total 12-month revenue change: +0.17M, run-rate ARR change: +2.44M, on 50M ARR
Tiered: Enterprise 20, Mid-market 12, SMB 5
Enterprise +20% | elasticity -0.3 | stay 94.7% | 12-mo revenue +0.54M | extra churn 1.8% of ARR | run-rate +3.27M
Mid-market +12% | elasticity -0.8 | stay 91.3% | 12-mo revenue +0.21M | extra churn 8.7% of ARR | run-rate +0.41M
SMB +5% | elasticity -1.5 | stay 92.9% | 12-mo revenue -0.18M | extra churn 7.1% of ARR | run-rate -0.19M
total 12-month revenue change: +0.57M, run-rate ARR change: +3.49M, on 50M ARR
Reading it:
- Enterprise: keeps 95.9% of exposed revenue and revenue per kept customer rises 15%, so it pays. Only a third is exposed in the window, which is why the in-window gain (+$0.41M) is far below its run-rate (+$2.47M).
- Mid-market: elasticity -0.8 gives +$0.26M in-window. It is revenue-positive but loses 10.6% of exposed revenue to churn, which is a lot of lost accounts (logos) for a small gain. If the elasticity is -1 or worse it is revenue-neutral or negative, and the only remaining benefit is lower cost to serve.
- SMB: loses $0.49M in-window and 18.9% of its revenue churns. Run-rate is -$0.54M. The break-even elasticity (the response at which revenue neither rises nor falls) is -1: at -1 the revenue factor is 1.15 x 1.15^-1 = 1.00, so the rise gains exactly what it loses. At -1.5 it is 1.15 x 1.15^-1.5 = 1.15^-0.5 = 0.933, a 6.7% loss on exposed revenue, which on $8M x 11/12 = $7.33M of exposed revenue gives about -$0.49M. SMB is on the wrong side unless its true response is milder than -1.
- Flat versus tiered: the tiered case raises price most where demand is least sensitive. Its enterprise 20% is a bigger step than the 15% case, and a constant elasticity assumed for one size of rise may not hold for a larger one, so that line carries the most risk.
- The most sensitive assumption is the SMB elasticity: moving it between -1 and -2 swings the SMB line from neutral to a loss of more than $0.8M in-window. Contract timing is second, because it controls how much revenue is exposed at all.
Mitigations by segment
| Segment | Lever | Why it works |
|---|---|---|
| Enterprise | Notify at renewal with a value summary; offer a multi-year lock at the old uplift cap (the contract clause that limits how much the price may rise at renewal) | Contracts already limit exposure; a lock trades price for commitment |
| Mid-market | Phase the rise over two renewals; tie it to new packaging or features | Softens the single-step shock and gives a reason for the change |
| SMB | Smaller rise, annual-prepay discount, or grandfathering (keeping existing customers on their old price) for a defined period | The segment with the highest response and lowest switching cost |
| All | Deal desk approval for discounts below an agreed floor; a save offer (a concession made to a customer who asks to cancel) for cancellation requests | Stops sales from quietly undoing the increase |
A deal desk is the small team that approves non-standard discounts and terms. Packaging is how features are grouped into plans.
Two of the levers in numbers (illustrative). Phasing: a mid-market account paying $60,000 a year pays $69,000 under a single 15% step. Phased over two renewals at 7.2% each (1.072 x 1.072 = 1.149), it pays $64,320 and then about $68,950, so the first-year jump is $4,320 instead of $9,000 and the account reaches the same price one renewal later. Annual prepay: an SMB plan at $100 a month moving to $115 costs $1,380 a year billed monthly. Offering 12 months prepaid at 10% off the new price costs $1,242, which is 3.5% above the old $1,200, and it locks the customer in for the year, so the churn risk is deferred, not removed.
Second-order effects and pitfalls
- Downgrades instead of churn: customers move to a cheaper tier, so revenue falls without a logo loss.
- Discount leakage: if sales concede to close renewals, the realised increase is below 15%.
- Lost expansion: a churned logo takes its future upsell with it, so run-rate understates the damage.
- Competitive response and review-site reactions are real but hard to size; cap the downside with a pilot in one region or cohort (a group of customers who started in the same period or share a plan).
- Revenue churn versus logo churn: logo churn counts accounts lost and revenue churn counts dollars lost, so revenue churn weights big accounts more; report both.
Craft an analysis plan to evaluate a strategic shift from a freemium model to a paid-only offering. Specify the internal and external data needed, how you'd model conversion and revenue forecasts, recommended pilot/experiment designs to test impact, key risks to quantify, and a go/no-go decision framework for leadership.
Sample Answer
Direct answer
The decision is not "does a paywall earn more per visitor" but "does contribution from the customers we keep exceed contribution from the paying customers our free tier used to create, after the free tier's cost and its referral effect". In the worked example below, with 800 new paying customers a month from the free funnel, paid-only needs about 750 of them (94%) to break even (earn the same contribution as today). Plan: gather funnel, cost and referral data; model the funnel over time; test with randomised new signups (not by removing access from existing users); quantify the risks; and decide against thresholds written before the test.
Terms. Freemium is a free tier that converts a fraction of users to paid. Paid-only has no permanent free tier. ARPPU is average revenue per paying user. Contribution is revenue minus direct cost to serve. Viral or referral effect is new signups caused by existing users. Holdout is a group kept on the old experience. Gross margin is the share of revenue left after the direct cost of serving the customer. Pre-register means write the decision rule down before seeing results. Confidence interval is the range in which the true value plausibly lies; its lower bound is the pessimistic end. Randomise means assign people to groups by chance. Grandfathering is letting existing customers keep their old terms. Bottom-up adoption is individual employees adopting a product before their company buys it. Cohort curves are retention and revenue curves for each signup month. Card-first signups require a payment card at signup. Activation is the share of new signups who complete the first key action. Guardrails are metrics that must not get worse.
Data needed
Internal: signup-to-paid funnel by cohort and time since signup; usage depth of free users that predicts conversion; share of paying customers whose first touch was a referral from a free user; free-user serving cost (infrastructure, support, abuse); paid retention and ARPPU by acquisition source; team or company accounts that started with one free user and later bought seats; existing-user counts that would be affected.
External: competitors' free tiers and pricing; search demand for free-tier queries; surveys of willingness to pay (the most a customer will pay) among free users; reviews and community sentiment.
Modelling conversion and revenue
Forecast new paying customers per month as signups x conversion, with conversion varying by days since signup, then apply retention by cohort. Paid-only changes three terms: signups fall (many visitors will not enter a card), conversion among those who stay rises, and referral-driven signups fall. Model three scenarios (the lowest, middle and highest plausible signup loss), each with a range for conversion and retention, and show the 12-month contribution for each.
Worked example (illustrative inputs)
- Baseline cohort of 20,000 signups a month, 4% become paying: 800 payers.
- A payer brings $30 a month at 80% gross margin and stays 20 months: contribution per payer = 30 x 0.80 x 20 = $480.
- Free users cost $0.40 a month for an average 3 months: 20,000 x 0.40 x 3 = $24,000.
- Baseline cohort contribution = 800 x 480 - 24,000 = $360,000.
- Paid-only must produce N payers with N x 480 at least $360,000, so N = 750, which is 93.8% of 800. The $24,000 saved on free users is only 6.25% of the $384,000 that payers bring in, so it cannot offset a large loss of conversions.
- If only 30% of signups (6,000) remain, they must convert at 750 / 6,000 = 12.5%, more than three times the current 4%. At 20% (4,000) it is 18.8%.
- If paid-only customers stay longer, say 25 months, the requirement falls to 360,000 / (30 x 0.80 x 25) = 600 payers (75% of 800). Customer lifetime is the assumption to test first.
Pilot designs
- Randomise new visitors to free (control) or paid-only (treatment); existing free users keep their plan, so you measure only the effect on new signups.
- Test middle paths as extra arms: a 14-day full-featured trial then paywall; or a smaller free tier. The best answer is often a tighter free tier, not none.
- Money-back guarantee arm, which lowers the barrier to paying.
Primary measure: paid starts per 1,000 visitors at 90 days, then 12-month contribution per visitor from cohort curves. Need enough sample: use the formula n per group = 2 x 7.849 x p(1 - p) / d^2, where 7.849 is (1.96 + 0.8416)^2 (the constants for 95% confidence, a 5% false-alarm risk, and 80% power, an 80% chance of catching a real effect), p is the average of the two conversion rates and d the difference you must detect. Example: to detect paid starts per visitor moving from 2.0% to 2.4% (a 20% relative lift), p = 0.022 and d = 0.004, so n = 2 x 7.849 x 0.022 x 0.978 / 0.000016 = about 21,110 visitors per group, roughly 42,000 in total.
Risks to quantify
Loss of referral and word-of-mouth signups; loss of bottom-up adoption inside companies; lower search and community traffic; angry existing users and grandfathering cost; more chargebacks on card-first signups; competitors keeping free tiers; support load shifting to paying users.
Go/no-go framework
Pre-register thresholds. Go if the lower bound of the confidence interval on 12-month contribution per visitor beats control and guardrails (for example signup volume down by no more than 60% and activation no more than 2 points lower; both limits illustrative) hold. The signup limit comes from the break-even above: a 60% loss leaves 8,000 signups that must convert at 750 / 8,000 = 9.4%, more than double today's 4%, so beyond that the needed jump is implausible. No-go if contribution per visitor is below control with confidence. Middle (anything else, or if the trial arm wins): ship the hybrid, not full paywall. Leadership gets a one-page view with each scenario, the break-even in payers per month (750 in the example), and the decision date.
Compare offering a multi-year discount against reducing the customer's feature set (a downgrade) to retain revenue at renewal. Discuss long-term financial impact, churn risk, customer experience and precedent-setting concerns, and recommend a decision framework that commercial and finance teams can apply.
Sample Answer
Direct answer
Neither concession is automatically better. Diagnose why the customer is at risk first, then match the tool to the cause. A multi-year discount (a price concession in return for a commitment: the customer commits to two or three years in exchange for a lower annual price) fits a customer who gets real value but is pushing back on price or budget. A downgrade (a smaller feature set or lower tier at a lower price) fits a customer who is paying for features they do not use. In both cases the concession must buy something: commitment for the discount, a right-sized scope for the downgrade. A decision rule that commercial and finance can both apply is given below.
Terms used here
- ARR: annual recurring revenue, the yearly value of subscriptions in force.
- NRR (net revenue retention): revenue today from customers who existed a year ago, divided by what those same customers paid a year ago. Discounts and downgrades pull it down; expansion pushes it up.
- Gross profit: revenue minus the cost of serving the customer. Compare options on this, not on ARR alone, because a downgrade can lower cost to serve while a discount does not.
- Precedent: what customers and sales reps learn to expect after seeing a concession granted.
- Give-get: a rule that every concession is traded for something in return (a longer term, upfront payment, a reference), never given for free.
- Champion: the person at the customer who advocates for the product internally.
- Present value: a dollar received in year 3 is worth less than a dollar today (you could invest it, and it is less certain), so future profits are divided by 1.10 for each year of delay. A 10% annual discount rate is used below, and it is unrelated to price discounts.
- Gross margin: gross profit as a share of revenue. Net revenue retention is the NRR defined above.
Step 1: find the cause before choosing the tool
| Evidence | What it points to | Better fit |
|---|---|---|
| Core features used weekly, champion engaged, objection is "budget is tight" | Price pressure on a healthy account | Multi-year discount with a give-get (a trade, for example a longer term for a lower annual price) |
| Less than half of paid seats or modules active, objection is "we are not using it" | Paying for shelfware (unused entitlements) | Downgrade to what they use, with a path back up |
| A named competitor quote, usage healthy | Competitive price pressure | Discount tied to term, matched to a documented floor |
| Champion left, usage falling, no stated reason | Value or relationship problem, not price | Neither yet: fix adoption first, concession would only delay churn |
Step 2: compare the two on the four things the question names
| Dimension | Multi-year discount | Downgrade |
|---|---|---|
| Long-term financial impact | Lowers price on the whole base for the full term, but locks revenue and removes renewal risk for that term. Cost to serve is unchanged, so margin falls by the full discount. | Lowers revenue by the removed scope, but cost to serve usually falls with it, so margin loss is smaller than the revenue loss. Annual terms keep renewal risk alive. |
| Churn risk | Zero inside the term, then a renewal cliff (a sudden loss of customers when the locked term ends) at the end if value was never fixed. | Lower ongoing risk because the customer pays for what they use. Risk of resurfacing if they later need the removed features. |
| Customer experience | Can feel like being locked in. Resentment if value is not delivered. | Feels honest and usage-based. The customer may feel the product shrank. |
| Precedent | Risk that every renewal asks for a discount. Controlled by a published discount ladder tied to term. | Risk that customers learn shrinking is cheap. Controlled by requiring a term and pricing add-backs at list. |
Worked example: one at-risk renewal
A customer pays $120k per year at full scope, with $24k cost to serve (all figures are illustrative, in USD thousands, discounted at 10% per year over five years). Three offers:
- Full price: 75% accept now and 75% keep it each later year.
- Downgrade to $90k: $18k cost to serve, 90% accept, then 90% keep each year, one-year terms.
- Three-year deal at 10% or 20% off: 90% accept, cannot leave for three years, then a "keep after term" rate that depends on whether value was fixed.
# Expected 5-year gross profit (present value, USD thousands) of one at-risk renewal. All inputs illustrative.
R = 0.10 # annual discount rate
def pv(profit_per_year, p_accept, locked_years, keep_after, years=5):
# Year 1 is paid at signing (factor 1). Inside the locked term the customer cannot leave;
# after it, each further year is kept with probability keep_after.
total, alive = 0.0, p_accept
for t in range(years):
if t >= locked_years:
alive *= keep_after
total += alive * profit_per_year / (1 + R) ** t
return total
LIST, COST = 120.0, 24.0 # annual price and cost to serve at full scope
base = pv(LIST - COST, 0.75, 1, 0.75) # full price, 1-year terms, 75% accept and 75% keep each year
down = pv(90.0 - 18.0, 0.90, 1, 0.90) # downgrade: $90k price, $18k cost to serve, 90% accept, 90% keep
print(f"full price, no concession: {base:6.1f}")
print(f"downgrade to $90k, 1-year terms: {down:6.1f}")
for d in (0.10, 0.20):
for keep in (0.80, 0.50, 0.20):
v = pv(LIST * (1 - d) - COST, 0.90, 3, keep)
print(f"3-year deal at {d:.0%} off, keep after term {keep:.0%}: {v:6.1f}")
def break_even(gap, lo, hi):
# gap(x) rises with x; find the x where it crosses zero
for _ in range(50):
mid = (lo + hi) / 2
if gap(mid) > 0: hi = mid
else: lo = mid
return (lo + hi) / 2
# Keep-after-term rate at which a 20%-off 3-year deal falls to the downgrade's value
k = break_even(lambda s: pv(LIST * 0.8 - COST, 0.90, 3, s) - down, 0.0, 1.0)
print(f"20%-off 3-year deal equals the downgrade when keep-after-term = {k:.1%}")
# Acceptance rate at which that deal falls to the downgrade's value (keep-after-term 50%)
a = break_even(lambda x: pv(LIST * 0.8 - COST, x, 3, 0.50) - down, 0.0, 1.0)
print(f"... or when acceptance = {a:.1%} (keep-after-term 50%)")
Output:
full price, no concession: 192.9
downgrade to $90k, 1-year terms: 225.7
3-year deal at 10% off, keep after term 80%: 285.3
3-year deal at 10% off, keep after term 50%: 248.1
3-year deal at 10% off, keep after term 20%: 220.2
3-year deal at 20% off, keep after term 80%: 244.5
3-year deal at 20% off, keep after term 50%: 212.7
3-year deal at 20% off, keep after term 20%: 188.8
20%-off 3-year deal equals the downgrade when keep-after-term = 63.2%
... or when acceptance = 95.5% (keep-after-term 50%)
How to read it. The 10%-off three-year deal beats the downgrade (225.7) when at least half of customers stay after the term (248.1) but not when only 20% do (220.2). The 20%-off deal beats the downgrade only if the keep-after-term rate is at least 63.2%, and at 20% keep it falls below even the full-price baseline (188.8 vs 192.9). The most sensitive inputs are the keep-after-term rate and the acceptance rate. What the two break-even lines mean. "Keep-after-term" is the share of customers who renew once the three-year lock ends. At 63.2% the 20%-off deal and the downgrade are worth the same; below that rate the downgrade is better, above it the deal is. Likewise, the deal needs about 95.5% of customers to accept it to match the downgrade when only half stay after the term, which is unrealistic. This is the quantitative reason to diagnose first: a multi-year discount on a value-gap account buys three quiet years and then a churn event.
Decision framework commercial and finance can apply
- Classify the cause from usage data and the customer's stated reason: price, fit (shelfware), competitor, or relationship.
- Choose the tool by cause using the table in Step 1. If the cause is relationship or value, fix adoption before conceding anything.
- Make every concession a trade. Multi-year discount: longer term, annual prepayment, a price escalator on renewal (a contractual annual price increase, for example 3 to 5%), and a discount capped by a published ladder (for example, a larger discount only for a longer term). Downgrade: a minimum one-year term, add-backs at list price, and removed scope chosen from low-usage features. A discount ladder, as in step 3, could read: 1-year term 0%, 2-year term up to 7%, 3-year term up to 12%, 3-year with annual prepayment up to 15% (illustrative).
- Floor on net price per unit (the lowest price per seat or unit after all discounts that any deal may reach) and a minimum gross margin per account, set by finance, that no concession may cross without escalation.
- Approval by size: concessions inside the ladder approved by the account owner's manager, anything beyond it by a commercial plus finance pair.
- Record a reason code (a standard label such as budget, shelfware, competitor or relationship, chosen when the concession is logged) for every concession and review it twelve months later: did discounted or downgraded accounts renew, expand and stay profitable?
Trade-offs and pitfalls
- Treating lock-in as retention: the contract holds but the customer has already left emotionally.
- Reporting ARR instead of gross profit: a downgrade can look worse on ARR yet better on profit.
- A permanent price reset: a multi-year discount lowers the base that all future increases build on.
- Ad hoc discounts: without a ladder, the second customer hears about the first.
- What would change the call: strong evidence that the customer would also accept full price with modest enablement, in which case neither concession is needed.
You have subscription start and churn dates and recently raised prices. How would you analyse whether the increase drove higher churn? Describe your cohort definitions, comparison groups and how you would judge the result.
Sample Answer
Direct answer
Compare churn after the increase against a group that was not affected, not against the customers' own past. The standard design is difference-in-differences (DiD): measure the change in churn for customers whose price rose, subtract the change over the same period for similar customers whose price did not, and judge the remainder against a pre-agreed break-even and a confidence interval. Define cohorts by who actually saw the price change and when, use fixed windows aligned to billing, check that the two groups were moving in parallel beforehand (the parallel-trends assumption, tested with a placebo on an earlier window), and extend with survival analysis for tenure effects.
Data and cohort definitions
You have subscription start and churn dates; you also need, for each customer, the plan, billing frequency (monthly or annual), the date the new price took effect for them, and whether they were actually repriced (some are grandfathered).
- Exposed cohort: customers active on the effective date whose bill went up. Split by tenure band (under 3 months, 3 to 12, over 12), plan and segment, because new and old customers react differently.
- Comparison group: customers active at the same time whose price did not change (grandfathered customers, a plan or region held back, or a later rollout wave). If none exists, use the same calendar window one year earlier, with the caveat that it cannot separate the price from other things that changed.
- Churn window: a fixed window (for example 60 days) from each group's effective date. For annual plans, define the window from the renewal date, because churn can only happen at renewal.
- New customers acquired after the increase are a separate analysis (conversion and early churn), not part of this cohort.
Worked example (synthetic data, fixed seed)
The raised group starts with a lower baseline churn than the comparison group, which is common when the raised plan is the older, more loyal one. The true effect built into the data is a 1.5 times higher hazard (the daily probability that a customer cancels) after the increase.
import random
from math import sqrt
random.seed(11)
N = 8000 # customers per group, all active 120 days before the increase
HAZ = {"raised": 0.0008, "not_raised": 0.0011} # baseline daily churn probability per group
LIFT = 1.5 # true effect: raised group's daily hazard x1.5 after the increase
def window(alive, hazard, days=60):
retained = 0
for _ in range(alive):
if all(random.random() > hazard for _ in range(days)):
retained += 1
return retained
rates = {}
for g, h in HAZ.items():
at_risk = N
for name, hz in (("pre2", h), ("pre1", h), ("post", h * (LIFT if g == "raised" else 1.0))):
left = window(at_risk, hz)
rates[(g, name)] = ((at_risk - left) / at_risk, at_risk) # 60-day churn rate, denominator
at_risk = left
for (g, w), (r, n) in rates.items():
print(f"{g:<10} {w:<5} 60-day churn {r*100:5.2f}% (at risk {n})")
def did(w0, w1):
d, var = 0.0, 0.0
for g, sign in (("raised", 1), ("not_raised", -1)):
(r0, n0), (r1, n1) = rates[(g, w0)], rates[(g, w1)]
d += sign * (r1 - r0)
var += r0 * (1 - r0) / n0 + r1 * (1 - r1) / n1
return d, 1.96 * sqrt(var)
for label, (w0, w1) in (("placebo pre2->pre1", ("pre2", "pre1")), ("effect pre1->post", ("pre1", "post"))):
d, hw = did(w0, w1)
print(f"{label}: DiD {d*100:+.2f} pts (95% CI {100*(d-hw):+.2f} to {100*(d+hw):+.2f})")
Output:
raised pre2 60-day churn 4.41% (at risk 8000)
raised pre1 60-day churn 4.50% (at risk 7647)
raised post 60-day churn 6.67% (at risk 7303)
not_raised pre2 60-day churn 6.51% (at risk 8000)
not_raised pre1 60-day churn 6.48% (at risk 7479)
not_raised post 60-day churn 6.69% (at risk 6994)
placebo pre2->pre1: DiD +0.11 pts (95% CI -0.90 to +1.12)
effect pre1->post: DiD +1.96 pts (95% CI +0.87 to +3.06)
How to read it:
- How the simulation decides who stays:
all(random.random() > hazard for _ in range(days))draws one random number per day for a customer, and the customer is retained only if every one of the 60 draws is above the daily churn probability, meaning no day produced a cancellation. Counting retained customers gives each window's retention, and churn is the rest. - Before and after for the raised group alone: 4.50% to 6.67% is a rise of 2.17 points. But the comparison group drifted from 6.48% to 6.69% (+0.21 points) over the same weeks for reasons unrelated to price, so DiD is 2.17 - 0.21 = +1.96 points, with 95% interval +0.87 to +3.06.
- Comparing the two groups only after the increase gives 6.67% against 6.69%, which would wrongly say no effect, because the groups started at different levels. This is why DiD subtracts the baseline gap.
- Placebo test: the same calculation on the two earlier windows gives +0.11 points (interval -0.90 to +1.12), consistent with no pre-existing divergence. This supports the parallel-trends assumption, namely that without the price change the two groups would have moved together.
Judging the result
- Size against break-even. Convert the extra churn into lost lifetime revenue and compare it with the revenue gain per surviving customer from the higher price. The decision rule is the break-even extra churn, not significance. Worked on the example (the simulation does not state the size of the price rise, so assume 10%): the raised group's baseline 4.50% per 60 days is a monthly churn of 1 - sqrt(1 - 0.045) = 2.28%, an expected lifetime of 1 / 0.0228 = 43.9 months. Adding the +1.96 points gives 6.46% per 60 days, 3.28% per month and 30.5 months. If that extra churn persisted, lifetime revenue per customer would be 1.10 x (30.5 / 43.9) = 1.10 x 0.693 = 0.76, a 24% loss, and the price rise would need to be about 1 / 0.693 - 1 = 44% to break even. Over only the first 12 months the same comparison is +4.3% (expected billed months 10.05 against 10.61 per customer, times 1.10). Across the interval, the extra churn of +0.87 to +3.06 points gives a persistent-churn result of 0.92 to 0.65 and a 12-month result of +7% to +1%. So the decision turns on whether the extra churn persists: treat the 12-month figure as the optimistic bound and the persistent one as the pessimistic bound, and learn which applies from later renewals before judging.
- Robustness. Vary the window, exclude promotions, and separate voluntary cancellations from failed payments.
- Mix. Check downgrades, because they leave churn unchanged but cut revenue.
- Survival view. A Kaplan-Meier curve (the share of customers still subscribed by days since the increase) per group shows whether the gap opens immediately or grows. A Cox model (a regression that compares the instantaneous cancellation rate between groups while adjusting for tenure, plan and channel) gives a hazard ratio (how many times higher one group's cancellation rate is than the other's at any moment, so 1.5 means 50% higher) with an interval.
DiD with a placebo and the break-even comparison is the working core of this analysis. Survival curves, per-vertical regressions, event studies and synthetic control extend it when tenure, segment or a missing comparison group matters.
Vertical-level analysis
A vertical is an industry or product line. The minimum instrumentation (the data you must record) per vertical is: effective price per customer and date, notice date, plan and billing frequency, cancellation request date versus actual end date, cancellation reason, and voluntary versus failed-payment status. Estimate a segmented regression (the DiD regression of churn on treated x post, with an interaction, a term that lets that effect differ, for each vertical) to get a separate effect and interval per vertical. This is the DiD above run once per vertical, so each vertical needs enough customers for an interval narrow enough to compare with its own break-even. Agree thresholds that trigger action before looking: for example pause the increase in any vertical where the lower end of the interval for extra churn already exceeds that vertical's break-even.
Long-term LTV in a high-frequency segment
For customers who transact often (weekly or daily use, usage billing), compare repeat-purchase rates before and after with an event study (DiD with a separate estimate for each period before the change, the leads, and after it, the lags, so you see both pre-trends and the evolving effect). If no clean comparison group exists, use a synthetic control: a weighted blend of unaffected customers that matches the raised group's behaviour before the change. Extrapolate lifetime value from the estimated change in retention and frequency, the same conversion from churn to lifetime revenue as in the break-even step, and label it as a model, not a measurement.
Pitfalls
- Treating a before and after comparison as causal.
- Defining exposure by plan instead of by actual repricing.
- Ignoring that annual customers have not yet reached renewal.
- Reading an interval that crosses the break-even as proof of no effect, when it means the data cannot yet decide.
You are evaluating per-user pricing ($10/user/mo) versus a flat-fee $500/mo for teams. How would you model revenue and customer value across segments (small teams vs large orgs), calculate break-even team size for flat-fee, and discuss churn sensitivity and sales implications for each model?
Sample Answer
Direct answer
The break-even team size (the size at which the two prices are equal) is 50 seats: $500 / $10 per seat per month. Below 50 seats per-user pricing is cheaper for the customer, above it the flat fee is. Which model earns more depends less on that threshold than on who buys under each model, so I would model revenue by segment with an explicit assumption for how many small teams still buy at $500, and I would lean towards per-user pricing with seat bands (a lower price per seat for the seats beyond certain team sizes) rather than a hard $500 cap, because it keeps expansion revenue and does not price small teams out. A hard $500 cap earns the least of the options modelled below ($140,000 a month), so the bands are the way to give big accounts a better price without freezing their growth.
Customer view: price per team by size
| Seats | Per-user ($10/seat/mo) | Flat ($/mo) | Effective flat price per seat |
|---|---|---|---|
| 5 | $50 | $500 | $100.00 |
| 10 | $100 | $500 | $50.00 |
| 25 | $250 | $500 | $20.00 |
| 50 | $500 | $500 | $10.00 (break-even) |
| 100 | $1,000 | $500 | $5.00 |
| 300 | $3,000 | $500 | $1.67 |
All figures are dollars per team per month, so both models share a basis. Break-even in algebra: 10 x N = 500, so N = 50.
Revenue model by segment (illustrative mix)
Assume 1,000 teams: 600 teams of 5 seats, 300 of 20, 80 of 60 and 20 of 300. Assume everyone buys under per-user pricing. Under the flat fee assume only some buy: 25% of 5-seat teams (the price is 10x what they pay today), 70% of 20-seat teams, and all teams of 60 and 300 (they get a discount). The buy rates are guesses; the interesting output is how far they can move.
PER_SEAT, FLAT = 10, 500 # dollars per month
mix = [(5, 600), (20, 300), (60, 80), (300, 20)] # (seats per team, number of teams)
flat_buy = {5: 0.25, 20: 0.70, 60: 1.0, 300: 1.0} # share of each size that buys at the flat fee
per_user = sum(seats * PER_SEAT * teams for seats, teams in mix)
flat = sum(teams * flat_buy[seats] * FLAT for seats, teams in mix)
capped = sum(min(seats * PER_SEAT, FLAT) * teams for seats, teams in mix)
def banded(seats):
"""Seat bands: $10 a seat up to 50 seats, $7 a seat for seats 51-200, $5 a seat above 200."""
return min(seats, 50) * 10 + max(0, min(seats, 200) - 50) * 7 + max(0, seats - 200) * 5
banded_rev = sum(banded(seats) * teams for seats, teams in mix)
print("break-even seats", FLAT / PER_SEAT)
print("monthly revenue: per-user", per_user, "flat", flat, "per-user capped at 500", capped)
# Flat revenue = FLAT x (600 x x + 300 x 0.70 + 80 + 20), where x is the share of 5-seat teams that buy.
# Setting that equal to per_user and solving for x gives:
needed = (per_user / FLAT - 300 * 0.70 - 80 - 20) / 600
print("per-user with seat bands:", banded_rev, "; cost vs uncapped:", per_user - banded_rev)
print("300-seat teams (at $3,000) that would have to leave for uncapped to equal banded:", round((per_user - banded_rev) / 3000, 1))
print("flat matches per-user if 5-seat teams buying is at least", round(needed, 3))
Output:
break-even seats 50.0
monthly revenue: per-user 198000 flat 230000.0 per-user capped at 500 140000
per-user with seat bands: 176600 ; cost vs uncapped: 21400
300-seat teams (at $3,000) that would have to leave for uncapped to equal banded: 7.1
flat matches per-user if 5-seat teams buying is at least 0.143
So under these guesses the flat fee earns $230,000/month against $198,000 for per-user, but only because mid-size teams pay more than they do today. Where the 14.3% comes from: flat revenue is $500 x (600 x x + 300 x 0.70 + 80 + 20), where x is the share of 5-seat teams that buy, the 300 x 0.70 is the 70% of 20-seat teams that buy, and the 80 and 20 are the 60- and 300-seat teams that all buy. That equals $300,000 x x + $155,000. Setting it equal to the per-user $198,000 gives x = 43,000 / 300,000 = 0.143. If fewer than about 14.3% of 5-seat teams buy at $500, flat falls below per-user (all other buy rates held at the guesses above).
Two ways to give large accounts a better deal. A hard cap at $500 earns $140,000 because every team above 50 seats is frozen at $500, which gives away the most revenue and removes expansion beyond 50 seats. Seat bands (here $10 for the first 50 seats, $7 for seats 51 to 200, $5 above 200) earn $176,600: a 300-seat team pays $2,050 instead of $3,000 (500 + 150 x 7 + 100 x 5), a 500-seat team pays $3,050 (500 + 1,050 + 300 x 5), and teams keep paying more as they add seats. Bands cost $21,400 a month against uncapped per-user, so they pay for themselves only if they stop roughly 7 of the 20 largest teams ($3,000 each) from leaving or negotiating hard; that is the number to test.
Customer value, churn and sales
- Per-user: price tracks value (seats are a proxy for the value delivered), so expansion is automatic as teams hire, giving net revenue retention above 100% (NRR: revenue from the same customers a year later as a share of what they paid now). The risk is contraction (customers cutting seats, for example after layoffs) and seat-count gaming, such as shared logins (several people using one paid seat). Churn is highest in teams with many idle seats, so watch seat utilisation (the share of paid seats actually in use).
- Flat: predictable bills and an easy sale, but no automatic expansion and large teams are underpriced (a 300-seat team pays $1.67 per seat). Small teams may feel they overpay at $100 per seat and churn or never convert. Churn is lower for big teams (they got a deal) and higher for small ones.
- Sales: per-user needs a seat forecast and invites seat negotiation. Flat shortens the cycle and needs fewer approvals, but gives sales nothing to expand besides a second plan.
Recommendation and what would flip it
Choose per-user pricing with seat bands for large teams (as above, not a hard $500 cap), test it on new customers, and keep flat only as an annual-commit option. This is a choice of expansion and defensibility over the $32,000 higher revenue the flat model shows under guessed buy rates: that lead rests on mid-size teams paying 2.5 times more and on small teams buying at all, which are the least certain inputs. Flip towards the flat fee if data show seat-counting causes friction (deals stall on seat counts) and large teams rarely exceed a few dozen seats. The input to validate first is the buy rate of the smallest teams at $500, since that single assumption decides the revenue comparison.
Unlock Full Question Bank
Get access to all 45 Pricing Strategy and Business Model interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.