1. 소개
시작하기 전에 알아두면 좋은 정보
iOS 앱 개발자라면 iOS 14.5 이상 개인 정보 보호 업데이트에 대해 들어보셨을 것입니다. 설치 후 의미 있는 전환 액션을 측정하기 위해 Apple은 사용자 개인 정보를 존중하면서 광고 캠페인의 실적을 측정할 수 있는 SKAdNetwork API를 제공합니다. 비즈니스 요구사항에 따라 SKAdNetwork를 활용하여 캠페인에 관한 의미 있는 통계를 파악하는 가장 최적의 방법을 생각해 볼 수 있습니다. 이 Codelab에서는 BigQuery에서 GA4F 데이터를 활용하여 앱 설치 후 수익을 버킷으로 그룹화하는 방법의 예를 살펴봅니다. 이 버킷은 앱 기여 분석 파트너와 설정하는 데 사용할 수 있습니다. 이 Codelab에서는 수익 기반 접근 방식을 사용하지만 SKAN 측정에 이벤트 또는 유입경로 기반 접근 방식을 사용할 수도 있습니다. 자세한 내용은 이 고객센터를 참고하세요. 이는 예시일 뿐 Google의 공식 추천이 아닙니다. 특정 비즈니스 요구사항에 따라 스키마를 직접 설계할 수 있습니다.
다룰 내용
- BigQuery에서 GA4F 데이터 탐색
- 0~2일 이내에 전환한 사용자의 수익 데이터 찾기
- 수익 데이터를 버킷으로 그룹화
- 각 버킷의 사용자 분포 이해
- 앱스플라이어 SKAN Conversion Studio에서 버킷 구현
기본 요건
- iOS 앱에 GA4F SDK 가 있고 모든 수익 이벤트 (in_app_purchase 또는 광고 지원 수익)가 통합되어 있습니다.
- Firebase에서 BigQuery로 내보내기 사용 설정
- 모든 수익 이벤트를 기록하는 앱 기여 분석 파트너
2. BigQuery Export 액세스
Google Cloud 데이터 세트로 이동
프로젝트 설정 > 통합 > BigQuery로 이동하여 GA4F의 데이터 세트로 이동합니다. 먼저 전환 버튼을 사용 설정해야 하며, 사용 설정 후 데이터 세트를 사용할 수 있게 되기까지 약 48시간이 걸립니다. 아래에 표시된 링크를 클릭하면 BigQuery로 이동합니다.

쿼리 실행
이제 BigQuery에서 생성된 일별 테이블을 확인할 수 있습니다. 아래 예시 스크린샷에는 일별 테이블이 64개 표시되어 있으므로 내보내기가 64일 동안 실행된 것입니다. 처음 액세스하는 경우 전날 데이터에 대한 일일 테이블 1개만 표시될 수 있습니다. 오른쪽에 테이블 스키마가 표시됩니다. 필드에 대한 자세한 내용은 여기를 참고하세요.
쿼리 작성을 시작하려면 쿼리 > 새 탭을 클릭합니다.

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

3. 수익 데이터 분석
설치 데이터 가져오기
이제 수익 버킷을 빌드하려면 지난 24~72시간 이내에 앱을 설치한 사용자의 데이터를 먼저 살펴봐야 합니다. SKAdNetwork 4.0에서는 0~2일 동안 데이터를 볼 수 있지만 SKAdNetwork 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 열은 여기에서 수정됨).

이 데이터 결합
지금까지 앱을 설치하고 연 사용자의 데이터를 찾는 쿼리와 해당 사용자의 수익을 찾는 쿼리 두 개를 실행했습니다. 이제 SKAdNetwork 제한사항에 대해 논의한 내용을 떠올려 보겠습니다. 기여 분석 기간은 설치 후 0~2일 이내에만 사용할 수 있습니다. 따라서 설치 및 수익의 이벤트 타임스탬프를 확인하고 해당 기간 내에 발생한 경우에만 정보를 가져와야 합니다. 이제 앱 설치 후 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일 이내인지 확인해야 합니다. SKAdNetwork 3.5를 사용하는 경우 기본값은 24시간이므로 조건을 변경하여 1일 데이터만 포함할 수도 있습니다.
수익을 버킷으로 그룹화하기
이전 쿼리 후 user_pseudo_id와 총수익이 표시됩니다.

이제 이를 전환 가치 범위에 사용할 수 있는 버킷으로 결합해야 합니다. 이를 위해 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는 일관된 백분위수 분포를 유지하려고 합니다.

이 버킷으로 사용자 분포 분석
각 버킷의 사용자 분포를 파악하려면 이 단계를 선택적으로 수행하세요. 예를 들어 이전 쿼리에서 반환된 버킷 범위는 다음과 같습니다.
- 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
아래와 같이 각 날짜의 각 수익 범위에 있는 사용자를 반환합니다. 버킷의 수가 매우 적거나 분포가 일반적으로 고르지 않은 경우 버킷 수를 조정하고 쿼리를 다시 실행하는 것이 좋습니다.

SKAdNetwork 4.0에 대한 간략한 설명
SKAdNetwork 4.0 은 최대 2일, 3~7일, 8~35일의 여러 전환 추적 기간을 제공합니다. 위의 접근 방식에서는 이러한 추가 시나리오에 대한 데이터를 분석하도록 창을 쉽게 변경할 수 있습니다. LOW, MEDIUM, HIGH의 대략적인 값도 사용할 수 있습니다. 이 접근 방식을 사용하려면 이를 3개의 버킷으로 생각하면 됩니다. 따라서 버킷 수를 3으로 변경하면 낮음, 중간, 높음의 기준점을 얻을 수 있습니다.
4. 기여 분석 제공업체를 사용한 배포
특정 플랫폼에 따라 이 안내가 변경될 수 있습니다. 이와 관련해 최신 정보를 확인하려면 플랫폼 담당자에게 문의하세요. 이 예에서는 현재 AppsFlyer에 이를 배포하는 방법을 살펴보겠습니다.
이전에 실행한 쿼리에서 출력으로 받은 최종 범위는 다음과 같습니다.

- 범위 1 : 0~0.1
- 범위 2 : 0.1~0.5
- 범위 3 : 0.5~2
- 범위 4 : 2~2.5
마지막 수익 범위는 이상치로 간주되어 앱 기여 분석 제공업체의 평균 계산을 왜곡하므로 무시하기로 결정했습니다.
앱스플라이어는 UI에 직접 입력하기가 매우 간단한 SKAN Conversion Studio를 제공합니다. 4.0을 직접 사용하거나 3.5를 사용하는 경우 '맞춤' 모드를 사용하여 '수익' 측정을 추가할 수 있습니다. 그런 다음 이전 분석에서 계산한 수익 범위를 추가하면 됩니다.

Google Ads 권장사항 및 학습
Google Ads에서 캠페인을 운영하고 SKAdNetwork 전환 가치 스키마를 통해 영향을 측정하는 경우 몇 가지 권장사항을 알려드립니다.
- Google Ads에서 사용하는 전환 추적 기간이 앱 기여 분석 플랫폼에서 지정한 활동 기간과 일치하는지 확인합니다. SKAdNetwork 3.5의 경우 1~3일 이내일 가능성이 높으므로 여기에 나열된 단계에 따라 Google Ads에서 적절하게 조정할 수 있습니다.

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

5. 축하합니다
축하합니다. SKAdNetwork 전환 가치 스키마를 설정하셨습니다. 이제 Google Ads SKAdNetwork 보고서에서 데이터를 모니터링하여 Google Ads 캠페인의 전환 가치를 확인할 수 있습니다.
학습한 내용
- BigQuery에서 GA4F의 풍부한 원시 데이터를 탐색하는 방법
- 비즈니스의 수익 버킷을 계산하는 분석적 접근 방식
- AppsFlyer로 스키마 배포