SSM-Audit Q&A Series – Media & Streaming (Question 45)

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 🛠️

  1. 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.
  2. Fix first-play: when start-failure band < A0, pre-warm origins/DRM keys and fall back to next CDN POP.
  3. De-bunch ads: if ad-load band < A0, redistribute mid-rolls; cap density where skip risk spikes; test shorter pods.
  4. Refresh recs: when freshness band < A0, widen explore radius, penalize near-duplicates, and inject serendipity slots.
  5. Target stalls: if stall band < A0, raise ABR floors on fragile ISPs, cache hot chunks, and shift traffic off hot peers.
  6. 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.