OBSERVERTC / Client Monitor

Quality scores

Read the 0–5 component scores and understand how they aggregate.

What a quality score tells you

A quality score summarizes the signals the monitor can observe on a scale from 0 to 5. Higher values mean fewer measured penalties; lower values help you find clients and tracks that need attention. It is an engineering health indicator, not a guarantee of what a person hears or sees.

Use the score for an overview, then inspect the track metrics, active issues, and score reasons to explain a change. A healthy connection with unavailable browser measurements still has limited evidence, even if its score is high.

Where scores are available

ScopeWhat it summarizes
Peer connectionStability and health of the transport used for media.
Inbound audio/video trackMedia received and played by this client.
Outbound audio/video trackMedia captured and sent by this client.
ClientConnection stability together with sending and receiving quality.
Call in ObserverA weighted average of the participating clients’ scores.

Why a bad track affects the overall score

The client calculator gives substantial weight to poor quality in any available dimension. For example, dimension scores of 5, 5, and 0 produce a client score of 2.11, rather than the arithmetic average of 3.33. This helps a severe problem remain visible even while other parts of a call work well. Dimensions with no data are excluded.

How to use score reasons

Reasons identify penalties associated with a component. Read them alongside the relevant track or peer connection; the root sample does not automatically contain every child’s reasons. Setting sendScoreReasonsToServer: false reduces sample detail without turning off scores or the local score event.

A score can fall without an issue being raised. Some penalties follow continuous measurements, and small accumulated penalties may not publish a reason yet. Do not interpret an empty reasons list as proof that all media was perfect.

Calculation reference

DefaultScoreCalculator.update() computes PC stability, track scores, then client score. A component starts from 5 and subtracts applicable penalties, clamped at 0. Track weight and PC stability weight feed dimension means. Five dimensions are PC stability, inbound audio/video, outbound audio/video. Client score is:

dimension = sum(componentScore × weight) / sum(weight)
client = roundTo2(clamp(5 − sqrt(mean((5 − dimension)²)), 0, 5))

Missing dimensions are excluded. [5,5,0] therefore gives 2.11, not arithmetic mean 3.33. The server’s DefaultCallScoreCalculator is a weighted arithmetic mean of client scores, not the same RMSE rule.

Source references

Penalties

Example evidenceEffect on the score
A dry track, stuck decoder, or stalled frame assemblyA severe penalty of 5 points for the affected component.
Sustained connection loss or delayA penalty of 2.5 points for each condition.
Directional congestionA penalty scaled by congestion severity.
Transport instability or decoder degradationA continuous penalty that follows the measured degradation.
PixelationA penalty whose weight also depends on how much the video is magnified on screen.

The calculator also evaluates capture, encoding, freezes, frame drops, and audio behavior. The formula reference preserves the exact calculations for the documented baseline. Use component scores to locate the affected part of the pipeline rather than reading a client score as the diagnosis by itself.

Detailed reason behavior

The calculator is not issues-only, despite its opening comment. It also charges continuous frame timing, frame drops, quantization, audio instability, target-bitrate deviation, screen-share downscale and transport stability. Continuous reason names are exposed only when their total exceeds 1 point, unless an issue is active; score reductions may exist with no published reasons. Root sample reasons are only root-owned reasons; the default RMSE adds no root reason, while the score event carries aggregated component reasons. sampledScoreReasons() copies the object and honors explicit false. Sources: client-monitor-js/src/scores/DefaultScoreCalculator.ts · reasonsOf, client-monitor-js/src/scores/utils.ts, client-monitor-js/src/ClientMonitor.ts · setScore.

Version coverage varies by reference. Source revisions · Markdown source