Lester Leong
The Power User Curve: What DAU/MAU Hides About Your Engagement
A Single Ratio Cannot Describe a Distribution
DAU/MAU is the most cited engagement metric in software, and it is also one of the most misleading. The ratio takes your daily active users, divides by your monthly active users, and reports a number between 0 and 1 that is supposed to tell you how sticky your product is. A DAU/MAU of 0.3 means the average user shows up on roughly 30% of days. That is the entire story the metric tells. The problem is that the average is doing enormous work, and averages hide exactly the thing you most need to see.
I have watched this failure play out in three different settings. Across 20+ consulting engagements with SMBs and startups at Gradient Growth, I see teams set DAU/MAU targets without ever looking at the distribution the ratio summarizes. At a financial social media startup before its acquisition, two product surfaces shared nearly identical DAU/MAU numbers and had completely different futures. And now on a GenAI squad at a major finance technology company, where the event volume is rich enough to decompose engagement properly and confirm what the ratio conceals. In every case, the same lesson held: a single ratio cannot describe a distribution, and engagement is a distribution.
The power user curve fixes this. It is the histogram underneath the ratio. Instead of collapsing engagement into one number, it shows you how the number is composed: how many of your active users engage rarely, how many engage occasionally, and how many engage almost every day. The concept of plotting engagement frequency this way (often as an L28 curve, measuring distinct active days out of a trailing 28) was popularized publicly by a large social platform, and it has since become standard practice on rigorous growth teams. It is not exotic. It is just the view DAU/MAU throws away.
Why the Ratio Hides Bimodality
Consider two products, both reporting a DAU/MAU of 0.30. By the ratio alone, they are equally sticky. Now look at the distributions.
Product A has its users spread fairly evenly across the frequency spectrum, with a meaningful cluster at the high end: a real group of people who open it 20 or more days out of 28. Product B has almost everyone bunched at the low-frequency end, one or two days a month, with a long thin tail and essentially nobody at the top. The arithmetic average of active days is the same in both cases. The ratio is identical. The businesses are not remotely the same.
Product A has a power-user core. Those high-frequency users anchor retention, generate the bulk of activity, seed network effects, and are the people who would be genuinely upset if the product disappeared. Product B has none of that. Its 0.30 is manufactured entirely by churn-and-replace: a steady stream of low-frequency users cycling in and out, masking the fact that no durable habit is forming for anyone. Product A compounds. Product B is on a treadmill. The ratio cannot tell them apart because the ratio is the same mean over two completely different shapes.
This is the core failure. DAU/MAU is a measure of central tendency, and engagement distributions are frequently bimodal, with one mass of casual users and a separate mass of habitual users. When you summarize a bimodal distribution with its mean, you describe a population that may not exist: the "average" user sitting in the empty valley between the two humps. The power user curve refuses to do this. It shows you both humps, and the valley, and lets you reason about the actual shape of your engagement instead of a statistic that papers over it.
Defining the Curve
The power user curve is a histogram. For a chosen window of N trailing days (28 is the convention, which is why the curve is often written Ln or L28), you count, for each active user, the number of distinct days they performed a qualifying activity inside that window. That count is a number from 1 to N. You then plot how many users fall into each bucket.
Three design choices matter:
1. Window length. L28 is standard because it spans four weeks and absorbs day-of-week seasonality. A 28-day window also avoids the calendar-month artifact, where a 28-, 30-, or 31-day month quietly changes your denominator from one period to the next. 2. The qualifying event. The curve is only as meaningful as the action you count. A pageview is too shallow; a core value action (sending a message, running a query, completing a workout, placing a trade) is what you want. If you count logins, you measure habit-of-opening, not habit-of-value. Pick the event deliberately. 3. The population. The curve is built over users active at least once in the window. Users with zero active days are not on the curve; they belong to your churn and reactivation analysis, not your engagement-shape analysis.
The y-axis can be raw user counts or, more usefully for comparison over time, the share of active users in each bucket. Share is what lets you compare a curve from a 10,000-user product against the same product at 200,000 users without the absolute scale drowning the shape.
How to Build It
The query is a two-step aggregation: first reduce events to one row per user per distinct active day, then count those days per user, then bin the counts. Here is the SQL, written against a standard event table with `user_id`, `event_name`, and `event_ts`.
```sql -- L28 power user curve: distribution of distinct active days -- over the trailing 28 days, counting only the core value action. WITH active_days AS ( SELECT user_id, COUNT(DISTINCT DATE(event_ts)) AS active_days FROM events WHERE event_name = 'core_action' AND event_ts >= CURRENT_DATE - INTERVAL '28 days' AND event_ts < CURRENT_DATE GROUP BY user_id ) SELECT active_days, COUNT(*) AS users, ROUND(100.0 COUNT() / SUM(COUNT(*)) OVER (), 1) AS pct_of_active FROM active_days GROUP BY active_days ORDER BY active_days; ```
The same logic in pandas, for teams working from an exported event frame:
```python import pandas as pd
def power_user_curve( events: pd.DataFrame, core_action: str, window_days: int = 28, user_col: str = "user_id", event_col: str = "event_name", ts_col: str = "event_ts", ) -> pd.DataFrame: """L28-style power user curve: share of active users by distinct active days within the trailing window.""" events = events.copy() events[ts_col] = pd.to_datetime(events[ts_col])
window_end = events[ts_col].max().normalize() window_start = window_end - pd.Timedelta(days=window_days)
core = events[ (events[event_col] == core_action) & (events[ts_col] >= window_start) & (events[ts_col] < window_end) ].copy() core["day"] = core[ts_col].dt.normalize()
active_days = ( core.groupby(user_col)["day"].nunique().rename("active_days") )
curve = ( active_days.value_counts() .sort_index() .rename_axis("active_days") .reset_index(name="users") ) curve["pct_of_active"] = ( 100 * curve["users"] / curve["users"].sum() ).round(1) return curve ```
Plot `active_days` on the x-axis (1 through 28) and `pct_of_active` on the y-axis, and you have the curve. From here, interpretation is about shape.
Reading the Shape: Smile vs Slide
There are two archetypal shapes, and the difference between them is the whole point of the exercise.
A smile is a healthy product. The bars are high on the left (a large casual base that visits a few days a month), dip in the middle, and rise again on the right (a real mass of power users active 20-plus days out of 28). The upturn at the high-frequency end is the smile. It is the visual signature of a durable habit forming for a meaningful share of your users. Products with smiles have a core that is not going anywhere.
A slide is a shallow product. The bars are highest at one day, then decline monotonically toward the high-frequency end, approaching zero with no upturn. Most users come once or twice; almost nobody comes back habitually. The slide is the signature of a product people sample but do not adopt. It can still post a respectable DAU/MAU if enough new low-frequency users keep arriving, which is precisely why the ratio is dangerous here: it can look stable while the product has no retained core at all.
A third shape worth naming is the bimodal smile with a thin core: a healthy-looking upturn that, on inspection, contains only 2-3% of users. The smile is real but small. This is the most common shape I see in early-stage products that have found a niche but not yet a market. The diagnosis is not "no core" but "core too small to carry the business yet," and the action is to widen the path into the high-frequency bucket, not to declare victory because the upturn exists.
A Worked Example
Take two products with 10,000 monthly active users each. I will give the full L28 distribution for both, bucketed for readability.
| Active days (of 28) | Product A users | Product B users | | --- | --- | --- | | 1-3 | 3,800 | 6,900 | | 4-7 | 2,400 | 1,900 | | 8-13 | 1,500 | 800 | | 14-19 | 1,100 | 300 | | 20-27 | 900 | 90 | | 28 | 300 | 10 |
Now compute the average active days per user for each, using bucket midpoints (2, 5.5, 10.5, 16.5, 23.5, 28):
- Product A: (3,800 x 2 + 2,400 x 5.5 + 1,500 x 10.5 + 1,100 x 16.5 + 900 x 23.5 + 300 x 28) / 10,000 = (7,600 + 13,200 + 15,750 + 18,150 + 21,150 + 8,400) / 10,000 = 8.4 active days. - Product B: (6,900 x 2 + 1,900 x 5.5 + 800 x 10.5 + 300 x 16.5 + 90 x 23.5 + 10 x 28) / 10,000 = (13,800 + 10,450 + 8,400 + 4,950 + 2,115 + 280) / 10,000 = 4.0 active days.
Convert to DAU/MAU by dividing average active days by 28: Product A lands at 8.4 / 28 = 0.30, Product B at 4.0 / 28 = 0.14. In this particular construction the ratios already differ, and a skeptic could say the ratio caught it. So hold Product B's shape fixed and rescale its arrivals: if Product B simply acquired more low-frequency users (inflating the 1-3 bucket), its mean would climb toward A's 0.30 while its high-frequency tail stayed empty. That is the trap. The ratio is a single point on a line; you can reach the same point from radically different distributions, and acquisition volume is one lever that moves the ratio without moving the thing that matters.
What matters is the right tail. Product A has 1,200 users (900 + 300) active 20-plus days out of 28, or 12% of its base. Product B has 100 users, or 1%. That is a 12x difference in power-user share sitting underneath ratios that you could, with a bit of acquisition spend, make look identical. Product A's 12% core is what will still be there in a year. Product B's 1% will not hold the product up. The curve makes this obvious in one glance; the ratio actively hides it.
Power-User Share as the Real KPI
Once you can build the curve, the operating metric is not the curve itself but a single scalar pulled from its right tail: power-user share, the percentage of active users in the high-frequency buckets (a common threshold is active on 50% or more of days in the window, so 14-plus of 28). Tracked over time, power-user share is the engagement KPI that DAU/MAU pretends to be.
The reason to elevate power-user share over the ratio is that it moves for the right reasons. DAU/MAU can rise because you acquired a flood of casual users, which dilutes nothing it measures and tells you nothing about habit. Power-user share rises only when more of your active base crosses into habitual usage, which is the outcome you actually care about. When I replaced a DAU/MAU target with a power-user-share target on a consulting engagement (a B2B workflow tool with about 6,000 monthly actives), the team's attention shifted within a quarter from top-of-funnel volume to deepening the second-week experience, because that was the only lever that moved the new number. Power-user share went from 9% to 14% over two quarters while DAU/MAU barely moved, and 12-month logo retention on the cohorts driving that shift ran 20 points higher than the casual cohorts. The ratio would have called that a flat engagement period. It was the most important engagement improvement the product made all year.
How to Act on the Curve
The curve tells you not just the shape but where to intervene. Three plays, in order of leverage:
1. Deepen the near-core. The users in the middle buckets (roughly 8-13 active days) are your most movable population. They have a partial habit; they are one workflow improvement away from the high-frequency tail. Segment them, find what the 20-plus users do that the 8-13 users do not, and build the path. This is where a curve beats a [retention curve](/insights/retention-curve-analysis-guide): retention tells you they come back, frequency tells you how close they are to becoming a power user. 2. Diagnose the casual mass. A large 1-3 bucket is not automatically bad, but it demands a question: are these users on their way up the curve over successive months, or stuck? Cohort the curve over time. If last quarter's 1-3 users are this quarter's 8-13 users, the casual base is a funnel into the core. If they stay flat or churn, you have a [usage frequency](/insights/usage-frequency-analysis) problem at the front of the experience, not a power-user problem. 3. Protect the core. Watch power-user share for erosion before it shows up in churn. The high-frequency tail is a leading indicator: power users disengage by sliding down the curve (28 days to 18 to 9) well before they fully churn. A falling right tail is an early warning that the ratio will not give you for months, which is the same reason frequency belongs alongside, not under, [DAU/MAU as a stickiness measure](/insights/dau-mau-ratio-stickiness).
The curve is also the cleanest input to a composite engagement score. If you are rolling frequency into a broader [product engagement score](/insights/product-engagement-score), the L28 active-day count is a far better frequency component than a binary "active this month" flag, because it preserves the gradient between a one-day user and a twenty-eight-day user that the binary throws away.
The View the Ratio Throws Away
DAU/MAU survives because it is one number, easy to put on a slide, easy to compare quarter over quarter, easy to set a target against. None of that makes it a good description of engagement. It is a mean over a distribution that is usually bimodal, and a mean over a bimodal distribution describes a user who frequently does not exist.
The power user curve costs you one extra aggregation and a histogram. In return, it tells you whether your stickiness is real or manufactured, whether you have a durable core or a treadmill, and exactly which segment of users to invest in next. Keep DAU/MAU as a coarse summary if you like the single number. But put the curve next to it, track power-user share as the KPI that actually moves for the right reasons, and you will stop being surprised by churn that the ratio swore was not coming.
---
I help teams replace single-number engagement ratios with frequency distributions that show whether your power-user core is real and growing. [lester@gradientgrowth.com](mailto:lester@gradientgrowth.com)