← Back to KPIs

Content Release Audience Reach

Also known as: Release Reach, New Content Reach, Launch Audience Reach, Release Audience Penetration, Content Launch Penetration, Title Release Reach

EngagementkpiMedia & Streaming

Content Release Audience Reach measures the percentage of eligible audience members who generate at least one qualified play of a newly released content item during the defined post-release measurement window. It shows how broadly a release penetrates its addressable streaming audience rather than how frequently reached audience members watch it.

Business Use Case

The Content Strategy team compares seven-day reach for a priority original series against the 10% launch target by market, subscription tier, and discovery surface. If reach is below target despite normal impression volume, the team can change homepage placement, audience targeting, release messaging, or localization investment; if reach is strong but completion is weak, it can investigate content-market fit or playback quality instead of increasing promotion.

Business Criticality

High

Journey / Navigation Area

Engagement

Owning Function

Content Strategy and Programming

Scope

User

Formula

(Unique Eligible Audience Members with at Least One Qualified Play of the Release / Unique Audience Members Eligible for the Release During the Measurement Window) × 100

Calculation Notes

1️⃣ Calculate distinct reach using governed audience_id. 2️⃣ A qualified play requires 60 seconds of playback or 50% of runtime for assets <120 seconds. 3️⃣ Exclude trailers, promotional clips, bots, and fraudulent traffic. 4️⃣ Denominator: distinct audience members active in the last 30 days and eligible. 5️⃣ Deduplicate plays, devices, sessions, and days for the same audience_id. 6️⃣ Use official release timestamp for staggered launches based on market. 7️⃣ Report daily reach as standalone or cumulative (D1, D7, D28) with labeled mode.

Technical Details

Measure Typepercentage
Aggregation WindowTime based - Daily

Events

PlatformEvent
Google Analytics 4video_progress
Adobevideo_progress

Data Mappings

W3 Data Layer
{
  "digitalData": {
    "event": [
      {
        "eventInfo": {
          "genre": "<primary_genre>",
          "region": "<region_code>",
          "country": "<ISO-3166-1_country_code>",
          "os_name": "<operating_system>",
          "play_id": "<play_id>",
          "user_id": "<pseudonymous_user_id>",
          "autoplay": false,
          "event_id": "<event_id>",
          "platform": "<web_or_app_platform>",
          "referrer": "<referrer_url>",
          "series_id": "<series_id>",
          "content_id": "<content_id>",
          "event_name": "video_progress",
          "profile_id": "<pseudonymous_profile_id>",
          "session_id": "<session_id>",
          "app_version": "<application_version>",
          "campaign_id": "<campaign_id>",
          "device_type": "<device_type>",
          "player_name": "<player_name>",
          "stream_type": "<vod_or_live>",
          "anonymous_id": "<anonymous_id>",
          "content_name": "<content_title>",
          "content_type": "<movie_episode_or_live>",
          "household_id": "<pseudonymous_household_id>",
          "release_type": "<premiere_or_catalog_release>",
          "season_number": 0,
          "episode_number": 0,
          "qualified_play": true,
          "catalog_version": "<catalog_version>",
          "event_timestamp": "<ISO-8601_timestamp>",
          "availability_end": "<ISO-8601_availability_end>",
          "content_language": "<BCP-47_language_tag>",
          "entitlement_tier": "<entitlement_tier>",
          "rights_territory": "<ISO-3166-1_rights_territory>",
          "consent_analytics": true,
          "eligible_audience": true,
          "release_timestamp": "<ISO-8601_release_timestamp>",
          "availability_start": "<ISO-8601_availability_start>",
          "eligibility_reason": "<eligibility_reason>",
          "identity_namespace": "<identity_namespace>",
          "audience_segment_id": "<eligible_audience_segment_id>",
          "subscription_status": "<subscription_status>",
          "play_duration_seconds": 0,
          "identity_authenticated": true,
          "measurement_window_end": "<ISO-8601_window_end>",
          "measurement_window_start": "<ISO-8601_window_start>",
          "playback_position_seconds": 0,
          "qualified_play_threshold_percent": 0,
          "qualified_play_threshold_seconds": 0
        }
      }
    ]
  }
}
GA4 Data Layer
{
  "event": "video_progress",
  "genre": "<primary_genre>",
  "region": "<region_code>",
  "country": "<ISO-3166-1_country_code>",
  "os_name": "<operating_system>",
  "play_id": "<play_id>",
  "user_id": "<pseudonymous_user_id>",
  "autoplay": false,
  "event_id": "<event_id>",
  "platform": "<web_or_app_platform>",
  "referrer": "<referrer_url>",
  "series_id": "<series_id>",
  "content_id": "<content_id>",
  "event_name": "video_progress",
  "profile_id": "<pseudonymous_profile_id>",
  "session_id": "<session_id>",
  "app_version": "<application_version>",
  "campaign_id": "<campaign_id>",
  "device_type": "<device_type>",
  "player_name": "<player_name>",
  "stream_type": "<vod_or_live>",
  "anonymous_id": "<anonymous_id>",
  "content_name": "<content_title>",
  "content_type": "<movie_episode_or_live>",
  "household_id": "<pseudonymous_household_id>",
  "release_type": "<premiere_or_catalog_release>",
  "season_number": 0,
  "episode_number": 0,
  "qualified_play": true,
  "catalog_version": "<catalog_version>",
  "event_timestamp": "<ISO-8601_timestamp>",
  "availability_end": "<ISO-8601_availability_end>",
  "content_language": "<BCP-47_language_tag>",
  "entitlement_tier": "<entitlement_tier>",
  "rights_territory": "<ISO-3166-1_rights_territory>",
  "consent_analytics": true,
  "eligible_audience": true,
  "release_timestamp": "<ISO-8601_release_timestamp>",
  "availability_start": "<ISO-8601_availability_start>",
  "eligibility_reason": "<eligibility_reason>",
  "identity_namespace": "<identity_namespace>",
  "audience_segment_id": "<eligible_audience_segment_id>",
  "subscription_status": "<subscription_status>",
  "play_duration_seconds": 0,
  "identity_authenticated": true,
  "measurement_window_end": "<ISO-8601_window_end>",
  "measurement_window_start": "<ISO-8601_window_start>",
  "playback_position_seconds": 0,
  "qualified_play_threshold_percent": 0,
  "qualified_play_threshold_seconds": 0
}
Adobe Client Data Layer
{
  "event": "video_progress",
  "eventInfo": {
    "genre": "<primary_genre>",
    "region": "<region_code>",
    "country": "<ISO-3166-1_country_code>",
    "os_name": "<operating_system>",
    "play_id": "<play_id>",
    "user_id": "<pseudonymous_user_id>",
    "autoplay": false,
    "event_id": "<event_id>",
    "platform": "<web_or_app_platform>",
    "referrer": "<referrer_url>",
    "series_id": "<series_id>",
    "content_id": "<content_id>",
    "event_name": "video_progress",
    "profile_id": "<pseudonymous_profile_id>",
    "session_id": "<session_id>",
    "app_version": "<application_version>",
    "campaign_id": "<campaign_id>",
    "device_type": "<device_type>",
    "player_name": "<player_name>",
    "stream_type": "<vod_or_live>",
    "anonymous_id": "<anonymous_id>",
    "content_name": "<content_title>",
    "content_type": "<movie_episode_or_live>",
    "household_id": "<pseudonymous_household_id>",
    "release_type": "<premiere_or_catalog_release>",
    "season_number": 0,
    "episode_number": 0,
    "qualified_play": true,
    "catalog_version": "<catalog_version>",
    "event_timestamp": "<ISO-8601_timestamp>",
    "availability_end": "<ISO-8601_availability_end>",
    "content_language": "<BCP-47_language_tag>",
    "entitlement_tier": "<entitlement_tier>",
    "rights_territory": "<ISO-3166-1_rights_territory>",
    "consent_analytics": true,
    "eligible_audience": true,
    "release_timestamp": "<ISO-8601_release_timestamp>",
    "availability_start": "<ISO-8601_availability_start>",
    "eligibility_reason": "<eligibility_reason>",
    "identity_namespace": "<identity_namespace>",
    "audience_segment_id": "<eligible_audience_segment_id>",
    "subscription_status": "<subscription_status>",
    "play_duration_seconds": 0,
    "identity_authenticated": true,
    "measurement_window_end": "<ISO-8601_window_end>",
    "measurement_window_start": "<ISO-8601_window_start>",
    "playback_position_seconds": 0,
    "qualified_play_threshold_percent": 0,
    "qualified_play_threshold_seconds": 0
  }
}
XDM Mapping
{
  "web": {
    "webReferrer": {
      "URL": "<referrer_url>"
    }
  },
  "device": {
    "type": "<device_type>"
  },
  "eventType": "media.ping",
  "marketing": {
    "trackingCode": "<campaign_id>"
  },
  "timestamp": "<ISO-8601_timestamp>",
  "_streaming": {
    "genre": "<primary_genre>",
    "region": "<region_code>",
    "country": "<ISO-3166-1_country_code>",
    "os_name": "<operating_system>",
    "play_id": "<play_id>",
    "user_id": "<pseudonymous_user_id>",
    "autoplay": false,
    "event_id": "<event_id>",
    "platform": "<web_or_app_platform>",
    "referrer": "<referrer_url>",
    "series_id": "<series_id>",
    "content_id": "<content_id>",
    "event_name": "video_progress",
    "profile_id": "<pseudonymous_profile_id>",
    "session_id": "<session_id>",
    "app_version": "<application_version>",
    "campaign_id": "<campaign_id>",
    "device_type": "<device_type>",
    "player_name": "<player_name>",
    "stream_type": "<vod_or_live>",
    "anonymous_id": "<anonymous_id>",
    "content_name": "<content_title>",
    "content_type": "<movie_episode_or_live>",
    "household_id": "<pseudonymous_household_id>",
    "release_type": "<premiere_or_catalog_release>",
    "season_number": 0,
    "episode_number": 0,
    "qualified_play": true,
    "catalog_version": "<catalog_version>",
    "event_timestamp": "<ISO-8601_timestamp>",
    "availability_end": "<ISO-8601_availability_end>",
    "content_language": "<BCP-47_language_tag>",
    "entitlement_tier": "<entitlement_tier>",
    "rights_territory": "<ISO-3166-1_rights_territory>",
    "consent_analytics": true,
    "eligible_audience": true,
    "release_timestamp": "<ISO-8601_release_timestamp>",
    "availability_start": "<ISO-8601_availability_start>",
    "eligibility_reason": "<eligibility_reason>",
    "identity_namespace": "<identity_namespace>",
    "audience_segment_id": "<eligible_audience_segment_id>",
    "subscription_status": "<subscription_status>",
    "play_duration_seconds": 0,
    "identity_authenticated": true,
    "measurement_window_end": "<ISO-8601_window_end>",
    "measurement_window_start": "<ISO-8601_window_start>",
    "playback_position_seconds": 0,
    "qualified_play_threshold_percent": 0,
    "qualified_play_threshold_seconds": 0
  },
  "environment": {
    "operatingSystem": "<operating_system>"
  },
  "identityMap": {
    "ECID": [
      {
        "id": "<anonymous_id>",
        "primary": false,
        "authenticatedState": "ambiguous"
      }
    ],
    "<identity_namespace>": [
      {
        "id": "<pseudonymous_user_id>",
        "primary": true,
        "authenticatedState": "authenticated"
      }
    ]
  },
  "eventMergeId": "<event_id>",
  "placeContext": {
    "geo": {
      "countryCode": "<ISO-3166-1_country_code>",
      "stateProvince": "<region_code>"
    }
  },
  "mediaCollection": {
    "playhead": 0,
    "sessionDetails": {
      "contentID": "<content_id>",
      "playerName": "<player_name>",
      "streamType": "<vod_or_live>",
      "contentType": "<movie_episode_or_live>",
      "friendlyName": "<content_title>"
    }
  }
}

SQL Queries

Google Analytics 4 (BigQuery)
-- ==========================================
-- 1. GOOGLE BIGQUERY SQL
-- ==========================================
WITH source_events AS (
  SELECT
    e.event_date,
    e.event_timestamp AS ga4_event_timestamp,
    e.event_name AS ga4_event_name,
    e.user_id AS ga4_user_id,
    e.user_pseudo_id,
    (SELECT ep.value.string_value FROM UNNEST(e.event_params) ep WHERE ep.key = 'event_id' LIMIT 1) AS source_event_id,
    ep.key AS param_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 param_value
  FROM `your-project.analytics_123456789.events_*` e
  LEFT JOIN UNNEST(e.event_params) ep
  WHERE _TABLE_SUFFIX BETWEEN @start_date AND @end_date
    AND e.event_name = 'video_progress'
),
normalized_events AS (
  SELECT
    COALESCE(MAX(IF(param_key = 'event_id', param_value, NULL)), source_event_id) AS event_id,
    COALESCE(MAX(IF(param_key = 'event_name', param_value, NULL)), ga4_event_name) AS event_name,
    COALESCE(
      SAFE_CAST(MAX(IF(param_key = 'event_timestamp', param_value, NULL)) AS TIMESTAMP),
      TIMESTAMP_MICROS(ga4_event_timestamp)
    ) AS event_timestamp,
    COALESCE(MAX(IF(param_key = 'user_id', param_value, NULL)), ga4_user_id) AS user_id,
    COALESCE(MAX(IF(param_key = 'anonymous_id', param_value, NULL)), user_pseudo_id) AS anonymous_id,
    MAX(IF(param_key = 'household_id', param_value, NULL)) AS household_id,
    MAX(IF(param_key = 'identity_namespace', param_value, NULL)) AS identity_namespace,
    LOWER(MAX(IF(param_key = 'identity_authenticated', param_value, NULL))) IN ('true','1','yes') AS identity_authenticated,
    LOWER(MAX(IF(param_key = 'consent_analytics', param_value, NULL))) IN ('true','1','yes') AS consent_analytics,
    MAX(IF(param_key = 'session_id', param_value, NULL)) AS session_id,
    MAX(IF(param_key = 'platform', param_value, NULL)) AS platform,
    MAX(IF(param_key = 'app_version', param_value, NULL)) AS app_version,
    MAX(IF(param_key = 'device_type', param_value, NULL)) AS device_type,
    MAX(IF(param_key = 'os_name', param_value, NULL)) AS os_name,
    UPPER(MAX(IF(param_key = 'country', param_value, NULL))) AS country,
    MAX(IF(param_key = 'region', param_value, NULL)) AS region,
    MAX(IF(param_key = 'content_id', param_value, NULL)) AS content_id,
    MAX(IF(param_key = 'content_name', param_value, NULL)) AS content_name,
    MAX(IF(param_key = 'content_type', param_value, NULL)) AS content_type,
    MAX(IF(param_key = 'series_id', param_value, NULL)) AS series_id,
    SAFE_CAST(MAX(IF(param_key = 'season_number', param_value, NULL)) AS INT64) AS season_number,
    SAFE_CAST(MAX(IF(param_key = 'episode_number', param_value, NULL)) AS INT64) AS episode_number,
    MAX(IF(param_key = 'genre', param_value, NULL)) AS genre,
    SAFE_CAST(MAX(IF(param_key = 'release_timestamp', param_value, NULL)) AS TIMESTAMP) AS release_timestamp,
    MAX(IF(param_key = 'release_type', param_value, NULL)) AS release_type,
    UPPER(MAX(IF(param_key = 'rights_territory', param_value, NULL))) AS rights_territory,
    SAFE_CAST(MAX(IF(param_key = 'availability_start', param_value, NULL)) AS TIMESTAMP) AS availability_start,
    SAFE_CAST(MAX(IF(param_key = 'availability_end', param_value, NULL)) AS TIMESTAMP) AS availability_end,
    MAX(IF(param_key = 'entitlement_tier', param_value, NULL)) AS entitlement_tier,
    MAX(IF(param_key = 'subscription_status', param_value, NULL)) AS subscription_status,
    MAX(IF(param_key = 'audience_segment_id', param_value, NULL)) AS audience_segment_id,
    LOWER(MAX(IF(param_key = 'eligible_audience', param_value, NULL))) IN ('true','1','yes') AS eligible_audience,
    MAX(IF(param_key = 'eligibility_reason', param_value, NULL)) AS eligibility_reason,
    SAFE_CAST(MAX(IF(param_key = 'measurement_window_start', param_value, NULL)) AS TIMESTAMP) AS measurement_window_start,
    SAFE_CAST(MAX(IF(param_key = 'measurement_window_end', param_value, NULL)) AS TIMESTAMP) AS measurement_window_end,
    MAX(IF(param_key = 'play_id', param_value, NULL)) AS play_id,
    SAFE_CAST(MAX(IF(param_key = 'playback_position_seconds', param_value, NULL)) AS NUMERIC) AS playback_position_seconds,
    SAFE_CAST(MAX(IF(param_key = 'play_duration_seconds', param_value, NULL)) AS NUMERIC) AS play_duration_seconds,
    SAFE_CAST(MAX(IF(param_key = 'qualified_play_threshold_seconds', param_value, NULL)) AS NUMERIC) AS qualified_play_threshold_seconds,
    SAFE_CAST(MAX(IF(param_key = 'qualified_play_threshold_percent', param_value, NULL)) AS NUMERIC) AS qualified_play_threshold_percent,
    LOWER(MAX(IF(param_key = 'qualified_play', param_value, NULL))) IN ('true','1','yes') AS qualified_play,
    LOWER(MAX(IF(param_key = 'autoplay', param_value, NULL))) IN ('true','1','yes') AS autoplay,
    MAX(IF(param_key = 'stream_type', param_value, NULL)) AS stream_type,
    MAX(IF(param_key = 'player_name', param_value, NULL)) AS player_name,
    MAX(IF(param_key = 'referrer', param_value, NULL)) AS referrer,
    MAX(IF(param_key = 'campaign_id', param_value, NULL)) AS campaign_id,
    MAX(IF(param_key = 'content_language', param_value, NULL)) AS content_language,
    MAX(IF(param_key = 'profile_id', param_value, NULL)) AS profile_id,
    MAX(IF(param_key = 'catalog_version', param_value, NULL)) AS catalog_version
  FROM source_events
  GROUP BY event_date, ga4_event_timestamp, ga4_event_name, ga4_user_id, user_pseudo_id, source_event_id
),
deduplicated_events AS (
  SELECT * EXCEPT(event_row_number)
  FROM (
    SELECT
      n.*,
      ROW_NUMBER() OVER (
        PARTITION BY COALESCE(
          event_id,
          TO_HEX(SHA256(CONCAT(
            CAST(event_timestamp AS STRING), '|',
            COALESCE(anonymous_id, ''), '|',
            COALESCE(play_id, ''), '|',
            COALESCE(CAST(playback_position_seconds AS STRING), '')
          )))
        )
        ORDER BY event_timestamp
      ) AS event_row_number
    FROM normalized_events n
  )
  WHERE event_row_number = 1
),
eligible_qualified_events AS (
  SELECT
    d.*,
    CASE
      WHEN identity_authenticated AND user_id IS NOT NULL
        THEN CONCAT(COALESCE(identity_namespace, 'user'), ':', user_id)
      WHEN profile_id IS NOT NULL THEN CONCAT('profile:', profile_id)
      WHEN household_id IS NOT NULL THEN CONCAT('household:', household_id)
      WHEN anonymous_id IS NOT NULL THEN CONCAT('anonymous:', anonymous_id)
    END AS audience_id
  FROM deduplicated_events d
  WHERE event_name = 'video_progress'
    AND consent_analytics
    AND eligible_audience
    AND content_id IS NOT NULL
    AND measurement_window_start IS NOT NULL
    AND measurement_window_end IS NOT NULL
    AND event_timestamp >= measurement_window_start
    AND event_timestamp < measurement_window_end
    AND (availability_start IS NULL OR event_timestamp >= availability_start)
    AND (availability_end IS NULL OR event_timestamp < availability_end)
    AND (rights_territory IS NULL OR country IS NULL OR country = rights_territory)
    AND (
      qualified_play
      OR (
        qualified_play_threshold_seconds IS NOT NULL
        AND GREATEST(
          COALESCE(playback_position_seconds, 0),
          COALESCE(play_duration_seconds, 0)
        ) >= qualified_play_threshold_seconds
      )
      OR (
        qualified_play_threshold_percent IS NOT NULL
        AND play_duration_seconds > 0
        AND SAFE_DIVIDE(playback_position_seconds * 100, play_duration_seconds)
            >= qualified_play_threshold_percent
      )
    )
)
SELECT
  content_id,
  ANY_VALUE(content_name HAVING MAX event_timestamp) AS content_name,
  content_type,
  series_id,
  season_number,
  episode_number,
  genre,
  release_timestamp,
  release_type,
  rights_territory,
  availability_start,
  availability_end,
  entitlement_tier,
  audience_segment_id,
  measurement_window_start,
  measurement_window_end,
  catalog_version,
  COUNT(DISTINCT audience_id) AS content_release_audience_reach,
  COUNT(DISTINCT IF(identity_authenticated, user_id, NULL)) AS authenticated_user_reach,
  COUNT(DISTINCT household_id) AS household_reach,
  COUNT(DISTINCT profile_id) AS profile_reach,
  COUNT(DISTINCT anonymous_id) AS anonymous_audience_reach,
  COUNT(DISTINCT play_id) AS qualified_play_count,
  MIN(event_timestamp) AS first_qualified_reach_timestamp,
  MAX(event_timestamp) AS last_qualified_reach_timestamp
FROM eligible_qualified_events
WHERE audience_id IS NOT NULL
GROUP BY
  content_id, content_type, series_id, season_number, episode_number, genre,
  release_timestamp, release_type, rights_territory, availability_start,
  availability_end, entitlement_tier, audience_segment_id,
  measurement_window_start, measurement_window_end, catalog_version;
Adobe Experience Platform (AEP Query Service)
-- ==========================================
-- 2. ADOBE AEP QUERY SERVICE SQL
-- ==========================================
WITH normalized_events AS (
  SELECT
    COALESCE(s._streaming.event_id, s.eventMergeId) AS event_id,
    s._streaming.event_name AS event_name,
    COALESCE(CAST(s._streaming.event_timestamp AS TIMESTAMP), CAST(s.timestamp AS TIMESTAMP)) AS event_timestamp,
    s._streaming.user_id AS user_id,
    s._streaming.anonymous_id AS anonymous_id,
    s._streaming.household_id AS household_id,
    s._streaming.identity_namespace AS identity_namespace,
    s._streaming.identity_authenticated AS identity_authenticated,
    s._streaming.consent_analytics AS consent_analytics,
    s._streaming.session_id AS session_id,
    s._streaming.platform AS platform,
    s._streaming.app_version AS app_version,
    s._streaming.device_type AS device_type,
    s._streaming.os_name AS os_name,
    UPPER(s._streaming.country) AS country,
    s._streaming.region AS region,
    s._streaming.content_id AS content_id,
    s._streaming.content_name AS content_name,
    s._streaming.content_type AS content_type,
    s._streaming.series_id AS series_id,
    CAST(s._streaming.season_number AS INTEGER) AS season_number,
    CAST(s._streaming.episode_number AS INTEGER) AS episode_number,
    s._streaming.genre AS genre,
    CAST(s._streaming.release_timestamp AS TIMESTAMP) AS release_timestamp,
    s._streaming.release_type AS release_type,
    UPPER(s._streaming.rights_territory) AS rights_territory,
    CAST(s._streaming.availability_start AS TIMESTAMP) AS availability_start,
    CAST(s._streaming.availability_end AS TIMESTAMP) AS availability_end,
    s._streaming.entitlement_tier AS entitlement_tier,
    s._streaming.subscription_status AS subscription_status,
    s._streaming.audience_segment_id AS audience_segment_id,
    s._streaming.eligible_audience AS eligible_audience,
    s._streaming.eligibility_reason AS eligibility_reason,
    CAST(s._streaming.measurement_window_start AS TIMESTAMP) AS measurement_window_start,
    CAST(s._streaming.measurement_window_end AS TIMESTAMP) AS measurement_window_end,
    s._streaming.play_id AS play_id,
    CAST(s._streaming.playback_position_seconds AS DECIMAL(18,3)) AS playback_position_seconds,
    CAST(s._streaming.play_duration_seconds AS DECIMAL(18,3)) AS play_duration_seconds,
    CAST(s._streaming.qualified_play_threshold_seconds AS DECIMAL(18,3)) AS qualified_play_threshold_seconds,
    CAST(s._streaming.qualified_play_threshold_percent AS DECIMAL(18,3)) AS qualified_play_threshold_percent,
    s._streaming.qualified_play AS qualified_play,
    s._streaming.autoplay AS autoplay,
    s._streaming.stream_type AS stream_type,
    s._streaming.player_name AS player_name,
    s._streaming.referrer AS referrer,
    s._streaming.campaign_id AS campaign_id,
    s._streaming.content_language AS content_language,
    s._streaming.profile_id AS profile_id,
    s._streaming.catalog_version AS catalog_version
  FROM streaming_playback_events s
  WHERE s.eventType = 'media.ping'
    AND s._streaming.event_name = 'video_progress'
    AND CAST(s.timestamp AS TIMESTAMP) >= CAST(:start_timestamp AS TIMESTAMP)
    AND CAST(s.timestamp AS TIMESTAMP) < CAST(:end_timestamp AS TIMESTAMP)
),
deduplicated_events AS (
  SELECT *
  FROM (
    SELECT
      n.*,
      ROW_NUMBER() OVER (
        PARTITION BY COALESCE(
          event_id,
          CONCAT(
            CAST(event_timestamp AS VARCHAR), '|',
            COALESCE(anonymous_id, ''), '|',
            COALESCE(play_id, ''), '|',
            COALESCE(CAST(playback_position_seconds AS VARCHAR), '')
          )
        )
        ORDER BY event_timestamp
      ) AS event_row_number
    FROM normalized_events n
  ) ranked_events
  WHERE event_row_number = 1
),
eligible_qualified_events AS (
  SELECT
    d.*,
    CASE
      WHEN identity_authenticated = TRUE AND user_id IS NOT NULL
        THEN CONCAT(COALESCE(identity_namespace, 'user'), ':', user_id)
      WHEN profile_id IS NOT NULL THEN CONCAT('profile:', profile_id)
      WHEN household_id IS NOT NULL THEN CONCAT('household:', household_id)
      WHEN anonymous_id IS NOT NULL THEN CONCAT('anonymous:', anonymous_id)
    END AS audience_id
  FROM deduplicated_events d
  WHERE event_name = 'video_progress'
    AND consent_analytics = TRUE
    AND eligible_audience = TRUE
    AND content_id IS NOT NULL
    AND measurement_window_start IS NOT NULL
    AND measurement_window_end IS NOT NULL
    AND event_timestamp >= measurement_window_start
    AND event_timestamp < measurement_window_end
    AND (availability_start IS NULL OR event_timestamp >= availability_start)
    AND (availability_end IS NULL OR event_timestamp < availability_end)
    AND (rights_territory IS NULL OR country IS NULL OR country = rights_territory)
    AND (
      qualified_play = TRUE
      OR (
        qualified_play_threshold_seconds IS NOT NULL
        AND GREATEST(
          COALESCE(playback_position_seconds, 0),
          COALESCE(play_duration_seconds, 0)
        ) >= qualified_play_threshold_seconds
      )
      OR (
        qualified_play_threshold_percent IS NOT NULL
        AND play_duration_seconds > 0
        AND (playback_position_seconds * 100.0 / play_duration_seconds)
            >= qualified_play_threshold_percent
      )
    )
)
SELECT
  content_id,
  MAX(content_name) AS content_name,
  content_type,
  series_id,
  season_number,
  episode_number,
  genre,
  release_timestamp,
  release_type,
  rights_territory,
  availability_start,
  availability_end,
  entitlement_tier,
  audience_segment_id,
  measurement_window_start,
  measurement_window_end,
  catalog_version,
  COUNT(DISTINCT audience_id) AS content_release_audience_reach,
  COUNT(DISTINCT CASE WHEN identity_authenticated = TRUE THEN user_id END) AS authenticated_user_reach,
  COUNT(DISTINCT household_id) AS household_reach,
  COUNT(DISTINCT profile_id) AS profile_reach,
  COUNT(DISTINCT anonymous_id) AS anonymous_audience_reach,
  COUNT(DISTINCT play_id) AS qualified_play_count,
  MIN(event_timestamp) AS first_qualified_reach_timestamp,
  MAX(event_timestamp) AS last_qualified_reach_timestamp
FROM eligible_qualified_events
WHERE audience_id IS NOT NULL
GROUP BY
  content_id, content_type, series_id, season_number, episode_number, genre,
  release_timestamp, release_type, rights_territory, availability_start,
  availability_end, entitlement_tier, audience_segment_id,
  measurement_window_start, measurement_window_end, catalog_version;

Source Data

Streaming Playback Telemetry, Audience Identity Graph, Content Catalog, Rights and Availability, Subscription Entitlement, CRM, and Digital Experience Analytics

Dependencies

[ "audience_id", "release_id", "content_id", "qualified_play_event", "playback_duration_seconds", "content_runtime_seconds", "official_release_timestamp", "market_id", "content_availability_window", "subscription_entitlement_status", "audience_activity_30d_flag", "age_policy_eligibility_flag", "internal_account_flag", "bot_traffic_flag", "fraudulent_playback_flag", "identity_resolution_status" ]

Report Attributes

Release Title Release ID Content Type Genre Franchise Original or Licensed Release Date Days Since Release Market Region Language Subscription Tier Audience Cohort Acquisition Cohort Device Type Operating System Application Version Discovery Surface Traffic Source Marketing Campaign Daily or Cumulative Window

Recommended Reporting Views

Views
Content Release Performance DashboardExecutive Content Launch ScorecardAudience Engagement DashboardOriginals Performance DashboardRegional Content Performance DashboardContent Marketing Effectiveness Dashboard

Segment Eligibility

true

Governance

Data Sensitivityinternal

Governance

Created bydevyendarm
Created on9/6/2026
Last modified bydevyendarm
StatusPUBLISHED

GitHub

View File on GitHubcatalog/kpis/content-release-audience-reach.yml

Community Discussion