Streaming Playback Success Rate
Also known as: Playback Success Rate, Stream Start Success Rate, Video Playback Success Rate, Successful Play Rate, Play Success Rate, SPSR
Measures the percentage of qualified streaming playback attempts that render the requested content within the defined startup time limit without a fatal playback error. It indicates the reliability of the end-to-end playback experience across applications, devices, content formats, delivery networks, and digital rights management services.
Business Use Case
The Streaming Product organization monitors this KPI by application version, device model, CDN, DRM provider, and content type. If the rate falls below 99.0% for a specific smart-TV release, the release owner can halt rollout, route traffic to a stable player version or alternate CDN, and prioritize remediation using the associated startup error codes.
Business Criticality
High
Journey / Navigation Area
Engagement
Owning Function
Product - Playback Experience
Scope
Event
Formula
(Successful Qualified Playback Attempts / Total Qualified Playback Attempts) × 100Calculation Notes
1️⃣ Calculate distinct qualified playback_attempt_id values based on timestamps. 2️⃣ Successful attempts require a validated content-first-frame event within 10 seconds. 3️⃣ Exclude fatal startup errors before the validated event. 4️⃣ For audio-only streams, use validated audio-render events instead. 5️⃣ Start measurement clock after pre-roll advertising time ends. 6️⃣ Automatic player retries count as part of the original attempt unless a new play action occurs. 7️⃣ Classify attempts without terminal events as unsuccessful after the 10-second window.
Technical Details
Events
| Platform | Event |
|---|---|
| Google Analytics 4 | select_content |
| Adobe | select_content |
Data Mappings
W3 Data Layer
{
"event": [
{
"eventInfo": {
"eventName": "select_content",
"eventAction": "streaming_playback_attempt_resolved"
},
"attributes": {
"cdn_pop": "IAD-01",
"is_live": false,
"item_id": "content_12345",
"user_id": "user_789",
"event_id": "evt_550e8400-e29b-41d4-a716-446655440000",
"platform": "connected_tv",
"series_id": "series_100",
"drm_system": "widevine",
"error_code": null,
"error_type": null,
"audio_codec": "aac",
"device_type": "television",
"error_stage": null,
"player_name": "Unified Streaming Player",
"retry_count": 0,
"stream_type": "on_demand",
"video_codec": "h264",
"anonymous_id": "anon_456",
"bitrate_kbps": 4500,
"browser_name": "not_applicable",
"cdn_provider": "Example CDN",
"content_type": "episode",
"country_code": "US",
"device_model": "Example TV 2025",
"network_type": "wifi",
"content_title": "Example Program",
"language_code": "en-US",
"season_number": 2,
"content_format": "video",
"episode_number": 5,
"player_version": "8.4.1",
"browser_version": "not_applicable",
"event_timestamp": "2025-03-08T14:30:45.123Z",
"startup_time_ms": 1840,
"application_name": "Streaming Application",
"content_rendered": true,
"operating_system": "Example TV OS",
"playback_success": true,
"qualified_attempt": true,
"drm_license_status": "granted",
"application_version": "12.6.0",
"content_duration_ms": 2700000,
"device_manufacturer": "Example Manufacturer",
"playback_attempt_id": "attempt_123456789",
"playback_session_id": "session_987654321",
"fatal_playback_error": false,
"playback_position_ms": 0,
"startup_time_limit_ms": 5000,
"operating_system_version": "7.2"
}
}
]
}GA4 Data Layer
{
"event": "select_content",
"cdn_pop": "IAD-01",
"is_live": false,
"item_id": "content_12345",
"user_id": "user_789",
"event_id": "evt_550e8400-e29b-41d4-a716-446655440000",
"platform": "connected_tv",
"series_id": "series_100",
"drm_system": "widevine",
"error_code": null,
"error_type": null,
"audio_codec": "aac",
"device_type": "television",
"error_stage": null,
"player_name": "Unified Streaming Player",
"retry_count": 0,
"stream_type": "on_demand",
"video_codec": "h264",
"anonymous_id": "anon_456",
"bitrate_kbps": 4500,
"browser_name": "not_applicable",
"cdn_provider": "Example CDN",
"content_type": "episode",
"country_code": "US",
"device_model": "Example TV 2025",
"network_type": "wifi",
"content_title": "Example Program",
"language_code": "en-US",
"season_number": 2,
"content_format": "video",
"episode_number": 5,
"player_version": "8.4.1",
"browser_version": "not_applicable",
"event_timestamp": "2025-03-08T14:30:45.123Z",
"startup_time_ms": 1840,
"application_name": "Streaming Application",
"content_rendered": true,
"operating_system": "Example TV OS",
"playback_success": true,
"qualified_attempt": true,
"drm_license_status": "granted",
"application_version": "12.6.0",
"content_duration_ms": 2700000,
"device_manufacturer": "Example Manufacturer",
"playback_attempt_id": "attempt_123456789",
"playback_session_id": "session_987654321",
"fatal_playback_error": false,
"playback_position_ms": 0,
"startup_time_limit_ms": 5000,
"operating_system_version": "7.2"
}Adobe Client Data Layer
{
"data": {
"cdn_pop": "IAD-01",
"is_live": false,
"item_id": "content_12345",
"user_id": "user_789",
"event_id": "evt_550e8400-e29b-41d4-a716-446655440000",
"platform": "connected_tv",
"series_id": "series_100",
"drm_system": "widevine",
"error_code": null,
"error_type": null,
"audio_codec": "aac",
"device_type": "television",
"error_stage": null,
"player_name": "Unified Streaming Player",
"retry_count": 0,
"stream_type": "on_demand",
"video_codec": "h264",
"anonymous_id": "anon_456",
"bitrate_kbps": 4500,
"browser_name": "not_applicable",
"cdn_provider": "Example CDN",
"content_type": "episode",
"country_code": "US",
"device_model": "Example TV 2025",
"network_type": "wifi",
"content_title": "Example Program",
"language_code": "en-US",
"season_number": 2,
"content_format": "video",
"episode_number": 5,
"player_version": "8.4.1",
"browser_version": "not_applicable",
"event_timestamp": "2025-03-08T14:30:45.123Z",
"startup_time_ms": 1840,
"application_name": "Streaming Application",
"content_rendered": true,
"operating_system": "Example TV OS",
"playback_success": true,
"qualified_attempt": true,
"drm_license_status": "granted",
"application_version": "12.6.0",
"content_duration_ms": 2700000,
"device_manufacturer": "Example Manufacturer",
"playback_attempt_id": "attempt_123456789",
"playback_session_id": "session_987654321",
"fatal_playback_error": false,
"playback_position_ms": 0,
"startup_time_limit_ms": 5000,
"operating_system_version": "7.2"
},
"event": "select_content",
"eventInfo": {
"eventName": "select_content",
"eventAction": "streaming_playback_attempt_resolved"
}
}XDM Mapping
{
"web": {
"webInteraction": {
"name": "select_content",
"type": "other",
"linkClicks": {
"value": 1
}
}
},
"device": {
"type": "television",
"model": "Example TV 2025",
"manufacturer": "Example Manufacturer"
},
"eventID": "evt_550e8400-e29b-41d4-a716-446655440000",
"eventType": "web.webinteraction.linkClicks",
"timestamp": "2025-03-08T14:30:45.123Z",
"_experience": {
"analytics": {
"customDimensions": {
"eVars": {
"eVar1": "attempt_123456789",
"eVar2": "session_987654321",
"eVar3": "user_789",
"eVar4": "anon_456",
"eVar5": "content_12345",
"eVar6": "Example Program",
"eVar7": "episode",
"eVar8": "video",
"eVar9": "series_100",
"eVar10": "2",
"eVar11": "5",
"eVar12": "2700000",
"eVar13": "false",
"eVar14": "on_demand",
"eVar15": "0",
"eVar16": "Unified Streaming Player",
"eVar17": "8.4.1",
"eVar18": "Streaming Application",
"eVar19": "12.6.0",
"eVar20": "connected_tv",
"eVar21": "television",
"eVar22": "Example Manufacturer",
"eVar23": "Example TV 2025",
"eVar24": "Example TV OS",
"eVar25": "7.2",
"eVar26": "not_applicable",
"eVar27": "not_applicable",
"eVar28": "wifi",
"eVar29": "Example CDN",
"eVar30": "IAD-01",
"eVar31": "widevine",
"eVar32": "granted",
"eVar33": "h264",
"eVar34": "aac",
"eVar35": "4500",
"eVar36": "1840",
"eVar37": "5000",
"eVar38": "true",
"eVar39": "true",
"eVar40": "true",
"eVar41": "false",
"eVar42": null,
"eVar43": null,
"eVar44": null,
"eVar45": "0",
"eVar46": "US",
"eVar47": "en-US"
}
}
}
},
"application": {
"name": "Streaming Application",
"version": "12.6.0"
},
"environment": {
"type": "connected_tv",
"browserDetails": {
"browser": "not_applicable",
"version": "not_applicable"
},
"operatingSystem": "Example TV OS",
"operatingSystemVersion": "7.2"
},
"identityMap": {
"ECID": [
{
"id": "12345678901234567890123456789012345678",
"primary": true,
"authenticatedState": "ambiguous"
}
]
},
"placeContext": {
"geo": {
"countryCode": "US"
}
},
"mediaCollection": {
"playhead": 0,
"qoeDataDetails": {
"bitrate": 4500,
"timeToStart": 1.84
},
"sessionDetails": {
"name": "content_12345",
"length": 2700,
"playerName": "Unified Streaming Player",
"streamType": "on_demand",
"contentType": "episode",
"friendlyName": "Example Program"
}
}
}SQL Queries
Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
WITH extracted AS (
SELECT
e.event_timestamp AS source_event_timestamp,
e.user_id AS ga4_user_id,
(
SELECT AS STRUCT
MAX(IF(key = 'event_id', v, NULL)) AS event_id,
MAX(IF(key = 'event_timestamp', v, NULL)) AS event_timestamp,
MAX(IF(key = 'playback_attempt_id', v, NULL)) AS playback_attempt_id,
MAX(IF(key = 'playback_session_id', v, NULL)) AS playback_session_id,
MAX(IF(key = 'user_id', v, NULL)) AS user_id,
MAX(IF(key = 'anonymous_id', v, NULL)) AS anonymous_id,
MAX(IF(key = 'item_id', v, NULL)) AS item_id,
MAX(IF(key = 'content_title', v, NULL)) AS content_title,
MAX(IF(key = 'content_type', v, NULL)) AS content_type,
MAX(IF(key = 'content_format', v, NULL)) AS content_format,
MAX(IF(key = 'series_id', v, NULL)) AS series_id,
MAX(IF(key = 'season_number', v, NULL)) AS season_number,
MAX(IF(key = 'episode_number', v, NULL)) AS episode_number,
MAX(IF(key = 'content_duration_ms', v, NULL)) AS content_duration_ms,
MAX(IF(key = 'is_live', v, NULL)) AS is_live,
MAX(IF(key = 'stream_type', v, NULL)) AS stream_type,
MAX(IF(key = 'playback_position_ms', v, NULL)) AS playback_position_ms,
MAX(IF(key = 'player_name', v, NULL)) AS player_name,
MAX(IF(key = 'player_version', v, NULL)) AS player_version,
MAX(IF(key = 'application_name', v, NULL)) AS application_name,
MAX(IF(key = 'application_version', v, NULL)) AS application_version,
MAX(IF(key = 'platform', v, NULL)) AS platform,
MAX(IF(key = 'device_type', v, NULL)) AS device_type,
MAX(IF(key = 'device_manufacturer', v, NULL)) AS device_manufacturer,
MAX(IF(key = 'device_model', v, NULL)) AS device_model,
MAX(IF(key = 'operating_system', v, NULL)) AS operating_system,
MAX(IF(key = 'operating_system_version', v, NULL)) AS operating_system_version,
MAX(IF(key = 'browser_name', v, NULL)) AS browser_name,
MAX(IF(key = 'browser_version', v, NULL)) AS browser_version,
MAX(IF(key = 'network_type', v, NULL)) AS network_type,
MAX(IF(key = 'cdn_provider', v, NULL)) AS cdn_provider,
MAX(IF(key = 'cdn_pop', v, NULL)) AS cdn_pop,
MAX(IF(key = 'drm_system', v, NULL)) AS drm_system,
MAX(IF(key = 'drm_license_status', v, NULL)) AS drm_license_status,
MAX(IF(key = 'video_codec', v, NULL)) AS video_codec,
MAX(IF(key = 'audio_codec', v, NULL)) AS audio_codec,
MAX(IF(key = 'bitrate_kbps', v, NULL)) AS bitrate_kbps,
MAX(IF(key = 'startup_time_ms', v, NULL)) AS startup_time_ms,
MAX(IF(key = 'startup_time_limit_ms', v, NULL)) AS startup_time_limit_ms,
MAX(IF(key = 'qualified_attempt', v, NULL)) AS qualified_attempt,
MAX(IF(key = 'playback_success', v, NULL)) AS playback_success,
MAX(IF(key = 'content_rendered', v, NULL)) AS content_rendered,
MAX(IF(key = 'fatal_playback_error', v, NULL)) AS fatal_playback_error,
MAX(IF(key = 'error_code', v, NULL)) AS error_code,
MAX(IF(key = 'error_type', v, NULL)) AS error_type,
MAX(IF(key = 'error_stage', v, NULL)) AS error_stage,
MAX(IF(key = 'retry_count', v, NULL)) AS retry_count,
MAX(IF(key = 'country_code', v, NULL)) AS country_code,
MAX(IF(key = 'language_code', v, NULL)) AS language_code
FROM (
SELECT
ep.key,
COALESCE(
ep.value.string_value,
CAST(ep.value.int_value AS STRING),
CAST(ep.value.double_value AS STRING),
CAST(ep.value.float_value AS STRING)
) AS v
FROM UNNEST(e.event_params) AS ep
)
) AS p
FROM `your-project.analytics_123456789.events_*` AS e
WHERE e.event_name = 'select_content'
AND _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
),
typed AS (
SELECT
COALESCE(p.event_id, CONCAT('ga4-', CAST(source_event_timestamp AS STRING), '-', p.playback_attempt_id)) AS event_id,
COALESCE(SAFE_CAST(p.event_timestamp AS TIMESTAMP), TIMESTAMP_MICROS(source_event_timestamp)) AS event_timestamp,
p.playback_attempt_id,
p.playback_session_id,
COALESCE(p.user_id, ga4_user_id) AS user_id,
p.anonymous_id,
p.item_id,
p.content_title,
p.content_type,
p.content_format,
p.series_id,
SAFE_CAST(p.season_number AS INT64) AS season_number,
SAFE_CAST(p.episode_number AS INT64) AS episode_number,
SAFE_CAST(p.content_duration_ms AS INT64) AS content_duration_ms,
SAFE_CAST(LOWER(p.is_live) AS BOOL) AS is_live,
p.stream_type,
SAFE_CAST(p.playback_position_ms AS INT64) AS playback_position_ms,
p.player_name,
p.player_version,
p.application_name,
p.application_version,
p.platform,
p.device_type,
p.device_manufacturer,
p.device_model,
p.operating_system,
p.operating_system_version,
p.browser_name,
p.browser_version,
p.network_type,
p.cdn_provider,
p.cdn_pop,
p.drm_system,
p.drm_license_status,
p.video_codec,
p.audio_codec,
SAFE_CAST(p.bitrate_kbps AS INT64) AS bitrate_kbps,
SAFE_CAST(p.startup_time_ms AS INT64) AS startup_time_ms,
SAFE_CAST(p.startup_time_limit_ms AS INT64) AS startup_time_limit_ms,
SAFE_CAST(LOWER(p.qualified_attempt) AS BOOL) AS qualified_attempt,
SAFE_CAST(LOWER(p.playback_success) AS BOOL) AS playback_success,
SAFE_CAST(LOWER(p.content_rendered) AS BOOL) AS content_rendered,
SAFE_CAST(LOWER(p.fatal_playback_error) AS BOOL) AS fatal_playback_error,
NULLIF(p.error_code, '') AS error_code,
NULLIF(p.error_type, '') AS error_type,
NULLIF(p.error_stage, '') AS error_stage,
SAFE_CAST(p.retry_count AS INT64) AS retry_count,
p.country_code,
p.language_code
FROM extracted
),
deduplicated AS (
SELECT * EXCEPT(row_num)
FROM (
SELECT
typed.*,
ROW_NUMBER() OVER (
PARTITION BY playback_attempt_id
ORDER BY event_timestamp DESC, event_id DESC
) AS row_num
FROM typed
WHERE playback_attempt_id IS NOT NULL
AND qualified_attempt IS NOT NULL
AND playback_success IS NOT NULL
)
WHERE row_num = 1
),
qualified_attempts AS (
SELECT *
FROM deduplicated
WHERE qualified_attempt = TRUE
),
kpi AS (
SELECT
COUNTIF(playback_success = TRUE) AS successful_qualified_attempts,
COUNT(*) AS total_qualified_attempts,
SAFE_MULTIPLY(
100.0,
SAFE_DIVIDE(COUNTIF(playback_success = TRUE), COUNT(*))
) AS streaming_playback_success_rate_pct
FROM qualified_attempts
)
SELECT
q.event_id,
q.event_timestamp,
q.playback_attempt_id,
q.playback_session_id,
q.user_id,
q.anonymous_id,
q.item_id,
q.content_title,
q.content_type,
q.content_format,
q.series_id,
q.season_number,
q.episode_number,
q.content_duration_ms,
q.is_live,
q.stream_type,
q.playback_position_ms,
q.player_name,
q.player_version,
q.application_name,
q.application_version,
q.platform,
q.device_type,
q.device_manufacturer,
q.device_model,
q.operating_system,
q.operating_system_version,
q.browser_name,
q.browser_version,
q.network_type,
q.cdn_provider,
q.cdn_pop,
q.drm_system,
q.drm_license_status,
q.video_codec,
q.audio_codec,
q.bitrate_kbps,
q.startup_time_ms,
q.startup_time_limit_ms,
q.qualified_attempt,
q.playback_success,
q.content_rendered,
q.fatal_playback_error,
q.error_code,
q.error_type,
q.error_stage,
q.retry_count,
q.country_code,
q.language_code,
k.successful_qualified_attempts,
k.total_qualified_attempts,
k.streaming_playback_success_rate_pct
FROM qualified_attempts AS q
CROSS JOIN kpi AS k
ORDER BY q.event_timestamp DESC, q.playback_attempt_id;Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
WITH typed AS (
SELECT
eventID AS event_id,
timestamp AS event_timestamp,
_experience.analytics.customDimensions.eVars.eVar1 AS playback_attempt_id,
_experience.analytics.customDimensions.eVars.eVar2 AS playback_session_id,
_experience.analytics.customDimensions.eVars.eVar3 AS user_id,
_experience.analytics.customDimensions.eVars.eVar4 AS anonymous_id,
COALESCE(
mediaCollection.sessionDetails.name,
_experience.analytics.customDimensions.eVars.eVar5
) AS item_id,
COALESCE(
mediaCollection.sessionDetails.friendlyName,
_experience.analytics.customDimensions.eVars.eVar6
) AS content_title,
COALESCE(
mediaCollection.sessionDetails.contentType,
_experience.analytics.customDimensions.eVars.eVar7
) AS content_type,
_experience.analytics.customDimensions.eVars.eVar8 AS content_format,
_experience.analytics.customDimensions.eVars.eVar9 AS series_id,
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar10, '') AS INTEGER) AS season_number,
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar11, '') AS INTEGER) AS episode_number,
COALESCE(
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar12, '') AS BIGINT),
CAST(mediaCollection.sessionDetails.length * 1000 AS BIGINT)
) AS content_duration_ms,
CASE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar13) = 'true' THEN TRUE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar13) = 'false' THEN FALSE
ELSE NULL
END AS is_live,
COALESCE(
mediaCollection.sessionDetails.streamType,
_experience.analytics.customDimensions.eVars.eVar14
) AS stream_type,
COALESCE(
CAST(mediaCollection.playhead * 1000 AS BIGINT),
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar15, '') AS BIGINT)
) AS playback_position_ms,
COALESCE(
mediaCollection.sessionDetails.playerName,
_experience.analytics.customDimensions.eVars.eVar16
) AS player_name,
_experience.analytics.customDimensions.eVars.eVar17 AS player_version,
COALESCE(application.name, _experience.analytics.customDimensions.eVars.eVar18) AS application_name,
COALESCE(application.version, _experience.analytics.customDimensions.eVars.eVar19) AS application_version,
COALESCE(environment.type, _experience.analytics.customDimensions.eVars.eVar20) AS platform,
COALESCE(device.type, _experience.analytics.customDimensions.eVars.eVar21) AS device_type,
COALESCE(device.manufacturer, _experience.analytics.customDimensions.eVars.eVar22) AS device_manufacturer,
COALESCE(device.model, _experience.analytics.customDimensions.eVars.eVar23) AS device_model,
COALESCE(environment.operatingSystem, _experience.analytics.customDimensions.eVars.eVar24) AS operating_system,
COALESCE(environment.operatingSystemVersion, _experience.analytics.customDimensions.eVars.eVar25) AS operating_system_version,
COALESCE(environment.browserDetails.browser, _experience.analytics.customDimensions.eVars.eVar26) AS browser_name,
COALESCE(environment.browserDetails.version, _experience.analytics.customDimensions.eVars.eVar27) AS browser_version,
_experience.analytics.customDimensions.eVars.eVar28 AS network_type,
_experience.analytics.customDimensions.eVars.eVar29 AS cdn_provider,
_experience.analytics.customDimensions.eVars.eVar30 AS cdn_pop,
_experience.analytics.customDimensions.eVars.eVar31 AS drm_system,
_experience.analytics.customDimensions.eVars.eVar32 AS drm_license_status,
_experience.analytics.customDimensions.eVars.eVar33 AS video_codec,
_experience.analytics.customDimensions.eVars.eVar34 AS audio_codec,
COALESCE(
CAST(mediaCollection.qoeDataDetails.bitrate AS BIGINT),
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar35, '') AS BIGINT)
) AS bitrate_kbps,
COALESCE(
CAST(mediaCollection.qoeDataDetails.timeToStart * 1000 AS BIGINT),
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar36, '') AS BIGINT)
) AS startup_time_ms,
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar37, '') AS BIGINT) AS startup_time_limit_ms,
CASE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar38) = 'true' THEN TRUE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar38) = 'false' THEN FALSE
ELSE NULL
END AS qualified_attempt,
CASE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar39) = 'true' THEN TRUE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar39) = 'false' THEN FALSE
ELSE NULL
END AS playback_success,
CASE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar40) = 'true' THEN TRUE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar40) = 'false' THEN FALSE
ELSE NULL
END AS content_rendered,
CASE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar41) = 'true' THEN TRUE
WHEN LOWER(_experience.analytics.customDimensions.eVars.eVar41) = 'false' THEN FALSE
ELSE NULL
END AS fatal_playback_error,
NULLIF(_experience.analytics.customDimensions.eVars.eVar42, '') AS error_code,
NULLIF(_experience.analytics.customDimensions.eVars.eVar43, '') AS error_type,
NULLIF(_experience.analytics.customDimensions.eVars.eVar44, '') AS error_stage,
CAST(NULLIF(_experience.analytics.customDimensions.eVars.eVar45, '') AS INTEGER) AS retry_count,
COALESCE(placeContext.geo.countryCode, _experience.analytics.customDimensions.eVars.eVar46) AS country_code,
_experience.analytics.customDimensions.eVars.eVar47 AS language_code
FROM streaming_playback_events
WHERE web.webInteraction.name = 'select_content'
AND timestamp >= CURRENT_DATE - INTERVAL '30' DAY
AND timestamp < CURRENT_DATE
),
ranked AS (
SELECT
typed.*,
ROW_NUMBER() OVER (
PARTITION BY playback_attempt_id
ORDER BY event_timestamp DESC, event_id DESC
) AS row_num
FROM typed
WHERE playback_attempt_id IS NOT NULL
AND qualified_attempt IS NOT NULL
AND playback_success IS NOT NULL
),
qualified_attempts AS (
SELECT
event_id,
event_timestamp,
playback_attempt_id,
playback_session_id,
user_id,
anonymous_id,
item_id,
content_title,
content_type,
content_format,
series_id,
season_number,
episode_number,
content_duration_ms,
is_live,
stream_type,
playback_position_ms,
player_name,
player_version,
application_name,
application_version,
platform,
device_type,
device_manufacturer,
device_model,
operating_system,
operating_system_version,
browser_name,
browser_version,
network_type,
cdn_provider,
cdn_pop,
drm_system,
drm_license_status,
video_codec,
audio_codec,
bitrate_kbps,
startup_time_ms,
startup_time_limit_ms,
qualified_attempt,
playback_success,
content_rendered,
fatal_playback_error,
error_code,
error_type,
error_stage,
retry_count,
country_code,
language_code
FROM ranked
WHERE row_num = 1
AND qualified_attempt = TRUE
),
kpi AS (
SELECT
SUM(CASE WHEN playback_success = TRUE THEN 1 ELSE 0 END) AS successful_qualified_attempts,
COUNT(*) AS total_qualified_attempts,
100.0 * SUM(CASE WHEN playback_success = TRUE THEN 1 ELSE 0 END)
/ NULLIF(COUNT(*), 0) AS streaming_playback_success_rate_pct
FROM qualified_attempts
)
SELECT
q.event_id,
q.event_timestamp,
q.playback_attempt_id,
q.playback_session_id,
q.user_id,
q.anonymous_id,
q.item_id,
q.content_title,
q.content_type,
q.content_format,
q.series_id,
q.season_number,
q.episode_number,
q.content_duration_ms,
q.is_live,
q.stream_type,
q.playback_position_ms,
q.player_name,
q.player_version,
q.application_name,
q.application_version,
q.platform,
q.device_type,
q.device_manufacturer,
q.device_model,
q.operating_system,
q.operating_system_version,
q.browser_name,
q.browser_version,
q.network_type,
q.cdn_provider,
q.cdn_pop,
q.drm_system,
q.drm_license_status,
q.video_codec,
q.audio_codec,
q.bitrate_kbps,
q.startup_time_ms,
q.startup_time_limit_ms,
q.qualified_attempt,
q.playback_success,
q.content_rendered,
q.fatal_playback_error,
q.error_code,
q.error_type,
q.error_stage,
q.retry_count,
q.country_code,
q.language_code,
k.successful_qualified_attempts,
k.total_qualified_attempts,
k.streaming_playback_success_rate_pct
FROM qualified_attempts q
CROSS JOIN kpi k
ORDER BY q.event_timestamp DESC, q.playback_attempt_id;Source Data
Player Telemetry, Digital Analytics, CDN Logs, DRM License Logs, and Playback Error Monitoring
Dependencies
[ "playback_attempt_id", "content_playback_request_event", "content_first_frame_event", "audio_render_started_event", "fatal_playback_error_event", "playback_attempt_timestamp", "content_id", "content_type", "player_session_id", "application_version", "device_type", "startup_time_seconds" ]
Report Attributes
Date and hour Platform Application version Player version Device type Device manufacturer Device model Operating system Operating system version Browser Content type Live or on-demand Content ID Subscription tier Country Region Internet service provider Connection type CDN provider DRM provider Video codec Audio codec Resolution Error code
Recommended Reporting Views
Segment Eligibility
true
Governance
Governance
GitHub
catalog/kpis/streaming-playback-success-rate.yml