Skip to content

Content drop-off

Analytics → Content (/analytics/content) tells you which titles are working and where in the story users abandon. This is the primary editorial feedback loop.

Table view of all published series with:

ColumnDefinition
SeriesTitle + thumbnail
StartsDistinct users who watched ≥1 second of episode 1 (period-scoped)
CompletesDistinct users who finished the series (last episode completed=true)
Completion %completes / starts
UnlocksTotal paid unlocks across all episodes of the series
Coins burnedTotal sink_unlock coins attributed to this series
Watch secondsAggregate viewing time
Avg drop-off epMedian episode number where users last watched

Sort by any column. Filter by market, date range.

Click any series → detail page with per-episode drop-off:

X-axis: episode number. Y-axis: % of series starters who watched this episode.

Reading it:

  • Steep drop between ep 3 and ep 4 = paywall friction (first 3 episodes are free). This is normal; the size of the drop measures conversion.
  • Steep drop mid-arc (e.g. ep 7-8) = story problem. The next release should tighten there.
  • Flat curve at the end = the show holds: cast a sequel.

Per-series, per-episode:

  • Paywall hits: mobile clients that surfaced the unlock prompt (from analytics_event).
  • Unlocks: actual episode_unlocks rows.
  • Conversion %: unlocks / paywall hits.

Under 10% conversion for a whole series = the pricing is off OR the show doesn’t earn its price. Common fix: cheaper series-level override.

The detail page shows cliffhanger_score per episode alongside its drop-off. High cliffhanger scores should correlate with low drop-off (users pushed through the paywall). If a scored-90 episode has 70% drop-off, the score is wrong: retag it in the episode editor.

  • Market (ISO-2)
  • Date range (period the numbers cover)
  • Genre / Trope filters for the series list
  • Rollup: rollup_series_daily (day, series_id, starts, completes, unlocks, coins_burned, watch_seconds) built by rollups-hourly cron.
  • Raw drill-down for the curve uses WatchProgress and analytics_event with a 30-day cap.
  • New series with < 100 starts: the curve is noisy. Wait for more data before drawing conclusions.
  • A/B test overlap: if you’re running a price A/B, drop-off between free and paid episodes can shift. Segment by test variant if needed.
  • Multiple markets: always filter by market when comparing similar-genre shows. Different markets have wildly different conversion norms.
ActionEndpoint
Content listGET /v1/admin/analytics/content
Per-series drilldownGET /v1/admin/analytics/content/series/:id

Full details in API: Analytics.