Blog

Setup Google Analytics 4 Ott Video Services

Tech Talk

Analytics

OTT

OTT 동영상 서비스를 위한 GOOGLE 애널리틱스 4 설정 방법

Jan 28, 2020

Google 애널리틱스 4를 활용하여 OTT 동영상 스트리밍 서비스의 동영상 재생 이벤트를 추적하여 콘텐츠의 인기도를 확인하는 방법을 알아보세요.

2019년에 구글은 구글 애널리틱스 SDK를 사용한 모바일 앱 보고를 일몰하기 시작했습니다. 이에 따라 OTT 모바일 앱에서 사용 데이터를 수집하고자 하는 기업은 Google의 후속 서비스로 전환해야 했습니다: Google 애널리틱스 4.

Google 애널리틱스 4는 앱과 사이트에서 생성된 OTT 동영상 재생 이벤트를 추적할 수 있는 강력한 도구입니다. 또한 단순한 조회 수보다 훨씬 더 심층적인 수준에서 서비스에서 콘텐츠의 인기도를 추적할 수 있습니다. 또한 거의 실시간으로 얼마나 많은 사용자가 콘텐츠를 시청하고 있는지 확인할 수 있습니다.

GOOGLE 애널리틱스 시작하기 4

처음부터 데이터 수집을 시작해야 하는 경우, OTT 데이터 분석을 위한 Google의 새로운 Google 애널리틱스 4 속성 유형(이전의 앱 + 웹)을 사용하는 것이 좋습니다. 이렇게 하면 Google 애널리틱스에서 웹사이트와 앱 트래픽을 하나의 통합된 보기에서 추적할 수 있습니다. Google은 지원 사이트에서 Google 애널리틱스 4 속성을 만들기 위한 훌륭한 단계별 가이드를 제공합니다. Google 애널리틱스 4 속성에서 새 사이트를 시작하는 것부터 이미 애널리틱스가 있는 사이트에 Google 애널리틱스 4 속성을 추가하는 것까지 다양한 설정 옵션을 사용할 수 있습니다.

구글 애널리틱스에서 OTT 동영상 이벤트를 위한 개발 4

초기 설정

먼저, Google의 빠른 시작 가이드를 사용하여 Firebase SDK를 포함하도록 OTT 앱을 업데이트해야 합니다. 이미 Google 애널리틱스 4 프로퍼티에 앱 데이터 스트림을 추가한 경우, 애널리틱스에서 연결된 Firebase 프로젝트를 자동으로 생성합니다.

동영상 재생 이벤트

다음으로, 특정 사용자 재생 이벤트가 발생할 때 Google 애널리틱스 4에 이벤트를 전송하도록 동영상 플레이어를 업데이트해야 합니다. 모든 동영상 재생 이벤트가 특정 사용자와 연결되도록 사용자 ID를 설정해야 합니다. 이 ID는 익명 ID(예: 사이트에서 등록할 필요 없이 무료 OTT 동영상을 제공하는 경우)일 수도 있고 구독자 ID일 수도 있습니다. 이메일 주소는 PII에 해당하며 Google 서비스 약관에 위배되므로 사용자 ID로 사용하지 마세요. 모든 동영상 재생 이벤트의 경우 이벤트 이름을 "video_playback"으로 설정하고 이벤트에 다음 파라미터를 포함하세요:

다음 작업이 발생하면 Google 애널리틱스 4로 이벤트를 전송합니다:

안드로이드 샘플 코드

이 샘플 코드는 동영상 플레이어에서 Google 애널리틱스 4로 전송할 수 있는 다양한 종류의 재생 이벤트를 보여줍니다:

class MainActivity : AppCompatActivity(){

private lateinit var firebaseAnalytics: FirebaseAnalytics override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) // firebase developer documentation // https: //firebase.google.com/docs/reference/android/com/google/firebase/analytics/package-summary firebaseAnalytics = FirebaseAnalytics.getInstance(this) // set user id firebaseAnalytics.setUserId(“test_user_id”) / video playback events / // video start val videoStartBundle = Bundle() videoStartBundle.putString(“video_event”,”start”) videoStartBundle.putString(“video_id”,”tt7984734″) videoStartBundle.putString(“video_title”,”The Lighthouse”) videoStartBundle.putInt(“video_position”,0) videoStartBundle.putInt(“video_duration”,6540) videoStartBundle.putDouble(“video_progress”,0.0) firebaseAnalytics.logEvent(“video_playback”, videoStartBundle) // video pause val videoPauseBundle = Bundle() videoPauseBundle.putString(“video_event”,”pause”) videoPauseBundle.putString(“video_id”,”tt7984734″) videoPauseBundle.putString(“video_title”,”The Lighthouse”) videoPauseBundle.putInt(“video_position”,654) videoPauseBundle.putInt(“video_duration”,6540) videoPauseBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoPauseBundle) // video resume val videoResumeBundle = Bundle() videoResumeBundle.putString(“video_event”,”resume”) videoResumeBundle.putString(“video_id”,”tt7984734″) videoResumeBundle.putString(“video_title”,”The Lighthouse”) videoResumeBundle.putInt(“video_position”,654) videoResumeBundle.putInt(“video_duration”,6540) videoResumeBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoResumeBundle) // video rewind val videoRewindBundle = Bundle() videoRewindBundle.putString(“video_event”,”rewind”) videoRewindBundle.putString(“video_id”,”tt7984734″) videoRewindBundle.putString(“video_title”,”The Lighthouse”) videoRewindBundle.putInt(“video_position”,327) videoRewindBundle.putInt(“video_duration”,6540) videoRewindBundle.putDouble(“video_progress”,5.0) firebaseAnalytics.logEvent(“video_playback”, videoRewindBundle) // video fast-forward val videoFastForwardBundle = Bundle() videoFastForwardBundle.putString(“video_event”,”fastforward”) videoFastForwardBundle.putString(“video_id”,”tt7984734″) videoFastForwardBundle.putString(“video_title”,”The Lighthouse”) videoFastForwardBundle.putInt(“video_position”,4905) videoFastForwardBundle.putInt(“video_duration”,6540) videoFastForwardBundle.putDouble(“video_progress”,75.0) firebaseAnalytics.logEvent(“video_playback”, videoFastForwardBundle) // video stop val videoStopBundle = Bundle() videoStopBundle.putString(“video_event”,”stop”) videoStopBundle.putString(“video_id”,”tt7984734″) videoStopBundle.putString(“video_title”,”The Lighthouse”) videoStopBundle.putInt(“video_position”,6000) videoStopBundle.putInt(“video_duration”,6540) videoStopBundle.putDouble(“video_progress”,91.74) firebaseAnalytics.logEvent(“video_playback”, videoStopBundle) // video skip val videoSkipBundle = Bundle() videoSkipBundle.putString(“video_event”,”skip”) videoSkipBundle.putString(“video_id”,”tt7984734″) videoSkipBundle.putString(“video_title”,”The Lighthouse”) videoSkipBundle.putInt(“video_position”,6000) videoSkipBundle.putInt(“video_duration”,6540) videoSkipBundle.putDouble(“video_progress”,91.74) firebaseAnalytics.logEvent(“video_playback”, videoSkipBundle) // video progress // send progress events at: // – first 30 seconds reached // – 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% of video completion val videoProgressBundle = Bundle() videoProgressBundle.putString(“video_event”,”progress”) videoProgressBundle.putString(“video_id”,”tt7984734″) videoProgressBundle.putString(“video_title”,”The Lighthouse”) videoProgressBundle.putInt(“video_position”,654) videoProgressBundle.putInt(“video_duration”,6540) videoProgressBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoProgressBundle) setContentView(R.layout.activity_main) }}

   override fun onCreate(savedInstanceState: Bundle?){
       super.onCreate(savedInstanceState)

       // firebase developer documentation
       // https: //firebase.google.com/docs/reference/android/com/google/firebase/analytics/package-summary

       firebaseAnalytics = FirebaseAnalytics.getInstance(this)

       // set user id
       firebaseAnalytics.setUserId(“test_user_id”)

       / video playback events /

       // video start
       val videoStartBundle = Bundle()
       videoStartBundle.putString(“video_event”,”start”)
       videoStartBundle.putString(“video_id”,”tt7984734″)
       videoStartBundle.putString(“video_title”,”The Lighthouse”)
       videoStartBundle.putInt(“video_position”,0)
       videoStartBundle.putInt(“video_duration”,6540)
       videoStartBundle.putDouble(“video_progress”,0.0)
       firebaseAnalytics.logEvent(“video_playback”, videoStartBundle)

       // video pause
       val videoPauseBundle = Bundle()
       videoPauseBundle.putString(“video_event”,”pause”)
       videoPauseBundle.putString(“video_id”,”tt7984734″)
       videoPauseBundle.putString(“video_title”,”The Lighthouse”)
       videoPauseBundle.putInt(“video_position”,654)
       videoPauseBundle.putInt(“video_duration”,6540)
       videoPauseBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoPauseBundle)

       // video resume
       val videoResumeBundle = Bundle()
       videoResumeBundle.putString(“video_event”,”resume”)
       videoResumeBundle.putString(“video_id”,”tt7984734″)
       videoResumeBundle.putString(“video_title”,”The Lighthouse”)
       videoResumeBundle.putInt(“video_position”,654)
       videoResumeBundle.putInt(“video_duration”,6540)
       videoResumeBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoResumeBundle)

       // video rewind
       val videoRewindBundle = Bundle()
       videoRewindBundle.putString(“video_event”,”rewind”)
       videoRewindBundle.putString(“video_id”,”tt7984734″)
       videoRewindBundle.putString(“video_title”,”The Lighthouse”)
       videoRewindBundle.putInt(“video_position”,327)
       videoRewindBundle.putInt(“video_duration”,6540)
       videoRewindBundle.putDouble(“video_progress”,5.0)
       firebaseAnalytics.logEvent(“video_playback”, videoRewindBundle)

       // video fast-forward
       val videoFastForwardBundle = Bundle()
       videoFastForwardBundle.putString(“video_event”,”fastforward”)
       videoFastForwardBundle.putString(“video_id”,”tt7984734″)
       videoFastForwardBundle.putString(“video_title”,”The Lighthouse”)
       videoFastForwardBundle.putInt(“video_position”,4905)
       videoFastForwardBundle.putInt(“video_duration”,6540)
       videoFastForwardBundle.putDouble(“video_progress”,75.0)
       firebaseAnalytics.logEvent(“video_playback”, videoFastForwardBundle)

       // video stop
       val videoStopBundle = Bundle()
       videoStopBundle.putString(“video_event”,”stop”)
       videoStopBundle.putString(“video_id”,”tt7984734″)
       videoStopBundle.putString(“video_title”,”The Lighthouse”)
       videoStopBundle.putInt(“video_position”,6000)
       videoStopBundle.putInt(“video_duration”,6540)
       videoStopBundle.putDouble(“video_progress”,91.74)
       firebaseAnalytics.logEvent(“video_playback”, videoStopBundle)

       // video skip
       val videoSkipBundle = Bundle()
       videoSkipBundle.putString(“video_event”,”skip”)
       videoSkipBundle.putString(“video_id”,”tt7984734″)
       videoSkipBundle.putString(“video_title”,”The Lighthouse”)
       videoSkipBundle.putInt(“video_position”,6000)
       videoSkipBundle.putInt(“video_duration”,6540)
       videoSkipBundle.putDouble(“video_progress”,91.74)
       firebaseAnalytics.logEvent(“video_playback”, videoSkipBundle)

       // video progress
       // send progress events at:
       // – first 30 seconds reached
       // – 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% of video completion
       val videoProgressBundle = Bundle()
       videoProgressBundle.putString(“video_event”,”progress”)
       videoProgressBundle.putString(“video_id”,”tt7984734″)
       videoProgressBundle.putString(“video_title”,”The Lighthouse”)
       videoProgressBundle.putInt(“video_position”,654)
       videoProgressBundle.putInt(“video_duration”,6540)
       videoProgressBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoProgressBundle)

       setContentView(R.layout.activity_main)
   }
}

구글 애널리틱스에서 디버그 4

Google 애널리틱스 4에는 매우 효율적으로 테스트할 수 있는 디버그뷰 기능이 있습니다. 이 기능을 활성화하면 Google 애널리틱스 4 콘솔에서 거의 실시간으로 전달되는 이벤트 스트림을 볼 수 있습니다. 또한 Google 애널리틱스 4 콘솔에서는 볼 수 없는 모든 사용자 지정 이벤트 매개변수와 값을 볼 수 있습니다. 이벤트가 정확한 시간에 정확한 값으로 실행되고 있는지 확인하려면 이 기능을 사용하는 것이 좋습니다.

빅쿼리로 내보내기

Google 애널리틱스 4와 Google 애널리틱스에는 원시 데이터에 액세스하는 새로운 패러다임이 있습니다. Google 애널리틱스는 지금까지 보고 API를 제공한 반면, Google 애널리틱스 4는 데이터베이스를 제공합니다: 구글 빅쿼리.

Google 애널리틱스 4용 BigQuery를 사용하려면 몇 가지 추가 단계를 거쳐야 하는데, 그 중 첫 번째 단계는 Firebase의 Blaze 요금제로 업그레이드하는 것입니다. 이 요금제는 종량제 요금제로, Google은 매월 무료 사용 할당량을 제공하므로 앱에서 생성되는 트래픽 양에 따라 요금이 거의 또는 전혀 들지 않을 수도 있습니다.

데이터는 구성을 활성화한 날짜부터 제공되기 시작하므로 가능한 한 빨리 BigQuery와의 링크를 활성화하는 것이 좋습니다. 데이터는 BigQuery에 소급하여 채워지지 않습니다.

BigQuery를 설정하면 몇 가지 주요 이점이 있습니다:

  • 데이터에 대한 신속한 임시 분석.
  • 원시 데이터에 쉽게 액세스하세요.

사용자 지정 매개변수와 같은 특정 데이터는 Google 애널리틱스 4 콘솔에서 전체 데이터를 볼 수 없는 반면, 모든 데이터는 BigQuery에서 사용할 수 있습니다. 원시 데이터에 대한 액세스는 전체 데이터 세트에 의존하는 고급 사용자 및 브라이트코브 오디언스 인사이트와 같은 타사 오디언스 분석 플랫폼의 경우 필수적입니다.