Your country

Tools that support it use your country for local currency, number formats, units and paper size. Your choice is saved only in this browser.

Type a name or a two-letter code. Use the up and down arrow keys to move through the countries, Enter to choose one and Escape to close.

Product Manager Interviews  Module 4 – Estimation and product strategy

Usage, revenue and capacity estimates

Estimate usage and its peak, the people in a service at once with Little's law, storage and yearly revenue, and check revenue against a public filing.

  • Intermediate
  • 15 minutes
  • Examples run with Python 3.14.8, Pyodide 314.0.7 and sql.js 1.14.2
  • By MySmartCoPilot
Free core, Pro depth: 6 of 15 minutes free
Free: Usage times a peak factor gives the load to plan for · Capacity estimates show how close the peak runs to the limit · Little's law counts the people in a service at once · 2 more sections. With a pass: 2 in-depth parts and 3 interview answers, about 9 minutes.

What you will learn

  • Estimate daily usage and peak load from a user base and its usage pattern
  • Estimate revenue from users, the share who pay and revenue per paying user
  • Use Little's law to estimate how many people use a service at once

Before you start

An expense app’s users upload 1,000,000 receipts a day. Is that 11.6 uploads a second or 34.7? Both: the first is the day’s average and the second its busiest hour, and only the second says what the app must handle when people use it most.

Below, you estimate usage and its peak for that invented app, see why the peak decides how long uploads wait, count the people in the app at once with Little’s law, and estimate its yearly revenue with a check against a public filing.

Usage times a peak factor gives the load to plan for

Usage estimates start from people and what they do: 250,000 daily users who upload 4 receipts each make 1,000,000 uploads a day, an average of 11.6 a second. People do not spread their uploads evenly over 86,400 seconds, so the average is multiplied by a peak factor: How many times the busiest period's rate exceeds the average rate, such as a busiest hour at 3 times the day's average. It is an assumption, so it is stated and then checked against the pattern of real use., an assumption you state and check. At 3, the busiest hour runs at 34.7 a second. Google’s SRE book makes the same point about averages: a system that serves 200 requests a second in even-numbered seconds and none in the others averages 100, while its load in those seconds is twice that (SRE book, chapter 4). The program works out every estimate of this lesson for the app:

Usage, the peak, people at once, storage and revenue of an expense app Python · expenses/peak_load.py
"""Usage, peak load, people at once, a year of storage and a year of revenue for an invented expense app.

Every input is an assumption about the invented app, written down so that it can be argued with. Money is in US
dollars; in any other currency the arithmetic is the same. Storage uses decimal units: 1 GB = 1,000,000 KB.
"""
SECONDS_A_DAY = 24 * 60 * 60

# Usage: who uploads receipts, and how often.
DAILY_USERS = 250_000
RECEIPTS_EACH = 4  # receipts a daily user uploads on a day
PEAK_FACTOR = 3  # the busiest hour runs at three times the day's average rate (an assumption to check)

# People at once (Little's law): in the busiest hour, how many open the app and how long each stays.
OPENS_IN_BUSY_HOUR = 30_000
MINUTES_EACH = 4

# Storage: the size of one receipt photo after the app compresses it.
KB_A_RECEIPT = 250

# Revenue: who pays, and how much.
MONTHLY_USERS = 400_000
SHARE_WHO_PAY = 0.06
DOLLARS_A_MONTH = 5

uploads = DAILY_USERS * RECEIPTS_EACH
average = uploads / SECONDS_A_DAY
print(f"Uploads a day:          {uploads:,}")
print(f"Average a second:       {average:.1f}")
print(f"Peak a second:          {average * PEAK_FACTOR:.1f}")

arrivals_a_minute = OPENS_IN_BUSY_HOUR / 60
print(f"People in the app at once, busy hour: {arrivals_a_minute * MINUTES_EACH:,.0f}")

gb_a_day = uploads * KB_A_RECEIPT / 1_000_000
print(f"Storage a day:          {gb_a_day:,.0f} GB")
print(f"Storage a year:         {gb_a_day * 365 / 1_000:,.2f} TB")

payers = MONTHLY_USERS * SHARE_WHO_PAY
print(f"Paying users:           {payers:,.0f}")
print(f"Revenue a year:         ${payers * DOLLARS_A_MONTH * 12:,.0f}")

Output

Uploads a day:          1,000,000
Average a second:       11.6
Peak a second:          34.7
People in the app at once, busy hour: 2,000
Storage a day:          250 GB
Storage a year:         91.25 TB
Paying users:           24,000
Revenue a year:         $1,440,000

Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 peak_load.py

Storage follows usage too: at 250 KB a receipt, the uploads add 250 GB a day and 91.25 TB a year. Unlike the load, storage adds up: every receipt stays, so each year’s total comes on top of the last.

Capacity estimates show how close the peak runs to the limit

A product manager’s capacity estimates exist to judge whether a plan is feasible and what it costs, not to size the servers, which the system design track does in depth. One number decides most of it: how close the peak runs to what the service can finish. Say one upload server finishes 40 uploads a second. Set the arrivals to the peak, 35 a second, and then drag them towards the average of 12:

Interactive · change it and see How long an upload spends in the service, from the average to the peak Requests arrive at random at an average rate and one server handles them one at a time. Raise the arrival rate towards the service rate and watch the time in the system.
Mean time in the system by utilisation: mean time in the system (ms) against utilisation ρ = λ/μ (%).0204060801000100200300utilisation ρ = λ/μ (%)mean time in the system (ms)time in systemservice alone 25 msnow 88 %

At 88 % utilisation a request spends 200 ms in the system on average, 8 times its 25 ms of service: the rest is waiting. Little's law: L = λW = 7 requests in the system.

Mean time in the system (W) 200 ms
Utilisation (ρ) 88 %
Mean wait before service 175 ms
Mean number in the system (L = λW) 7
The numbers as a table
Mean time in the system with μ = 40 a second
UtilisationMean time in the system
50 %50 ms
70 %83.3 ms
80 %125 ms
90 %250 ms
95 %500 ms
99 %2,500 ms

At 35 a second an upload spends 200.0 ms in the service, eight times its 25 ms of work; at 12 a second, 35.7 ms. Past 40 a second, the queue grows without limit. The peak, not the average, decides whether the feature feels fast.

Checkpoint

Check: Usage and the peak factor · How close the peak runs to the limit

  1. Question 1 of 2 A booking service handles 2,000,000 requests a day, and its busiest hour runs at 2.5 times the day's average rate. How many requests a second does it handle in that hour?

    Type a number.

    A hint

    Divide the day's requests by the seconds in a day, then multiply by the peak factor.

    Show the answer: Question 1 of 2

    Answer: 57.9 requests a second (anything from 57.4 to 58.4 counts)

    2,000,000 ÷ 86,400 ≈ 23.1 requests a second on average; × 2.5 ≈ 57.9 in the busiest hour. The peak factor is an assumption, so say it and say how you would check it, for example from an hour-by-hour chart of requests.

  2. Question 2 of 2 In the queueing model, one server finishes 50 requests a second and the peak brings 45 a second. About how long does a request spend in the service on average?

    Choose one answer.

    Show the answer: Question 2 of 2

    Answer: 200 ms, ten times its 20 ms of work

    Mean time in the system = 1 ÷ (service rate − arrival rate). Near the limit, a small rise in arrivals multiplies the wait, which is why the peak, not the average, decides whether a feature feels fast.

Little’s law counts the people in a service at once

Little's law: The average number of people or requests in a system equals the rate at which they arrive times the average time each one stays, L = λW: 500 arrivals a minute staying 4 minutes each means 2,000 in the system at once. links three averages: L, how many people are inside a system at once, is λ, how many arrive in a unit of time, multiplied by W, how long one of them stays: L = λW. John Little’s proof shows that it holds for a system in a steady state whatever the pattern of arrivals and of service (Little’s proof). Put the rate and the time in the same unit first, then multiply:

Arrivals Time each People at once
30,000 an hour, 500 a minute 4 minutes 2,000
3,000 an hour, 50 a minute 6 minutes 300

The first row is the expense app’s busiest hour, the number the program printed; the second is a shop whose orders each take 6 minutes to place.

Revenue: users, times the share who pay, times what each pays

Revenue estimates multiply the users by the share who pay and by what each payer brings in over the period. The expense app’s 400,000 monthly users, 6 % of whom pay $5 a month, give 24,000 payers and $1,440,000 a year. Check the share against a public filing where one exists, such as Duolingo’s shareholder letter for one quarter (Duolingo, SEC filing):

Monthly users Paying Share who pay
The expense app, assumed 400,000 24,000 6 %
The filing, one quarter 140.6 million 12.7 million at its end About 9 %

The filing’s two counts are measured differently, so the ratio is a rough check, and it says that 6 % is plausible.

Checkpoint

Check: Little's law · Revenue from users who pay

  1. Question 1 of 2 In its busiest hour, 1,200 people start booking a test drive on a car dealer's app, and each spends 5 minutes. How many are booking at once, on average?

    Type a number.

    A hint

    Put the rate and the time in the same unit before multiplying.

    Show the answer: Question 1 of 2

    Answer: 100 people

    1,200 an hour is 20 a minute; × 5 minutes = 100 people at once, by Little's law, L = λW.

  2. Question 2 of 2 An app has 1,000,000 monthly users. 2 % pay $7 a month. What is its revenue in a year, in dollars?

    Type a number.

    A hint

    Users × the share who pay × the price × 12 months.

    Show the answer: Question 2 of 2

    Answer: 1680000 dollars

    1,000,000 × 0.02 = 20,000 payers; × $7 = $140,000 a month; × 12 = $1,680,000 a year. Then check the share against a public figure before trusting it.

Practise: people at once, then check yourself

Write the function that applies Little’s law, then run the sample tests:

Exercise · Easy · Python

Count the people in a service at once with Little's law

Little's law says that the average number of people in a system equals the rate at which they arrive times the average time each one stays. Write concurrent_users(arrivals_per_hour, minutes_each):

  • arrivals_per_hour is how many people start using the service in an hour;
  • minutes_each is how long each of them stays, on average, in minutes;
  • it returns the average number of people in the service at once, as a number (a whole number when the inputs give one);
  • it raises ValueError when either input is negative.

Mind the units: the rate is per hour and the time is in minutes.

concurrent_users(3000, 6)    # 300.0: 50 arrive a minute and each stays 6 minutes
concurrent_users(30000, 4)   # 2000.0: the expense app's busiest hour

The sample tests also check a stay of half a minute, an hour with no arrivals, a negative rate and a negative time.

Starter code · concurrency.py

def concurrent_users(arrivals_per_hour, minutes_each):
    """Return the average number of people in a service at once (Little's law: L = arrival rate x time each).

    arrivals_per_hour: people who start using the service in an hour
    minutes_each: the average time each one stays, in minutes
    Raises ValueError when either input is negative.
    """
    # Your code here.
    return 0
The sample tests · test_concurrency.py
from concurrency import concurrent_users


def test_orders_example():
    """3,000 an hour is 50 a minute; staying 6 minutes each, 300 are in at once"""
    assert concurrent_users(3000, 6) == 300


def test_expense_app_busy_hour():
    """the lesson's expense app: 30,000 opens in the busiest hour, 4 minutes each"""
    assert concurrent_users(30000, 4) == 2000


def test_half_a_minute():
    """720 an hour is 12 a minute; half a minute each leaves 6 in at once"""
    assert abs(concurrent_users(720, 0.5) - 6) < 1e-9


def test_no_arrivals():
    """nobody arrives, nobody is in"""
    assert concurrent_users(0, 10) == 0


def test_negative_input():
    """a negative rate or time is a mistake, not an estimate"""
    try:
        concurrent_users(-100, 5)
    except ValueError:
        pass
    else:
        assert False, "expected a ValueError for a negative rate"
    try:
        concurrent_users(100, -5)
    except ValueError:
        pass
    else:
        assert False, "expected a ValueError for a negative time"
A hint

Put both inputs in the same unit before you multiply: divide the arrivals in an hour by 60 to get the arrivals in a minute, then multiply by the minutes each person stays. Check the signs of the inputs first.

The sample tests run on this device, in your browser (Pyodide): nothing is sent to mysmartcopilot.com. The first run downloads Python (about 13.5 MB), which is kept for the next runs. A check in your browser is feedback for you, not proof that the code is right for every input.

The self-check that follows starts from the concept you have missed most and adapts as you answer.

Practice that adapts to you

Practise this lesson

8 questions about 6 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.

  1. Question 1 of 8 An app takes 1,000,000 uploads a day. What is its average rate a second?

    Choose one answer.

    Show the answer: Question 1 of 8

    Answer: About 11.6

    A day has 86,400 seconds, so 1,000,000 a day is about 11.6 a second on average; the peak factor turns that into the load of the busiest hour.

  2. Question 2 of 8 Why plan an upload service for 34.7 uploads a second rather than the day's average of 11.6?

    Choose one answer.

    Show the answer: Question 2 of 8

    Answer: People upload unevenly over the day, so the busiest hour runs at about three times the average

    Average load hides bursts. Multiply by a stated peak factor, and check it against an hour-by-hour pattern of use where one exists.

  3. Question 3 of 8 What are a product manager's capacity estimates for?

    Choose one answer.

    Show the answer: Question 3 of 8

    Answer: Judging whether a plan is feasible and what it costs

    Estimate to judge feasibility and cost, then take the numbers to engineering as questions about limits, cost and risk.

  4. Question 4 of 8 A server finishes 40 uploads a second. A new feature will raise the peak from 35 to 39 a second. What do you expect?

    Choose one answer.

    Show the answer: Question 4 of 8

    Answer: Uploads slow sharply, from 200 ms in the service to about 1 second, because the server runs at 97.5 % of its limit

    The queueing model's mean time in the system is 1 ÷ (μ − λ). A small rise near the limit multiplies the wait, so a feature that adds load at the peak needs capacity before it ships.

  5. Question 5 of 8 What does Little's law, L = λW, say?

    Choose one answer.

    Show the answer: Question 5 of 8

    Answer: The average number in a system equals the arrival rate times the average time each one stays

    L = λW: arrivals a minute times minutes each gives the people in the system at once, in a steady state.

  6. Question 6 of 8 A colleague says: "18,000 people open the app an hour and each stays 3 minutes, so 54,000 are in it at once." What went wrong?

    Choose one answer.

    Show the answer: Question 6 of 8

    Answer: The units: 18,000 an hour is 300 a minute, so 300 × 3 = 900 people at once

    Convert first: 18,000 an hour = 300 a minute, and 300 a minute × 3 minutes = 900 people at once.

  7. Question 7 of 8 Which formula gives a subscription app's yearly revenue?

    Choose one answer.

    Show the answer: Question 7 of 8

    Answer: Monthly users × share who pay × price a month × 12

    Revenue = users × the share who pay × what each pays over the period. Each factor is an assumption to state and check.

  8. Question 8 of 8 The filing's 12.7 million paid subscribers against 140.6 million monthly users gives about 9 %. Why does the lesson call it a rough check?

    Choose one answer.

    Show the answer: Question 8 of 8

    Answer: The subscribers are counted at the quarter's end and the users for the quarter, so the two counts are measured differently

    Read what each public number counts and when. A large app's share of paying users is a reference point for an assumption, and a ratio of counts measured differently is a rough one.

Three estimates worked with ranges and checks Pro: opens with a Pro, Premium or Ultimate pass

Three invented products, three kinds of estimate: a ticket sale’s first minute, a year of listing photos and a subscription’s yearly revenue. Each comes with low, base and high values from one program and a sanity check of its own.

In this part:

  • A ticket sale’s first minute, worked from buyers and requests
  • A year of listing photos, worked from listings and sizes
  • A subscription’s yearly revenue, worked and checked against a filing
  • Saying an estimate in the round, level by level

1 runnable example (Python) · about 5 minutes

Opening this part with your pass…

This part opens with any MySmartCoPilot pass.

  • Pro pass · 1 week₹79$2.99
  • 30 days₹179$5.99
  • 1 year₹1,699$45

One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.

It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).

What to ask engineering after the estimate Pro: opens with a Pro, Premium or Ultimate pass

An estimate earns its place when it changes a decision. This part turns each estimate into the questions a product manager takes to engineering, about limits, cost and risk, and shows how the queueing model reads those answers.

In this part:

  • Questions about limits, cost and risk, estimate by estimate
  • Reading an engineer’s answer with the queueing model, worked
  • A failure drill: the average that hid the peak
  • When the estimate says no

1 diagram · about 5 minutes

Opening this part with your pass…

This part opens with any MySmartCoPilot pass.

  • Pro pass · 1 week₹79$2.99
  • 30 days₹179$5.99
  • 1 year₹1,699$45

One payment; a pass never renews. The price shown is the total you pay: no fees or charges are added at checkout.

It also opens every other in-depth part in Learn and every Pro tool. Sales are final, except where the law gives you a right to withdraw, for example in the EU and the UK (refund policy).

Interview questions

Work each of these aloud, with a range and a check, before you read its first step and follow-ups:

  1. Fresher to senior

    A shopping app expects ten times its normal orders in the first hour of a festival sale. Estimate the peak orders a second and say what you would ask engineering.

    Model answer, Pro. Model answers open with any pass; prices are in the notice on this page. First step and follow-ups

  2. Fresher to mid

    Estimate the storage a photo-sharing feature needs in its first year if 2 million users each upload a few photos a week.

    Model answer, Pro. First step and follow-ups

  3. Fresher to senior

    Estimate the yearly revenue of a meditation app with 5 million monthly users. Which assumption matters most, and how would you check it?

    Model answer, Pro. First step and follow-ups

Flashcards · 6 cards

Recall it, then check

Say the answer to yourself before you look: recalling it is what makes it stick.

  1. Why multiply average usage by a peak factor?

    Use is uneven through the day. A million uploads a day average 11.6 a second, but with a stated peak factor of 3 the busiest hour runs at 34.7 a second, and that is the load the service must carry.

  2. How does storage differ from load in a usage estimate?

    Load comes and goes, but storage builds up: at 250 KB a receipt, a million uploads add 250 GB a day and about 91 TB a year, on top of every earlier year.

  3. Why does the peak, not the average, decide whether a feature feels fast?

    Waiting climbs steeply near capacity. With a server that finishes 40 uploads a second, an upload spends 200 ms in the service at 35 a second, eight times its 25 ms of work, against about 36 ms at 12 a second; above 40 the queue grows without limit.

  4. What does Little's law say, and how do you use it?

    L = λW: the people in a system at once equal the arrival rate times how long each stays, for a system in a steady state. Put both in the same unit first: 500 arrivals a minute staying 4 minutes gives 2,000 people at once.

  5. How do you estimate the yearly revenue of a subscription app?

    Users × share who pay × what each payer brings in over the period: 400,000 monthly users with 6 % paying $5 a month give 24,000 payers and $1,440,000 a year. Check the paying share against a public filing where one exists.

  6. What is a product manager's capacity estimate for?

    To judge whether a plan is feasible and what it costs, by showing how close the peak runs to what the service can finish. Sizing the servers is engineering's depth.

Key takeaways

  • Usage is users times actions; the load to plan for is the average times a stated peak factor, here 34.7 uploads a second against 11.6.
  • Capacity estimates show how close the peak runs to the limit: at 35 of 40 a second an upload spent 200 ms, eight times its work.
  • Little’s law counts the people in a service at once: 500 arrivals a minute staying 4 minutes is 2,000 people.
  • Revenue is users times the share who pay times what each pays, checked against a public filing where one exists.

Terms in this lesson

Little's law
The average number of people or requests in a system equals the rate at which they arrive times the average time each one stays, L = λW: 500 arrivals a minute staying 4 minutes each means 2,000 in the system at once.
peak factor
How many times the busiest period's rate exceeds the average rate, such as a busiest hour at 3 times the day's average. It is an assumption, so it is stated and then checked against the pattern of real use.

References

Related tools

Report a problem with this lesson

Quick answers and tool search

Type to search tools or to get a quick answer, for example 18% of 2500. Use the up and down arrow keys to move through the results, Enter to choose, and Escape to close.