一、簡介
開始之前的一些背景資訊
如果您是 iOS App 開發者,您一定聽過iOS 14.5+ 隱私更新。為了衡量安裝後有意義的轉換操作,Apple 提供了SKAd Network API ,它允許您衡量廣告活動的成功程度,同時尊重用戶隱私。根據您的業務需求,您可以提出利用 SKAd Network 獲取有關您的行銷活動的有意義的見解的最佳方式。在此 Codelab 中,我們將研究一種範例方法,用於利用 BigQuery 中的 GA4F 資料將應用安裝後的收入分組到儲存桶中,然後您可以使用該儲存桶與應用程式歸因合作夥伴進行設定。雖然此 Codelab 使用基於收入的方法,但您也可以使用基於事件或漏斗的方法進行 SKAN 衡量。請參閱此幫助中心以獲取更詳細的指導。這只是一個範例,並非 Google 官方推薦。您可以根據您的特定業務需求設計自己的架構
我們打算涵蓋的內容
- 在 BigQuery 中探索 GA4F 數據
- 尋找 0-2 天內轉換的用戶的收入數據
- 將收入資料分組到儲存桶中
- 了解每個桶中的使用者分佈
- 在 Appsflyer 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 小時內安裝應用程式的使用者的資料。 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'
關於此查詢需要注意的幾點
- 請將表名稱替換為您的 Analytics 匯出表。您可以使用通配符查詢多個日表。例如,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
- 如果您發送多種貨幣,您首先需要調整為單一貨幣以進行此分析。為本範例的目的,我們假設廣告資助收入的貨幣也是美元
輸出將類似於以下內容(此處對 user_pseudo_id 列進行了編輯)。
結合這些數據
到目前為止,我們已經運行了兩個查詢,一個查詢用於查找安裝並打開應用程式的用戶的數據,另一個查詢用於查找這些用戶的收入。現在,讓我們記住我們討論的有關 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 和總收入
我們現在需要將其合併到可用於轉換值範圍的儲存桶中。為此,我們將使用 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 視為最後一個範圍。這是因為應用歸因提供者傾向於使用範圍平均值來計算 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
它應返回每天每個收入範圍內的用戶,如下所示。如果您看到任何儲存桶中的數字非常低或分佈普遍不均勻,您可能需要調整儲存桶的數量並重新執行查詢。
SKAd Network 4.0 簡介
SKAd Network 4.0提供長達2天、3-7天和8-35天的多個轉換視窗。在上述方法中,您也可以輕鬆變更視窗來分析這些附加場景的資料。也提供低、中和高的粗粒度值。同樣,如果您想使用這種方法,您可以將其視為 3 個桶,因此,透過將桶的數量更改為 3,您可以獲得 LOW、MEDIUM 和 HIGH 的閾值
4. 與您的歸因提供者一起部署
根據特定平台的不同,此指南可能會發生變化。請與平台代表合作以獲取這方面的最新資訊。出於本範例的目的,我們將了解目前如何在 AppsFlyer 上部署它
在我們之前執行的查詢中,我們收到的輸出的最終範圍如下
- 範圍 1:0 至 0.1
- 範圍 2:0.1 至 0.5
- 範圍 3:0.5 至 2
- 範圍 4:2 至 2.5
請記住,我們決定忽略最後一個收入範圍,因為它將是異常值,並且會扭曲您的應用程式歸因提供者的平均計算結果。
AppsFlyer 提供SKAN Conversion Studio ,可以非常簡單地將其直接輸入到 UI 中。您可以直接使用4.0,或者如果您使用3.5,則使用「自訂」模式,並新增「收入」測量。然後,您只需新增根據先前的分析計算出的收入範圍即可。
Google Ads 的最佳實踐與學習
如果您在 Google Ads 上投放廣告活動並透過 SKAd 網路轉換價值架構衡量影響,我們希望為您提供一些建議
- 確保您在 Google Ads 上使用的轉換時間範圍與您在應用程式歸因平台上指定的活動時間範圍相符。對於 SKAd 網路 3.5,這可能會在 1-3 天內完成,因此您可以按照此處列出的步驟在 Google Ads 上進行相應調整
- 如果您使用 Appsflyer,目前預設事件計數器為 1,這表示它不會考慮每個使用者的多個事件。如果您使用基於事件的模型進行 SKAN 衡量並與 Google Ads 上的 tCPA 廣告系列進行比較,則可以選擇按照Appsflyer 的指南進行自訂
5. 恭喜
恭喜,您已成功設定 SKAd 網路轉換價值架構。現在,您可以監控Google Ads SKAd Network 報告中的數據,以便在該報告生效後檢查您的 Google Ads 廣告系列的轉換價值
你已經學會了
- 如何在 BigQuery 中探索來自 GA4F 的豐富原始數據
- 計算您企業收入的分析方法
- 使用 AppsFlyer 部署架構