Riferimento degli eventi
Ogni chiamata offerta dall’SDK, su ogni piattaforma, con il nome dell’evento che arriva a Unolink. I funnel sono per app: creane quanti ne vuoi in Funnel → Nuovo funnel e scegli uno qualsiasi di questi nomi come passaggio, compresi i tuoi. Ogni passaggio conta le installazioni che hanno inviato l’evento in qualsiasi momento, quindi anche le app con le schermate in un ordine diverso hanno un funnel sensato. Attiva Conta i passaggi solo in quest’ordine in un funnel per contare un passaggio solo quando avviene dopo quello precedente.
Eventi standard
| Nome dell’evento | Android | iOS | React Native | Flutter | Passaggio del funnel |
|---|---|---|---|---|---|
onboarding_step | onboardingStep(step, index, flow) | onboardingStep(_:index:flow:) | onboardingStep(step, { index, flow }) | onboardingStep(step, index:, flow:) | Scheda Onboarding, non un passaggio |
onboarding_skipped | onboardingSkipped(step) | onboardingSkipped(_:) | onboardingSkipped(step) | onboardingSkipped(step) | Scheda Onboarding, non un passaggio |
onboarding_completed | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | onboardingCompleted() | Onboarding |
paywall_viewed | paywallViewed(placement) | paywallViewed(placement:) | paywallViewed(placement) | paywallViewed(placement:) | Paywall |
paywall_skipped | paywallSkipped(placement) | paywallSkipped(placement:) | paywallSkipped(placement) | paywallSkipped(placement:) | Se lo aggiungi |
sign_up | signUp(method) | signUp(method:) | signUp(method) | signUp(method:) | Registrazione |
sign_in | signIn(method) | signIn(method:) | signIn(method) | signIn(method:) | Accesso fatto |
sign_up_skipped | signUpSkipped() | signUpSkipped() | signUpSkipped() | signUpSkipped() | Continuato come ospite |
trial_started | trialStarted(productId) | trialStarted(productId:) | trialStarted(productId) | trialStarted(productId:) | Prova |
purchase | purchase(amount, currency, productId) | purchase(amount:currency:productId:) | purchase(amount, currency, productId) | purchase(amount, currency, productId:) | Pagato |
purchase_cancelled | purchaseCancelled(productId) | purchaseCancelled(productId:) | purchaseCancelled(productId) | purchaseCancelled(productId:) | Se lo aggiungi |
purchase_failed | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | Se lo aggiungi |
| il tuo | track(name, properties) | track(_:properties:) | track(name, properties) | track(name, properties) | Se lo aggiungi |
Tutti gli argomenti sono facoltativi, tranne importo e valuta di un acquisto, e ogni chiamata accetta anche proprietà aggiuntive.
placementindica quale paywall:onboarding,launch,feature_gate,settingso un nome tuo. Viene inviato come proprietàplacement. Funnel → Dividi per Paywall mostra il funnel di ogni posizionamento.methodindica come è stato creato l’account:email,apple,google. Inviato comemethod.productIdè l’ID del tuo prodotto nello store. Inviato comeproduct_id.purchaseporta il prezzo come decimale (AndroidBigDecimal, iOSDecimal, React Native e Flutter una stringa come"49.99") e un codice valuta di tre lettere. I prezzi non vengono mai arrotondati.
Quando inviare ciascuno
| Evento | Invialo |
|---|---|
onboarding_step | Quando ogni schermata di onboarding appare, non quando viene toccato il suo pulsante. Vedi Schermate di onboarding. |
onboarding_skipped | Quando qualcuno tocca Salta, con la schermata in cui l’ha toccato. |
onboarding_completed | Quando l’ultima domanda o schermata di onboarding è finita, prima di qualsiasi paywall o registrazione che segue. |
paywall_viewed | Ogni volta che appare un paywall, con il suo posizionamento. Non per gli abbonati: se la tua app non mostra loro alcun paywall, non inviare nulla. |
paywall_skipped | Quando qualcuno chiude un paywall senza comprare: il suo pulsante di chiusura, uno swipe verso il basso o il gesto Indietro. Non mentre un acquisto è ancora in attesa di approvazione (Chiedi di acquistare, il controllo 3-D Secure di una banca). |
sign_up | Subito dopo la creazione di un nuovo account. Non quando qualcuno accede a un account che aveva già. |
sign_in | Quando qualcuno accede a un account che aveva già: un utente di ritorno (una reinstallazione, un nuovo telefono, dopo essere uscito). Percorsi lo etichetta come di ritorno e permette di filtrare per questo. SDK 0.3.0 o successivo. |
sign_up_skipped | Quando qualcuno sceglie di continuare senza account in una schermata di registrazione (modalità ospite). Percorsi lo etichetta come ospite, e un funnel con un passaggio di registrazione lo mostra come chi ha preso un’altra strada, non come un abbandono. |
trial_started, purchase | Quando lo store lo conferma. Saltali entrambi se RevenueCat è collegato. |
purchase_cancelled | Quando qualcuno chiude la schermata di acquisto dello store senza pagare. |
purchase_failed | Quando il pagamento non va a buon fine. reason è una tua breve descrizione. |
Schermate di onboarding
La scheda Onboarding mostra in quale schermata le persone escono e quanto tempo richiede ciascuna. Invia una chiamata per schermata quando
appare, una su Salta e onboardingCompleted alla fine:
// iOS (SwiftUI)
GoalScreen().onAppear { Unolink.onboardingStep("goal", index: 0) }
Button("Skip") { Unolink.onboardingSkipped("goal") }
// Android (Compose)
LaunchedEffect(Unit) { Unolink.onboardingStep("goal", index = 0) }
// React Native
useOnboardingStep("goal", { index: 0 }) // or Unolink.onboardingStep("goal", { index: 0 }) in a useEffect
// Flutter, in initState
Unolink.onboardingStep('goal', index: 0);
stepè un ID fisso per schermata:goal,notifications,plan. Stesse regole dei nomi degli eventi. Dai alle diramazioni i loro ID. Un pager o un onboarding a schermata singola ne invia uno per pagina.- Solo le schermate dell’onboarding. Il paywall e la schermata di registrazione non sono schermate di onboarding, anche quando
sono passaggi dello stesso flusso: inviano
paywallViewed/paywallSkippedesignUp. Un paywall chiuso senza comprare èpaywallSkipped, maionboardingSkipped. onboardingCompletedva subito dopo l’ultima schermata di onboarding, prima del paywall o della registrazione che segue, anche quando l’account viene creato alla fine del flusso. Chi vede il paywall ha finito l’onboarding.index(facoltativo) è la posizione della schermata, da 0 a 999. Con questo, la scheda può mostrare la schermata più avanzata raggiunta oltre all’ultima vista.flow(facoltativo) dà un nome all’onboarding, quando ne hai più di uno: una variante A/B, una nuova versione, un nuovo onboarding per chi torna. Ogni flusso ha il suo elenco.- Queste sono le uniche proprietà che questi eventi accettano. Con qualsiasi altra l’evento viene rifiutato.
- Non mettere mai dati degli utenti in
stepoflow. Sono nomi di schermate, mostrati nella dashboard. - Sono gratis. Un onboarding costa un solo evento, il suo
onboardingCompleted, per quante schermate abbia. Ogni installazione può inviarne fino a 100, per un massimo di 40 schermate diverse. - La navigazione indietro, le chiusure forzate dell’app e i riavvii non richiedono nulla di speciale. Unolink ricava lo stato di ogni installazione: completato,
saltato in una schermata, uscito dalla sua ultima schermata (niente di nuovo per 24 ore), o ancora in corso. Un’app che invia solo
onboardingCompletedmostra comunque quanti hanno completato; le schermate servono per vedere dove le persone escono. Le installazioni che non hanno inviato alcun evento di onboarding sono mostrate come non tracciate, mai come abbandoni.
Queste chiamate richiedono l’SDK 0.2.0 o successivo. Nelle versioni precedenti, track("onboarding_step", { step: "goal" }) invia lo stesso
evento.
Come vengono contati gli eventi
- I funnel contano persone, non eventi. Ogni passaggio conta le installazioni che hanno inviato l’evento almeno una volta, quindi un paywall
visto cinque volte, o
onboardingCompletedinviato di nuovo dopo essere tornati indietro, conta una volta per persona. - In qualsiasi ordine, per impostazione predefinita. Un passaggio conta ogni volta che è avvenuto. Attiva Conta i passaggi solo in quest’ordine in un funnel quando l’ordine conta; allora un passaggio conta solo se avviene insieme o dopo quello precedente.
- Ogni evento conta comunque per il tuo piano. Le ripetizioni vengono registrate (Percorsi le mostra tutte) e ognuna conta per la quota mensile, tranne quelli gratuiti qui sotto.
- Gli orari sono quelli del telefono, a meno che non risalgano a più di 7 giorni prima o a più di un’ora nel futuro; in quel caso si usa l’ora in cui l’evento è arrivato.
Ospiti e account
Riporta l’app user ID di RevenueCat ogni volta che cambia: per un ospite, l’ID anonimo di RevenueCat, poi l’ID
dell’account che crea o a cui accede. connectRevenueCat (SDK 0.3.2 o successivo) lo fa per te; altrimenti chiama
setUserId con esso. Ogni ID segnalato da un’installazione conta, quindi un acquisto fatto come ospite,
i suoi rinnovi e gli acquisti che RevenueCat sposta poi su un altro account restano tutti con l’installazione che ha comprato.
| Cosa è successo | Invia |
|---|---|
| Ha creato un nuovo account (email, Apple, Google, anche dopo essere stato ospite) | signUp(method) |
| Ha fatto l’accesso a un account che aveva già | signIn(method) |
| Ha scelto di continuare senza account | signUpSkipped() (SDK 0.3.2+, React Native 0.3.1+; SDK precedenti: track("sign_up_skipped")) |
| Un ospite che si registra più tardi, dalle impostazioni | signUp(method): conta per il passaggio di registrazione del funnel quando avviene |
| Ha fatto l’accesso con una password reimpostata | signIn(method): l’account esisteva già |
| Ha provato a registrarsi con un’email già registrata, poi ha fatto l’accesso | signIn(method) |
| È uscito | setUserId(null) |
Nuovo o di ritorno con Apple o Google? Di solito lo dice il risultato dell’accesso. Firebase: additionalUserInfo.isNewUser.
Supabase: un utente il cui created_at è a pochi secondi da last_sign_in_at è appena stato creato.
Eventi automatici
L’SDK li invia da solo. Sono gratis: non contano mai per il tuo piano.
| Evento | Quando |
|---|---|
first_open | Una volta per installazione, al primo avvio. Questa è l’installazione. |
session_start | All’avvio, o quando l’app torna dopo 30 minuti o più in background. |
app_background | Quando l’app va in background. |
Eventi personalizzati
track(name, properties) invia qualsiasi altra cosa, e anche gli eventi personalizzati possono essere passaggi del funnel.
- Nomi: iniziano con una lettera, poi lettere, cifre,
_e., al massimo 64 caratteri.level_upoexport.pdf. Un nome non valido viene scartato e registrato nei log. - Proprietà: al massimo 20 per evento. I valori sono stringhe (fino a 200 caratteri), numeri o booleani, 4 KB in totale.
- Non mettere mai nomi, email, numeri di telefono o altri dati personali nelle proprietà.
Stato dell’utente e dell’app
Queste chiamate non inviano un evento proprio.
| Android | iOS | React Native | Flutter | Cosa fa |
|---|---|---|---|---|
setUserId(id) | setUserId(_:) | setUserId(id) | setUserId(id) | L’ID utente della tua app; con RevenueCat, l’app user ID di RevenueCat. Salvato solo come hash unidirezionale per app. Chiamalo di nuovo ogni volta che cambia (ospite → account): ogni ID conta. Passa null (nil) al logout. Al massimo 256 caratteri. |
connectRevenueCat { } | connectRevenueCat { } | connectRevenueCat(Purchases) | connectRevenueCat(…) | Mantiene l’ID utente uguale all’app user ID di RevenueCat, ospiti compresi (SDK 0.3.2+). Vedi RevenueCat. Usa questo oppure setUserId, non entrambi. |
revenueCatUserChanged() | revenueCatUserChanged() | Invia subito il nuovo ID di RevenueCat: chiamalo dopo logIn e logOut (SDK 0.3.2+). React Native e Flutter se ne accorgono da soli. | ||
setDeferredDeepLinkListener { } | onDeferredDeepLink(_:) | addDeferredDeepLinkListener(fn) | setDeferredDeepLinkListener(fn) | Chiamato una volta per ogni installazione arrivata da un link Unolink. In pratica solo Android. |
getPendingDeferredDeepLink(), consumeDeferredDeepLink() | getPendingDeferredDeepLink(), consumeDeferredDeepLink() | getPendingDeferredDeepLink(), consumeDeferredDeepLink() | Il link da aprire una volta finito l’onboarding o l’accesso, poi da segnare come aperto. Aspetta finché non viene consumato, anche se nel frattempo l’app viene chiusa, fino a 30 giorni (SDK 0.3.3+; React Native 0.3.1+ lo conservava per un solo avvio). | |
isConfigured() | Se configure è stato eseguito con una chiave (React Native 0.3.1+). | |||
getInstallId() | installId | getInstallId() | getInstallId() | L’ID casuale di questa installazione. |
flush() | flush() | flush() | flush() | Invia subito gli eventi in coda. |
setEnabled(bool) | setEnabled(_:) | setEnabled(bool) | setEnabled(bool) | Disattiva il tracciamento (gli eventi in coda vengono eliminati) o lo riattiva. |
RevenueCat
Quando RevenueCat è collegato, è la fonte di riferimento per i soldi. Riporta prove, acquisti,
rinnovi, cancellazioni, rimborsi, scadenze e problemi di pagamento, anche quando l’app non è aperta. Le chiamate dell’app a
purchase e trialStarted vengono ignorate, così nulla conta due volte. La tua app ha bisogno solo di connectRevenueCat (o
di setUserId con l’ID di RevenueCat).
Quota del piano
L’SDK fa parte dei piani Pro e Studio. Ogni evento inviato dalla tua app conta per la quota mensile
di eventi: 1 milione su Pro, 5 milioni su Studio. Questo include gli eventi standard qui sopra e quelli
personalizzati. Gli eventi automatici (first_open, session_start, app_background) e le schermate di onboarding
(onboarding_step, onboarding_skipped) sono gratis, come anche gli acquisti, i rinnovi e i rimborsi che arrivano da RevenueCat. Superare la quota non blocca nulla; oltre il doppio della quota,
gli eventi personalizzati vengono rifiutati fino al mese successivo, mentre gli eventi standard, di onboarding e automatici vengono sempre conservati.