Уникальные пользователи, совершившие core action за день.
$$\text{DAU}_d = \left|,{\text{user_id} : \exists,\text{event} \in \text{core_actions}, \text{event_date} = d},\right|$$
Что это
DAU — самая базовая метрика «живости» продукта. Сколько уникальных юзеров совершили главное действие (core action) за день.
«Главное действие» зависит от продукта:
Тонкости
Что считать «активным» — открыл приложение и сразу закрыл = НЕ активный. Иначе DAU раздувается push-уведомлениями.
Уникальность по user_id, не по device — один человек с 2 устройствами = 1 DAU.
Часовой пояс — DAU за «день» в Алматы (UTC+5) ≠ DAU за UTC. Стандарт: считать в локальной таймзоне юзера или в часовой зоне компании.
Anonymous traffic — если у тебя 50% юзеров без авторизации, DAU по user_id сильно занижает реальность. Альтернатива: device_id + dedup, но точность хуже.
Бенчмарки
Частые ошибки
-- DAU за последние 30 дней, по локальной таймзоне юзера
select date_trunc('day', event_at at time zone 'Asia/Almaty')::date as day,
count(distinct user_id) as dau
from events
where event_name in ('app_open', 'feature_used') -- core actions
and event_at >= current_date - interval '30 day'
group by 1
order by 1;
df = events[events.event_name.isin(['app_open','feature_used'])]
df['day'] = df.event_at.dt.tz_convert('Asia/Almaty').dt.date
dau = df.groupby('day')['user_id'].nunique().reset_index(name='dau')