DAU, WAU, MAU. Many product teams track these measures, but their usefulness depends on how “active” is defined and what decision the metric supports. That gap is what this post covers.
The Three Core Engagement Metrics
DAU — Daily Active Users
Count of unique users who performed at least one meaningful action on a given day. "Meaningful" is the word that matters — opening the app is not the same as completing a purchase. You define what counts.
SELECT
DATE(event_time) AS date,
COUNT(DISTINCT user_id) AS dau
FROM events
WHERE event_name != 'app_open' -- define "active" strictly
GROUP BY DATE(event_time)
ORDER BY date;WAU — Weekly Active Users
Unique users active at least once in a rolling 7-day window. Better than DAU for products not used daily — productivity tools, e-commerce, anything with natural weekly rhythms.
SELECT
COUNT(DISTINCT user_id) AS wau
FROM events
WHERE event_time >= CURRENT_DATE - INTERVAL '6 days'
AND event_time < CURRENT_DATE + INTERVAL '1 day';MAU — Monthly Active Users
Unique users active at least once in a 30-day window. MAU is often used as a top-line engagement measure, but it can hide frequency: two products can have identical MAU while one has users active 25 days/month and the other just 1 day/month.
Stickiness — The Metric That Actually Tells You Something
Stickiness = DAU / MAU. It answers: of everyone who used the product this month, how many come back daily?
WITH dau AS (
SELECT DATE(event_time) AS date, COUNT(DISTINCT user_id) AS dau
FROM events GROUP BY 1
),
mau AS (
SELECT DATE_TRUNC('month', event_time) AS month,
COUNT(DISTINCT user_id) AS mau
FROM events GROUP BY 1
)
SELECT
d.date,
d.dau,
m.mau,
ROUND(d.dau::DECIMAL / m.mau, 3) AS stickiness
FROM dau d
JOIN mau m ON DATE_TRUNC('month', d.date) = m.month
ORDER BY d.date;Illustrative frequency patterns by product type—not universal benchmarks:
- Social / messaging (WhatsApp, Twitter) — higher daily frequency may be expected, but evaluate against the product's own baseline
- E-commerce — lower daily stickiness can be expected because many users do not shop every day
- Productivity tools — usage frequency depends on the job cadence and target user
- Games — compare cohorts and genres before interpreting daily frequency
A common mistake is comparing stickiness across product categories. A food delivery app with 15% stickiness is not worse than a messaging app with 60% — they serve different use case frequencies.
Growth Accounting — Connecting Activity to Product Decisions
Instead of just tracking MAU, decompose what changed and why.
SELECT
this_month.user_id,
CASE
WHEN last_month.user_id IS NULL and first_seen.user_id IS NOT NULL
THEN 'resurrected'
WHEN last_month.user_id IS NULL
THEN 'new'
WHEN this_month.user_id IS NULL
THEN 'churned'
ELSE 'retained'
END AS user_status
FROM active_this_month this_month
FULL OUTER JOIN active_last_month last_month
ON this_month.user_id = last_month.user_id;MAU growth = new + resurrected - churned. That decomposition tells you where to focus, not just that the number moved.