1. 簡介
開始前的背景資訊
如果您是 iOS 應用程式開發人員,您必須聽過 iOS 14.5 以上版本隱私權更新。為了評估安裝後有意義的轉換動作,Apple 提供 SKAd Network API,讓您在保護使用者隱私的前提下,評估廣告活動成效。您可以配合業務需求找出最佳方式,運用 SKAd Network 取得有關廣告活動的重要深入分析。在這個程式碼研究室中,我們將舉例說明如何運用 BigQuery 中的 GA4F 資料,將安裝到應用程式安裝後的收益歸類為不同值區,然後與應用程式歸因合作夥伴一起進行設定。雖然本程式碼研究室採用以收益為準的做法,但您也可以使用事件或以漏斗為基礎的方法進行 SKAN 評估。如需詳細指南,請參閱這個說明中心。這只是範例,並非官方 Google 提供的建議。您可以根據特定業務需求自行設計結構定義
我們想涵蓋的內容
- 在 BigQuery 中探索 GA4F 資料
- 查看 0 到 2 天內完成轉換的使用者收益資料
- 將收益資料分類到值區
- 瞭解每個值區的使用者分佈情形
- 在 Appsflyer SKAN Conversion Studio 中實作值區
必要條件
- iOS 應用程式中的 GA4F SDK ,以及整合的所有收益事件 (in_app_purchase 或廣告資助收益)
- 已啟用從 Firebase 匯出功能的 Firebase
- 應用程式歸因合作夥伴,此合作夥伴也會記錄所有收益事件
2. 存取 BigQuery Export
前往 Google Cloud 資料集
前往 GA4F 中的資料集,方法是前往「專案設定」>整合 >BigQuery。您必須先啟用切換按鈕,待啟用後約 48 小時才會開始提供資料集。點選下方連結,即可前往 BigQuery
執行一些查詢
現在您已進入 BigQuery,應該可以看見系統產生的每日資料表。在下方的螢幕截圖範例中,我們看到 64 個每日資料表,因此匯出作業已執行 64 天。如果是第一次存取,可能只會看到前一天資料的每日 1 個資料表。右側是資料表結構定義。如要進一步瞭解這些欄位,請按這裡
如要開始撰寫查詢,請按一下查詢 >開啟新分頁
接著,您可以試著在新分頁中執行範例查詢
3. 分析收益資料
擷取安裝資料
為了開始建立收益值區,我們必須先查看過去 24 至 72 小時內安裝應用程式的使用者資料。SKAd Network 4.0 可讓您在 0 到 2 天內查看資料,SKAd Network 3.5 預設允許 24 小時。(視應用程式歸因合作夥伴的能力而定,您通常可在不到 72 小時內修改這個活動期間)。使用者初次安裝應用程式及開啟應用程式時,SDK 會觸發 first_open 事件,並記錄在 BigQuery 中。
可用於 BigQuery 的 ID 是 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'
這個查詢的幾個注意事項
- 請以 Analytics 匯出的表格取代表格名稱。您可以使用萬用字元 查詢多個每日資料表。舉例來說,2023* 會查詢 2023 年所有資料
- 如果您有眾多使用者,也可以只查詢最近 30 天,加快處理速度
- 系統會篩選「IOS」平台,如果 Firebase 專案中有多個 iOS 應用程式,也可以新增 app_info.firebase_app_id 篩選器,藉此取得特定應用程式的資料
擷取收益資料
現在,我們來瞭解查詢使用者收益的方式。在本例中,我們假設收益事件為 in_app_purchase 和 ad_impression。您可以透過 event_value_usd 查看 in_app_purchase 的收益,如果是 ad_impression,則可在事件參數的值參數中查看收益。如果您不熟悉 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
- 如果您要傳送多種貨幣,則必須先為這項分析採用一種貨幣。在本例中,我們假設廣告收益所用的幣別也是美元
輸出內容如下所示 (這裡會遮蓋 user_pseudo_id 的資料欄)。
合併這項資料
目前我們進行了兩項查詢,一項則用來找出已安裝並開啟應用程式的使用者資料,另一項查詢則找出這些使用者的收益。現在,讓我們回顧一下先前討論的 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 和總收益
現在我們必須把這些條件結合成可用於轉換價值範圍的區塊。為此,我們應使用 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 會嘗試維持一致的百分位數分佈情形
運用這些值區分析使用者分佈情形
如要瞭解每個值區的使用者分佈情形,請勾選這個核取方塊。舉例來說,先前查詢中傳回的值區範圍為
- 0.1
- 0.5
- 2
- 2.5
- 5 [最後一個值不應用於範圍設定]
針對最後一個範圍,我們會忽略最後一個區塊 (5),因為這通常就是最大值,可以將 2.5 視為最後一個範圍。這是因為應用程式歸因供應商通常會使用範圍的平均值來計算廣告投資報酬率,因此必須排除離群值,才能以更一致的方式計算。
現在,我們要嘗試查看所有範圍中每個日期的使用者人數,藉此瞭解每個值區的每日使用者人數。只要使用這個範例查詢,即可將值區值替換為您的實際資料,而查詢看起來會像這樣:
#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
就會傳回每天每個收益範圍中的使用者,如下所示。如果您在任何值區看到極低的數字,或分佈的情形通常不均,您可能會想要調整值區數量並重新執行查詢。
SKAd Network 4.0 簡介
SKAd Network 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
請注意,我們決定忽略上一個收益範圍,因為這將是離群值,導致應用程式歸因服務供應商的平均計算方式偏差。
AppsFlyer 提供 SKAN Conversion Studio,讓您輕鬆將這項功能直接輸入到使用者介面。您可以直接使用 4.0 或「自訂」若是 3.5 版,在新增「收益」欄成效評估方式然後只加入之前分析計算的收益範圍即可。
Google Ads 最佳做法和學習資訊
如果您目前透過 Google Ads 放送廣告活動,並利用 SKAd Network 轉換價值結構定義評估相關影響,在此提供一些建議
- 請確認您在 Google Ads 使用的轉換回溯期,與您在應用程式歸因平台中指定的活動回溯期一致。如果是 SKAd 聯播網 3.5,時間可能在 1 到 3 天內。您可以按照這裡的步驟,在 Google Ads 中據以調整。
- 如果您使用的是 Appsflyer,預設的事件計數器是 1,這表示系統不會針對每位使用者記錄多個事件。如果您目前使用以事件為基礎的模型進行 SKAN 評估,並與 Google Ads 的目標單次轉換出價廣告活動進行比較,可以選擇按照 Appsflyer 提供的這項指引進行自訂。
5. 恭喜
恭喜!您已成功設定 SKAd Network 轉換價值結構定義。您現在可以監控 Google Ads SKAd Network 報表中的資料,查看 Google Ads 廣告活動的轉換價值
您已瞭解
- 如何在 BigQuery 中探索 GA4F 的豐富原始資料
- 計算業務收益值區的分析方法
- 使用 AppsFlyer 部署結構定義