Product Manager Interviews Module 3 – Metrics, analytics and experiments
Product metrics and the north star metric
Choose a north star metric and the inputs that drive it, add guardrails, pick HEART measures and compute DAU, MAU and their ratio from an event log.
What you will learn
- Choose a north star metric and the input metrics that drive it
- Add guardrail metrics that catch harm the north star would miss
- Pick measures for a user experience with the HEART categories
- Compute DAU, MAU and their ratio from an event log, and read a company's own metric definitions
Before you start
What you’ll learn · Before you start
What you will learn
- Choose a north star metric and the input metrics that drive it
- Add guardrail metrics that catch harm the north star would miss
- Pick measures for a user experience with the HEART categories
- Compute DAU, MAU and their ratio from an event log, and read a company's own metric definitions
Before you start
On this page
A food-delivery app can show five million app opens a month on its dashboard while it loses customers, because opening an app is not getting dinner. Product metrics tell a team every week whether people get what the product promises, and interviewers ask you to choose them because the choice shows whether you understand the product.
Below, you build the metric tree of an invented food-delivery app: one north star metric, the three input metrics that multiply into it and two guardrails that catch harm. Then you pick measures for an experience with the HEART categories, compute DAU, MAU and their ratio from a month of events, and read how a listed company defines its own active users.
A north star metric counts the value customers get
Start with what customers come for. People open a food-delivery app to get a meal that arrives on time with nothing missing, so a strong north star for it is good orders a week: orders delivered on time, complete and not refunded. App opens, menu views and downloads say that people came, not that they got anything.
The term comes from product analytics practice. The North Star Playbook, a product analytics vendor’s own guide, defines a north star metric: The one metric a product team chooses to count the value its customers get, such as good orders delivered in a week. The team's work should raise it, and it tends to move before revenue does. as “a single critical rate, count, or ratio” that stands for the product’s strategy, and gives it three qualities: it represents the value users get, product and marketing teams can influence it, and it is a leading indicator of revenue. Its checklist puts seven tests to a candidate. Here they are in short, tried on good orders a week:
| The playbook’s test | Good orders a week |
|---|---|
| Expresses customer value | Yes: each one is a meal that arrived on time and complete |
| Fits the vision and strategy | Yes, for an app that competes on reliable delivery |
| Leads success | It should: a good order is what brings the next one |
| Actionable | Yes, through the three inputs of the next section |
| Understood outside the team | Yes: anyone can say what a good order is |
| Measurable | Yes, from delivery times, missing-item reports and refunds |
| Not a vanity metric | Yes: it can fall in a bad week |
The playbook also asks which “game” a product plays, because the game points at the value. Here is one north star for an invented product of each kind:
| Game | What users want | A north star that fits |
|---|---|---|
| Attention | To be absorbed; time spent shows the value | Hours of podcasts played to the end a week |
| Transaction | The right thing, bought easily and delivered | Good orders a week |
| Productivity | A job done | Documents shared and opened by someone else a week |
Revenue as the north star
Wrong: “Our north star is monthly revenue.” Revenue counts what already happened and can rise while customers get less, for example through higher fees. Right: count the value that earns next month’s revenue, here good orders a week, and watch revenue beside it.
Input metrics are the levers that multiply into it
A north star moves slowly and no single team owns it, so it is split into input metric: One of the few factors that produce a north star metric, such as orders per customer, and that a team can move through its daily work.: the few factors that produce it and that a team can change in its daily work. The playbook suggests “typically a set of three to five”, and adds that the north star “is not immediately actionable—the inputs are”. For the food app, three inputs multiply into the north star: ordering customers × orders per customer × the share of orders that are good. Step through the tree as it is built:
The drawing shows the whole scene; its 7 steps are listed below.
Every step as text
- One number for the value. Customers come to a food-delivery app for one thing: a meal that arrives on time with nothing missing. The north star counts exactly that, good orders a week: delivered on time, complete and not refunded.
- Who orders. 40,000 customers placed at least one order last week. More customers mean more good orders only if the other two inputs hold.
- How often they order. Each ordering customer placed 1.8 orders on average, so the app handled 40,000 × 1.8 = 72,000 orders. A team that makes reordering easier works on this input.
- How many were good. 85 % of those orders arrived on time and complete without a refund, so the north star is 72,000 × 0.85 = 61,200 good orders a week. The three inputs multiply into it.
- A guardrail on offers. A team can raise orders per customer by sending more offers as notifications. Opt-outs, now 9 per 1,000 customers a week, must stay under 10 while it does, or the app loses the channel it is using.
- A guardrail on promises. A team can raise the good-order share by promising later delivery times, so that more orders count as on time. The median promised time, 32 minutes, must not grow while it does.
- The whole tree. One north star says whether customers get value. Three inputs say which team can move it, and two guardrails say what each push must not break.
Because the inputs multiply, 5 % more of any one of them gives 5 % more good orders: 42,000 customers at the same 1.8 orders and 85 % give 64,260 good orders a week instead of 61,200. What differs between the inputs is how hard each rise is to win and what it can break, so each input gets its own team and its own guardrail.
Checkpoint
Check: What a north star metric counts · Input metrics and the metric tree
Guardrails catch the harm the north star would miss
Each input can be pushed in a way that raises the north star and hurts the product. A guardrail metric: A metric that must not get worse while a team pushes another metric up, such as notification opt-outs while it sends more offers. If it does get worse, the change is stopped or rethought. is a metric that must not get worse while you push another one up. In the tree, a team that sends more offers as notifications raises orders per customer, and the opt-outs show what the offers cost; a team that promises later delivery times raises the share of orders that arrive “on time”, and the median promised time shows the trick. Good guardrails are the metrics a push would damage first:
| Push | How it raises the north star | Guardrail |
|---|---|---|
| More offer notifications | More orders per customer | Opt-outs per 1,000 customers a week |
| Later promised delivery times | More orders count as on time | Median promised delivery time |
| Deeper discounts | More customers and more orders | Contribution per order after discounts |
A guardrail the team itself pushes
Wrong: guarding the offers team with “orders per customer”, the very input it is paid to raise. Right: guard it with what its offers could damage, the opt-outs. A guardrail is useful only if a harmful push moves it the wrong way.
Common guardrails across products are crashes, complaints, unsubscribes, load time and cost per order.
Key idea
Name a guardrail at the same time as a target: for every way a team could push its input, write down the metric that would show the push did harm.
HEART turns an experience goal into measures
Interviewers often ask for metrics of an experience rather than of a whole product: “How would you measure the new checkout?” Rodden, Hutchinson and Fu’s paper on user-centred metrics gives five categories to choose from, the HEART framework: Five categories of user-centred metrics: Happiness, Engagement, Adoption, Retention and Task success. A team reaches a metric through goals first, then signals of success, then the metric that counts the signal. framework: Happiness, Engagement, Adoption, Retention and Task success. Teams reach a metric in three steps, goals first, then signals (what users would do or feel if the goal were met), then the metric that counts the signal. Here is one signal and one metric per category for the food app:
| Category | Signal | Metric |
|---|---|---|
| Happiness | Customers rate a delivery highly | Share of rated orders given 4 or 5 stars |
| Engagement | Customers order again within the week | Orders per ordering customer a week |
| Adoption | New customers place a first order | First orders by new customers a week |
| Retention | Customers still order a month later | Share of a week’s customers who order again within 4 weeks |
| Task success | Checkout ends in a paid order | Share of checkouts that end in a placed order |
The paper advises reporting Engagement as an average per user rather than a total, because an increase in a total “could be a result of more users, not more usage”. It also says not every category fits every product: Engagement may mean little in a work tool that people must use. And it contrasts HEART with business and technical health measures such as page views, uptime and latency, which are too indirect to judge a change to the experience.
Checkpoint
Check: Guardrail metrics · The HEART categories
DAU, MAU and their ratio, computed from a month of events
daily active users (DAU): The number of different users who were active on a day, by the product's own definition of active. Monthly active users (MAU) are the different users active in a month. (DAU) are the different users active on a day; monthly active users (MAU) are the different users active in the month. Their ratio, average DAU ÷ MAU, is often called stickiness (DAU/MAU): Average daily active users divided by monthly active users: the share of a month's users who are active on a typical day. At 15 %, a monthly user is active on about 4.5 days of 30.: the share of a month’s users who are active on a typical day. Both depend on what “active” means. The program counts both for a month of app opens by 12 invented users of the food app, then counts again with “active” meaning “placed an order”:
# DAU, MAU and DAU/MAU for one 30-day month of an invented food-delivery app.
# Each user's string lists the days on which they opened the app, one entry per
# open; a "*" marks an open that ended in an order. Change a string and run again.
OPENS = {
"u01": "1 3* 3 6 8 10 12 15* 15* 18 21 24 27*",
"u02": "2 5 9* 9* 13 16 20* 23 28",
"u03": "1 4* 4 11 17 22* 29*",
"u04": "2 7* 14* 19 25* 30",
"u05": "5* 5 12 19 26*",
"u06": "3 10 16* 22 29",
"u07": "6 6 13* 27",
"u08": "8 18* 28",
"u09": "11 20 30*",
"u10": "14 21*",
"u11": "9 24",
"u12": "17",
}
DAYS = 30
def active_days(only_orders):
"""Set of (user, day) pairs: a user counts once per day, however often they act."""
pairs = set()
for user, entries in OPENS.items():
for entry in entries.split():
if only_orders and not entry.endswith("*"):
continue
pairs.add((user, int(entry.rstrip("*"))))
return pairs
def stickiness(pairs):
"""Average daily active users over every day of the month, MAU and their ratio."""
dau = len(pairs) / DAYS # the sum of each day's active users, divided by all 30 days
mau = len({user for user, _ in pairs})
return dau, mau, dau / mau
opens = sum(len(entries.split()) for entries in OPENS.values())
dau, mau, ratio = stickiness(active_days(only_orders=False))
print(f"A month of app opens: {opens} opens by {mau} users over {DAYS} days")
print(f"Daily active users, averaged: {dau:.2f} ({len(active_days(False))} user-days)")
print(f"MAU: {mau} users, DAU/MAU: {ratio:.1%}")
print(f"Counting opens, not users: {opens / DAYS:.2f} a day, {opens / DAYS / mau:.1%} (too high)")
dau, mau, ratio = stickiness(active_days(only_orders=True))
print(f"Active means ordering: DAU {dau:.2f}, MAU {mau}, DAU/MAU {ratio:.1%}")
# A listed company's own averages for one quarter (millions), from its shareholder letter.
published_dau, published_mau = 58.7, 140.6
print(f"Published averages: {published_dau} million DAUs, {published_mau} million MAUs")
print(f"DAU/MAU from them: {published_dau / published_mau:.1%}") Output
A month of app opens: 60 opens by 12 users over 30 days Daily active users, averaged: 1.80 (54 user-days) MAU: 12 users, DAU/MAU: 15.0% Counting opens, not users: 2.00 a day, 16.7% (too high) Active means ordering: DAU 0.60, MAU 10, DAU/MAU 6.0% Published averages: 58.7 million DAUs, 140.6 million MAUs DAU/MAU from them: 41.7%
Recorded with Python 3.14.8 on macOS 26 arm64. To run it yourself: mise exec python@3.14.8 -- python3 dau_mau.py
Runs on this device, in your browser. The first run downloads Python (about 13.5 MB), which is kept for the next runs.
Your run, in this browser
Opens give 15.0 %: an average day had 1.80 active users, and 12 users were active in the month, so a monthly user was
active on about 4.5 days of 30. Counting opens instead of users gives 16.7 %, too high: 6 of the 60 opens were a
second open by the same user on the same day, such as u01’s two opens on day 3, and a user counts once a day.
Counting orders gives 6.0 %: one log, two definitions, numbers more than twice
apart. For a food app, 15 % is not bad news, because few people order dinner every day; the ratio says how often people
come back, not what they get. Change an entry in OPENS and run it again.
Each company defines its own active user
Duolingo’s shareholder letter for one quarter, filed with the US Securities and Exchange Commission, counts as DAUs the “unique users who engage with” its app or the learning part of its website “each calendar day”, and reports them as the average over the period. It reports averages of 58.7 million DAUs and 140.6 million MAUs; the last lines of the program divide them, 41.7 %. The letter itself reports no such ratio. It evaluates engagement mainly with DAUs, treats MAUs as a supplementary metric, and calls its own Current User Retention Rate, the share of recently active daily users who come back the next day, its main measure of stickiness.
So two companies’ DAU can differ in what counts as activity, where a day ends and whether the number is an average or the last day’s count. Read the definition before you compare numbers or quote one in an answer. Set side by side, the program’s two definitions and the letter’s differ in every row:
| What is counted | The lesson’s food app | The shareholder letter |
|---|---|---|
| Active means | An app open, or an order | Engaging with the app or the learning website |
| DAU | The month’s average day | The quarter’s average day |
| MAU | Users in the month | The average of the quarter’s months |
| DAU/MAU | 15.0 % for opens, 6.0 % for orders | 41.7 %, worked out here, not reported |
Public services publish their measures too. GOV.UK’s Service Manual names four that UK government services must collect and publish: cost per transaction, user satisfaction, completion rate and digital take-up. It advises each team to pick three or four metrics that answer one question: “is this service working?”
Checkpoint
Check: DAU, MAU and stickiness · Reading a company's own definitions
Totals that only grow cannot show that a change worked
Downloads since launch, registered users and orders ever rise every week whatever the team does, so they cannot tell whether last week’s change helped. These are vanity metric: A metric that makes a product look good but cannot guide a decision, usually a total that only grows, such as downloads since launch. A rate or a count in a fixed period can fall, so it can show whether a change helped.: they make a product look good and decide nothing. The HEART paper’s advice is to normalise, because “raw counts will go up as your user base grows”: use ratios, percentages or averages per user instead. The playbook’s own list of vanity metrics includes downloads and registered users, and also daily active users and page views, which can fall but say nothing about the value customers get.
| Vanity metric | Can it fall? | A decision metric instead |
|---|---|---|
| Downloads since launch | No | Share of new installs that order within 7 days |
| Registered users | No | Ordering customers this week |
| Orders ever | No | Orders per ordering customer this week |
A decision metric can fall, which is what lets it show that something went wrong. Rates, averages per user and counts in a fixed period can; so can the cohorts of this module’s funnels and cohorts lesson, which follow each week’s new users on their own.
Checkpoint
Check: Vanity metrics and decision metrics
Practise: compute stickiness
Write the function that computes DAU/MAU from a month of events, and run the sample tests:
Exercise · Easy · Python
Compute DAU/MAU for a month of events
An event log lists who did something in an app, and on which day of the month. Write stickiness(events, days):
eventsis a list of(user, day)pairs, one per event, so the same user can appear many times on the same day;daysis the number of days in the month, every one of them counted, including days with no events;- it returns the average number of daily active users divided by the month's active users (MAU), as a fraction (
0.15for 15 %), or0.0when there are no events at all.
A user counts once on a day, however many events they have that day, and once in the month.
stickiness([("a", 1), ("a", 1), ("b", 1), ("a", 2)], 2) # 0.75: 1.5 users a day on average, 2 in the month
stickiness([("a", 1)], 4) # 0.25: days without events count as 0
The sample tests also check a month with no events and a user who acts on every day.
Starter code · stickiness.py
def stickiness(events, days):
"""Return average daily active users divided by monthly active users.
events: a list of (user, day) pairs, one per event; a user may repeat on a day
days: the number of days in the month, days without events included
Returns 0.0 when there are no events.
"""
# Your code here.
return 0.0 The sample tests · test_stickiness.py
from stickiness import stickiness
def test_repeat_events_count_once():
"""two events by a on day 1 are one active user that day"""
assert stickiness([("a", 1), ("a", 1), ("b", 1), ("a", 2)], 2) == 0.75
def test_quiet_days_count():
"""days without any event still count in the average"""
assert stickiness([("a", 1)], 4) == 0.25
def test_no_events():
"""an empty month has nothing to divide"""
assert stickiness([], 30) == 0.0
def test_daily_user():
"""one user active on every day of a 5-day month and one who came once"""
events = [("a", d) for d in range(1, 6)] + [("b", 3)]
assert stickiness(events, 5) == 0.6
def test_three_users_once_each():
"""three users, each active on one day of 30"""
assert abs(stickiness([("a", 2), ("b", 9), ("c", 30)], 30) - 1 / 30) < 1e-12 A hint
Turn the events into a set of (user, day) pairs first, so repeated events on one day collapse into one. The number of pairs is the sum of every day's active users; divide it by days, not by the number of days that had events. MAU is the number of different users in the pairs.
Results of the sample tests
| Test | Result | Details |
|---|
What your code printed
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.
Then answer the self-check, one question at a time:
Practice that adapts to you
Practise this lesson
16 questions about 7 ideas of this lesson. Each answer is explained at once, and what you get right is kept in this browser.
Interview questions
Metric questions open with a choice: which number, and why that one. The warm-up below is answered in full. For the two after it, give your whole answer out loud, then compare it with the first step and the follow-ups:
Model answers open with any pass: ₹79 for 1 week ($2.99), one payment that never renews.
-
Fresher to mid · Warm-up
What does DAU/MAU measure, and when is it a poor choice of metric?
DAU/MAU divides the average number of daily active users by the month's active users, so it is the share of a month's users who are active on a typical day: at 15 %, a monthly user is active on about 4.5 days of 30. It measures how often people come back, by the product's own definition of active, and nothing more. It is a poor choice when the product is not meant for daily use: a food-delivery or travel app can be healthy at a low ratio, because people order dinner or book trips a few times a month. It misleads when "active" is defined loosely, such as any app open, and it is a weak north star, because coming back often is not the value people get. Read each company's definition before comparing ratios, and pair the ratio with a value metric.
-
Fresher to senior
Choose a north star metric for a two-wheeler taxi app in a congested city, its input metrics and one guardrail. Defend each choice.
-
Fresher to mid
A team celebrates one million total sign-ups. Which questions do you ask before you agree that it is good news?
Flashcards · 8 cards
Recall it, then check
Say the answer to yourself before you look: recalling it is what makes it stick.
-
What should a north star metric count?
The value customers actually receive, such as good orders a week for a food-delivery app (on time, complete and not refunded), rather than app opens or downloads, which only show that people came.
-
Why is monthly revenue a weak north star?
It counts what already happened and can rise while customers get less, for example through higher fees. Count the value that earns next month's revenue instead, and watch revenue beside it.
-
What north star fits each kind of product: attention, transaction and productivity?
Attention: absorbed time, such as hours of podcasts played to the end each week. Transaction: the right thing bought and delivered, such as good orders a week. Productivity: a job done, such as documents shared and opened by someone else each week.
-
What are input metrics, and how do they relate to the north star?
The few factors a team can move in its daily work that produce the north star, typically three to five. For the food app they multiply: ordering customers × orders per customer × share of orders that are good, so 5 % more of any one gives 5 % more good orders.
-
How do you choose the guardrail for a team pushing an input metric?
Pick the metric its push would damage first, never the input it is paid to raise. More offer notifications are guarded by opt-outs per 1,000 customers; later promised delivery times by the median promised time.
-
What are the five HEART categories, and how do you get from them to a metric?
Happiness, Engagement, Adoption, Retention and Task success. Go from a goal to a signal, what users would do or feel if the goal were met, and then to the metric that counts the signal. Report Engagement per user rather than as a total.
-
What is stickiness, and why can two DAU/MAU figures for one app differ?
Average DAU divided by MAU: the share of a month's users who are active on a typical day. It depends on what 'active' means; the lesson's month of events gave 15.0 % when counting app opens and 6.0 % when counting orders, so read the definition before comparing.
-
What is a vanity metric, and what should replace it?
A total that only grows, such as downloads since launch or registered users, so it cannot show whether a change worked. Use a decision metric that can fall: a rate, an average per user or a count within a fixed period.
Key takeaways
- A north star metric counts the value customers get, such as good orders a week, and leads revenue rather than repeating it.
- Input metrics are the few factors that produce the north star and that a team can move; for the food app they multiply, so each team owns one.
- Every input can be pushed in a harmful way, so each push gets a guardrail that the push would move the wrong way.
- HEART gives five categories of experience measures, chosen through goals, then signals, then metrics.
- DAU, MAU and their ratio depend on what “active” means: the same log gave 15.0 % for opens and 6.0 % for orders, so read each company’s definition first.
- Totals that only grow are vanity metrics; rates, averages per user and counts in a fixed period can show a change.
Terms in this lesson
- daily active users (DAU)
- The number of different users who were active on a day, by the product's own definition of active. Monthly active users (MAU) are the different users active in a month.
- guardrail metric
- A metric that must not get worse while a team pushes another metric up, such as notification opt-outs while it sends more offers. If it does get worse, the change is stopped or rethought.
- HEART framework
- Five categories of user-centred metrics: Happiness, Engagement, Adoption, Retention and Task success. A team reaches a metric through goals first, then signals of success, then the metric that counts the signal.
- input metric
- One of the few factors that produce a north star metric, such as orders per customer, and that a team can move through its daily work.
- north star metric
- The one metric a product team chooses to count the value its customers get, such as good orders delivered in a week. The team's work should raise it, and it tends to move before revenue does.
- stickiness (DAU/MAU)
- Average daily active users divided by monthly active users: the share of a month's users who are active on a typical day. At 15 %, a monthly user is active on about 4.5 days of 30.
- vanity metric
- A metric that makes a product look good but cannot guide a decision, usually a total that only grows, such as downloads since launch. A rate or a count in a fixed period can fall, so it can show whether a change helped.
References
- North Star Playbook (Amplitude (a product analytics vendor's own guide))
- Measuring the User Experience on a Large Scale: User-Centered Metrics for Web Applications (Google Research (Rodden, Hutchinson and Fu))
- Measuring the user experience on a large scale (Proceedings of the SIGCHI Conference on Human Factors in Computing Systems) (ACM)
- Duolingo shareholder letter, second quarter (filed with the US SEC) (Duolingo, Inc. (SEC EDGAR))
- Data you must publish (Service Manual) (GOV.UK (Government Digital Service))
- How to set performance metrics for your service (Service Manual) (GOV.UK (Government Digital Service))
Related tools
Report a problem with this lesson
Kept only in this browser. Your Learn progress