Umsatzgruppen für das SKAdNetwork-Conversion-Wert-Schema berechnen

1. Einführung

Zuerst ein wenig Hintergrundwissen

Wenn Sie ein iOS-App-Entwickler sind, müssen Sie die Datenschutzupdates für iOS 14.5 und höher kennen. Damit nach der Installation sinnvolle Conversion-Aktionen erfasst werden können, stellt Apple die SKAd Network API bereit. Damit können Sie unter Wahrung des Datenschutzes den Erfolg Ihrer Werbekampagnen messen. Je nach Ihren Geschäftsanforderungen können Sie SKAdNetwork optimal nutzen, um aussagekräftige Informationen zu Ihren Kampagnen zu erhalten. In diesem Codelab sehen wir uns eine Beispielmethode an, mit der Sie Ihre GA4F-Daten in BigQuery verwenden, um den Umsatz nach App-Installation in Buckets zu gruppieren. Diese können Sie dann mit Ihrem App-Attributionspartner einrichten. In diesem Codelab wird ein umsatzbasierter Ansatz verwendet. Sie können aber auch Ereignisse oder Trichterbasierte Ansätze für die SKAN-Analyse verwenden. Weitere Informationen finden Sie in diesem Hilfeartikel. Dies ist nur ein Beispiel, keine offizielle Empfehlung von Google. Sie können Ihr eigenes Schema basierend auf Ihren spezifischen Geschäftsanforderungen entwerfen

Unsere Ziele

  • GA4F-Daten in BigQuery untersuchen
  • Umsatzdaten für Nutzer abrufen, die innerhalb von 0–2 Tagen eine Conversion ausgeführt haben
  • Umsatzdaten in Buckets gruppieren
  • Übersicht über die Nutzerverteilung in den einzelnen Buckets
  • Bucket im Appsflyer SKAN Conversion Studio implementieren

Voraussetzungen

  • GA4F SDK in Ihrer iOS-App und alle Umsatzereignisse (in_app_purchase oder Werbeeinnahmen)
  • Firebase nach BigQuery Export aktiviert
  • App Attribution Partner, der auch alle Umsatzereignisse aufzeichnet

2. Auf BigQuery Export zugreifen

Rufen Sie das Dataset in GA4F über Projekteinstellungen > Integrationen > BigQuery Die Option muss zuerst aktiviert werden. Nach der Aktivierung dauert es etwa 48 Stunden, bis der Datensatz verfügbar ist. Klicken Sie auf den unten stehenden Link, um zu BigQuery zu gelangen.

1aa4e20bfd3419d1.png

Abfragen ausführen

Jetzt sollten Sie in BigQuery die generierten täglichen Tabellen sehen. Im folgenden Beispiel-Screenshot sehen wir 64 tägliche Tabellen. Der Export wird also seit 64 Tagen ausgeführt. Wenn Sie zum ersten Mal darauf zugreifen, wird möglicherweise nur eine Tagestabelle mit den Daten des Vortags angezeigt. Rechts sehen Sie das Tabellenschema. Weitere Informationen zu den Feldern

Um mit dem Schreiben Ihrer Abfrage zu beginnen, klicken Sie auf Abfrage > In neuem Tab

42ba59ec655c5d1b.png

Sie können dann versuchen, die Beispielabfrage auf dem neuen Tab auszuführen

70ef90d32b7cd7f1.png

3. Umsatzdaten analysieren

Installationsdaten abrufen

Um die Umsatzgruppen zu erstellen, müssen wir uns zuerst die Daten der Nutzer ansehen, die die App in den letzten 24 bis 72 Stunden installiert haben. Mit SKAdNetwork 4.0 können Sie Daten nach 0 bis 2 Tagen abrufen. Bei SKAdNetwork 3.5 sind standardmäßig 24 Stunden erforderlich. Je nach den Funktionen Ihres App-Attributionspartners können Sie diesen Aktivitätszeitraum in der Regel auf maximal 72 Stunden festlegen. Wenn Nutzer die App installieren und zum ersten Mal öffnen, wird vom SDK das Ereignis „first_open“ ausgelöst und in BigQuery aufgezeichnet.

Die Kennung, die Sie für BigQuery verwenden können, ist „user_pseudo_id“ (auch „App-Instanz-ID“ genannt). Mit der folgenden Abfrage können Sie diese Nutzer finden.

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'

Hinweise zu dieser Abfrage

  • Ersetzen Sie den Tabellennamen durch die exportierte Analytics-Tabelle. Sie können Platzhalter verwenden, um mehrere Tagestabellen abzufragen. Beispiel: Für 2023* werden alle Daten im Jahr 2023 abgefragt.
  • Wenn Sie viele Nutzer haben, können Sie auch nur die letzten 30 Tage abfragen, um die Verarbeitung zu beschleunigen.
  • Wir filtern nach „platform“ = „iOS“. Wenn Ihr Firebase-Projekt mehrere iOS-Apps umfasst, können Sie auch einen Filter für app_info.firebase_app_id hinzufügen, um Daten für die jeweilige App zu erhalten.

Umsatzdaten abrufen

Sehen wir uns nun eine Abfrage an, um den Umsatz für Ihre Nutzer zu ermitteln. In diesem Fall gehen wir davon aus, dass Ihre Umsatzereignisse „in_app_purchase“ und „ad_impression“ sind. Der Umsatz aus „in_app_purchase“ ist in „event_value_usd“ verfügbar. Für „ad_impression“ ist der Umsatz im Parameter „value“ innerhalb der Ereignisparameter verfügbar. Wenn Sie mit Ereignisparametern in BigQuery nicht vertraut sind, finden Sie hier eine Definition. In unserer offiziellen Referenz finden Sie auch eine Beispielabfrage, in der auch das Extrahieren des Werts aus „event_params“ behandelt wird.

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

Schauen wir uns an, was die Abfrage hier bewirkt. Das sind die Dinge, die Ihnen auffallen

  • In der WHERE-Klausel filtern wir nach Umsatzereignissen, da wir nur an diesen interessiert sind, und wie beim letzten Mal nach iOS-Daten suchen.
  • In der SELECT-Klausel verwenden wir den Wert und die Währung für das Ereignis „Werbeeinnahmen“ (ad_impression) und den „event_value_in_usd“, wenn das Ereignis „in_app_purchase“ ist.
  • Falls Sie mehrere Währungen senden möchten, müssen Sie diese für diese Analyse zunächst auf eine einzige Währung abstimmen. Für dieses Beispiel gehen wir davon aus, dass die Währung für werbefinanzierte Umsätze ebenfalls US-Dollar ist.

Die Ausgabe sieht in etwa so aus (die Spalte für user_pseudo_id wird hier entfernt).

1e1e6943e4b3a6d8.png

Diese Daten kombinieren

Bisher haben wir zwei Abfragen ausgeführt: eine, um die Daten der Nutzer zu finden, die die App installiert und geöffnet haben, und eine weitere, um den Umsatz dieser Nutzer zu ermitteln. Denken Sie noch einmal an die Einschränkungen des SKAdNetwork. Der Attributionszeitraum kann nur innerhalb von 0–2 Tagen nach der Installation verfügbar sein. Daher müssen wir die Ereigniszeitstempel für Installationen und Umsatz prüfen und nur die Informationen berücksichtigen, die innerhalb dieses Zeitraums auftreten. Versuchen wir nun, beide Abfragen in einer einzigen zu kombinieren, die den Gesamtumsatz für jeden Tag nach der App-Installation liefert.

#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

Mit der Abfrage werden nur die Installationsdaten und die Umsatzdaten im Feld „user_pseudo_id“ zusammengeführt. Dann müssen wir dafür sorgen, dass der Zeitstempel innerhalb von zwei Tagen liegt. Wenn Sie SKAd Network 3.5 verwenden, ist die Standardeinstellung 24 Stunden. Sie können die Bedingung also auch so ändern, dass nur die Daten eines Tages enthalten sind.

Umsatz in Kategorien gruppieren

Nach der vorherigen Abfrage sollten Sie die „user_pseudo_id“ und den Gesamtumsatz haben.

2c1986b93e937d19.png

Jetzt müssen wir dies in Gruppen kombinieren, die wir für unsere Conversion-Wert-Bereiche verwenden können. Dazu verwenden wir die Funktion approx_quantiles in BigQuery, mit der diese Bereiche automatisch erstellt werden. Angenommen, wir möchten in diesem Beispiel fünf Bereiche erstellen. Dann können wir einfach SELECT approx_quantiles(total_revenue, 5) AS buckets verwenden.

Binden wir dies nun in unsere Gesamtabfrage ein.

#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

Mit dieser Abfrage wird der Umsatz in fünf Bucket unterteilt. BigQuery versucht, eine einheitliche Prozentrangverteilung beizubehalten.

ba46f5d993449948.png

Nutzerverteilung mit diesen Gruppen analysieren

Dieser Schritt ist optional, wenn Sie die Verteilung Ihrer Nutzer in den einzelnen Buckets nachvollziehen möchten. In unserem Beispiel sind das die Bucket-Bereiche, die in der vorherigen Abfrage zurückgegeben wurden:

  • 0,1
  • 0,5
  • 2
  • 2,5
  • 5 [Der letzte Wert darf in der Bereichskonfiguration nicht verwendet werden]

Für die endgültigen Bereiche ignorieren wir den letzten Bucket 5, da dies in der Regel der Maximalwert ist. Wir können also 2,5 als letzten Bereich betrachten. Das liegt daran, dass App Attributionsanbieter den ROAS tendenziell anhand des Mittelwerts des Bereichs berechnen. Daher muss der Ausreißer für eine einheitlichere Berechnung ausgeschlossen werden.

Wir versuchen nun, die Anzahl der User für jedes Datum in allen Bereichen zu untersuchen, damit wir das tägliche Volumen der User in jeder Gruppe verstehen können.Dies können wir mithilfe dieser Beispielabfrage tun, bei der Sie die Containerwerte durch Ihre tatsächlichen Daten ersetzen können, und die Abfrage würde in etwa so aussehen:

#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

Es werden die Nutzer in jedem Umsatzbereich für jeden Tag zurückgegeben, wie unten dargestellt. Wenn Sie in einem Bucket sehr niedrige Zahlen oder eine allgemein ungleichmäßige Verteilung sehen, sollten Sie die Anzahl der Buckets anpassen und die Abfrage noch einmal ausführen.

bf7d73085fe94cb6.png

Ein kurzer Hinweis zu SKAd Network 4.0

SKAdNetwork 4.0 bietet mehrere Conversion-Tracking-Zeiträume von bis zu 2 Tagen, 3 bis 7 Tagen und 8 bis 35 Tagen. Im obigen Ansatz können Sie das Fenster einfach ändern, um die Daten auch für diese zusätzlichen Szenarien zu analysieren. Undifferenzierte Werte für LOW, MEDIUM und HIGH sind ebenfalls verfügbar. Wenn Sie diesen Ansatz verwenden möchten, können Sie sich das als drei Buckets vorstellen. Wenn Sie also die Anzahl der Buckets auf drei ändern, erhalten Sie die Grenzwerte für „Niedrig“, „Mittel“ und „Hoch“.

4. Bereitstellung über Ihren Attributionspartner

Je nach Plattform können sich diese Hinweise ändern. Aktuelle Informationen dazu erhalten Sie von Ihren Plattformmitarbeitern. In diesem Beispiel sehen wir uns an, wie wir das derzeit in AppsFlyer implementieren können.

In der vorherigen Abfrage haben wir die folgenden Endbereiche als Ausgabe erhalten:

ba46f5d993449948.png

  • Bereich 1: 0 bis 0,1
  • Bereich 2: 0,1 bis 0,5
  • Bereich 3 : 0,5 bis 2
  • Bereich 4 : 2 bis 2,5

Wie Sie wissen, haben wir uns entschieden, den letzten Umsatzbereich zu ignorieren, da er ein Ausreißer ist und die durchschnittlichen Berechnungen für Ihren App-Attributionsanbieter verfälschen würde.

AppsFlyer bietet SKAN Conversion Studio, mit der sich Daten ganz einfach direkt in die Benutzeroberfläche eingeben lassen. Sie können 4.0 direkt oder „Benutzerdefiniert“ verwenden. wenn Sie Version 3.5 verwenden, und fügen Sie "Umsatz" zu messen. Fügen Sie dann einfach die Umsatzspannen hinzu, die Sie in der vorherigen Analyse berechnet haben.

f8c56abdf9b405f4.png

Best Practices und Erkenntnisse zu Google Ads

Wir haben einige Empfehlungen für Sie, wenn Sie Kampagnen in Google Ads schalten und die Auswirkungen mithilfe eines SKAdNetwork-Conversion-Wert-Schemas messen.

  • Der Conversion-Tracking-Zeitraum in Google Ads muss mit dem Aktivitätszeitraum übereinstimmen, den Sie auf Ihrer App-Attributionsplattform angegeben haben. Bei SKAdNetwork 3.5 dauert es wahrscheinlich ein bis drei Tage. Sie können die Daten dann in Google Ads entsprechend anpassen. Folgen Sie dazu dieser Anleitung.

4fd625aae9d4a43.png

  • Wenn Sie Appsflyer verwenden, ist der Standardereigniszähler derzeit „1“. Das bedeutet, dass mehrere Ereignisse pro Nutzer nicht berücksichtigt werden. Wenn Sie ein ereignisbasiertes Modell für die SKAN-Messung verwenden und Kampagnen mit der Gebotsstrategie „Ziel-CPA“ in Google Ads vergleichen, können Sie Anpassungen vornehmen. Folgen Sie dazu dieser Anleitung von Appsflyer.

6c7a4d703567700a.png

5. Glückwunsch

Sie haben das SKAdNetwork-Conversion-Wert-Schema erfolgreich eingerichtet. Sie können jetzt die Daten in Ihrem SKAdNetwork-Bericht in Google Ads beobachten, um Conversion-Werte für Ihre Google Ads-Kampagnen zu prüfen, sobald dieser aktiv ist

Sie haben gelernt,

  • Umfangreiche Rohdaten aus GA4F in BigQuery untersuchen
  • Analyseansatz zur Berechnung von Umsatzgruppen für Ihr Unternehmen
  • Schema mit AppsFlyer bereitstellen