SKAd 네트워크 전환 가치 스키마의 수익 버킷 계산

1. 소개

시작하기 전에 알아야 할 정보

iOS 앱 개발자는 iOS 14.5+ 개인 정보 보호 업데이트에 대해 들어보셨을 것입니다. 설치 후 의미 있는 전환 액션을 측정하기 위해 Apple은 사용자 개인 정보를 존중하면서 광고 캠페인의 실적을 측정할 수 있는 SKAd Network API를 제공합니다. 비즈니스 요구사항에 따라 SKAd Network를 활용하여 캠페인에 관한 유의미한 통계를 얻는 가장 최적의 방법을 찾을 수 있습니다. 이 Codelab에서는 BigQuery의 GA4F 데이터를 활용하여 앱 설치 후 수익을 버킷으로 그룹화한 다음 앱 기여 분석 파트너를 설정하는 데 사용할 수 있는 예시 방법을 살펴봅니다. 이 Codelab에서는 수익 기반 접근 방식을 사용하지만 SKAN 측정에 이벤트 또는 유입경로 기반 접근 방식을 사용할 수도 있습니다. 자세한 내용은 이 고객센터를 참고하세요. 이는 Google의 공식 권장사항이 아닌 예시일 뿐입니다. 특정 비즈니스 요구사항에 따라 자체 스키마를 설계할 수 있습니다.

다루는 내용

  • BigQuery에서 GA4F 데이터 살펴보기
  • 0~2일 이내에 전환한 사용자의 수익 데이터 찾기
  • 수익 데이터를 버킷으로 그룹화
  • 각 버킷의 사용자 분포 이해하기
  • Appsflyer SKAN Conversion Studio에서 버킷 구현

기본 요건

2. BigQuery Export 액세스

프로젝트 설정 > GA4F의 데이터 세트로 이동합니다. 통합 > BigQuery 먼저 전환 버튼을 사용 설정해야 하며, 사용 설정 후 데이터 세트를 사용할 수 있게 되기까지 약 48시간이 걸립니다. 아래 링크를 클릭하면 BigQuery로 이동합니다.

1aa4e20bfd3419d1.png

쿼리 실행

이제 BigQuery에 있으므로 생성된 일일 테이블이 표시됩니다. 아래 예시 스크린샷에는 64개의 일일 테이블이 표시되어 있으므로 내보내기가 64일 동안 실행되었습니다. 처음 액세스하는 경우 전날 데이터의 일일 표 1개만 표시될 수 있습니다. 오른쪽에 테이블 스키마가 표시됩니다. 필드에 대한 자세한 내용은 여기를 참고하세요.

쿼리를 작성하려면 쿼리 > 새 탭에서 열기

42ba59ec655c5d1b.png

그런 다음 새 탭에서 샘플 쿼리를 실행해 볼 수 있습니다.

70ef90d32b7cd7f1.png

3. 수익 데이터 분석

설치 데이터 가져오기

이제 수익 버킷을 만들기 시작하려면 먼저 지난 24~72시간 이내에 앱을 설치한 사용자의 데이터를 살펴봐야 합니다. SKAd Network 4.0에서는 0~2일 이내에 데이터를 볼 수 있지만 SKAd Network 3.5에서는 기본적으로 24시간이 허용됩니다. 앱 기여 분석 파트너의 기능에 따라 이 활동 기간을 일반적으로 72시간 이하로 수정할 수 있습니다. 사용자가 앱을 설치하고 처음 열면 SDK에서 first_open 이벤트를 실행하고 BigQuery에 기록합니다.

BigQuery에 사용할 수 있는 식별자는 user_pseudo_id (앱 인스턴스 ID라고도 함)이므로 아래 쿼리를 사용하여 이러한 사용자를 찾을 수 있습니다.

SELECT
  user_pseudo_id,
  event_name,
  event_date,
  event_timestamp
FROM `project_name.dataset_name.events_2023*`
WHERE
  event_name = 'first_open'
  AND platform = 'IOS'

이 쿼리에 관한 몇 가지 참고사항

  • 테이블 이름을 애널리틱스에서 내보낸 테이블로 바꾸세요. 와일드 카드를 사용하여 여러 일일 테이블을 쿼리할 수 있습니다. 예를 들어 2023*은 2023년의 모든 데이터를 쿼리합니다.
  • 사용자가 많은 경우 처리 속도를 높이기 위해 지난 30일 동안만 쿼리할 수도 있습니다.
  • 플랫폼 = 'IOS'를 필터링합니다. Firebase 프로젝트에 iOS 앱이 여러 개인 경우 app_info.firebase_app_id 필터를 추가하여 특정 앱의 데이터를 가져올 수도 있습니다.

수익 데이터 가져오기

이제 사용자의 수익을 찾는 쿼리를 살펴보겠습니다. 이 경우 수익 이벤트가 in_app_purchase 및 ad_impression이라고 가정합니다. in_app_purchase의 수익은 event_value_usd에서 확인할 수 있으며, ad_impression의 경우 이벤트 매개변수 내의 value 매개변수에서 수익을 확인할 수 있습니다. BigQuery의 이벤트 매개변수에 익숙하지 않은 경우 여기에서 정의 확인을 권장하며, 공식 참조에서 이 샘플 쿼리를 사용해 보세요. 여기에서는 event_params에서 값을 추출하는 방법도 다룹니다.

SELECT
  user_pseudo_id,
  event_name,
  EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
  (
    SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
    FROM UNNEST(event_params)
    WHERE
      KEY = 'value'
      AND event_name = 'ad_impression'
  ) AS ad_funded_revenue,
  (
    SELECT value.string_value
    FROM UNNEST(event_params)
    WHERE
      KEY = 'currency'
      AND event_name = 'ad_impression'
  ) AS ad_revenue_currency,
  (
    CASE
      WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
      ELSE 0
      END) AS iap_revenue_usd,
FROM `project_name.dataset_name.events_2023*`
WHERE
  platform = 'IOS'
  AND event_name IN (
    'in_app_purchase',
    'ad_impression')

여기서 쿼리가 어떤 역할을 하는지 알아보겠습니다. 여러분은

  • 우리는 수익 이벤트에만 관심이 있으므로 WHERE 절에서 수익 이벤트에만 필터링을 하고, 지난번과 마찬가지로 iOS 데이터를 찾고 있습니다.
  • 이제 SELECT 절에서 광고 수익 이벤트(ad_impression)의 값과 통화를 가져오고 이벤트가 in_app_purchase인 경우 event_value_in_usd를 가져옵니다.
  • 여러 통화를 전송하는 경우 먼저 이 분석을 위해 단일 통화로 조정해야 합니다. 이 예에서는 광고 수익의 통화도 USD라고 가정합니다.

출력은 다음과 같습니다 (user_pseudo_id 열은 여기에서 수정됨).

1e1e6943e4b3a6d8.png

데이터 결합하기

지금까지는 두 개의 쿼리를 실행했는데, 하나는 앱을 설치하고 연 사용자에 대한 데이터를 찾는 쿼리이고, 다른 하나는 이러한 사용자의 수익을 찾는 쿼리입니다. 이제 SKAd Network 제한사항에 대해 알아보겠습니다. 기여 산정 기간은 설치 후 0~2일 이내에만 사용할 수 있습니다. 따라서 이벤트 타임스탬프에서 설치 및 수익을 확인하고 해당 기간 내에 발생하는 경우에만 정보를 수집해야 합니다. 이제 이틀간의 앱 설치 후의 총수익을 제공하는 쿼리로 결합하는 방법을 살펴보겠습니다.

#creating the install table
WITH
  install_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_date,
      event_timestamp
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      event_name = 'first_open'
      AND platform = 'IOS'
  ),
  #creating the revenue table
  revenue_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_timestamp,
      EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
      (
        SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
        FROM UNNEST(event_params)
        WHERE
          KEY = 'value'
          AND event_name = 'ad_impression'
      ) AS ad_funded_revenue,
      (
        SELECT value.string_value
        FROM UNNEST(event_params)
        WHERE
          KEY = 'currency'
          AND event_name = 'ad_impression'
      ) AS ad_revenue_currency,
      (
        CASE
          WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
          ELSE 0
          END) AS iap_revenue_usd,
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      platform = 'IOS'
      AND event_name IN (
        'in_app_purchase',
        'ad_impression')
  )
SELECT
  it.user_pseudo_id AS user_pseudo_id,
  #combine ad revenue and IAP revenue, assuming both are in same currency
  sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
FROM install_table it
INNER JOIN revenue_table rt
  ON it.user_pseudo_id = rt.user_pseudo_id
WHERE
  rt.event_timestamp >= it.event_timestamp
  AND rt.event_timestamp
    <= it.event_timestamp + 86400000000 * 2  #added 86400 000 millisecond as 24 hours, taking for 2 days later
GROUP BY 1

쿼리는 user_pseudo_id 필드에서 설치 데이터와 수익 데이터를 조인하려고 시도한 다음 타임스탬프가 2일 이내인지 확인해야 합니다. SKAd Network 3.5를 사용하는 경우 기본값은 24시간이므로 조건을 변경하여 1일의 데이터만 포함하도록 할 수도 있습니다.

수익을 버킷으로 그룹화

이전 쿼리 후에는 user_pseudo_id와 총수익이 표시됩니다.

2c1986b93e937d19.png

이제 이를 전환 가치 범위에 사용할 수 있는 버킷으로 결합해야 합니다. 이를 위해 BigQuery에서 해당 범위를 자동으로 생성하는 approx_quantiles 함수를 사용합니다. 이 예시에서는 5개의 범위를 만들려고 한다고 가정해 보겠습니다. 따라서 SELECT approx_quantiles(total_revenue, 5) AS buckets를 사용하면 됩니다.

이제 이를 전체 쿼리에 통합해 보겠습니다.

#creating the install table
WITH
  install_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_date,
      event_timestamp
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      event_name = 'first_open'
      AND platform = 'IOS'
  ),
  #creating the revenue table
  revenue_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_timestamp,
      EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
      (
        SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
        FROM UNNEST(event_params)
        WHERE
          KEY = 'value'
          AND event_name = 'ad_impression'
      ) AS ad_funded_revenue,
      (
        SELECT value.string_value
        FROM UNNEST(event_params)
        WHERE
          KEY = 'currency'
          AND event_name = 'ad_impression'
      ) AS ad_revenue_currency,
      (
        CASE
          WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
          ELSE 0
          END) AS iap_revenue_usd,
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      platform = 'IOS'
      AND event_name IN (
        'in_app_purchase',
        'ad_impression')
  ),
  total_revenue_table AS (
    SELECT
      it.user_pseudo_id AS user_pseudo_id,
      #combine ad revenue and IAP revenue, assuming both are in same currency
      sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
    FROM install_table it
    INNER JOIN revenue_table rt
      ON it.user_pseudo_id = rt.user_pseudo_id
    WHERE
      rt.event_timestamp >= it.event_timestamp
      AND rt.event_timestamp
        <= it.event_timestamp + 86400000000 * 2  #added 86400 000 millisecond as 24 hours
    GROUP BY 1
  )
SELECT approx_quantiles(total_revenue, 5) AS buckets FROM total_revenue_table

이 쿼리는 수익을 5개 버킷으로 나누고 BigQuery는 일관된 백분위수 분포를 유지하려고 합니다.

ba46f5d993449948.png

이 버킷으로 사용자 분포 분석하기

각 버킷의 사용자 분포를 이해하려는 경우 이 단계는 선택 단계입니다. 이 예에서 이전 쿼리에서 반환된 버킷 범위는 다음과 같습니다.

  • 0.1
  • 0.5
  • 2
  • 2.5
  • 5 [마지막 값은 범위 구성에 사용해서는 안 됩니다.]

최종 범위의 경우 마지막 버킷 5는 일반적으로 최댓값이므로 무시하며 2.5를 마지막 범위로 간주하면 됩니다. 이는 앱 기여 분석 제공업체가 범위의 평균을 사용하여 ROAS를 계산하는 경향이 있으므로 더 균일한 계산을 위해 이상점을 제외해야 하기 때문입니다.

이제 각 범위의 날짜별 사용자 수를 확인하여 각 버킷의 일일 사용자 수를 파악해 보겠습니다. 이 샘플 쿼리를 사용하면 버킷 값을 실제 데이터로 대체할 수 있으며 쿼리는 다음과 같이 표시됩니다.

#creating the install table
WITH
  install_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_date,
      event_timestamp
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      event_name = 'first_open'
      AND platform = 'IOS'
  ),
  #creating the revenue table
  revenue_table AS (
    SELECT
      user_pseudo_id,
      event_name,
      event_timestamp,
      EXTRACT(date FROM Parse_datetime('%Y%m%d', event_date)) AS event_date,
      (
        SELECT COALESCE(value.int_value, value.float_value, value.double_value, NULL)
        FROM UNNEST(event_params)
        WHERE
          KEY = 'value'
          AND event_name = 'ad_impression'
      ) AS ad_funded_revenue,
      (
        SELECT value.string_value
        FROM UNNEST(event_params)
        WHERE
          KEY = 'currency'
          AND event_name = 'ad_impression'
      ) AS ad_revenue_currency,
      (
        CASE
          WHEN event_name = 'in_app_purchase' THEN event_value_in_usd
          ELSE 0
          END) AS iap_revenue_usd,
    FROM `project_name.dataset_name.events_2023*`
    WHERE
      platform = 'IOS'
      AND event_name IN (
        'in_app_purchase',
        'ad_impression')
  ),
  total_revenue_table AS (
    SELECT
      it.user_pseudo_id AS user_pseudo_id,
      rt.event_date,
      #combine ad revenue and IAP revenue, assuming both are in same currency
      sum(ifnull(rt.iap_revenue_usd,0) + ifnull(rt.ad_funded_revenue,0)) AS total_revenue,
    FROM install_table it
    INNER JOIN revenue_table rt
      ON it.user_pseudo_id = rt.user_pseudo_id
    WHERE
      rt.event_timestamp >= it.event_timestamp
      AND rt.event_timestamp
        <= it.event_timestamp + 86400000000 * 2  #added 86400 000 millisecond as 24 hours
    GROUP BY 1, 2
  )
SELECT
  event_date,
  sum(CASE WHEN total_revenue BETWEEN 0 AND 0.1 THEN 1 ELSE 0 END) AS Bucket1,
  sum(CASE WHEN total_revenue BETWEEN 0.1 AND 0.5 THEN 1 ELSE 0 END) AS Bucket2,
  sum(CASE WHEN total_revenue BETWEEN 0.5 AND 2 THEN 1 ELSE 0 END) AS Bucket3,
  sum(CASE WHEN total_revenue BETWEEN 2 AND 2.5 THEN 1 ELSE 0 END) AS Bucket4,
  sum(CASE WHEN total_revenue > 2.5 THEN 1 ELSE 0 END) AS Bucket5
FROM total_revenue_table
GROUP BY 1 ORDER BY 1 DESC

아래와 같이 각 날짜의 각 수익 범위 내 사용자를 반환해야 합니다. 버킷의 수치가 매우 적거나 분포가 일반적으로 고르지 않은 경우 버킷 수를 조정하고 쿼리를 다시 실행해야 할 수 있습니다.

BF7d73085fe94cb6.png

SKAd Network 4.0에 대한 간단한 설명

SKAd Network 4.0 은 최대 2일, 3~7일, 8~35일의 다양한 전환 추적 기간을 제공합니다. 위의 접근 방식에서는 이러한 추가 시나리오에 대한 데이터를 분석하도록 기간을 쉽게 변경할 수 있습니다. LOW, MEDIUM, HIGH의 대략적인 값도 사용할 수 있습니다. 마찬가지로 이 접근 방식을 사용하려는 경우 3개의 버킷으로 생각할 수 있습니다. 따라서 버킷 수를 3으로 변경하면 LOW, MEDIUM, HIGH의 임곗값을 얻을 수 있습니다.

4. 기여 분석 제공업체를 통해 배포

특정 플랫폼에 따라 이 안내가 달라질 수 있습니다. 이 문제에 관한 최신 정보는 플랫폼 담당자에게 문의하세요. 이 예에서는 현재 AppsFlyer에서 이를 배포하는 방법을 살펴봅니다.

이전에 실행한 쿼리에서 출력으로 받은 최종 범위는 다음과 같습니다.

ba46f5d993449948.png

  • 범위 1 : 0 ~ 0.1
  • 범위 2: 0.1~0.5
  • 범위 3: 0.5~2
  • 범위 4: 2~2.5

이 범위는 외부값이므로 앱 기여 분석 제공업체의 평균 계산을 왜곡할 수 있으므로 마지막 수익 범위는 무시됩니다.

앱스플라이어에서는 SKAN Conversion Studio를 제공하므로 UI에 직접 입력하는 것이 매우 간단합니다. 4.0을 직접 사용하거나 3.5를 사용하는 경우 '맞춤' 모드를 사용하고 '수익' 측정을 추가할 수 있습니다. 그런 다음 이전 분석에서 계산한 수익 범위를 추가하기만 하면 됩니다.

f8c56abdf9b405f4.png

Google Ads 권장사항 및 학습사항

Google Ads에서 캠페인을 운영 중이고 SKAd 네트워크 전환 가치 스키마를 통해 영향을 측정하는 경우 몇 가지 추천을 남겨드리고자 합니다.

  • Google Ads에서 사용 중인 전환 추적 기간이 앱 기여 분석 플랫폼에서 지정한 활동 기간과 일치하는지 확인합니다. SKAd 네트워크 3.5의 경우 1~3일 이내에 완료될 가능성이 높으므로 여기에 안내된 단계에 따라 Google Ads에서 조정하실 수 있습니다.

4fd625aae9d4a43.png

  • Appsflyer를 사용 중인 경우 현재 기본 이벤트 카운터는 1입니다. 즉, 사용자당 여러 이벤트를 고려하지 않습니다. SKAN 측정에 이벤트 기반 모델을 사용하고 Google Ads의 tCPA 캠페인과 비교하는 경우 AppsFlyer의 이 가이드에 따라 맞춤설정을 선택할 수 있습니다.

6c7a4d703567700a.png

5. 축하합니다

축하합니다. SKAd 네트워크 전환 가치 스키마를 설정했습니다. 이 기능이 출시되면 Google Ads SKAd 네트워크 보고서의 데이터를 모니터링하여 Google Ads 캠페인의 전환 가치를 확인할 수 있습니다.

학습한 내용

  • BigQuery에서 GA4F의 리치 원시 데이터를 탐색하는 방법
  • 비즈니스의 수익 버킷을 계산하는 분석적 접근 방식
  • AppsFlyer로 스키마 배포