Ad Session Data
This document describes how to use Connect Ad Session Summary data with Ads metrics. Ad Session Summary data is a daily offline historical log that provides session-level information for every ad play or attempted ad play in a given day.
Audience
This summary is beneficial to many critical business departments, but it's mainly used by:
-
Business analysts
-
Operations teams
-
Research teams
Note: To include the Conviva Household ID in your ad session summary data or to receive the data in parquet format, reach out to your Conviva representative.
How to use Ad Session Summary Data Fields?
We have summarized all the fields in a table, please review the field definitions at the end of this document.
You can use the field data to:
-
Filter against a particular metadata field in the file, to identify issues or patterns in a set of ad sessions.
-
Filter against a particular ad metric across one or many days.
-
Calculate key experience and engagement metrics (see Calculate Metrics).
-
Define and shape business KPIs (see Define KPIs).
-
Analyze viewer usage / consumption patterns: By tracking how users are engaging with ads, you can research trends and patterns within viewing habits. This information can be used in ad licensing or production decisions.
You can also define custom metadata to focus your queries on your specific business needs. This processed information is intended for analysis using a third-party tool.
Get the Ad Session Summary Data Reports
The method of delivery is to either a data store, such a Google Cloud Storage bucket or an Amazon S3 bucket.
The SSD file formats are CSV (comma-separated values), Parquet, and Avro. We use the standard described in RFC 4180.
The file path is:
[c3 account name]/[file type]/[date of data]/part-*
Data is delivered in multi-part files; part-* is used to enumerate the files.
The Conviva Connect file name is in the format:
• DailyAdsSessionLog_<CUSTOMER_NAME>_<YYYY-MM-DD>.csv
Note: ByHousehold is appended to the file name if the household ID column is included.
Tools to Use
Typically users load Ad Session Summary data into a database such as MySQL or into analytic tools such as Tableau or Micro Strategy, to analyze the data and correlate with other data sets. Please see examples at the sample SQL queries provided for some of the metrics.
Note: When parsing legacy SSD and Connect files with .CSV data, any double quotes and commas passed to Conviva in the data columns are percent-encoded to prevent parsing errors and require percent-decoding. A sample Python decoding script in Spark is shown below. Conviva SSD and Connect files with Parquet data process double quotes and commas passed to Conviva without this decoding.
def decode_pct_encoding(s):
import urllib
if s is None:
return "Unknown"
else:
return urllib.parse.unquote_plus(s)
spark.udf.register("decode_pct_encoding", decode_pct_encoding) Getting Started with Ad Session Summary Data
Each row in the Ad Session Summary file describes an ad session. Conviva defines an ad session as an instance of an attempt to play an ad; the attempt can be an explicit viewer action or an implicit automatic player action.
In Ad Session Summary, each ad session starts on or before the pipeline end date (PED). The ad session ends either on the PED (EndedStatus > 0) or after the PED (EndedStatus = 0). All sessions contain data over the lifetime of the session ending on the PED.
Each session has an AdSessionID, which is a string consisting of five segments, for example:
992489610:1404980148:3349546328:378608002:-1542356252
The first four segments (in italic) represent the Client ID, which is assigned by Conviva to each device. The fifth segment (underlined) represents the Ad Session ID.
A session that is expired and resumed will appear as different rows with the same AdSessionID but with different Ad Start Times. In this case, the primary key to process the sessions is Ad Session ID + Ad Start Time.
The row for each ad session also contains the Ad Break ID field, which identifies the ad break during which the ad session played. Each ad break can contain multiple ad sessions. In this case, the ad sessions will share the same ad break ID.
Note: Metrics are based on ad events and metadata with Playing Time, for example, indicating the amount of time the ad played in the SQL code, and elsewhere.
Metrics List
| Ad Delivery Metrics | ||
| Ads Metrics | ||
| Ad Completion Metrics |
Metric Definition and Calculations
This section provides definitions for the metrics and shows how these metrics can be calculated using SQL code. In most cases, metrics at the session level are provided in the Ad Session Summary file. In cases where these are not provided, examples of the formulas and SQL code are given below. This section also shows how to aggregate the ad metrics across sessions. The SQL code is based on Conviva Demo data from the Ad Session Summary with a pipeline end date of February 13, 2023.
Ad Delivery Metrics
-
Ad Attempts
-
Ad Playback Failures (APF)
Definition: The sum or a percentage of the cumulative ended ad creatives that terminated with a playback failure error in the selected time period.
Sessions with Playback Error = 1 represent Ad Playback Failures (APF). The SSD field error list, lists all the error messages received from the client, for ad sessions that ended due to a APF.
Ad Playback Failure = True if (playback_error = 1)
Average Ad Playback Failures (APF) % can be aggregated using the calculation below:
Average APF % = ∑ Count ( APF ) / ∑ Count (EndedPlays)
SELECT
SUM (
CASE WHEN
size(VideoPlaybackFailureErrorsBusiness) > 0 or size(VideoPlaybackFailureErrorsTech) > 0
then
1
else
0
END) / COUNT(*) * 100 as APF_Perc
-
Ad Startup Time (AST)
-
Ad Start Failures (ASF)
-
Ad Impressions
Definition: An ad impression is a session with greater than zero seconds of Ad Playing Time (i.e., at least one ad frame was played).
Across all sessions, Ad Impressions are aggregated as:
SELECT
COUNT(*) as AdImpressions
FROM
Demo
WHERE
PlayingTime > 0Another way to aggregate Ad Impressions is to count all attempted ad sessions that didn’t have a failure like ASF or EBAS:
In some cases, the player may report that an ad session started, but the user might have exited before the first ad frame was played. If the ad session started but we don’t have the actual AST, we display AST = -3 . Therefore, for ad impression calculations, you can include sessions where AST = –3 and Ad Playing Time > 0. See also FAQ.
SELECT
COUNT(*) as AdImpressions
FROM
Demo
WHERE
StartupTime > 0
or (
StartupTime = -3
and PlayingTime >= 0) -
Ad Rebuffering Ratio
-
Average Ad Bitrate
-
Exits Before Ad Start (EBAS)
-
Ad Frequency/Unique Devices
-
Session Duration
-
Ad Bandwidth
-
Ad Ended Plays
-
Completed Ad Creative Plays
-
Ad % Complete
-
Ad Actual Duration
Definition: An attempt to fetch ad creatives in the selected timeframe, regardless if the ad played or not. For client-side ads, an attempt is made when the video player attempts to fetch an ad creative using the ad tag URL. For server-side ads, an attempt is the first event that indicates that the ad attempted to play the stitched media. In Ad Session Summary, each row represents an ad attempt.
Across all sessions, the total number of Ad Attempts is:
SELECT
COUNT(*) as AdAttempts
FROM
Demo Definition: AST is the number of seconds between the start of Conviva monitoring and the first played ad frame. We exclude any time playing non ad related content.
Across all sessions, AST can be aggregated as:
SELECT
SUM(StartupTime / 1000) / COUNT(*) as AST
FROM
(
SELECT
*
FROM
Demo
WHERE
PlayingTime >0
and StartupTime >= 0) Definition: Ad Start Failures can occur when an ad fails to play and generates an error code. In Ad Session Summary, this metric is called StartupError. You can find the list of associated errors in the ErrorList field.
Across all sessions, Ad Start Failures (ASF) % can be aggregated as:
SELECT
SUM (
CASE
WHEN
StartupError = 'true'
then
1
else
0
END) / COUNT(*) * 100 as ASF_Perc
FROM
Demo Ads Metrics
Definition: The Ad Rebuffering Ratio shows the percentage of buffering during an ad session. From this metric, we exclude the initial player Ad Startup Buffering time (before the first ad frame).
Across all sessions, the Ad Rebuffering Ratio % can be aggregated as:
SELECT
SUM(ReBufferingTime) / (SUM(ReBufferingTime) + SUM(PlayingTime)) * 100 as AdRebufferingRatio
FROM
Demo
WHERE
PlayingTime > 0 Definition: The average bitrate in kilobytes per second of delivered ad content in the session.
Across all sessions, the Average Ad Bitrate can be aggregated as:
-- Because bitrate is per second, convert AdPlayingTime to seconds
SELECT
SUM(AvgBitRate * PlayingTime / 1000) / SUM(PlayingTime / 1000) as AverageAdBitRate
FROM
Demo
WHERE
PlayingTime > 0 Definition: EBAS is when an ad attempt is terminated, typically by the viewer, before the ad started. If an error is not generated, the failed attempt is counted as an EBAS. An EBAS is similar to an ASF (it is a failure to play an ad), but an EBAS does not include a descriptive error message. The EBAS for each session needs to be computed from the Ad Session Summary fields.
Across all sessions, the EBAS % can be aggregated using the AdAttempts metric:
SELECT
SUM(
CASE
WHEN
StartupError = false
and PlayingTime = 0
and StartupTime = -1
then
1
END) / COUNT(*) * 100 as EBAS_Perc
FROM
Demo Definition: This metric is defined as the total number of Ad Ended Plays divided by the number of Unique Devices with at least one played ad during the session lifetime. A unique device is not equivalent to a unique person. If a person uses multiple devices, each device will be counted as a unique device with an ad play that ended. If more than one application is offered to the same device, the Client ID is identified for each application separately.
SELECT
COUNT(*) / COUNT(DISTINCT(DeviceId)) as AdFreqUniqueDev
FROM
Demo
WHERE
PlayingTime > 0
and EndedStatus > 0 Definition: Session Duration is the time in seconds from the ad session start to the ad session end. It is calculated as:
SELECT
EndTime - StartTime as SessionDurationSec
FROM
Demo
Definition: Ad Bandwidth is the amount of data transferred in megabytes (MB) per second in the session.
Across all sessions, Ad Bandwidth can be aggregated as:
SELECT
SUM((PlayingTime / 1000) * (AvgBitRate / 8000)) as AdBandwidth
FROM
Demo
Ad Completion Metrics
Definition: An Ad Ended Play is a session with an ad impression (PlayingTime > 0) that ended (EndedStatus > 0) during the pipeline end date (for example, February 13). Thus, the session must have at least one viewed ad frame to count toward the Ad Ended Plays metric.
Across all sessions, the number of Ad Ended Plays can be aggregated as:
SELECT
COUNT(*) as AdEndedPlays
FROM
Demo
WHERE
PlayingTime > 0
and EndedStatus > 0 Definition: The total number of ad creatives that successfully played at least 90% of the ad content.
The Completed Ad Creative Plays % can be aggregated as:
SELECT
100 * SUM(
CASE
WHEN
(PlayingTime / ContentLength) >= 0.9
then
1
END) / SUM(
CASE
WHEN
(PlayingTime > 0)
then
1
END) as CompAdCreativePlays
FROM
Demo Definition: We calculate Ad % Complete by dividing the total Playing Time for all sessions by the total Content Length. We don’t count the Playing Time for sessions where the Ad Content Length isn’t available.
SELECT
SUM(PlayingTimeRC)/SUM(ContentLength) * 100 as AdPercComplete
FROM
(
SELECT
ContentLength,
CASE
WHEN
PlayingTime > ContentLength
then
ContentLength
else
PlayingTime
END as PlayingTimeRC
FROM
Demo) Definition: The average ad Playing Time in seconds, which is the total ad playing time divided by the number of ad creatives that played.
SELECT
(SUM(PlayingTime) / 1000) / COUNT(*) as AdActualDurationSecAdPlays
FROM
Demo
WHERE
PlayingTime > 0 KPIs
Startuptime>= 0ANDPlayingTime= (number)AND no error code, corresponds to a successful play.Startuptime= -1ANDPlayingTime= 0AND an error code, corresponds to a ASF.Startuptime= -1ANDPlayingTime= 0AND no error code, corresponds to an EBAS.StartupError= 0andBufferingTime> 0=> PassStartupError0orPlayingTimeFailStartupTimePassStartupTime>Threshold=> FailAvgBitrate >= Threshold=> PassAvgBitrate=> Fail- (
BufferingTime/BufferingTime+PlayingTime)* 100=> Pass - (
BufferingTime/BufferingTime+PlayingTime)* 100 > Threshold=> Fail
Startup
Quality KPI: Successfully started sessions
Quality KPI: Sessions with StartupTime below acceptable threshold
Quality KPI: Sessions Played with an acceptable bitrate
Quality KPI: Sessions Played with acceptable buffering ratio
Frequently Asked Questions
- Difference between Ads Dashboard and SSD
There are differences between Conviva Ad Session Summary data and Ads data, and that's because:
Ads uses real-time 1-minute or 1-hour interval metrics whereas SSD provides lifetime metrics. For more details on the difference between lifetime and interval metrics, refer here. Note that in some rare cases the ad session can cross the midnight boundary of the pipeline end date. The averages between lifetime and interval metrics will get closer the longer the window you use, that is, a 24-hour average will result in a better match than a 1-hour average.
Although Ads and Ad Session Summary share the same session level sanitization rules, Ads adds additional aggregation logic based on metrics calculations. The idea here is for the consumer of Ad Session Summary to apply aggregation logic based on the desired use case.
Pursuing an exact match between Ads and offline Ad Session Summary calculations is difficult and often inadvisable.
A Note on Heartbeats:
Conviva uses Heartbeats to monitor the ad sessions. Heartbeats continue to be sent while the ad is buffering, unless the internet connection itself has been interrupted, and the Conviva library and backend cannot communicate. In this case, the library will continue monitoring and will send a "catch-up" heartbeat when the connection is re-established.
If the ad is paused or the connection is lost for more than 2 minutes, then no heartbeats will be sent and the Conviva back-end will automatically clean-up the session. We do not count paused time, so if the viewer was paused for more than 2 minutes then the session will time out.
We still collect heartbeats during rebuffering, so this would not cause an ad session to timeout. However, if the player ends up in what we call a 'zombie state' (incessant/perpetual buffering) then that contributes to Ads and Ad Session Summary metrics. The only difference is that Ads metrics cap buffering at 30 minutes, whereas Ad Session Summary has no such cap. - What does AST = -3 stand for?
- it is a resumed session, where there is no start up time; for example, when a user closes the laptop during playback, and resumes later.
- we have flags that indicate the startup time is not reliable.
- Why do I see unexpected ASCII characters in certain fields?
AST=-3 means we don't have a specific Ad Startup Time. Possible reasons include:
Ad Session Summary reports are delivered as CSV files. The Session Tags column in SSD is customer defined and can contain arbitrary strings with special characters which could prevent parsing of CSV; therefore we use URI encoding to remove any offending characters. We recommend that you run URI decoding on the "Session Tags" field, by using various libraries that provide this decode functionality (available in all mainstream languages).
Ad Session Summary Field Definitions
This guide provides a comprehensive list of all available Ad Session Summary columns. You can customize your Ad Session Summary reports to include only the columns you need for your metrics.
Note: All INTEGER type fields can store 64-bit integer values.
Conviva Ad Session Summary Schema
| Field Name | Data Type | Description |
|---|---|---|
| AdTitle | VARCHAR(256) | Name of the ad |
| DeviceID | VARCHAR(128) | Conviva unique device (app) identifier, 4 integers separated by colons (:) |
| ContentLength | INTEGER | The planned duration of the ad in milliseconds (ms). If not available, then set to -1 |
| City | VARCHAR(128) | City Name (geography, like San Francisco) |
| Continent | VARCHAR(128) | Continent Name |
| Country | VARCHAR(128) | Country Name |
| State | VARCHAR(128) | State Name (geography, like California) |
| ASN | VARCHAR(32) | Autonomous System Number for the ISP |
| ISP | VARCHAR(32) | Internet Service Provider name |
| IPV4 | VARCHAR(32) | The public IP address of the viewer's video playing device in v4 version. For example, 84.106.90.230. |
| IPV6 | VARCHAR(48) | The public IP address of the viewer's video playing device in v6 version. For example, 2600:8801:8d07:e100:c0a9:9de9:8741:267. |
| IPAddress | VARCHAR(48) |
The viewer's video playing device public IP address. The IP address - as seen by the Conviva gateway - typically corresponds to the modem gateway for fixed connections or the packet gateway for mobile connections. For European customers, due to legal/privacy reasons, the IP address is not shown. |
| IPType | VARCHAR(32) | If IP address is IPv4 or IPv6 |
| AvgBitRate | INTEGER | Average bit rate at which content was delivered during the session. The ability to determine bitrate depends on the player integration. Not all players can deliver bitrate information. |
| ReBufferingEvents | INTEGER | |
| ReBufferingTime | INTEGER | This is the duration of rebuffering time during the ad session. It does not include the initial buffering at startup. |
| ContentWatchedTime | INTEGER | The amount of time, in milliseconds (ms), that was spent watching the ad. This field is deprecated. |
| FatalErrorCodes | VARCHAR(32) |
A list of fatal errors that occurred during this ad session, separated by "&". For CSV output file, the value for this field is in |
| StartTime | INTEGER | The time when Conviva received the first heartbeat for the ad session. The format is Unix epoch time in seconds. |
| StartTimeMs | INTEGER | The time when Conviva received the first heartbeat for the ad session. The format is Unix epoch time in milliseconds. |
| PlayingTime | INTEGER | The actual play duration of the ad in milliseconds (ms). The duration excludes any buffering time. If not available, set to -1 |
| EndTime | INTEGER | The time we received the last heartbeat update from this session. The format is Unix epoch time in seconds. |
| EndTimeMs | INTEGER | The time we received the last heartbeat update from this session. The format is Unix epoch time in milliseconds. |
| VideoPlaybackFailureErrorsBusiness | VARCHAR(1024) |
Video Playback Failures (VPF) Business Error list contains errors (including custom errors) that caused the video playback to fail due to business logic issue. For CSV output file, this field value is in |
| VideoPlaybackFailureErrorsTech | VARCHAR(1024) |
Video Playback Failures (VPF) Technical Error list contains errors (including custom errors) that caused the video playback to fail due to technical logic issue. For CSV output file, this field value is in |
| VideoStartFailureErrorsBusiness | VARCHAR(1024) |
Video Start Failures (VSF) Business Error list contains errors (including custom errors) that caused the video start to fail due to business logic issue. For CSV output file, this field value is in |
| VideoStartFailureErrorsTech | VARCHAR(1024) |
Video Start Failures (VSF) Technical Error list contains errors (including custom errors) that caused the video start to fail due to technical logic issue. For CSV output file, this field value is in |
| SegmentID | VARCHAR(32) | Segment ID of the Ad |
| AdSessionID | VARCHAR(128) | Unique Conviva session identifier for the ad session that attempted to play. The first 4 components represent the Client ID, the fifth component represents the Session ID. The Client ID is shared between Video sessions and Ad sessions (for ads that play in the video session). |
| StreamURL | VARCHAR(1024) | The last streaming URL used during the session. |
| AdManagerName | VARCHAR(128) | Name of Ad manager |
| AdManagerVersion | VARCHAR(128) | Version of Ad manager |
| AdPodType | VARCHAR(128) | Pod type of the ad |
| AdStitcher | VARCHAR(128) | Ad insertion solution, such as Yospace |
| AdvertiserCategory | VARCHAR(128) | Category of the advertiser |
| AdvertiserID | VARCHAR(128) | ID of the advertiser |
| AdBreakID | VARCHAR(128) | The ID of the ad break in which the ad played |
| AdCampaignName | VARCHAR(128) | Name of the campaign related to the ad |
| AdCategory | VARCHAR(128) | Category of ad |
| AdClassification | VARCHAR(128) | Classification of the ad |
| AdCreativeID | VARCHAR(128) | The ID of the Ad Creative |
| AdCeativeName | VARCHAR(128) | Name of the ad creative |
| AdDayPart | VARCHAR(128) | |
| AdDescription | VARCHAR(128) | Description of Ad |
| FirstAdId | VARCHAR(128) | Relevant for wrapper (3rd party redirect) ads. capture the "first" Ad ID in the wrapper chain |
| FirstAdSystem | VARCHAR(128) | Relevant for wrapper (3rd party redirect) ads. capture the "first" Ad System in the wrapper chain |
| FirstCreativeId | VARCHAR(128) | Relevant for wrapper (3rd party redirect) ads. capture the "first" Ad Creative ID in the wrapper chain |
| AdID | VARCHAR(64) | The Ad Id or Line Item against which the ad impression is counted |
| AdIsSlate | VARCHAR(16) | Set to 1 if a default media file rather than an ad plays. Primarily used for Server Side Stictched ads on Live streams |
| VASTMediaFileAPIFramework | VARCHAR(128) | Set to "VPAID" if a VPAID ad creative plays (generally client-side ad) |
| AdPosition | VARCHAR(32) | The position in which the ad plays, for example, pre-roll or mid-roll |
| AdSequence | VARCHAR(128) | Sequence of the ad |
| AdSystem | VARCHAR(128) | The name of the ad server, such as DFP or Google Ad Manager |
| AdTechnology | VARCHAR(128) | Used to identify whether the ad is client side or server side stitched |
| AdType | VARCHAR(128) | Type of the ad |
| AdUnitName | VARCHAR(128) | Unit name of Ad |
| Advertiser | VARCHAR(128) | Name of the advertiser |
| ContentAssetName | VARCHAR(256) | Name of the content |
| ContentSessionID | VARCHAR(128) | Unique Conviva session identifier for the video session that attempted to play. The first 4 components represent the Client ID, the fifth component represents the Session ID. The Client ID is shared between Video sessions and Ad sessions (for ads that play in the video session). |
| Browser | VARCHAR(128) | Name of the browser used by the viewer's device. If no browser is involved in the streaming, such as with a mobile app or connected TV, the value will be "Non-Browser Apps." |
| BrowserVersion | VARCHAR(128) | Version of the browser used by the viewer's device |
| DeviceOS | VARCHAR(128) | OS of the viewer's device |
| isLive | BOOLEAN (true/false) |
Is video live or vod? |
| SessionTags | RECORD |
Session tags are player metadata that are defined when you integrate your player with Conviva. Each tag describes a piece of information that your player sends to Conviva. You can choose which of the available tags you want to include in SSD and the Ads Viewer Module. You can have a unique set of tags based on your players and business needs and your Conviva Solutions Consultant can assist further with your list. For CSV output file, this field value is in |
| ViewerId | VARCHAR(128) | Unique identifier of the viewer (sometimes called subscriber) watching content in that session. This is typically a number, or a hashed/masked identifier without any personally identifiable information. The same ViewerID can have multiple sessions. This can be null if not passed as part of sensor integrations. |
| StartupTime | INTEGER |
Ad Startup Time in ms is the number of seconds between the start of the Conviva monitoring and the first played ad frame. -1 indicates an unsuccessful play (no startup time). -3 indicates the session connected but the client didn't send us the necessary information to determine when the ad began playing. |
| ErrorList | VARCHAR(1024) |
A list of fatal errors that occurred during this session, separated by "&". A session with Startup Time = -1 and Playing Time = 0 and no error list, corresponds to an Exit Before Video Start (EBVS) |
| EndedStatus | INTEGER |
An integer showing the status of the session at the end of the day: 0 = Not Ended; at the SSD issue time, the session is still active. 1 = Gracefully ended; the session ended with a session ended event. 2 = Expired due to lack of heartbeat update; we received no heartbeat update for 2 minutes. Or expired due to long buffering; the session's lifetime buffering is longer than 30 minutes, Zombie session. |
| HouseholdID | VARCHAR(128) |
Unique identifier for a Household |
| HouseholdIP | VARCHAR(48) |
The physical residence's IP address, where the devices are located Note: If a Household IP address is accessible in IPv4 and IPv6 formats, then each session in the output file contains two records for that Household ID, one with an IPv4 address and the other with an IPv6 address. |
| SessionEndedStatus | VARCHAR(48) | The string values for Ended Status. |
| StartupError |
BOOLEAN |
If video start failed or successful. |
Note: HouseholdID is available only for customers who have StreamID feature enabled.