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

1. Einführung

Ein wenig Hintergrundwissen

Wenn Sie iOS-App-Entwickler sind, haben Sie sicher schon von den Datenschutz-Updates für iOS 14.5 und höher gehört. Um aussagekräftige Conversion-Aktionen nach der Installation zu erfassen, stellt Apple die SKAdNetwork API zur Verfügung. Damit können Sie den Erfolg Ihrer Werbekampagnen messen und gleichzeitig den Datenschutz der Nutzer wahren. Je nach Ihren Geschäftsanforderungen können Sie die optimale Methode für die Nutzung von SKAdNetwork entwickeln, um aussagekräftige Statistiken zu Ihren Kampagnen zu erhalten. In diesem Codelab sehen wir uns eine Beispielmethodik an, mit der Sie Ihre GA4F-Daten in BigQuery nutzen können, um den Umsatz nach der App-Installation in Gruppen einzuteilen. Diese Gruppen können Sie dann mit Ihrem Partner für die App-Attribution einrichten. In diesem Codelab wird ein umsatzbasierter Ansatz verwendet. Sie können für die SKAN-Analyse aber auch ereignis- oder trichterbasierte Ansätze nutzen. Weitere Informationen Dies ist nur ein Beispiel und keine offizielle Empfehlung von Google. Sie können Ihr eigenes Schema basierend auf Ihren spezifischen Geschäftsanforderungen entwerfen.

Themen

  • GA4F-Daten in BigQuery analysieren
  • Umsatzdaten für Nutzer, die innerhalb von 0 bis 2 Tagen eine Conversion ausgeführt haben
  • Umsatzdaten in Gruppen einteilen
  • Nutzerverteilung in den einzelnen Gruppen nachvollziehen
  • Buckets in AppsFlyer SKAN Conversion Studio implementieren

Voraussetzungen

2. Auf BigQuery Export zugreifen

Rufen Sie das Dataset in GA4F auf, indem Sie Projekteinstellungen > Integrationen > BigQuery aufrufen. Die Ein/Aus-Schaltfläche muss zuerst aktiviert werden. Danach dauert es etwa 48 Stunden, bis das Dataset verfügbar ist. Klicken Sie auf den unten angezeigten Link, um zu BigQuery zu gelangen.

1aa4e20bfd3419d1.png

Abfragen ausführen

In BigQuery sollten nun die täglich generierten Tabellen angezeigt werden. Im folgenden Beispiel-Screenshot sehen wir 64 Tages-Tabellen. Der Export läuft also seit 64 Tagen. Wenn Sie zum ersten Mal darauf zugreifen, sehen Sie möglicherweise nur eine tägliche Tabelle mit den Daten des Vortags. Rechts sehen Sie das Tabellenschema. Weitere Informationen zu den Feldern

Wenn Sie mit dem Schreiben Ihrer Abfrage beginnen möchten, 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 mit der Erstellung der Umsatzkategorien zu beginnen, müssen wir uns zuerst die Daten von Nutzern ansehen, die die App in den letzten 24 bis 72 Stunden installiert haben. Mit SKAdNetwork 4.0 können Sie Daten innerhalb von 0 bis 2 Tagen aufrufen, während mit SKAdNetwork 3.5 standardmäßig 24 Stunden möglich sind. Je nach den Funktionen Ihres App-Attributionspartners können Sie dieses Aktivitätszeitfenster in der Regel auf maximal 72 Stunden ändern. Wenn Nutzer die App installieren und zum ersten Mal öffnen, wird das Ereignis „first_open“ vom SDK ausgelöst und in BigQuery erfasst.

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 ermitteln.

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'

Einige Hinweise zu dieser Anfrage

  • Ersetzen Sie den Tabellennamen durch Ihre aus Analytics exportierte Tabelle. Sie können Platzhalter verwenden, um mehrere tägliche Tabellen abzufragen. Mit „2023*“ werden beispielsweise 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 Sie mehrere iOS-Apps in Ihrem Firebase-Projekt haben, 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, mit der Sie den Umsatz für Ihre Nutzer ermitteln können. 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, während der Umsatz für ad_impression im Parameter „value“ in den Ereignisparametern verfügbar ist. Wenn Sie mit Ereignisparametern in BigQuery nicht vertraut sind, empfehlen wir Ihnen, diese Definition zu lesen. Außerdem können Sie diese Beispielabfrage in unserer offiziellen Referenz ausprobieren. Dort wird auch beschrieben, wie Sie den Wert aus „event_params“ extrahieren.

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

Sehen wir uns an, was die Abfrage hier macht. Das sind die Dinge, die Ihnen auffallen würden

  • In der WHERE-Klausel filtern wir nach den Umsatzereignissen, da wir nur an diesen interessiert sind. Wie beim letzten Mal suchen wir nach iOS-Daten.
  • In der SELECT-Klausel werden nun der Wert und die Währung für das Ereignis mit Werbeeinnahmen (ad_impression) sowie event_value_in_usd für das Ereignis „in_app_purchase“ verwendet.
  • Wenn Sie mehrere Währungen senden, müssen Sie zuerst eine einzelne Währung für diese Analyse auswählen. In diesem Beispiel gehen wir davon aus, dass die Währung für umsatzbasierte Einnahmen aus Anzeigen ebenfalls US-Dollar ist.

Die Ausgabe sieht etwa so aus (die Spalte für user_pseudo_id wurde hier entfernt):

1e1e6943e4b3a6d8.png

Diese Daten kombinieren

Bisher haben wir zwei Abfragen ausgeführt: eine, um die Daten für die Nutzer zu ermitteln, die die App installiert und geöffnet haben, und eine weitere, um den Umsatz für diese Nutzer zu ermitteln. Sehen wir uns noch einmal die Einschränkungen von SKAdNetwork an. Der Attributionszeitraum kann nur innerhalb von 0–2 Tagen nach der Installation verfügbar sein. Daher müssen wir die Ereignis-Zeitstempel für Installationen und Umsatz prüfen und die Informationen nur berücksichtigen, wenn sie innerhalb dieses Zeitrahmens liegen. Wir versuchen nun, die beiden Abfragen zu kombinieren, um den Gesamtumsatz für jeden Beitrag zwei Tage nach der App-Installation zu ermitteln.

#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

In der Abfrage wird versucht, die Installationsdaten und die Umsatzdaten über das Feld „user_pseudo_id“ zu verknüpfen. Außerdem muss der Zeitstempel innerhalb von zwei Tagen liegen. Wenn Sie SKAdNetwork 3.5 verwenden, beträgt der Standardwert 24 Stunden. Sie können die Bedingung also auch so ändern, dass nur Daten für einen Tag berücksichtigt werden.

Umsatz in Kategorien einteilen

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

2c1986b93e937d19.png

Diese müssen wir nun in Gruppen zusammenfassen, die wir für unsere Conversion-Wertbereiche verwenden können. Dazu verwenden wir die Funktion approx_quantiles in BigQuery, mit der diese Bereiche automatisch erstellt werden. Nehmen wir für dieses Beispiel an, dass wir 5 Bereiche erstellen möchten. Wir können also einfach SELECT approx_quantiles(total_revenue, 5) AS buckets verwenden.

Wir wollen das nun in unsere Gesamtabfrage einbauen.

#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 5 Buckets unterteilt. BigQuery versucht, eine konsistente Prozentilverteilung beizubehalten.

ba46f5d993449948.png

Nutzerverteilung mit diesen Gruppen analysieren

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

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

Bei den endgültigen Bereichen ignorieren wir den letzten Bucket 5, da er in der Regel den Maximalwert darstellt und wir einfach 2,5 als letzten Bereich betrachten können. Das liegt daran, dass Anbieter von App-Attributionen den ROAS in der Regel anhand des Mittelwerts des Bereichs berechnen. Der Ausreißer muss also ausgeschlossen werden, damit die Berechnung einheitlicher ist.

Sehen wir uns nun die Anzahl der Nutzer für jedes Datum in allen Bereichen an, damit wir das tägliche Nutzervolumen in jedem Bucket nachvollziehen können. Dazu können wir die folgende Beispielabfrage verwenden. Ersetzen Sie die Bucket-Werte durch Ihre tatsächlichen Daten. Die Abfrage sieht dann so aus:

#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 soll die Nutzer in jeder Umsatzklasse für jeden Tag zurückgeben, wie unten dargestellt. Wenn Sie in einem Bucket sehr niedrige Zahlen oder eine ungleichmäßige Verteilung sehen, sollten Sie die Anzahl der Buckets anpassen und die Abfrage noch einmal ausführen.

bf7d73085fe94cb6.png

Kurzer Hinweis zu SKAdNetwork 4.0

SKAdNetwork 4.0 bietet mehrere Conversion-Tracking-Zeiträume von bis zu 2 Tagen, 3–7 Tagen und 8–35 Tagen. Bei der oben beschriebenen Vorgehensweise lässt sich das Fenster ganz einfach ändern, um auch Daten für diese zusätzlichen Szenarien zu analysieren. Außerdem sind grobe Werte für NIEDRIG, MITTEL und HOCH verfügbar. Wenn Sie diesen Ansatz verwenden möchten, können Sie sich das Ganze als drei Gruppen vorstellen. Wenn Sie die Anzahl der Gruppen auf drei ändern, erhalten Sie die Grenzwerte für NIEDRIG, MITTEL und HOCH.

4. Bereitstellung mit Ihrem Attributionsanbieter

Je nach Plattform kann sich diese Anleitung ändern. Wenden Sie sich an die Plattformvertreter, um die aktuellsten Informationen zu erhalten. In diesem Beispiel sehen wir uns an, wie wir das derzeit in AppsFlyer bereitstellen können.

In der Abfrage, die wir zuvor ausgeführt haben, waren die endgültigen Bereiche, die wir als Ausgabe erhalten haben, wie unten dargestellt.

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

Wir haben beschlossen, den letzten Umsatzbereich zu ignorieren, da er ein Ausreißer ist und die Durchschnittsberechnungen für Ihren App-Attributionsanbieter verfälschen würde.

AppsFlyer bietet das SKAN Conversion Studio, in dem Sie diese Informationen ganz einfach über die Benutzeroberfläche eingeben können. Sie können entweder direkt 4.0 verwenden oder den benutzerdefinierten Modus, wenn Sie 3.5 nutzen, und die Umsatzmessung hinzufügen. Anschließend können Sie einfach die Umsatzbereiche hinzufügen, die Sie in der vorherigen Analyse berechnet haben.

f8c56abdf9b405f4.png

Best Practices und Erkenntnisse zu Google Ads

Wenn Sie Kampagnen in Google Ads schalten und die Auswirkungen anhand eines SKAdNetwork-Conversion-Wert-Schemas messen, haben wir einige Empfehlungen für Sie:

  • Achten Sie darauf, dass der Conversion-Tracking-Zeitraum, den Sie in Google Ads verwenden, mit dem Aktivitätszeitraum übereinstimmt, den Sie auf Ihrer App-Attributionsplattform angegeben haben. Bei SKAdNetwork 3.5 dauert es in der Regel ein bis drei Tage. Sie können die Einstellung in Google Ads entsprechend anpassen. Folgen Sie dazu der 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 es mit Ziel-CPA-Kampagnen in Google Ads vergleichen, können Sie es gemäß dieser Anleitung von AppsFlyer anpassen.

6c7a4d703567700a.png

5. Glückwunsch

Herzlichen Glückwunsch! Sie haben Ihr SKAdNetwork-Conversion-Wert-Schema erfolgreich eingerichtet. Sobald die Daten verfügbar sind, können Sie die Conversion-Werte für Ihre Google Ads-Kampagnen im Google Ads-SKAdNetwork-Bericht einsehen.

Sie haben gelernt

  • Rohdaten aus GA4F in BigQuery untersuchen
  • Analytischer Ansatz zur Berechnung von Umsatzkategorien für Ihr Unternehmen
  • Schema mit AppsFlyer bereitstellen