Calcolare i bucket delle entrate per lo schema del valore di conversione di SKAd Network

1. Introduzione

Un po' di contesto prima di iniziare

Se sei uno sviluppatore di app per iOS, avrai sicuramente sentito parlare degli aggiornamenti della privacy di iOS 14.5 e versioni successive. Per misurare le azioni di conversione significative dopo l'installazione, Apple fornisce l'API SKAdNetwork, che ti consente di misurare il successo delle tue campagne pubblicitarie rispettando la privacy degli utenti. In base alle esigenze della tua attività, puoi trovare il modo più ottimale per sfruttare SKAdNetwork e ottenere informazioni significative sulle tue campagne. In questo codelab esaminiamo una metodologia di esempio per sfruttare i dati GA4F in BigQuery per raggruppare le entrate post-installazione dell'app in bucket, che puoi poi utilizzare per la configurazione con il tuo partner di attribuzione delle app. Sebbene questo codelab utilizzi un approccio basato sulle entrate, puoi anche utilizzare approcci basati su eventi o funnel per la misurazione SKAN. Per indicazioni più dettagliate, consulta questo articolo del Centro assistenza. Questo è solo un esempio, non un consiglio ufficiale di Google. Puoi progettare il tuo schema in base alle esigenze specifiche della tua attività

Argomenti che intendiamo trattare

  • Esplorare i dati GA4F in BigQuery
  • Trovare i dati sulle entrate per gli utenti che hanno generato una conversione entro 0-2 giorni
  • Raggruppa i dati sulle entrate in bucket
  • Comprendere la distribuzione degli utenti in ogni bucket
  • Implementa i bucket in AppsFlyer SKAN Conversion Studio

Prerequisiti

2. Accedere a BigQuery Export

Vai al set di dati in GA4F visitando Impostazioni progetto > Integrazioni > BigQuery. Il pulsante di attivazione/disattivazione deve essere attivato e, una volta attivato, sono necessarie circa 48 ore prima che il set di dati sia disponibile. Puoi fare clic sul link mostrato di seguito per accedere a BigQuery.

1aa4e20bfd3419d1.png

Esegui alcune query

Ora che ti trovi in BigQuery, dovresti visualizzare le tabelle giornaliere generate. Nello screenshot di esempio riportato di seguito, vediamo 64 tabelle giornaliere, quindi l'esportazione è in esecuzione da 64 giorni. Se vi accedi per la prima volta, potresti visualizzare una sola tabella giornaliera per i dati del giorno precedente. A destra, vedi lo schema della tabella. Puoi trovare ulteriori dettagli sui campi qui.

Per iniziare a scrivere la query, puoi fare clic su Query > In una nuova scheda.

42ba59ec655c5d1b.png

Puoi quindi provare a eseguire la query di esempio nella nuova scheda.

70ef90d32b7cd7f1.png

3. Analizzare i dati sulle entrate

Recupero dei dati di installazione

Ora, per iniziare a creare i bucket delle entrate, dobbiamo prima esaminare i dati degli utenti che hanno installato l'app nelle ultime 24-72 ore. SKAd Network 4.0 consente di visualizzare i dati in 0-2 giorni, mentre SKAd Network 3.5 consente 24 ore per impostazione predefinita. A seconda delle funzionalità del tuo partner per l'attribuzione delle app, potresti essere in grado di modificare questa finestra di attività in generale fino a un massimo di 72 ore. Quando gli utenti installano l'app e la aprono per la prima volta, l'evento first_open viene attivato dall'SDK e registrato in BigQuery.

L'identificatore che puoi utilizzare per BigQuery è user_pseudo_id (chiamato anche ID istanza app), quindi puoi utilizzare la query riportata di seguito per trovare questi utenti

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'

Un paio di cose da notare su questa query

  • Sostituisci il nome della tabella con la tabella esportata di Analytics. Puoi utilizzare i caratteri jolly per eseguire query su più tabelle giornaliere. Ad esempio, 2023* eseguirà una query su tutti i dati del 2023
  • Se hai molti utenti, puoi anche eseguire query solo sugli ultimi 30 giorni per un'elaborazione più rapida.
  • Filtriamo in base a piattaforma = "IOS". Se hai più app per iOS nel tuo progetto Firebase, puoi anche aggiungere un filtro per app_info.firebase_app_id per ottenere i dati per l'app specifica

Recupero dei dati sulle entrate

Ora esaminiamo una query per trovare le entrate per i tuoi utenti. In questo caso, supponiamo che gli eventi relativi alle entrate siano in_app_purchase e ad_impression. Le entrate generate da in_app_purchase sono disponibili in event_value_usd, mentre per ad_impression le entrate sono disponibili nel parametro value, all'interno dei parametri evento. Se non hai familiarità con i parametri evento in BigQuery, ti consigliamo di consultare la definizione qui e puoi provare questa query di esempio nel nostro riferimento ufficiale, che illustra anche l'estrazione del valore da 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')

Vediamo cosa fa la query qui. Ecco gli elementi che noterai

  • Nella clausola WHERE, filtriamo gli eventi relativi alle entrate, poiché ci interessano solo questi, e come l'ultima volta, cerchiamo i dati iOS
  • Ora, nella clausola SELECT, prendiamo il valore e la valuta per l'evento relativo alle entrate pubblicitarie (ad_impression) e prendiamo event_value_in_usd quando l'evento è in_app_purchase
  • Se invii più valute, devi prima allinearti a una singola valuta per questa analisi. Ai fini di questo esempio, supponiamo che anche la valuta per le entrate finanziate dagli annunci sia il dollaro statunitense.

L'output sarà simile a quello riportato di seguito (la colonna user_pseudo_id è oscurata).

1e1e6943e4b3a6d8.png

Combinazione di questi dati

Finora abbiamo eseguito due query: una per trovare i dati degli utenti che hanno installato e aperto l'app e un'altra per trovare le entrate generate da questi utenti. Ora, ricordiamo cosa abbiamo detto in merito alle limitazioni di SKAd Network. La finestra di attribuzione può essere disponibile solo entro 0-2 giorni dall'installazione. Pertanto, dovremo controllare i timestamp degli eventi per installazione ed entrate e prendere in considerazione le informazioni solo se si verificano in questo periodo di tempo. Ora proviamo a combinare in una query che fornisca le entrate totali per ogni post due giorni dopo l'installazione dell'app

#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

La query tenta solo di unire i dati di installazione e i dati sulle entrate nel campo user_pseudo_id, quindi dobbiamo assicurarci che il timestamp rientri in un periodo di 2 giorni. Se utilizzi SKAd Network 3.5, il valore predefinito è 24 ore, quindi puoi anche modificare la condizione in modo da includere solo i dati di un giorno.

Raggruppamento delle entrate in bucket

Dopo la query precedente, avrai l'user_pseudo_id e le entrate totali

2c1986b93e937d19.png

Ora dobbiamo combinarli in bucket che possiamo utilizzare per gli intervalli di valori di conversione. A questo scopo, utilizzeremo la funzione approx_quantiles in BigQuery, che crea automaticamente questi intervalli. Ai fini di questo esempio, supponiamo di voler creare 5 intervalli, quindi possiamo utilizzare SELECT approx_quantiles(total_revenue, 5) AS buckets

A questo punto, incorporiamo questa informazione nella query complessiva.

#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

Questa query divide le entrate in 5 bucket e BigQuery tenta di mantenere una distribuzione percentile coerente.

ba46f5d993449948.png

Analizzare la distribuzione degli utenti con questi bucket

Questo è un passaggio facoltativo, se vuoi comprendere la distribuzione degli utenti in ogni bucket. Per il nostro esempio, gli intervalli dei bucket restituiti nella query precedente sono

  • 0,1
  • 0,5
  • 2
  • 2,5
  • 5 [l'ultimo valore non deve essere utilizzato nella configurazione dell'intervallo]

Per gli intervalli finali, ignoreremo l'ultimo bucket 5, in quanto generalmente è il valore massimo e possiamo considerare 2, 5 come ultimo intervallo. Questo perché i fornitori di attribuzione delle app tendono a calcolare il ROAS utilizzando la media dell'intervallo, quindi l'outlier deve essere escluso per un calcolo più uniforme.

Ora proviamo a esaminare il numero di utenti per ogni data in tutti gli intervalli, in modo da poter comprendere il volume giornaliero di utenti in ogni bucket. Possiamo farlo utilizzando questa query di esempio, in cui puoi sostituire i valori dei bucket con i tuoi dati effettivi. La query avrà un aspetto simile a questo:

#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

Restituisce gli utenti in ogni intervallo di entrate per ogni giorno, come di seguito. Se noti numeri molto bassi in un bucket o una distribuzione generalmente non uniforme, ti consigliamo di modificare il numero di bucket ed eseguire di nuovo la query.

bf7d73085fe94cb6.png

Un breve accenno a SKAdNetwork 4.0

SKAd Network 4.0 offre più finestre di conversione fino a 2 giorni, 3-7 giorni e 8-35 giorni. Nell'approccio precedente, puoi modificare facilmente la finestra per analizzare i dati anche per questi scenari aggiuntivi. Sono disponibili anche i valori approssimativi BASSO, MEDIO e ALTO. Anche in questo caso, se vuoi utilizzare questo approccio, puoi pensare a tre bucket. Quindi, modificando il numero di bucket in 3, puoi ottenere le soglie per BASSO, MEDIO e ALTO.

4. Implementazione con il tuo fornitore di attribuzione

A seconda della piattaforma specifica, queste indicazioni potrebbero cambiare. Per informazioni più aggiornate, rivolgiti ai rappresentanti della piattaforma. Ai fini di questo esempio, esamineremo come è possibile eseguire il deployment su AppsFlyer

Nella query che abbiamo eseguito in precedenza, gli intervalli finali che abbiamo ricevuto come output erano i seguenti

ba46f5d993449948.png

  • Intervallo 1 : da 0 a 0,1
  • Intervallo 2 : da 0,1 a 0,5
  • Intervallo 3 : da 0,5 a 2
  • Intervallo 4 : da 2 a 2,5

Ricorda che abbiamo deciso di ignorare l'ultimo intervallo di entrate, in quanto sarà un valore anomalo e distorcerà i calcoli della media per il tuo fornitore di attribuzione delle app.

AppsFlyer offre SKAN Conversion Studio, dove è piuttosto semplice inserire questi dati direttamente nell'interfaccia utente. Puoi utilizzare direttamente la versione 4.0 o la modalità "Personalizzata" se utilizzi la versione 3.5 e aggiungere la misurazione delle entrate. A questo punto, puoi aggiungere gli intervalli di entrate che hai calcolato dall'analisi precedente.

f8c56abdf9b405f4.png

Best practice e lezioni apprese su Google Ads

Vorremmo darti alcuni consigli se pubblichi campagne su Google Ads e misuri l'impatto tramite uno schema del valore di conversione di SKAdNetwork

  • Assicurati che la finestra di conversione che utilizzi su Google Ads corrisponda alla finestra di attività che hai specificato sulla piattaforma di attribuzione app. Per SKAdNetwork 3.5, è probabile che questo periodo sia compreso tra 1 e 3 giorni, quindi puoi modificarlo di conseguenza su Google Ads seguendo i passaggi elencati qui.

4fd625aae9d4a43.png

  • Se utilizzi Appsflyer, al momento il contatore di eventi predefinito è 1, il che significa che non tiene conto di più eventi per utente. Se utilizzi un modello basato sugli eventi per la misurazione SKAN e lo confronti con le campagne basate sul CPA target su Google Ads, puoi scegliere di personalizzare seguendo queste indicazioni di AppsFlyer.

6c7a4d703567700a.png

5. Complimenti

Congratulazioni, hai configurato correttamente lo schema del valore di conversione di SKAdNetwork. Una volta che i dati saranno disponibili, potrai monitorarli nel report SKAdNetwork di Google Ads per controllare i valori di conversione delle tue campagne Google Ads.

Cosa hai imparato

  • Come esplorare i dati non elaborati avanzati di GA4F in BigQuery
  • Approccio analitico per calcolare i bucket di entrate per la tua attività
  • Esegui il deployment dello schema con AppsFlyer