Oblicz grupy przychodów dla schematu wartości konwersji sieci SKAd

1. Wstęp

Trochę kontekstu, zanim zaczniemy

Jeśli jesteś programistą aplikacji na iOS, na pewno słyszałeś o aktualizacjach prywatności iOS 14.5+ . Aby mierzyć znaczące działania powodujące konwersję po instalacji, Apple udostępnia interfejs API sieci SKAd , który pozwala mierzyć skuteczność kampanii reklamowych przy jednoczesnym poszanowaniu prywatności użytkowników. W zależności od potrzeb biznesowych możesz znaleźć najbardziej optymalny sposób wykorzystania sieci SKAd do gromadzenia istotnych informacji na temat swoich kampanii. W tych ćwiczeniach z programowania sprawdzimy przykładową metodologię wykorzystania danych GA4F w BigQuery do grupowania przychodów po instalacji aplikacji w zasobniki, których możesz następnie użyć do skonfigurowania współpracy ze swoim partnerem w zakresie atrybucji aplikacji. Chociaż w tym laboratorium programistycznym zastosowano podejście oparte na przychodach, do pomiaru SKAN można również zastosować podejście oparte na zdarzeniach lub lejkach. Bardziej szczegółowe wskazówki można znaleźć w tym centrum pomocy . To tylko przykład, a nie oficjalna rekomendacja Google . Możesz zaprojektować własny schemat w oparciu o konkretne potrzeby biznesowe

Co zamierzamy omówić

  • Przeglądaj dane GA4F w BigQuery
  • Znajdź dane o przychodach użytkowników, którzy dokonali konwersji w ciągu 0–2 dni
  • Grupuj dane o przychodach w segmenty
  • Zrozum rozkład użytkowników w każdym segmencie
  • Zaimplementuj segmenty w Appsflyer SKAN Conversion Studio

Wymagania wstępne

2. Dostęp do BigQuery Export

Przejdź do zbioru danych w GA4F, odwiedzając Ustawienia projektu > Integracje > BigQuery. Najpierw należy włączyć przełącznik. Po włączeniu zbiór danych będzie dostępny po około 48 godzinach. Możesz kliknąć link pokazany poniżej, który przeniesie Cię do BigQuery

1aa4e20bfd3419d1.png

Uruchom kilka zapytań

Teraz, gdy jesteś w BigQuery, powinieneś zobaczyć wygenerowane tabele dzienne. Na poniższym przykładowym zrzucie ekranu widzimy 64 tabele dzienne, zatem eksport trwa już 64 dni. Jeśli uzyskujesz do niego dostęp po raz pierwszy, możesz zobaczyć tylko 1 tabelę dzienną zawierającą dane z poprzedniego dnia. Po prawej stronie widzisz schemat tabeli. Więcej szczegółów na temat pól można znaleźć tutaj

Aby rozpocząć pisanie zapytania, 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. Analizuj dane dotyczące przychodów

Pobieram dane instalacyjne

Teraz, aby rozpocząć budowanie segmentów przychodów, musimy najpierw przyjrzeć się danym użytkowników, którzy zainstalowali aplikację w ciągu ostatnich 24–72 godzin. SKAd Network 4.0 umożliwia przeglądanie danych w ciągu 0-2 dni, natomiast SKAd Network 3.5 domyślnie umożliwia przeglądanie danych w ciągu 24 godzin. (W zależności od możliwości Twojego partnera przypisania aplikacji możesz ogólnie zmodyfikować to okno działania do nie więcej niż 72 godzin). Gdy użytkownicy instalują aplikację i otwierają ją po raz pierwszy, pakiet SDK uruchamia zdarzenie First_open i rejestruje je w BigQuery.

Identyfikator, którego możesz użyć w BigQuery, to user_pseudo_id (zwany także identyfikatorem instancji aplikacji), więc możesz użyć poniższego zapytania, aby znaleźć tych użytkowników

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'

Warto zwrócić uwagę na kilka rzeczy na temat tego zapytania

  • Zastąp nazwę tabeli tabelą wyeksportowaną z Analytics. Możesz używać symboli wieloznacznych do wysyłania zapytań do wielu tabel dziennych. Na przykład 2023* przeprowadzi zapytanie do wszystkich danych w roku 2023
  • Jeśli masz wielu użytkowników, możesz także wysłać zapytanie tylko z ostatnich 30 dni, aby przyspieszyć przetwarzanie
  • Filtrujemy według platformy = „IOS”. Jeśli w projekcie Firebase masz wiele aplikacji na iOS, możesz także dodać filtr dla app_info.firebase_app_id, aby uzyskać dane dla konkretnej aplikacji

Pobieram dane o przychodach

Przyjrzyjmy się teraz zapytaniu, które pozwala znaleźć 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 in_app_purchase są dostępne w event_value_usd, natomiast w przypadku ad_impression przychody są dostępne w parametrze value, w ramach parametrów event. Jeśli nie znasz parametrów zdarzeń w BigQuery, polecam sprawdzić definicję tutaj i możesz wypróbować to przykładowe zapytanie w naszym oficjalnym podręczniku, który obejmuje również wyodrębnianie wartości z parametrów zdarzenia

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')

Rozumiemy, co robi tutaj zapytanie. To są rzeczy, które byś zauważył

  • W klauzuli WHERE filtrujemy po zdarzeniach przychodowych, bo tylko one nas interesują i podobnie jak ostatnim razem szukamy danych iOS
  • Teraz w klauzuli SELECT bierzemy wartość i walutę zdarzenia generującego przychody z reklam (ad_impression) oraz wartość event_value_in_usd, gdy zdarzenie ma miejsce w_app_purchase
  • Jeśli wysyłasz wiele walut, najpierw musisz dostosować się do jednej waluty na potrzeby tej analizy. Na potrzeby tego przykładu założymy, że walutą przychodów finansowanych z reklam jest również USD

Wynik będzie podobny do poniższego (kolumna user_pseudo_id została tutaj zredagowana).

1e1e6943e4b3a6d8.png

Łączenie tych danych

Do tej pory uruchomiliśmy dwa zapytania, jedno w celu znalezienia danych użytkowników, którzy zainstalowali i otworzyli aplikację, a drugie w celu znalezienia przychodów tych użytkowników. Przypomnijmy sobie teraz, co omawialiśmy na temat ograniczeń sieci SKAd. Okno przypisania może być dostępne tylko w ciągu 0–2 dni po instalacji. Dlatego będziemy musieli sprawdzić znaczniki czasu zdarzeń pod kątem instalacji i przychodów i zbierać informacje tylko wtedy, gdy nastąpi to w tym przedziale czasowym. Spróbujmy teraz połączyć je w zapytanie, które poda całkowity przychód za każdy post z dwóch dni 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 po prostu próbuje połączyć dane dotyczące instalacji i danych o przychodach w polu user_pseudo_id, a następnie musimy upewnić się, że sygnatura czasowa przypada w ciągu 2 dni. Jeśli korzystasz z SKAd Network 3.5, wartością domyślną są 24 godziny, więc możesz także zmienić warunek tak, aby obejmował tylko dane z 1 dnia

Grupowanie przychodów w koszyki

Po poprzednim zapytaniu będziesz mieć user_pseudo_id i całkowity przychód

2c1986b93e937d19.png

Będziemy teraz musieli połączyć to w segmenty, których będziemy mogli użyć dla naszych zakresów wartości konwersji. W tym celu skorzystamy z funkcji about_quantiles w BigQuery, która automatycznie utworzy za Ciebie te zakresy. Załóżmy na potrzeby tego przykładu, że chcemy utworzyć 5 zakresów, więc możemy po prostu użyć segmentów SELECT około_quantiles(total_revenue, 5) AS

W związku z tym uwzględnijmy to w naszym ogólnym zapytaniu

#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 podzieli przychody na 5 segmentów, a BigQuery spróbuje zachować spójny rozkład percentylowy

ba46f5d993449948.png

Analizuj rozkład użytkowników za pomocą tych zasobników

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

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

W przypadku końcowych zakresów pominiemy ostatni segment 5, ponieważ jest to zazwyczaj wartość maksymalna, a za ostatni zakres możemy uznać 2,5. Dzieje się tak dlatego, że dostawcy atrybucji aplikacji zwykle obliczają ROAS na podstawie średniej z zakresu, dlatego w celu uzyskania bardziej jednolitych obliczeń należy wykluczyć wartość odstającą.

Spróbujemy teraz sprawdzić liczbę użytkowników dla każdej daty we wszystkich zakresach, abyśmy mogli zrozumieć 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 rzeczywiste dane, a zapytanie będzie wyglądać mniej więcej 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 użytkowników w każdym przedziale przychodów dla każdego dnia, jak poniżej. Jeśli w którymkolwiek zasobniku widzisz bardzo niskie liczby lub ogólnie nierówny rozkład, możesz dostosować liczbę zasobników i ponownie uruchomić zapytanie.

bf7d73085fe94cb6.png

Krótkie słowo na temat SKAd Network 4.0

SKAd Network 4.0 zapewnia wiele okien konwersji trwających do 2 dni, 3-7 dni i 8-35 dni. W powyższym podejściu możesz łatwo zmienić okno, aby analizować dane również dla tych dodatkowych scenariuszy. Dostępne są również wartości gruboziarniste LOW, MEDIUM i HIGH. Ponownie, jeśli chcesz zastosować to podejście, możesz myśleć o tym jak o 3 segmentach. Zatem zmieniając liczbę segmentów na 3, możesz uzyskać progi dla NISKIEGO, ŚREDNIEGO i WYSOKIEGO

4. Wdrożenie u Twojego dostawcy atrybucji

W zależności od konkretnej platformy te wskazówki mogą się zmienić. Aby uzyskać najbardziej aktualne informacje na ten temat, skontaktuj się z przedstawicielami platformy. Na potrzeby tego przykładu przyjrzymy się, jak możemy obecnie wdrożyć to w AppsFlyer

W zapytaniu, które uruchomiliśmy wcześniej, końcowe zakresy otrzymane jako dane wyjściowe były następujące

ba46f5d993449948.png

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

Pamiętaj, że postanowiliśmy zignorować ostatni zakres przychodów , ponieważ będzie to wartość odstająca i wypaczyć średnie obliczenia dla Twojego dostawcy atrybucji aplikacji.

AppsFlyer oferuje SKAN Conversion Studio , w którym wprowadzenie tego bezpośrednio do interfejsu użytkownika jest dość proste. Możesz użyć wersji 4.0 bezpośrednio lub użyć trybu „Niestandardowego”, jeśli używasz wersji 3.5, i dodać pomiar „Przychodów”. Następnie możesz po prostu dodać zakresy przychodów obliczone na podstawie wcześniejszej analizy.

f8c56abdf9b405f4.png

Najlepsze praktyki i wnioski dotyczące Google Ads

Chcielibyśmy podzielić się z Tobą kilkoma rekomendacjami, jeśli prowadzisz kampanie w Google Ads i mierzysz wpływ za pomocą schematu wartości konwersji w sieci SKAd

  • Upewnij się, że okno konwersji, którego używasz w Google Ads, odpowiada oknu aktywności określonemu na platformie App Attribution. W przypadku sieci SKAd 3.5 nastąpi to prawdopodobnie w ciągu 1–3 dni, więc możesz to odpowiednio dostosować w Google Ads, wykonując czynności wymienione tutaj

4fd625aae9d4a43.png

  • Jeśli korzystasz z Appsflyer, obecnie domyślny licznik zdarzeń wynosi 1, co oznacza, że ​​nie uwzględnia on wielu zdarzeń na użytkownika. Jeśli używasz modelu opartego na zdarzeniach do pomiaru SKAN i porównujesz go z kampaniami tCPA w Google Ads, możesz dostosować, postępując zgodnie ze wskazówkami z Appsflyer

6c7a4d703567700a.png

5. Gratulacje

Gratulacje, pomyślnie skonfigurowałeś schemat wartości konwersji sieciowej SKAd. Możesz teraz monitorować dane w raporcie sieci SKAd Google Ads, aby sprawdzić wartości konwersji w kampaniach Google Ads po jego uruchomieniu

Nauczyłeś się

  • Jak eksplorować bogate, surowe dane z GA4F w BigQuery
  • Analityczne podejście do obliczania koszyków przychodów dla Twojej firmy
  • Wdróż schemat za pomocą AppsFlyer