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에 대한 필터를 추가하여 특정 앱에 대한 데이터를 가져올 수도 있습니다.

수익 데이터를 가져오는 중

이제 사용자를 위한 수익을 찾기 위한 쿼리를 살펴보겠습니다. 이 경우 Google에서는 수익 이벤트가 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 네트워크 제한사항에 대해 논의한 내용을 떠올려 보세요. 기여 산정 기간은 설치 후 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 버킷을 사용할 수 있습니다.

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

#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

Google에서는 이상치가 될 수 있고 마지막 수익 범위는 무시하고 앱 기여 분석 제공업체의 평균 계산을 왜곡하기로 결정했습니다.

AppsFlyer는 UI에 직접 입력하는 것이 매우 간단한 SKAN Conversion Studio를 제공합니다. 4.0을 직접 사용하거나 '커스텀'을 사용할 수 있습니다. 모드를 사용하고 '수익'을 있습니다. 그런 다음 이전 분석에서 계산한 수익 범위를 추가하면 됩니다.

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로 스키마 배포