Brief Intro
Here is my first post dedicated to scoping the digital video measurement analytics framework hopefully useful for Analytics Implementation Engineers and Senior Web Analysts and other analytics practitioners.
I’d like to hand you over a data layer framework that with some adaptations can be used with any digital analytics tool like Google Analytics or Adobe Analytics.
All you need is to adapt the data layer to your schema and needs - some values may be not available or not really required by your business.
Problems with Scoping Video Measurement Framework
Judging from my own experience, it is really worth it to put time and effort into the scoping measurement framework. Rushed framework usually means it needs to be done twice 😓. Here is the example: it may be too late when the analytics spec with missing data points is already sent to devs but your stakeholders require answers to questions that provided data cannot fill in. Dreadful situation to be in 😰.
Therefore, it is better to define more data points as a conversation starting point with developers and business stakeholders, which could or could not be used in the future. I cannot highlight how important it is to have an honest discussion with all your stakeholders. And sometimes just listening to people is all you need to do.
It is up to you of course how would you like to approach the scoping exercise.
Benefits of Video Measurement Framework
Benefits of digital video measurement framework are as follows:
- Clear structure of your data
- Measuring what’s right
- Providing full picture into video usage
- Data from the data layer can be passed on into other systems like marketing Customer Data Platforms (CDP) or for SEO purposes.
Naming Conventions Used
At this point of the time I’m leaning towards snake_case
naming conventions with all names of variables and values lowercase. This should provide consistency and won’t impair the readability especially of very long variables’ names.
Feel free to modify the framework for your needs.
The Framework
Here is the framework - it consists of events, and static and dynamic attributes.
Events
- Video Play and Video Pause
- Milestones - 0%, 25%, 75%, 95% and 100% - 95% milestone is the proxy for when the credits appear on the screen, feel free to replace it with the real event if you can access it
- Video interactions - Language / Subtitles change, Bit rate change
- Errors
Attributes
Dynamic attributes are highlighted with an asterix *
, so they can change based on the video events; static will stay the same over the course of the all video interactions - like video_name
.
Attribute name | Attribute format | Attribute description |
---|---|---|
video_name |
String | Video name displayed to a user |
video_id |
String | Internal Video ID |
video_desc |
String | Video description displayed to a user |
video_thumbnail_url |
Array of URL Strings [] |
Video thumbnail URLs |
video_thumbnail_url_string |
String | Concatenated value of video_thumbnail_url with a pipe delimiter |
video_upload_date |
String - Date in ISO 8601 | |
video_duration_iso |
String - Duration in ISO 8601 | Video duration excluding adverts |
video_content_url |
URL String | External URL of the video file with file format |
video_embed_url |
URL String | External URL of the video |
video_user_interaction_count |
Number | Number of user interactions i.e. likes |
video_genres |
Object of Strings {} |
|
video_genres_string |
Concatenated value of video_genres with a pipe delimiter |
|
video_player_type |
String | |
video_player_name |
String | |
video_player_version |
String | |
video_media_type |
String | Values series or film , so either video_series_ or video_film_ nodes are expected |
video_series_show_name |
String | |
video_series_episode_no |
String | |
video_series_season_no |
String | |
video_film_name |
String | |
video_content_type |
String | If the content is premium or free , i.e. accessible or not behind the login or a paywall |
video_tv_channel |
String | |
video_certificate |
String | The rating of the video |
video_audio_language |
Object of Strings {} |
Language versions available for the user |
video_audio_language_string |
String | Concatenated value of video_audio_language with a pipe delimiter |
* video_audio_language_used |
String | Currently used language version |
video_accessibility |
Object of Strings {} |
Accessibility settings avaiable for the user |
video_accessibility_string |
String | Concatenated value of video_accessibility with a pipe delimiter |
* video_accessibility_used |
String | Currenlty used accessibility settings |
video_release_date |
String - Date | Date of the release |
video_duration_sec |
Number | Duration of the video in seconds excluding adverts |
* video_playtime_sec |
Number | Playtime duration in seconds |
* video_quality |
String | Current video quality |
video_autoplay |
Boolean | If the video was auto played |
It is up to you if you would like to repeat all the static attributes in the consecutive events for a certain video. Some tag management systems with a bit of custom code can do this for you.
Of course the situation may be more complicated if there is more than one video on the page, or the website you work on is a single page app (SPA). I believe it is still possible albeit requires much more testing.
Examples
I will use one of the latest episodes Britain's Got Talent
from ITV Hub https://www.itv.com/watch/britains-got-talent/1a7470/1a7470a0195 as an example.
Attributes are for the Video Start
event and I assume that the video duration was 30 minutes and 5 seconds.
Attribute name | Example |
---|---|
video_name |
"Britain's Got Talent Series 16 - Episode 2" |
video_id |
"1_7470_0195_18" |
video_desc |
"The nation's favourite TV talent show, Britain's Got Talent, returns to our screens for a fun-filled 14th series packed full of variety." |
video_thumbnail_url |
[ "https://hubimages.itv.com/episode/1_7470_0195?w={width}&h={height}&q={quality}&blur={blur}&bg={bg}" ] |
video_thumbnail_url_string |
"https://hubimages.itv.com/episode/1_7470_0195?w={width}&h={height}&q={quality}&blur={blur}&bg={bg}" |
video_upload_date |
"2020-05-09T21:05:01+01:00" |
video_duration_iso |
"T00H30M5S" |
video_content_url |
"https://magni.itv.com/playlist/itvonline/ITV/1_7470_0195.001.mpeg" |
video_embed_url |
"https://www.itv.com/hub/britains-got-talent/1a7470a0195" |
video_user_interaction_count |
23890 |
video_genres |
{"entertainment"} |
video_genres_string |
"entertainment" |
video_player_type |
"html5" |
video_player_name |
"desktop" |
video_player_version |
"2.5" |
video_media_type |
"series" |
video_series_show_name |
"Britain's Got Talent" |
video_series_episode_no |
"E02" |
video_series_season_no |
"S16" |
video_film_name |
"" |
video_content_type |
"premium" |
video_tv_channel |
"itv hub" |
video_certificate |
"tv-pg" |
video_audio_language |
{"english"} |
video_audio_language_string |
"english" |
* video_audio_language_used |
"english" |
video_accessibility |
{} |
video_accessibility_string |
"" |
* video_accessibility_used |
"" |
video_release_date |
"2023-04-16" |
video_duration_sec |
1805 |
* video_playtime_sec |
0 |
* video_quality |
"720p" |
video_autoplay |
false |
Caveats of Video Measurement Framework
There are a couple of things you need to watch out
- Mistakes with the value of video play time - here is a really good post explaining these caveats by Charles Farina - his post is entitled Video Tracking (The Right Way) for Google Analytics but applicable not only for GA
- Not aligning the framework for your needs - when the right balance between what’s possible and business stakeholders needs is not struck and devs struggle to get the data right that can answer the questions never required by business.
Summary
I hope this post about Video Measurement Framework gives you enough insights to start building your own analytics specification.
Would you like to find out more or you have some questions or feedback? Please feel free to leave comments under this post or email me directly.
If you like this post, and found it useful, please share.
Thanks for reading and sharing the post!
Happy measuring!