1. 簡介
開始前先瞭解一些背景資訊
如果您是 iOS 應用程式開發人員,應該聽過 iOS 14.5 以上版本的隱私權更新。如要評估安裝後的重要轉換動作,Apple 提供 SKAdNetwork API,讓您評估廣告活動成效,同時尊重使用者隱私。您可以根據業務需求,找出最合適的 SKAdNetwork 運用方式,取得廣告活動的實用洞察資料。在本程式碼研究室中,我們將探討如何運用 BigQuery 中的 GA4F 資料,將應用程式安裝後的收益分組,然後使用這些資料向應用程式歸因合作夥伴設定。雖然本程式碼研究室採用收益式方法,但您也可以使用事件或漏斗式方法進行 SKAdNetwork 評估。如需詳細指引,請參閱這篇說明中心文章。這只是範例,並非 Google 官方建議。您可以根據特定業務需求設計自己的結構定義
預計涵蓋的主題
- 在 BigQuery 中探索 GA4F 資料
- 找出在 0 到 2 天內完成轉換的使用者收益資料
- 將收益資料分組
- 瞭解每個值區中的使用者分布情形
- 在 Appsflyer SKAN 轉換工作室中實作 Bucket
必要條件
- iOS 應用程式中的 GA4F SDK ,以及所有已整合的收益事件 (in_app_purchase 或廣告資助收益)
- Firebase to BigQuery export enabled
- 應用程式歸因合作夥伴,也會記錄所有收益事件
2. 存取 BigQuery Export
前往 Google Cloud 資料集
前往「專案設定」>「整合」>「BigQuery」,即可在 GA4F 中找到資料集。您必須先啟用切換按鈕,啟用後,資料集大約會在 48 小時內提供。您可以點選下方顯示的連結,前往 BigQuery

執行一些查詢
現在您已進入 BigQuery,應該會看到系統產生的每日資料表。在下方的螢幕截圖範例中,我們看到 64 個每日資料表,因此匯出作業已執行 64 天。如果是第一次存取,您可能只會看到前一天的每日資料表。右側會顯示資料表結構定義。如要進一步瞭解各欄位,請參閱這篇文章。
如要開始編寫查詢,請依序點選「查詢」>「在新分頁中開啟」

然後在新分頁中執行範例查詢

3. 分析收益資料
擷取安裝資料
現在,如要開始建立收益區間,我們必須先查看過去 24 到 72 小時內安裝應用程式的使用者資料。SKAdNetwork 4.0 可讓您查看 0 至 2 天內的資料,而 SKAdNetwork 3.5 預設為 24 小時。(視應用程式歸因合作夥伴的功能而定,您或許可以修改這項活動視窗,但一般來說不得超過 72 小時)。使用者安裝應用程式並首次開啟時,SDK 會觸發 first_open 事件,並記錄在 BigQuery 中。
您可將 user_pseudo_id (也稱為應用程式例項 ID) 做為 BigQuery 的 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 中,而廣告曝光的收益則會顯示在事件參數的 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
- 如果傳送多種幣別,您必須先將幣別統一,才能進行這項分析。在本例中,我們假設廣告資助收益的幣別也是美元
輸出內容如下所示 (這裡已隱藏 user_pseudo_id 的資料欄)。

合併這項資料
到目前為止,我們已執行兩項查詢,分別是找出已安裝並開啟應用程式的使用者資料,以及找出這些使用者的收益。現在,請回想一下我們討論過的 SKAdNetwork 限制。歸因回溯期只能設為安裝後 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 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 會盡量維持一致的百分位數分布

使用這些值區分析使用者分布情形
這是選用步驟,如果您想瞭解每個值區中的使用者分布情形,可以執行這項步驟。以我們的範例來說,前一個查詢傳回的 bucket 範圍為
- 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
系統應會傳回每天各收益範圍的使用者,如下所示。如果任何值區的數字非常低,或一般分布不均,您可能需要調整值區數量並重新執行查詢。

簡介 SKAdNetwork 4.0
SKAdNetwork 4.0 提供多個轉換回溯期,包括最多 2 天、3 至 7 天和 8 至 35 天。在上述方法中,您也可以輕鬆變更時間範圍,分析這些額外情境的資料。您也可以使用「低」、「中」和「高」粗略值。同樣地,如要使用這種方法,可以將其視為 3 個儲存區,因此只要將儲存區數量變更為 3,即可取得「低」、「中」和「高」的閾值
4. 與歸因供應商一起部署
這項指引可能會因特定平台而異。如要瞭解最新資訊,請洽詢平台代表。在本範例中,我們將探討目前如何在 AppsFlyer 上部署這項功能
在先前執行的查詢中,我們收到的最終範圍如下:

- 範圍 1:0 到 0.1
- 範圍 2:0.1 至 0.5
- 範圍 3:0.5 至 2
- 範圍 4:2 至 2.5
請注意,我們決定忽略最後一個收益範圍,因為這會是離群值,並導致應用程式歸因服務供應商的平均計算結果有偏差。
AppsFlyer 提供 SKAN 轉換工作室,可直接在使用者介面中輸入這項資訊。您可以直接使用 4.0,也可以使用「自訂」模式 (如果您使用 3.5),並新增「收益」評估。接著,只要加入您從先前分析計算出的收益範圍即可。

Google Ads 最佳做法和學習內容
如果您在 Google Ads 上放送廣告活動,並透過 SKAdNetwork 轉換價值結構定義評估影響,建議您採取下列做法:
- 請確認您在 Google Ads 中使用的轉換回溯期,與您在應用程式歸因平台中指定的活動回溯期一致。如果是 SKAdNetwork 3.5,這段時間可能為 1 到 3 天,因此您可以在 Google Ads 中按照這裡列出的步驟進行調整。

- 如果您使用 Appsflyer,目前預設的事件計數器為 1,也就是說,系統不會計算每位使用者的多個事件。如果您使用以事件為準的 SKAN 評估模式,並與 Google Ads 的目標單次動作出價廣告活動進行比較,可以按照 AppsFlyer 的這項指南自訂設定。

5. 恭喜
恭喜,您已成功設定 SKAdNetwork 轉換價值結構定義。這項功能上線後,您就能透過 Google Ads SKAdNetwork 報表監控資料,查看 Google Ads 廣告活動的轉換價值
您已學習以下內容
- 如何在 BigQuery 中探索 GA4F 的豐富原始資料
- 計算商家收益類別的分析方法
- 透過 AppsFlyer 部署結構定義