DAU is steady, yet watch-time per session drops
Question
Daily active users are flat-to-up and new titles launched on time. But watch-time per session keeps slipping, mid-roll completion fell, and prime-time stalls spiked last week. Recommendations feel “samey” after a few swipes. Why does engagement feel softer when DAU is stable?
Answer ✅
A headline DAU can hide session-depth instability. If recs repeat, ad loads bunch, or start failures and micro-stalls rise at peaks, users “show up” but don’t stay. SSM-Audit adds a stability band beside the KPIs you already track so you see whether engagement is calm and repeatable or thin and timing-sensitive—before revenue and retention drift.
What the bands would have shown 📊
• Session watch-time stability sliding A+ -> A0 (shorter sessions despite steady DAU)
• Episode completion stability degrading to A- (more mid-episode exits)
• Recommendation freshness stability weakening A0 -> A- (repeat titles after 3–5 swipes)
• Start failure/timeout stability tilting A0 -> A- (first-play errors at peaks)
• Ad load cadence stability softening A+ -> A0 (mid-rolls bunch, skip probability rises)
• Stall rate stability dipping A0 -> A- (micro-buffers in specific ISPs/geos)
What to do now 🛠️
- Band engagement, not just DAU: track session depth, completion, rec freshness, start failure, ad load cadence, stall rate by 30-min buckets and geo/ISP.
- Fix first-play: when start-failure band < A0, pre-warm origins/DRM keys and fall back to next CDN POP.
- De-bunch ads: if ad-load band < A0, redistribute mid-rolls; cap density where skip risk spikes; test shorter pods.
- Refresh recs: when freshness band < A0, widen explore radius, penalize near-duplicates, and inject serendipity slots.
- Target stalls: if stall band < A0, raise ABR floors on fragile ISPs, cache hot chunks, and shift traffic off hot peers.
- Protect narrative arcs: when completion band < A0, tighten trailer-to-episode handoff and add “resume-next” nudges.
How SSM-Audit helps (practicalities) 🌟
• No additional infrastructure: runs beside your analytics, CDN, and ad-server exports.
• Numbers unchanged: DAU, ad impressions, and error logs stay the same; stability is a read-only overlay.
• Easy to use: spreadsheet/BI friendly; one lightweight weekly ritual across content, product, and delivery.
• Universal language: A++ / A+ / A0 / A- / A– aligns engineering, content ops, and ad ops quickly.
CLI 💻 — try our mini Calculator to identify the drift
(Mini CLI Download Page)
Feed your CSVs and see bands and drift at a glance (numbers unchanged).
# Session watch-time stability (per session minutes)
ssm_audit_mini_calc media.csv --kpi "Session Watch-Time Stability" \
--out bands_session.csv --plot_kpi "Session Watch-Time Stability" \
--build_id media
# Episode completion stability (pct reaching 90%+)
ssm_audit_mini_calc media.csv --kpi "Episode Completion Stability" \
--out bands_completion.csv --plot_kpi "Episode Completion Stability" \
--build_id media
# Recommendation freshness stability (unique titles within first N swipes)
ssm_audit_mini_calc media.csv --kpi "Recommendation Freshness Stability" \
--out bands_fresh.csv --plot_kpi "Recommendation Freshness Stability" \
--build_id media
# Start failure/timeout stability (first-play success)
ssm_audit_mini_calc media.csv --kpi "Start Failure Stability" \
--out bands_start.csv --plot_kpi "Start Failure Stability" \
--build_id media
# Ad load cadence stability (pods/session dispersion)
ssm_audit_mini_calc media.csv --kpi "Ad Load Cadence Stability" \
--out bands_adload.csv --plot_kpi "Ad Load Cadence Stability" \
--build_id media
# Stall rate stability (micro-stalls per hour)
ssm_audit_mini_calc media.csv --kpi "Stall Rate Stability" \
--out bands_stall.csv --plot_kpi "Stall Rate Stability" \
--build_id media
Outputs you will get:
• CSVs with stability bands for each timestamp (e.g., bands_session.csv).
• Drift charts per KPI (--plot_kpi) pinpointing prime-time and geo/ISP weak spots.
• Optional alerts if you enable thresholds in your setup.
Technical notes
Representation: x = (m, a) with a in (-1, +1)
Collapse parity: phi((m,a)) = m
Order-invariant pooling:
U = sum(w_i * atanh(a_i))
W = sum(w_i)
a_out = tanh( U / max(W, eps_w) )
Typical bands (example):
A++: a >= 0.75
A+: 0.50 - 0.75
A0: 0.25 - 0.50
A-: 0.10 - 0.25
A--: a < 0.10
Navigation
Back: SSM-Audit Q&A Series – Personal Investing (Question 44)
Next: SSM-Audit Q&A Series – Gaming Live-Ops (Question 46)
Page disclaimer
Illustrative scenario for research and education. Observation-only; do not use for critical decisions without independent validation.