Calcola i bucket di entrate per lo schema dei valori di conversione della rete SKAd

1. Introduzione

Un po' di contesto prima di iniziare

Se sei uno sviluppatore di app iOS, devi aver sentito parlare degli aggiornamenti sulla privacy di iOS 14.5+ . Per misurare azioni di conversione significative dopo l'installazione, Apple fornisce l' API SKAd Network che ti consente di misurare il successo delle tue campagne pubblicitarie rispettando la privacy dell'utente. In base alle esigenze della tua azienda, puoi trovare il modo ottimale per sfruttare SKAd Network per acquisire informazioni significative sulle tue campagne. In questo codelab esaminiamo una metodologia di esempio per sfruttare i dati GA4F in BigQuery per raggruppare le entrate successive all'installazione dell'app in bucket, che puoi quindi utilizzare per configurare con il tuo partner di attribuzione dell'app. Sebbene questo codelab utilizzi un approccio basato sulle entrate, puoi anche utilizzare eventi o approcci basati su canalizzazione per la misurazione SKAN. Per indicazioni più dettagliate, fare riferimento a questo Centro assistenza . Questo è solo un esempio, non un consiglio ufficiale di Google . Puoi progettare il tuo schema in base alle tue esigenze aziendali specifiche

Cosa intendiamo trattare

  • Esplora i dati GA4F in BigQuery
  • Trova i dati sulle entrate per gli utenti che hanno effettuato la conversione entro 0-2 giorni
  • Raggruppare i dati sulle entrate in bucket
  • Comprendere la distribuzione degli utenti in ciascun bucket
  • Implementa i bucket in Appsflyer SKAN Conversion Studio

Prerequisiti

2. Accesso a BigQuery Export

Passa al set di dati in GA4F visitando Impostazioni progetto > Integrazioni > BigQuery. L'interruttore deve essere prima abilitato e, una volta abilitato, sono necessarie circa 48 ore affinché il set di dati sia disponibile. Puoi fare clic sul collegamento mostrato di seguito e ti porterà a BigQuery

1aa4e20bfd3419d1.png

Esegui alcune query

Ora che sei in BigQuery, dovresti vedere le tabelle giornaliere generate. Nello screenshot di esempio seguente vediamo 64 tabelle giornaliere, quindi l'esportazione è in esecuzione da 64 giorni. Se accedi per la prima volta, potresti vedere solo 1 tabella giornaliera con i dati del giorno precedente. A destra vedi lo schema della tabella. Puoi fare riferimento a maggiori 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 di installazione

Ora, per iniziare a creare i gruppi di 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 capacità del tuo partner di attribuzione app, potresti essere in grado di modificare questa finestra di attività in genere per non più di 72 ore). Quando gli utenti installano l'app e la aprono per la prima volta, l'evento first_open viene generato dall'SDK e registrato in BigQuery.

L'identificatore che puoi utilizzare per BigQuery è user_pseudo_id (chiamato anche ID istanza dell'app), quindi puoi utilizzare la query seguente 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. È possibile utilizzare i caratteri jolly per eseguire query su più tabelle giornaliere. Ad esempio, 2023* eseguirà query su tutti i dati nel 2023
  • Se hai molti utenti, puoi anche eseguire query solo sugli ultimi 30 giorni per un'elaborazione più rapida
  • Filtriamo sulla piattaforma = 'IOS'. Se hai più app iOS nel tuo progetto Firebase, puoi anche aggiungere un filtro per app_info.firebase_app_id per ottenere 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, presumiamo che gli eventi relativi alle entrate siano in_app_purchase e ad_impression. Le entrate provenienti 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 dell'evento. Se non hai familiarità con i parametri evento in BigQuery, ti consigliamo di controllare la definizione qui e puoi provare questa query di esempio nel nostro riferimento ufficiale, che copre 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')

Capiamo cosa sta facendo la query qui. Queste sono le cose che noteresti

  • Nella clausola WHERE, stiamo filtrando gli eventi relativi alle entrate, poiché siamo interessati solo a quelli e, come l'ultima volta, stiamo cercando 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, dovrai prima allinearti a una singola valuta per questa analisi. Ai fini di questo esempio, supponiamo che anche la valuta per le entrate finanziate dalla pubblicità sia USD

L'output sarebbe qualcosa di simile al seguente (la colonna per user_pseudo_id è oscurata qui).

1e1e6943e4b3a6d8.png

Combinando questi dati

Fino ad ora abbiamo eseguito due query, una per trovare i dati per gli utenti che hanno installato e aperto l'app e un'altra per trovare le entrate per tali utenti. Ora ricordiamo ciò di cui abbiamo discusso sulle limitazioni della rete SKAd. 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 le informazioni solo se si verificano entro tale intervallo di tempo. Proviamo ora a combinare in una query che fornisca le entrate totali per ogni post di 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 di installazione e i dati sulle entrate nel campo user_pseudo_id, quindi dobbiamo garantire che il timestamp sia entro 2 giorni. Se utilizzi SKAd Network 3.5, il valore predefinito è 24 ore, quindi puoi anche modificare la condizione per includere solo i dati di 1 giorno

Raggruppamento delle entrate in segmenti

Dopo la query precedente, avrai user_pseudo_id e le entrate totali

2c1986b93e937d19.png

Ora dovremo combinarli in bucket che possiamo utilizzare per i nostri intervalli di valori di conversione. A questo scopo utilizzeremo la funzione approx_quantiles in BigQuery, che crea automaticamente questi intervalli per te. Supponiamo, ai fini di questo esempio, di voler creare 5 intervalli, quindi possiamo semplicemente utilizzare SELECT approx_quantiles(total_revenue, 5) AS bucket

Detto questo, incorporiamolo nella nostra query generale

#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 dividerà le entrate in 5 segmenti e BigQuery tenta di mantenere una distribuzione percentile coerente

ba46f5d993449948.png

Analizza la distribuzione degli utenti con questi bucket

Questo è un passaggio facoltativo se desideri comprendere la distribuzione dei tuoi utenti in ciascun bucket. Per il nostro esempio, gli intervalli di 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, poiché generalmente è il valore massimo, e possiamo considerare semplicemente 2,5 come l'ultimo intervallo. Questo perché i fornitori di attribuzione delle app tendono a calcolare il ROAS utilizzando la media dell'intervallo, quindi il valore anomalo deve essere escluso per un calcolo più uniforme.

Proveremo ora a esaminare il numero di utenti per ciascuna data in tutti gli intervalli, in modo da poter comprendere il volume giornaliero di utenti in ciascun segmento. Possiamo farlo utilizzando questa query di esempio, in cui puoi sostituire i valori del segmento con i tuoi dati effettivi e la query sarebbe simile a questa

#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

Restituirà gli utenti in ciascun intervallo di entrate per ogni giorno, come di seguito. Se vedi numeri molto bassi in qualsiasi segmento o una distribuzione generalmente non uniforme, potresti voler modificare il numero di segmenti ed eseguire nuovamente la query.

bf7d73085fe94cb6.png

Una breve parola su SKAd Network 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 è possibile modificare facilmente la finestra per analizzare i dati anche per questi scenari aggiuntivi. Sono disponibili anche valori a grana grossa BASSO, MEDIO e ALTO. Ancora una volta, se vuoi utilizzare questo approccio, puoi pensarlo come 3 bucket, quindi, modificando il numero di bucket in 3, puoi ottenere le soglie per BASSO, MEDIO e ALTO

4. Distribuzione con il tuo fornitore di attribuzione

A seconda della piattaforma specifica, questa guida potrebbe cambiare. Si prega di collaborare con i rappresentanti della piattaforma per le informazioni più aggiornate al riguardo. Ai fini di questo esempio, vedremo come possiamo attualmente distribuirlo su AppsFlyer

Nella query eseguita 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 , poiché sarà un valore anomalo, e distorcere i calcoli medi per il tuo fornitore di attribuzione dell'app.

AppsFlyer offre SKAN Conversion Studio , dove è abbastanza semplice inserirlo direttamente nell'interfaccia utente. Puoi utilizzare direttamente la versione 4.0 oppure utilizzare la modalità "Personalizzata" se utilizzi la versione 3.5 e aggiungere la misurazione "Entrate". Puoi quindi semplicemente aggiungere gli intervalli di entrate calcolati dall'analisi precedente.

f8c56abdf9b405f4.png

Best practice e apprendimenti su Google Ads

Vorremmo lasciarti con alcuni consigli se stai pubblicando campagne su Google Ads e misurando l'impatto tramite uno schema dei valori di conversione della rete SKAd

  • Assicurati che la finestra di conversione che stai utilizzando su Google Ads corrisponda alla finestra di attività che hai specificato sulla piattaforma di attribuzione app. Per la rete SKAd 3.5, è probabile che ciò avvenga entro 1-3 giorni, quindi puoi modificarlo di conseguenza su Google Ads seguendo i passaggi elencati 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 su eventi per la misurazione SKAN e il confronto con le campagne tCPA su Google Ads, puoi scegliere di personalizzare seguendo queste indicazioni di Appsflyer

6c7a4d703567700a.png

5. Congratulazioni

Congratulazioni, hai impostato correttamente lo schema dei valori di conversione della rete SKAd. Ora puoi monitorare i dati nel rapporto SKAd Network di Google Ads per verificare i valori di conversione per le tue campagne Google Ads una volta pubblicato

Hai imparato

  • Come esplorare i ricchi dati grezzi di GA4F in BigQuery
  • Approccio analitico per calcolare le fasce di reddito della tua azienda
  • Distribuisci lo schema con AppsFlyer