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 alla 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 migliore per utilizzare SKAd Network per acquisire informazioni significative sulle tue campagne. In questo codelab esaminiamo un esempio di metodologia per utilizzare i dati GA4F in BigQuery per raggruppare le entrate dopo l'installazione dell'app in bucket, che puoi poi utilizzare per la configurazione con il tuo partner di attribuzione app. Sebbene questo codelab utilizzi un approccio basato sulle entrate, per la misurazione SKAN puoi utilizzare anche approcci basati su eventi o canalizzazione. Per indicazioni più dettagliate, consulta questo Centro assistenza. Questo è solo un esempio e non è un consiglio ufficiale di Google. Puoi progettare il tuo schema in base alle tue esigenze aziendali specifiche

Argomenti trattati

  • Esplorare i dati di GA4F in BigQuery
  • Consultare i dati sulle entrate per gli utenti che hanno generato conversioni entro 0-2 giorni
  • Raggruppa i dati sulle entrate in bucket
  • Comprendere la distribuzione degli utenti in ciascun bucket
  • Implementare i bucket in Appsflyer SKAN Conversion Studio

Prerequisiti

2. Accedere a BigQuery Export

Vai al set di dati in GA4F selezionando Impostazioni progetto > Integrazioni > BigQuery. L'opzione deve essere prima abilitata e, una volta abilitata, 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

Eseguire alcune query

Ora che sei in BigQuery dovresti vedere le tabelle giornaliere generate. Nello screenshot di esempio riportato di seguito sono visibili 64 tabelle giornaliere, quindi l'esportazione è in esecuzione da 64 giorni. Se è la prima volta che accedi, potresti vedere solo una tabella giornaliera per i dati del giorno precedente. A destra viene visualizzato lo schema della tabella. Puoi consultare ulteriori dettagli sui campi qui.

Per iniziare a scrivere la tua 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 sulle installazioni

Per iniziare a creare i bucket per le entrate, dobbiamo prima esaminare i dati degli utenti che hanno installato l'app nelle ultime 24-72 ore. SKAd Network 4.0 ti 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 di attribuzione app, potresti essere in grado di modificare questa finestra di attività in genere in modo che non superi le 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 di 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'

Ecco un paio di aspetti da tenere presente in merito a 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à 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
  • Applichiamo il filtro sulla piattaforma = "iOS". Se nel tuo progetto Firebase sono presenti più app per iOS, 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 generate dagli utenti. In questo caso, ipotizziamo che i tuoi 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 conosci i parametri evento in BigQuery, ti consigliamo di controllare la definizione qui. Puoi provare questa query di esempio nel nostro riferimento ufficiale, che riguarda 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')

Cerchiamo di capire cosa fa la query qui. Ecco gli aspetti che potresti notare

  • Nella clausola WHERE, filtriamo in base agli eventi relativi alle entrate, poiché ci interessano solo questi, e, come la volta scorsa, stiamo cercando i dati per 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, per questa analisi devi prima allinearti a un'unica valuta. Ai fini di questo esempio, assumeremo che la valuta delle entrate finanziate dagli annunci sia anche in dollari statunitensi

L'output sarà simile al seguente (la colonna per user_pseudo_id è oscurata qui).

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 individuare le entrate di questi utenti. A questo punto, ricordiamo ciò di cui abbiamo parlato sulle limitazioni di SKAdNetwork. La finestra di attribuzione può essere disponibile solo entro 0-2 giorni dall'installazione. Dovremo quindi controllare le installazioni e le entrate nei timestamp degli eventi e acquisire le informazioni solo se avvengono entro questo lasso di tempo. Adesso vediamo come combinare in una query che fornisce le entrate totali per ogni due giorni di 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 semplicemente di unire i dati sulle installazioni e sulle entrate nel campo user_pseudo_id e poi dobbiamo assicurarci che il timestamp rientri in due 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.

Raggruppare le entrate in bucket

Dopo la query precedente, avrai user_pseudo_id e le entrate totali

2c1986b93e937d19.png

Ora dobbiamo combinare questi dati 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 per te. Ai fini di questo esempio supponiamo di voler creare 5 intervalli, quindi possiamo usare SELECT approx_quantiles(total_revenue, 5) AS bucket

A questo punto, includiamolo nella nostra 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 deve dividere le entrate in 5 bucket e BigQuery cerca 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, ignoriamo l'ultimo bucket 5, che è generalmente il valore massimo, e possiamo considerare 2.5 come l'ultimo intervallo. Questo perché i fornitori di servizi di attribuzione app tendono a calcolare il ROAS utilizzando la media dell'intervallo, pertanto l'outlier deve essere escluso per un calcolo più uniforme.

Ora cercheremo di esaminare il numero di utenti per ogni data in tutti gli intervalli, in modo da poter capire il volume giornaliero di utenti in ogni bucket.Possiamo farlo utilizzando questa query di esempio, in cui puoi sostituire i valori del bucket con i tuoi dati effettivi e la query avrebbe questo aspetto:

#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

Deve restituire gli utenti in ogni intervallo di entrate per ogni giorno, come mostrato 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

Una breve parola su SKAd Network 4.0

SKAd Network 4.0 offre più finestre di conversione fino a 2, 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 a granulometria grossolana LOW, MEDIUM e HIGH. Anche in questo caso, se si vuole utilizzare questo approccio, si può considerare l'approccio come 3 bucket. Quindi, modificando il numero di bucket in 3, è possibile ottenere le soglie per BASSO, MEDIO e ALTO

4. Implementazione con il fornitore di attribuzioni

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

Nella query eseguita in precedenza, gli intervalli finali ricevuti 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 si tratta di un valore anomalo che potrebbe alterare i calcoli medi per il tuo fornitore di servizi di attribuzione app.

AppsFlyer offre SKAN Conversion Studio, dove è abbastanza semplice inserire questo parametro 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 "Entrate". A questo punto, puoi semplicemente aggiungere gli intervalli di entrate calcolati dall'analisi precedente.

f8c56abdf9b405f4.png

Best practice e insegnamenti su Google Ads

Vediamo alcuni consigli se pubblichi campagne su Google Ads e misuri l'impatto tramite uno schema dei valori di conversione di SKAdNetwork

  • Assicurati che la finestra di conversione che utilizzi in Google Ads corrisponda alla finestra di attività specificata nella piattaforma di attribuzione app. Per la rete SKAd 3.5, l'aggiornamento è previsto entro 1-3 giorni. Per apportare le modifiche necessarie su Google Ads, segui la procedura riportata qui

4fd625aae9d4a43.png

  • Se utilizzi Appsflyer, attualmente il contatore 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 confronti le campagne basate su CPA target su Google Ads, puoi scegliere di personalizzarlo seguendo queste indicazioni di Appsflyer

6c7a4d703567700a.png

5. Complimenti

Congratulazioni, hai configurato lo schema dei valori di conversione della rete SKAdNetwork. Ora puoi monitorare i dati nel report sulla rete pubblicitaria di Google Ads per controllare i valori di conversione delle campagne Google Ads una volta attivato il monitoraggio.

Hai appreso

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