Schemat wartości konwersji SKAdNetwork

1. Wprowadzenie

Kontekst przed rozpoczęciem

Jeśli tworzysz aplikacje na iOS, prawdopodobnie znasz już aktualizacje dotyczące prywatności na urządzeniach z iOS w wersji 14.5 lub nowszej. Aby mierzyć znaczące działania powodujące konwersję po instalacji, Apple udostępnia interfejs SKAd Network API, który umożliwia pomiar skuteczności kampanii reklamowych z poszanowaniem prywatności użytkowników. Na podstawie potrzeb biznesowych możesz określić, jak najlepiej wykorzystać SKAdNetwork do pozyskiwania istotnych statystyk dotyczących Twoich kampanii. W ramach tego ćwiczenia w programie omówimy przykładową metodologię wykorzystania danych GA4F w BigQuery do grupowania przychodów po instalacji aplikacji w zasobniki, które możesz potem wykorzystać do skonfigurowania wspólnie z firmą uczestniczącą w programie App Attribution Partner. Chociaż w ramach tego ćwiczenia w Codelabs stosowana jest metoda oparta na przychodach, do pomiaru SKAN możesz też używać zdarzeń lub metod opartych na ścieżce. Bardziej szczegółowe wskazówki znajdziesz w tym Centrum pomocy. To tylko przykład, a nie oficjalna rekomendacja Google. Możesz zaprojektować własny schemat zgodnie z konkretnymi potrzebami biznesowymi

Co omówimy

  • Przeglądaj dane GA4F w BigQuery
  • Znajdowanie danych o przychodach użytkowników, którzy dokonali konwersji w ciągu 0–2 dni
  • Pogrupuj dane o przychodach w grupy
  • Informacje o dystrybucji użytkowników w poszczególnych zasobnikach
  • Wdróż zasobniki w Appsflyer SKAN Conversion Studio

Wymagania wstępne

  • Pakiet SDK GA4F w aplikacji na iOS i wszystkie zintegrowane zdarzenia związane z przychodami (in_app_purchase lub przychody z reklam);
  • Eksportowanie z Firebase do BigQuery jest włączone
  • App Attribution Partner, która również rejestruje wszystkie zdarzenia związane z przychodami

2. Dostęp do BigQuery Export

Przejdź do zbioru danych w GA4F, klikając Ustawienia projektu > Integracje > BigQuery. Najpierw należy włączyć przełącznik. Udostępnienie zbioru danych zajmie około 48 godzin. Kliknij poniższy link, aby przejść do BigQuery

1aa4e20bfd3419d1.png

Wykonywanie zapytań

Po otwarciu BigQuery powinny wyświetlić się wygenerowane dzienne tabele. Na przykładowym zrzucie ekranu poniżej widać 64 dzienne tabele, więc eksport trwa 64 dni. Jeśli otwierasz ją po raz pierwszy, możesz zobaczyć tylko jedną dzienną tabelę z danymi z poprzedniego dnia. Po prawej stronie znajduje się schemat tabeli. Więcej informacji na temat pól znajdziesz tutaj

Aby zacząć pisać zapytanie, możesz kliknąć Zapytanie > W nowej karcie

42ba59ec655c5d1b.png

Następnie możesz spróbować uruchomić przykładowe zapytanie w nowej karcie

70ef90d32b7cd7f1.png

3. Analizowanie danych o przychodach

Pobieranie danych o instalacjach

Aby zacząć tworzyć grupy przychodów, musimy najpierw przeanalizować dane użytkowników, którzy zainstalowali aplikację w ciągu ostatnich 24–72 godzin. SKAd Network 4.0 pozwala przeglądać dane w ciągu 0-2 dni, a SKAd Network 3.5 domyślnie zapewnia dostęp przez 24 godziny. (W zależności od możliwości partnera uczestniczącego w programie App Attribution Partner możesz zmienić to okno aktywności zasadniczo na nie więcej niż 72 godziny). Gdy użytkownicy zainstalują i otworzą aplikację po raz pierwszy, pakiet SDK wywoła zdarzenie first_open i zarejestrowane w BigQuery.

Identyfikator, którego możesz użyć w BigQuery, to user_pseudo_id (inaczej identyfikator instancji aplikacji), więc do znalezienia tych użytkowników możesz użyć poniższego zapytania.

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'

Kilka uwag na temat tego zapytania

  • Zastąp nazwę tabeli wyeksportowaną tabelą z Analytics. Za pomocą symboli wieloznacznych możesz wysyłać zapytania do kilku tabel dziennych. Na przykład w 2023 r.* zapytania będą obejmowały wszystkie dane w roku 2023
  • Jeśli masz wielu użytkowników, możesz też wysyłać zapytania dotyczące tylko ostatnich 30 dni, aby przyspieszyć przetwarzanie
  • Filtrujemy dane według platformy = „IOS”. Jeśli w projekcie Firebase masz wiele aplikacji na iOS, możesz też dodać filtr app_info.firebase_app_id, aby uzyskać dane dotyczące konkretnej aplikacji.

Pobieranie danych o przychodach

Przyjrzyjmy się teraz zapytaniu, które pozwala określić przychody dla użytkowników. W tym przypadku zakładamy, że zdarzenia związane z przychodami to in_app_purchase i ad_impression. Przychody z zakupu in_app_purchase są podawane w parametrze event_value_usd, natomiast w przypadku ad_impression przychody są podawane w parametrze value w parametrach zdarzenia. Jeśli nie znasz parametrów zdarzeń w BigQuery, zalecamy zapoznanie się z definicją tutaj. Możesz też wypróbować to przykładowe zapytanie w naszym oficjalnym dokumencie, który obejmuje również wyodrębnianie wartości z parametru 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')

Zastanówmy się, jak działa to zapytanie. Oto elementy, które możesz zauważyć

  • W klauzuli WHERE filtrujemy zdarzenia przychodów, ponieważ interesują nas tylko te zdarzenia, i tak jak ostatnio, szukamy danych iOS.
  • W klauzuli SELECT teraz przyjmujemy zarówno wartość, jak i walutę dla zdarzenia przychodów z reklam (ad_impression). Następnie przyjmujemy wartość event_value_in_usd, gdy zdarzenie to in_app_purchase.
  • Jeśli wysyłasz wiele walut, na potrzeby tej analizy najpierw musisz wybrać jedną z tych walut. Na potrzeby tego przykładu zakładamy, że walutą przychodów z reklam jest również USD.

Wynik powinien być podobny do tego poniżej (kolumna parametru user_pseudo_id jest tu usunięta).

1e1e6943e4b3a6d8.png

Łączenie tych danych

Do tej pory uruchamialiśmy 2 zapytania: jedno w celu znalezienia danych o użytkownikach, którzy zainstalowali i uruchomili aplikację, i drugie w celu znalezienia danych o przychodach tych użytkowników. Przypomnijmy teraz, o ograniczeniach SKAdNetwork. Okno atrybucji jest dostępne tylko w ciągu 0–2 dni po instalacji. Musimy więc sprawdzić sygnatury czasowe zdarzeń pod kątem instalacji i przychodów, i korzystać tylko z tych informacji, jeśli nastąpią w tym czasie. Zobaczmy teraz, jak połączyć oba te elementy w zapytanie, które podaje łączne przychody za każdy po 2 dniach instalacji aplikacji.

#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

Zapytanie próbuje po prostu połączyć dane o instalacjach z danymi o przychodach w polu user_pseudo_id, a następnie musi się upewnić, że sygnatura czasowa mieści się w ciągu 2 dni. Jeśli korzystasz ze SKAdNetwork w wersji 3.5, wartość domyślna to 24 godziny, więc możesz też zmienić warunek, aby uwzględniał tylko dane z jednego dnia.

Grupowanie przychodów w grupy

Po poprzednim zapytaniu będziesz mieć parametr user_pseudo_id oraz łączne przychody.

2c1986b93e937d19.png

Musimy teraz połączyć te dane w segmenty, które możemy wykorzystać przy określaniu zakresów wartości konwersji. W tym celu użyjemy funkcji approx_quantiles w BigQuery, która automatycznie tworzy te zakresy. Na potrzeby tego przykładu załóżmy, że chcemy utworzyć 5 zakresów, więc możemy użyć tylko zbioru danych SELECT approx_quartiles(total_revenue, 5) AS

Teraz spójrzmy na nasze ogólne zapytanie.

#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

To zapytanie spowoduje podzielenie przychodów na 5 zasobników, a BigQuery będzie starać się zachować spójny rozkład centylowy

ba46f5d993449948.png

Przeanalizuj rozkład użytkowników w tych zasobnikach

Jest to krok opcjonalny, jeśli chcesz poznać rozkład użytkowników w poszczególnych zasobnikach. W naszym przykładzie zakresy zasobników zwrócone w poprzednim zapytaniu to

  • 0,1
  • 0,5
  • 2
  • 2.5
  • 5 [ostatniej wartości nie należy używać w konfiguracji zakresu]

W przypadku ostatnich zakresów ignorujemy ostatni segment 5, ponieważ jest to zwykle wartość maksymalna, a 2, 5 możemy uznać za ostatni. Dzieje się tak, ponieważ dostawcy atrybucji w aplikacji zwykle obliczają ROAS na podstawie średniej z zakresu, więc aby uzyskać bardziej jednolite obliczenia, należy wykluczyć wartość odstającą.

Teraz spróbujemy sprawdzić liczbę użytkowników dla każdej daty we wszystkich zakresach, aby poznać dzienną liczbę użytkowników w każdym segmencie. Możemy to zrobić za pomocą tego przykładowego zapytania, w którym możesz zastąpić wartości segmentów rzeczywistymi danymi. Będzie ono wyglądać np. tak

#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

Zwróci on użytkowników poszczególnych zakresów przychodów dla każdego dnia, tak jak poniżej. Jeśli w którymś z segmentów zauważysz bardzo niskie wartości lub ogólnie nierówną dystrybucję, być może warto dostosować liczbę segmentów i ponownie wykonać zapytanie.

bf7d73085fe94cb6.png

Kilka słów o SKAd Network 4.0

SKAd Network 4.0 zapewnia wiele okien konwersji o wartości 2, 3–7 dni i 8–35 dni. W ramach powyższego podejścia możesz łatwo zmienić okno, aby przeanalizować dane również w przypadku tych dodatkowych scenariuszy. Dostępne są też wartości przybliżone LOW, ŚREDNI i WYSOKI. Jeśli chcesz zastosować to podejście, wyobraź sobie, że jest to 3 zasobniki, więc jeśli zmienisz liczbę segmentów na 3, możesz uzyskać progi dla wartości LOW, ŚREDNI i WYSOKIEJ

4. Wdrożenie z dostawcą atrybucji

Te wskazówki mogą się różnić w zależności od platformy. Aby uzyskać najbardziej aktualne informacje na ten temat, skontaktuj się z przedstawicielem platformy. Na potrzeby tego przykładu przyjrzymy się, jak możemy obecnie wdrożyć tę funkcję w AppsFlyer.

W poprzednim uruchamianym zapytaniu ostateczne zakresy, które otrzymaliśmy jako dane wyjściowe, wyglądały tak:

ba46f5d993449948.png

  • Zakres 1 : 0–0,1
  • Zakres 2 : 0,1–0,5
  • Zakres 3 : 0,5–2
  • Zakres 4 : 2–2,5

Pamiętaj, że postanowiliśmy zignorować ostatni zakres przychodów, ponieważ będzie to wynik odstający i zniekształcone w obliczeniach średnich wartości dla dostawcy atrybucji w aplikacji.

AppsFlyer udostępnia pakiet SKAN Conversion Studio, w którym można łatwo wprowadzić te dane bezpośrednio w interfejsie. Możesz użyć wersji 4.0 bezpośrednio lub skorzystać z opcji „Niestandardowe” jeśli używasz wersji 3.5, i dodaj „Przychody”, pomiar skuteczności. Potem możesz po prostu dodać zakresy przychodów obliczone na podstawie wcześniejszej analizy.

f8c56abdf9b405f4.png

Sprawdzone metody i wnioski dotyczące Google Ads

Chcielibyśmy przekazać Ci zalecenia, jeśli prowadzisz kampanie w Google Ads i mierzysz ich wpływ z wykorzystaniem schematu wartości konwersji SKAdNetwork

  • Upewnij się, że okno konwersji, którego używasz w Google Ads, odpowiada oknie aktywności określonemu na platformie atrybucji aplikacji. W przypadku SKAd Network 3.5 jest to zwykle 1–3 dni, więc możesz go odpowiednio dostosować w Google Ads, wykonując czynności opisane tutaj.

4fd625aae9d4a43.png

  • Jeśli korzystasz z Appsflyer, obecnie domyślny licznik zdarzeń wynosi 1. Oznacza to, że nie uwzględnia on wielu zdarzeń na użytkownika. Jeśli do pomiaru SKAN używasz modelu opartego na zdarzeniach i porównujesz go z kampaniami ze strategią Docelowy CPA w Google Ads, możesz dostosować model zgodnie z tymi wskazówkami platformy Appsflyer.

6c7a4d703567700a.png

5. Gratulacje

Udało Ci się skonfigurować schemat wartości konwersji SKAdNetwork. Możesz teraz sprawdzać dane w raporcie Google Ads SKAdNetwork, aby sprawdzać wartości konwersji w kampaniach Google Ads po ich uruchomieniu.

Wiesz już

  • Jak przeglądać rozszerzone nieprzetworzone dane z GA4F w BigQuery
  • Podejście analityczne do obliczania zbiorczych przychodów firmy
  • Wdrażanie schematu za pomocą AppsFlyer