Tính toán nhóm doanh thu cho giản đồ giá trị chuyển đổi của mạng SKAd

1. Giới thiệu

Một số thông tin bối cảnh trước khi bắt đầu

Nếu là nhà phát triển ứng dụng iOS thì chắc hẳn bạn đã biết đến bản cập nhật quyền riêng tư của iOS 14.5 trở lên. Để đo lường những hành động chuyển đổi có ý nghĩa sau khi cài đặt, Apple cung cấp API mạng SKAdNetwork. API này cho phép bạn đo lường mức độ thành công của các chiến dịch quảng cáo trong khi vẫn tôn trọng quyền riêng tư của người dùng. Dựa trên nhu cầu kinh doanh, bạn có thể tìm ra cách tối ưu nhất là tận dụng Mạng SKAd để thu thập thông tin chi tiết có ý nghĩa về chiến dịch của mình. Trong lớp học lập trình này, chúng ta sẽ tìm hiểu một phương pháp mẫu giúp tận dụng dữ liệu của GA4F trong BigQuery nhằm nhóm doanh thu sau khi cài đặt ứng dụng vào các nhóm. Sau đó, bạn có thể sử dụng phương pháp này để thiết lập với đối tác phân bổ ứng dụng. Mặc dù lớp học lập trình này sử dụng phương pháp dựa trên doanh thu, nhưng bạn cũng có thể sử dụng các phương pháp dựa trên sự kiện hoặc phễu để đo lường SKAN. Vui lòng tham khảo trung tâm trợ giúp này để biết thêm hướng dẫn chi tiết. Đây chỉ là một ví dụ, không phải là đề xuất chính thức của Google. Bạn có thể thiết kế giản đồ riêng dựa trên các nhu cầu kinh doanh cụ thể của mình

Nội dung chúng tôi dự định đề cập

  • Khám phá dữ liệu của GA4F trong BigQuery
  • Tìm dữ liệu doanh thu cho những người dùng đã chuyển đổi trong vòng 0-2 ngày
  • Nhóm dữ liệu doanh thu thành các nhóm
  • Tìm hiểu cách phân bổ người dùng trong mỗi nhóm
  • Triển khai các bộ chứa trong Appsflyer SKAN Conversion Studio

Điều kiện tiên quyết

2. Truy cập vào BigQuery Export

Chuyển đến tập dữ liệu trong GA4F bằng cách chuyển đến phần Cài đặt dự án > Tích hợp > BigQuery. Trước tiên, bạn cần bật nút bật/tắt này. Sau khi bật, tập dữ liệu sẽ mất khoảng 48 giờ mới truy cập được. Bạn có thể nhấp vào đường liên kết xuất hiện bên dưới để chuyển đến BigQuery

1aa4e20bfd3419d1.png.

Chạy một số truy vấn

Bây giờ, bạn đã ở trong BigQuery, nên bạn sẽ thấy các bảng hằng ngày được tạo. Trong ảnh chụp màn hình ví dụ bên dưới, chúng ta thấy 64 bảng hằng ngày, vì vậy quá trình xuất đã chạy được 64 ngày. Nếu đây là lần đầu tiên truy cập vào bảng này, bạn có thể chỉ thấy 1 bảng hằng ngày cho dữ liệu của ngày trước đó. Ở bên phải, bạn sẽ thấy giản đồ bảng. Bạn có thể tham khảo thêm thông tin về các trường tại đây

Để bắt đầu viết truy vấn, bạn có thể nhấp vào Truy vấn > Trong thẻ mới

42ba59ec655c5d1b.png.

Sau đó, bạn có thể thử chạy truy vấn mẫu trong thẻ mới

70ef90d32b7cd7f1.pngS

3. Phân tích dữ liệu doanh thu

Tìm nạp dữ liệu về lượt cài đặt

Bây giờ, để bắt đầu xây dựng nhóm doanh thu, trước tiên, chúng tôi phải xem xét dữ liệu về người dùng đã cài đặt ứng dụng trong vòng 24 đến 72 giờ qua. SKAd Network 4.0 cho phép bạn xem dữ liệu trong 0-2 ngày, trong khi SKAd Network 3.5 cho phép 24 giờ theo mặc định. (Tuỳ thuộc vào khả năng của Đối tác phân bổ ứng dụng, bạn có thể sửa đổi khoảng thời gian hoạt động này thường không quá 72 giờ). Khi người dùng cài đặt và mở ứng dụng lần đầu tiên, sự kiện first_open sẽ được SDK kích hoạt và được ghi lại trong BigQuery.

Giá trị nhận dạng mà bạn có thể sử dụng cho BigQuery là user_pseudo_id (còn được gọi là mã phiên bản ứng dụng). Vì vậy, bạn có thể sử dụng truy vấn bên dưới để tìm những người dùng này

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'

Một vài điều cần lưu ý về truy vấn này

  • Vui lòng thay thế tên bảng bằng bảng đã xuất Analytics. Bạn có thể sử dụng ký tự đại diện để truy vấn nhiều bảng hằng ngày. Ví dụ: năm 2023* sẽ truy vấn trên tất cả dữ liệu vào năm 2023
  • Nếu có nhiều người dùng, bạn cũng có thể chỉ truy vấn 30 ngày qua để xử lý nhanh hơn
  • Chúng tôi lọc trên nền tảng = "IOS". Trong trường hợp có nhiều Ứng dụng iOS trong dự án Firebase, bạn cũng có thể thêm bộ lọc cho app_info.firebase_app_id để lấy dữ liệu cho ứng dụng cụ thể đó

Tìm nạp dữ liệu doanh thu

Bây giờ, hãy cùng xem một truy vấn để tìm doanh thu cho người dùng. Trong trường hợp này, chúng tôi sẽ giả định rằng sự kiện doanh thu của bạn là in_app_purchase và ad_impression. Bạn có thể xem doanh thu từ in_app_purchase trong event_value_usd, còn đối với ad_impression, doanh thu có trong thông số giá trị và nằm trong các thông số sự kiện. Nếu chưa hiểu rõ về các thông số sự kiện trong BigQuery, bạn nên xem định nghĩa tại đây và bạn có thể thử truy vấn mẫu này trong tài liệu tham khảo chính thức của chúng tôi. Tài liệu này cũng đề cập đến việc trích xuất giá trị từ 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')

Hãy cùng tìm hiểu chức năng của truy vấn này tại đây. Đây là những điều bạn sẽ nhận thấy

  • Trong mệnh đề WHERE, chúng ta sẽ lọc các sự kiện doanh thu vì chúng ta chỉ quan tâm đến những sự kiện đó và giống như lần trước, chúng ta đang tìm kiếm dữ liệu iOS
  • Bây giờ, trong mệnh đề SELECT, chúng ta sẽ lấy giá trị cũng như đơn vị tiền tệ cho sự kiện doanh thu từ quảng cáo (ad_impression) và sử dụng event_value_in_usd khi sự kiện là in_app_purchase
  • Nếu gửi nhiều đơn vị tiền tệ, thì trước tiên bạn cần điều chỉnh theo một đơn vị tiền tệ duy nhất để phân tích này. Trong ví dụ này, chúng tôi sẽ giả định rằng đơn vị tiền tệ của doanh thu từ quảng cáo được tài trợ cũng là đô la Mỹ

Kết quả sẽ có dạng như dưới đây (cột user_pseudo_id bị loại bỏ tại đây).

1e1e6943e4b3a6d8.png.

Kết hợp dữ liệu này

Cho đến thời điểm hiện tại, chúng tôi đã chạy 2 truy vấn: một truy vấn để tìm dữ liệu về những người dùng đã cài đặt và mở ứng dụng và một truy vấn khác để tìm doanh thu cho những người dùng đó. Bây giờ, hãy nhớ lại những điều chúng ta đã thảo luận về các hạn chế của Mạng SKAd. Bạn chỉ có thể phân bổ khoảng thời gian phân bổ trong vòng 0 đến 2 ngày sau khi cài đặt. Do đó, chúng tôi sẽ cần kiểm tra dấu thời gian của sự kiện để biết thông tin về lượt cài đặt và doanh thu, đồng thời chỉ lấy thông tin này nếu xảy ra trong khung thời gian đó. Bây giờ, hãy cùng thử kết hợp truy vấn để cung cấp tổng doanh thu cho mỗi bài đăng cài đặt ứng dụng trong 2 ngày

#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

Truy vấn này chỉ cố gắng kết hợp dữ liệu lượt cài đặt và dữ liệu doanh thu trên trường user_pseudo_id, sau đó chúng ta phải đảm bảo rằng dấu thời gian nằm trong vòng 2 ngày. Nếu bạn đang sử dụng SKAd Network 3.5, giá trị mặc định là 24 giờ, vì vậy, bạn cũng có thể thay đổi điều kiện để chỉ đưa vào dữ liệu của 1 ngày

Chia doanh thu thành các nhóm

Sau truy vấn trước đó, bạn sẽ có user_pseudo_id và tổng doanh thu

2c1986b93e937d19.png.

Bây giờ, chúng ta cần phải kết hợp giá trị này thành các nhóm mà chúng ta có thể sử dụng cho phạm vi giá trị chuyển đổi. Vì mục đích này, chúng tôi sẽ sử dụng hàm approx_quantiles trong BigQuery để tự động tạo các phạm vi này cho bạn. Giả sử trong ví dụ này chúng ta muốn tạo 5 phạm vi, do đó, chúng ta có thể chỉ sử dụng nhóm SELECT approx_quantiles(total_revenue, 5) AS

Cùng với đó, hãy kết hợp điều này vào truy vấn chung của chúng ta

#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

Truy vấn này sẽ chia doanh thu thành 5 nhóm và BigQuery cố gắng duy trì mức phân phối phân vị nhất quán

ba46f5d993449948.pngS

Phân tích hoạt động phân phối của người dùng khi dùng các bộ chứa này

Đây là bước không bắt buộc nếu bạn muốn tìm hiểu cơ chế phân bổ người dùng trong mỗi nhóm. Ví dụ: các phạm vi nhóm được trả về trong truy vấn trước đó là

  • 0,1
  • 0,5
  • 2
  • 2.5
  • 5 [giá trị cuối cùng sẽ không được sử dụng trong cấu hình dải ô]

Đối với các phạm vi cuối cùng, chúng ta sẽ bỏ qua nhóm cuối cùng 5, vì đó thường là giá trị lớn nhất và chúng ta có thể coi 2, 5 là phạm vi cuối cùng. Điều này là do các nhà cung cấp dịch vụ phân bổ ứng dụng có xu hướng tính toán ROAS bằng cách sử dụng giá trị trung bình của phạm vi, vì vậy, bạn phải loại trừ giá trị ngoại lệ để tính toán thống nhất hơn.

Bây giờ, chúng ta sẽ cố gắng xem xét số lượng người dùng của từng ngày trên tất cả các phạm vi để có thể hiểu số lượng người dùng hằng ngày trong mỗi nhóm.Chúng ta có thể làm việc đó bằng cách sử dụng truy vấn mẫu này, trong đó bạn có thể thay thế các giá trị nhóm bằng dữ liệu thực tế của mình và truy vấn sẽ có dạng như sau

#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

API này sẽ trả về người dùng trong từng phạm vi doanh thu mỗi ngày, như bên dưới. Nếu bạn thấy số lượng rất thấp trong bất kỳ nhóm nào hoặc phân phối thường không đồng đều, bạn có thể muốn điều chỉnh số nhóm và chạy lại truy vấn.

bf7d73085fe94cb6.png.

Giới thiệu ngắn gọn về SKAd Network 4.0

SKAd Network 4.0 cung cấp nhiều khoảng thời gian chuyển đổi lên đến 2 ngày, 3-7 ngày và 8-35 ngày. Trong phương pháp trên, bạn cũng có thể dễ dàng thay đổi cửa sổ phân tích dữ liệu cho các trường hợp bổ sung này. Bạn cũng có thể sử dụng giá trị chi tiết thô là THẤP, TRUNG BÌNH và CAO. Xin nhắc lại, nếu muốn sử dụng phương pháp này, bạn có thể coi đây là 3 nhóm. Vì vậy, bằng cách thay đổi số lượng nhóm thành 3, bạn có thể nhận được các ngưỡng cho THẤP, TRUNG BÌNH và CAO

4. Triển khai với nhà cung cấp phân bổ của bạn

Tuỳ thuộc vào nền tảng cụ thể, hướng dẫn này có thể thay đổi. Vui lòng làm việc với người đại diện của nền tảng để biết thông tin mới nhất về vấn đề này. Trong ví dụ này, chúng ta sẽ xem xét cách chúng ta hiện có thể triển khai tính năng này trên AppsFlyer

Trong truy vấn mà chúng tôi đã chạy trước đây, phạm vi cuối cùng mà chúng tôi nhận được dưới dạng kết quả như bên dưới

ba46f5d993449948.pngS

  • Phạm vi 1 : 0 đến 0,1
  • Phạm vi 2 : 0,1 đến 0,5
  • Phạm vi 3 : 0,5 đến 2
  • Phạm vi 4 : 2 đến 2,5

Hãy nhớ rằng chúng tôi đã quyết định bỏ qua phạm vi doanh thu gần đây nhất, vì đây sẽ là phạm vi ngoại lệ và làm sai lệch kết quả tính toán trung bình cho nhà cung cấp phân bổ ứng dụng của bạn.

AppsFlyer cung cấp SKAN Conversion Studio, cho phép bạn nhập trực tiếp mã này trực tiếp vào giao diện người dùng một cách khá đơn giản. Bạn có thể dùng trực tiếp phiên bản 4.0 hoặc dùng phiên bản "Tuỳ chỉnh" nếu bạn đang sử dụng phiên bản 3.5 và thêm "Doanh thu" đo lường. Sau đó, bạn chỉ cần thêm phạm vi doanh thu mà bạn đã tính được từ bản phân tích trước đó.

f8c56abdf9b405f4.png.

Các phương pháp hay nhất và bài học về Google Ads

Chúng tôi xin chia sẻ một số đề xuất nếu bạn đang chạy các chiến dịch trên Google Ads và đo lường mức tác động thông qua giản đồ giá trị lượt chuyển đổi trên Mạng SKAd

  • Hãy đảm bảo rằng khoảng thời gian chuyển đổi mà bạn đang sử dụng trên Google Ads khớp với khoảng thời gian hoạt động mà bạn đã chỉ định trên nền tảng Phân bổ ứng dụng. Đối với mạng SKAd 3.5, khoảng thời gian này có thể là trong vòng 1 đến 3 ngày. Vì vậy, bạn có thể điều chỉnh nó cho phù hợp trên Google Ads bằng cách làm theo các bước được nêu tại đây

4fd625aae9d4a43.pngS

  • Nếu bạn đang sử dụng Appsflyer, thì hiện bộ đếm sự kiện mặc định là 1. Điều này có nghĩa là bộ đếm sự kiện này không tính đến nhiều sự kiện cho mỗi người dùng. Nếu đang sử dụng mô hình dựa trên sự kiện để đo lường SKAN và so sánh với các chiến dịch CPA mục tiêu trên Google Ads, bạn có thể chọn tuỳ chỉnh bằng cách làm theo hướng dẫn này của Appsflyer

6c7a4d703567700a.pngS

5. Xin chúc mừng

Xin chúc mừng! Bạn đã thiết lập thành công giản đồ giá trị lượt chuyển đổi của Mạng SKAd. Giờ đây, bạn có thể theo dõi dữ liệu trong báo cáo Mạng SKAd của Google Ads để kiểm tra giá trị lượt chuyển đổi cho các chiến dịch trên Google Ads sau khi dữ liệu này hoạt động

Bạn đã tìm hiểu về

  • Cách khám phá dữ liệu thô phong phú từ GA4F trong BigQuery
  • Phương pháp phân tích để tính nhóm doanh thu cho doanh nghiệp của bạn
  • Triển khai giản đồ bằng AppsFlyer