Skip to Content
DocsDashboardStreamingAnalytics & Logs

Analytics & Logs

The Analytics and Activity Logs panels give you visibility into viewing patterns, content popularity, and streaming history. Track watch time, identify trending content, discover encoding issues through health scores, and audit every play, pause, stop, and administrative action across your media servers.

Admin only

Analytics and activity logs require administrator privileges and the wsdashboard feature flag enabled in Settings > General > Feature Flags.


Key features

📊 Watch Analytics

Total watch time, session counts, top users, top titles, and stream type breakdowns with configurable time windows

📈 Time-Series Charts

Daily watch time plotted over time to visualize usage trends across your selected period

🔥 Trending Content

Ranked list of currently popular content using time-decay scoring where recent views count more than older ones

🏥 Health Scores

Composite watchability metric (0-100) per item combining completion, direct play compatibility, stability, and engagement

🚪 Abandoned Streams

Identify content with high abandonment rates that may indicate encoding issues or poor metadata

📝 Activity Logs

Paginated history of all streaming actions — play, pause, resume, stop, disconnect, and message events

📥 CSV Export

Download analytics data as a CSV file for external analysis in spreadsheets or reporting tools

🔍 Filtering

Filter by media type, server type, play method, action type, user, and date range — with a global time range setting that controls the analysis window across all views

📦 Historical Import

Import playback history from Emby or Jellyfin to populate analytics with historical data instead of starting from zero

🔄 Reset Analytics

Wipe all watch session history and start fresh — useful before a clean import or to clear test data


How to access

The Analytics and Activity Logs panels are flyout panels accessible from multiple locations:

  • Sidebar — click Watch Analytics or Activity Logs under the Streaming Dashboard section
  • Header buttons — click the Analytics or Logs buttons in the Streaming Dashboard page header

Both panels slide in from the side and can be used alongside the main streaming view.


Watch Analytics

The Analytics panel has two tabs: Overview and Intelligence.

Overview tab

The Overview tab provides aggregate viewing statistics across your media servers:

MetricWhat it shows
Watch Time
Total hours watched across all users and content for the selected period
Session Count
Total number of watch sessions in the selected period
Top Users
Ranked list of users by total watch time
Top Titles
Ranked list of most-watched content
Stream Type Breakdown
Distribution chart showing Direct Play vs Direct Stream vs Transcode sessions
Time-Series Chart
Daily watch time plotted over time, showing usage trends
CSV Export
Download all analytics data as a CSV file

Overview filters

FilterOptions
Media type
All, Movies, Episodes, Live TV
Server type
All, Emby, Jellyfin
Play method
Direct Play, Direct Stream, Transcode (Overview tab only)

Time range is a global setting

The time window for all analytics views is controlled by the Analytics Time Range setting in the Streaming Dashboard Settings flyout, not by a per-view filter. See Analytics Time Range below.


Intelligence tab

The Intelligence tab provides deeper, item-level analytics with four sub-views:

Items

A searchable, sortable table of all tracked media items. Each row shows the title, series name (for episodes), media type, server, total plays, unique viewers, total watch time, average watch time, average completion percentage, health score, and trending score. Clicking any row expands detailed per-item analytics including play method breakdown, resolution breakdown, and recent plays with user and device details.

A ranked list of currently popular content. Trending uses a time-decay algorithm where recent views count more than older ones — a movie watched 5 times today ranks higher than one watched 50 times last month. Each entry shows rank number, server icon, media type icon, title, trending score, and play count.

Library

Per-library summary cards showing total plays, total watch time, average completion rate, and top genres for each of your media libraries.

Abandoned

Items with high abandonment rates — sessions ending below the configured abandonment threshold (default: 10% completion). This view is useful for identifying content with technical issues (buffering, codec problems) or poor metadata that causes viewers to stop watching almost immediately. Each entry shows the title, total plays, abandoned count, abandonment rate, and average completion.

Live TV excluded

Live TV sessions are excluded from abandonment calculations because live streams have no defined duration, making completion percentage meaningless.


Health Score

The Health Score is a composite metric from 0 to 100 that measures the overall “watchability” of a media item. It combines five signals:

SignalWeightWhat it measures
Completion Rate
35%
Do viewers finish what they start?
Direct Play Rate
25%
Can most devices play the file natively without transcoding?
Playback Stability
20%
How rarely do viewers abandon within the first 10%?
Rewatch Engagement
10%
Do viewers come back to watch again?
Audience Breadth
10%
Is the content watched by many different users or just one?

Score interpretation

Score RangeRatingWhat it means
80–100
Excellent
Well-encoded, engaging content that plays natively on most devices
60–79
Good
Minor issues or niche appeal — generally healthy
40–59
Fair
Noticeable issues worth investigating — transcoding or engagement problems
20–39
Poor
Significant problems with encoding or engagement
0–19
Critical
Likely unwatchable or universally abandoned — re-encode or replace

Low health score symptoms

  • Content consistently scores below 40
  • High transcode rate for specific items
  • Viewers frequently abandon within the first minutes
  • Only one user watches certain content

Possible actions

  • Re-encode the media file in a more compatible format (H.264 is widely supported)
  • Check audio codec compatibility — some devices cannot direct play certain audio formats
  • Review metadata and thumbnails — poor artwork or descriptions may deter viewers
  • Consider removing or replacing consistently abandoned content

The Trending Score indicates how popular content is right now. It uses exponential time-decay weighting with a 3-day half-life. Each viewing session contributes a score based on completion (completed sessions count more than abandoned ones) multiplied by a recency factor that halves every 3 days.

This means content must receive ongoing plays to maintain a high trending position. A title watched frequently this week will rank higher than one with many historical views but no recent activity.


Activity Logs

The Activity Logs panel shows a paginated table of all streaming actions logged by the dashboard.

Logged actions

ActionWhat was recorded
Play
A user started watching content
Pause
Playback was paused (by user or admin)
Resume
A paused session was resumed
Notify
A message was sent to a viewer's device
Stop
Playback was stopped gracefully
Disconnect
A session was forcefully killed (device disconnected)

Each log entry shows the timestamp, action type, username, device name, IP address, and media details.

Log filters

  • Action type — select specific action types to display
  • Username — filter by a specific user
  • Date range — from and to date pickers

Data retention

Activity logs are retained based on the configured analytics retention period (default 90 days). Older entries are automatically cleaned up.


Analytics data source

All analytics are computed from watch session records stored locally on your server. There are two ways data enters the analytics system:

  • Live tracking — the Streaming Dashboard automatically tracks every play session from start to finish while it is enabled and connected to your media server. This happens continuously in real time.
  • Historical import — administrators can import playback history from Emby or Jellyfin to backfill analytics with data from before the Streaming Dashboard was enabled. See the Historical Import section below.

Both live-tracked and imported sessions appear together in all analytics views and are treated identically by the analytics engine.


Analytics settings

Administrators can customize several thresholds that control how the analytics engine classifies viewing sessions, and exclude specific users from all analytics calculations. These settings are available in the Streaming Dashboard Settings flyout under the Analytics section.

SettingDefaultRangeWhat it controls
Analytics Time Range
30 days
1–3650 days, or All Time
Global time window applied to all analytics and intelligence views — controls how far back data is included in dashboards
Completion Threshold
80%
50–100%
Minimum completion percentage for a viewing to count as "completed"
Abandonment Threshold
10%
1–50%
Maximum completion percentage for a session to be classified as "abandoned"
Minimum Watch Time
10 seconds
0–300 seconds
Sessions shorter than this duration are excluded from all analytics
Missing Session Threshold
4 poll cycles (20 seconds)
2–10 cycles
How long the dashboard waits before considering a session disconnected

Minimum watch time filtering

The minimum watch time filter applies globally across all analytics views. Sessions below the threshold (default: 10 seconds) are excluded from play counts, watch time totals, completion rates, and all Intelligence sub-views. This prevents accidental clicks or brief buffering from inflating your analytics. The raw session data is preserved — only the analytics queries filter it out.

Analytics Time Range

The Analytics Time Range is a global setting that controls the time window for all analytics views — Overview, Intelligence, and Media Portal item pages. Instead of selecting a time window on each individual view, administrators set a single range that applies everywhere.

The setting offers preset buttons for common ranges:

  • 30 days — recent activity focus (default)
  • 90 days — medium-term trend analysis
  • 180 days — half-year overview
  • All Time — includes every session ever recorded, with no time filtering

You can also enter a custom value between 1 and 3650 days using the text input field. The setting takes effect immediately across all analytics views.

Choosing a time range

Changing the Analytics Time Range affects what data is visible in all analytics views simultaneously. Shorter ranges load faster and highlight recent trends, while longer ranges provide broader historical context. The “All Time” option may be noticeably slower on servers with very large session histories spanning years of data.

Excluded users

Administrators can exclude specific media server users from all analytics calculations. This is useful for filtering out admin or test accounts that briefly sample media to verify quality — watching a few seconds, fast-forwarding through files — which would otherwise inflate abandonment rates, skew completion percentages, and appear in top user or item viewer lists.

To exclude users, open the Streaming Dashboard Settings flyout and scroll to the Analytics section. The Excluded Users picker lets you search and select users from your connected Emby or Jellyfin servers. You can also type a username manually for users that have been deleted from your media server but still have historical sessions in the analytics data.

Excluded users are filtered at query time across every analytics view — overview stats, top users, trending, health scores, abandonment rates, item viewers, library summaries, geo breakdowns, and device breakdowns. The raw session data is preserved, so removing a user from the exclusion list immediately restores their data in all analytics views.

Exclusion limits

You can exclude up to 200 users. Each username can be up to 100 characters.

Advanced settings

Most administrators will not need to change the default thresholds. Adjusting thresholds affects how existing and future session data is interpreted across all analytics views. Changes take effect immediately.

Historical Import

The Historical Import feature lets you import playback history from your Emby or Jellyfin server into the analytics database. This is useful for new QuickBox Pro installations where you have months or years of media server viewing history that you want reflected in your analytics dashboards immediately rather than waiting for the data to accumulate through live tracking.

To access the import feature, open the Streaming Dashboard Settings flyout and expand the Analytics section. The Historical Import panel appears below the threshold settings.

Server selection

Choose which media server to import from:

  • Emby — import from your Emby server only
  • Jellyfin — import from your Jellyfin server only
  • Both — import from both servers in sequence

Only servers that are configured and enabled in your Streaming Dashboard connection settings will appear as options.

How it works

The import reads playback history directly from your media server’s local SQLite database. Since QuickBox Pro runs on the same server as your media server, the database files are always available locally. This approach is fast, reliable, and avoids any API timeout concerns with large libraries.

By default, the import captures your complete play history:

  • Play counts, titles, and series information
  • Users and their watch history
  • Dates played and item creation dates
  • Media type (Movie, Episode)
  • Genres and container format
  • Completion status and playback position

Stream quality enrichment

Optionally, you can enable the Enrich with media quality data toggle to also extract stream quality metadata from the database for each imported item. When enrichment is off, you still get all play history — just without the stream quality fields listed below.

Enrichment adds the following data to each imported session:

FieldWhat it provides
Video codec
Original video codec (e.g., H.264, HEVC/H.265)
Audio codec
Original audio codec (e.g., TrueHD, EAC3, AAC)
Container
Container format (e.g., MKV, MP4)
Resolution
Video resolution (e.g., 1920x1080, 3840x2160)
Bitrate
Original bitrate of the video stream
Library name
Which media library the item belongs to

Enable enrichment when

  • You want codec distribution charts, resolution statistics, and bitrate analysis in your analytics
  • You want library-level filtering and per-library summary cards with accurate library names
  • You want to identify items that need re-encoding based on historical codec data

Skip enrichment when

  • You only need play history — who watched what, when, how often
  • You want the fastest possible import without extra database reads per item
  • You plan to re-import later with enrichment once you see what data you need

Safety and idempotency

The import process is designed to be safe to run multiple times:

  • No duplicates — the import uses deterministic session identifiers. Re-running the import for the same server produces the same result without creating duplicate entries.
  • Readonly database access — QuickBox Pro opens the media server’s database files in strict readonly mode. Your media server’s data is never modified.
  • Cancellable — you can cancel a running import at any time. Sessions already inserted are kept; the import simply stops processing additional items.
  • Progress tracking — the import panel shows the current phase, which user is being processed, a progress bar, and counters for items processed, sessions inserted, and sessions skipped.

Supported content types

The import processes Movies and Episodes (TV shows). All play counts are imported — if a user watched a movie 26 times, all 26 viewings are created as individual sessions with interpolated timestamps.

Clearing imported data

After an import, the panel shows the number of imported sessions per server. You can clear imported data at any time using the Clear Imported Data button. This removes only the imported sessions — live-tracked sessions from real-time monitoring are not affected. Clearing requires confirmation.

Reset Analytics

Destructive action

Resetting analytics permanently deletes all watch session history from the analytics database, including both live-tracked sessions and imported historical data. This action cannot be undone.

The Reset Analytics feature completely wipes the analytics database and reclaims storage space. It is available at the bottom of the Analytics settings section in the Streaming Dashboard Settings flyout. Use it when you want to:

  • Start fresh before an import — clear all existing data, then run a historical import to build analytics from scratch
  • Recover from bad data — wipe analytics after importing incorrect historical data or if sessions have become unreliable
  • Remove test data — wipe sessions accumulated during initial setup, development, or testing
  • Hand over to a new admin — give a new server administrator a clean slate without inherited viewing history
  • Start over — discard all analytics history and begin tracking from zero

The reset button shows a confirmation dialog before proceeding. Once confirmed, all watch sessions are deleted and the database storage is reclaimed. This is an admin-only action.


Best practices

Do

  • Set the global Analytics Time Range in settings to match your monitoring needs — use 30 days for recent activity focus, 90–180 days for trend analysis, or All Time to see your complete viewing history
  • Start with the Overview tab to understand overall viewing patterns before diving into item-level Intelligence
  • Use the Abandoned sub-view to identify content with encoding or compatibility issues that cause viewers to stop watching
  • Export analytics data as CSV periodically if you want to keep historical records beyond the retention period
  • Review the Stream Type Breakdown regularly — a high transcode percentage may indicate your media library needs re-encoding for better device compatibility
  • Use activity logs to audit administrative actions like kill session and message sends
  • Review the analytics threshold settings if the default completion (80%) or abandonment (10%) thresholds don't match your viewing expectations
  • Exclude admin and test accounts from analytics to keep metrics accurate — accounts that briefly sample media to verify quality will skew abandonment rates and completion percentages
  • Use Historical Import to backfill analytics when first setting up the Streaming Dashboard — this gives you immediate visibility into viewing patterns
  • Enable stream quality enrichment during import to capture codec, resolution, bitrate, and library data — this significantly enriches your analytics with media quality information

Don't

  • Don't expect rich analytics immediately after enabling the Streaming Dashboard — use Historical Import to backfill, or allow data to accumulate over time
  • Don't compare trending scores across long time periods — they are designed to surface what is popular right now
  • Don't interpret low health scores as a content quality judgment — they primarily reflect technical compatibility and engagement metrics
  • Don't rely on the Streaming Dashboard for Plex analytics — use Tautulli instead

FAQ

Analytics are built from viewing sessions tracked while the Streaming Dashboard is enabled and connected to your media server. If you recently enabled the feature, the dashboard has not yet collected enough data to display meaningful statistics. You can either allow time for data to accumulate through live tracking, or use the Historical Import feature to import existing playback history from your Emby or Jellyfin server.
Yes. The Historical Import feature in the Analytics settings lets you import playback history from Emby, Jellyfin, or both. The import reads play data directly from your media server's local database and creates analytics sessions for each viewing. You can optionally enable enrichment to also capture stream quality metadata like codec, resolution, bitrate, and library name. The import is safe to run multiple times — duplicate sessions are automatically prevented.
Activity logs are retained for the configured analytics retention period, which defaults to 90 days. Older entries are automatically cleaned up. You can export analytics data as CSV before the retention window expires if you need longer-term records.
The Analytics panel (accessed from the sidebar or header) shows aggregate statistics across your entire library — total watch time, top users, top titles, trending, and abandoned items. Per-item analytics on Media Portal detail pages show statistics for a single specific item — play count, unique viewers, completion rate, and viewer cards.
Yes. The Overview tab supports multiple simultaneous per-view filters — media type, server type, and play method. Apply any combination to narrow down the data you want to analyze. The time range is a separate global setting configured in the Streaming Dashboard Settings flyout under Analytics, and it applies to all analytics views at once.
Sessions shorter than the minimum watch time threshold (default: 10 seconds) are automatically excluded from all analytics calculations. This prevents accidental clicks or brief buffering events from inflating play counts and abandonment rates. If you need to see all sessions regardless of duration, you can lower or disable the threshold in the Streaming Dashboard Settings flyout under Analytics.
If a stream temporarily drops and reconnects within about 60 seconds, the dashboard automatically resumes tracking the same viewing session rather than creating a duplicate. This means brief network hiccups — such as WiFi roaming or a momentary ISP interruption — will not inflate your play counts or fragment your watch time data.
Yes. The dashboard aggregates all viewing sessions for the same content when calculating completion. If a viewer watches 50% of a movie today and the remaining 50% tomorrow, the analytics correctly report this as completed rather than showing two separate incomplete sessions.
Open the Streaming Dashboard Settings flyout and scroll to the Analytics section. Use the Excluded Users picker to search and select users from your media server. Excluded users are filtered from all analytics views — their raw session data is preserved, so you can remove them from the exclusion list at any time to restore their data. You can also type a username manually for users that have been deleted from the media server but still have historical sessions.
The import always reads play data directly from your media server's local database. The enrichment toggle controls whether to also extract stream quality metadata — video codec, audio codec, resolution, bitrate, and library name — for each item. Without enrichment, you get full play history (titles, users, play counts, dates, genres, completion status) but stream quality fields will appear as unknown. Enrichment adds extra database reads per item, so it takes slightly longer.
Yes. The import uses deterministic identifiers for each session, so running it again for the same server will not create duplicates. Previously imported sessions are skipped automatically. This is useful if you want to re-import after adding new content or new users to your media server.
Clearing imported data removes only the sessions that were created by the Historical Import feature. Live-tracked sessions from real-time monitoring are not affected. After clearing, you can run a new import if needed.
Clearing imported data removes only the sessions created by the Historical Import feature, leaving live-tracked sessions intact. Resetting analytics deletes everything — both imported and live-tracked sessions — giving you a completely empty analytics database. Use clear when you want to re-import; use reset when you want to start completely from scratch.

Join the Community

Media server operators sharing configs, getting support, and shaping the future of QuickBox Pro.

Dedicated Support
Feature Previews
Community Configs
Active Discussions
Join Discord Server