Référence des événements

Chaque appel proposé par le SDK, sur chaque plateforme, avec le nom d’événement qui arrive chez Unolink. Les entonnoirs sont propres à chaque app : créez-en autant que vous voulez sous Entonnoir → Nouvel entonnoir, et choisissez n’importe lequel de ces noms comme étapes, y compris les vôtres. Chaque étape compte les installations qui ont envoyé l’événement à n’importe quel moment, donc les apps dont les écrans arrivent dans un autre ordre obtiennent quand même un entonnoir utile. Activez Compter les étapes dans cet ordre uniquement dans un entonnoir pour ne compter une étape que lorsqu’elle a lieu après la précédente.

Événements standard

Nom de l’événementAndroidiOSReact NativeFlutterÉtape d’entonnoir
onboarding_steponboardingStep(step, index, flow)onboardingStep(_:index:flow:)onboardingStep(step, { index, flow })onboardingStep(step, index:, flow:)Onglet Onboarding, pas une étape
onboarding_skippedonboardingSkipped(step)onboardingSkipped(_:)onboardingSkipped(step)onboardingSkipped(step)Onglet Onboarding, pas une étape
onboarding_completedonboardingCompleted()onboardingCompleted()onboardingCompleted()onboardingCompleted()Onboarding
paywall_viewedpaywallViewed(placement)paywallViewed(placement:)paywallViewed(placement)paywallViewed(placement:)Paywall
paywall_skippedpaywallSkipped(placement)paywallSkipped(placement:)paywallSkipped(placement)paywallSkipped(placement:)Si vous l’ajoutez
sign_upsignUp(method)signUp(method:)signUp(method)signUp(method:)Inscription
sign_insignIn(method)signIn(method:)signIn(method)signIn(method:)Connecté
sign_up_skippedsignUpSkipped()signUpSkipped()signUpSkipped()signUpSkipped()Continué en invité
trial_startedtrialStarted(productId)trialStarted(productId:)trialStarted(productId)trialStarted(productId:)Essai
purchasepurchase(amount, currency, productId)purchase(amount:currency:productId:)purchase(amount, currency, productId)purchase(amount, currency, productId:)A payé
purchase_cancelledpurchaseCancelled(productId)purchaseCancelled(productId:)purchaseCancelled(productId)purchaseCancelled(productId:)Si vous l’ajoutez
purchase_failedpurchaseFailed(productId, reason)purchaseFailed(productId:reason:)purchaseFailed(productId, reason)purchaseFailed(productId:reason:)Si vous l’ajoutez
les vôtrestrack(name, properties)track(_:properties:)track(name, properties)track(name, properties)Si vous l’ajoutez

Tous les arguments sont facultatifs, sauf le montant et la devise d’un achat, et chaque appel accepte aussi des propriétés supplémentaires.

  • placement indique de quel paywall il s’agit : onboarding, launch, feature_gate, settings, ou un nom à vous. Il est envoyé comme propriété placement. Entonnoir → Répartir par Paywall affiche l’entonnoir propre à chaque emplacement.
  • method indique comment le compte a été créé : email, apple, google. Envoyé comme method.
  • productId est l’identifiant de votre produit dans le store. Envoyé comme product_id.
  • purchase transmet le prix sous forme décimale (Android BigDecimal, iOS Decimal, React Native et Flutter une chaîne comme "49.99") et un code de devise à trois lettres. Les prix ne sont jamais arrondis.

Quand envoyer chacun

ÉvénementÀ envoyer
onboarding_stepQuand chaque écran d’onboarding apparaît, pas quand on appuie sur son bouton. Voir Écrans d’onboarding.
onboarding_skippedQuand quelqu’un appuie sur Passer, avec l’écran sur lequel il a appuyé.
onboarding_completedQuand la dernière question ou le dernier écran d’onboarding est terminé, avant le paywall ou l’inscription qui suit.
paywall_viewedÀ chaque fois qu’un paywall apparaît, avec son emplacement. Pas pour les abonnés : si votre app ne leur montre aucun paywall, n’envoyez rien.
paywall_skippedQuand quelqu’un ferme un paywall sans acheter : son bouton de fermeture, un glissement vers le bas ou le geste retour. Pas pendant qu’un achat attend encore une validation (Ask to Buy, la vérification 3-D Secure d’une banque).
sign_upJuste après la création d’un nouveau compte. Pas quand quelqu’un se connecte à un compte qu’il avait déjà.
sign_inQuand quelqu’un se connecte à un compte qu’il avait déjà : un utilisateur de retour (une réinstallation, un nouveau téléphone, après une déconnexion). Parcours l’étiquette de retour et permet de filtrer dessus. SDK 0.3.0 ou plus récent.
sign_up_skippedQuand quelqu’un choisit de continuer sans compte sur un écran d’inscription (mode invité). Parcours l’étiquette invité, et un entonnoir avec une étape d’inscription le montre comme ayant pris un autre chemin, pas comme un abandon.
trial_started, purchaseQuand le store le confirme. Ne les envoyez pas si RevenueCat est connecté.
purchase_cancelledQuand quelqu’un ferme la fenêtre d’achat du store sans payer.
purchase_failedQuand le paiement échoue. reason est votre propre description courte.

Écrans d’onboarding

L’onglet Onboarding montre sur quel écran les gens partent et combien de temps prend chacun. Envoyez un appel par écran quand il apparaît, un sur Passer, et onboardingCompleted à la fin :

// 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 est un identifiant fixe par écran : goal, notifications, plan. Mêmes règles que pour les noms d’événements. Donnez aux embranchements leurs propres identifiants. Un pager ou un onboarding sur un seul écran en envoie un par page.
  • Uniquement les écrans de l’onboarding lui-même. Le paywall et l’écran d’inscription ne sont pas des écrans d’onboarding, même quand ils font partie du même flux : ils envoient paywallViewed / paywallSkipped et signUp. Un paywall fermé sans achat est un paywallSkipped, jamais un onboardingSkipped.
  • onboardingCompleted se place juste après le dernier écran d’onboarding, avant le paywall ou l’inscription qui suit, même quand le compte est créé à la fin du flux. Quelqu’un qui voit le paywall a terminé l’onboarding.
  • index (facultatif) est la position de l’écran, de 0 à 999. Avec lui, l’onglet peut montrer l’écran le plus avancé atteint en plus du dernier vu.
  • flow (facultatif) nomme l’onboarding, quand vous en avez plusieurs : une variante A/B, une nouvelle version, un ré-onboarding. Chaque flux a sa propre liste.
  • Ce sont les seules propriétés que ces événements acceptent. Toute autre propriété fait rejeter l’événement.
  • Ne mettez jamais de données utilisateur dans step ou flow. Ce sont des noms d’écrans, affichés dans le tableau de bord.
  • Ils sont gratuits. Un onboarding coûte un seul événement, son onboardingCompleted, quel que soit son nombre d’écrans. Chaque installation peut en envoyer jusqu’à 100, pour jusqu’à 40 écrans différents.
  • Le retour en arrière, l’arrêt forcé de l’app et les relances ne demandent rien de particulier. Unolink détermine le statut de chaque installation : terminé, passé sur un écran, parti sur son dernier écran (rien de nouveau depuis 24 heures), ou en cours. Une app qui n’envoie que onboardingCompleted montre quand même combien l’ont terminé ; les écrans sont nécessaires pour voir où les gens partent. Les installations qui n’ont envoyé aucun événement d’onboarding sont affichées comme non suivies, jamais comme des abandons.

Ces appels nécessitent le SDK 0.2.0 ou plus récent. Sur les versions plus anciennes, track("onboarding_step", { step: "goal" }) envoie le même événement.

Comment les événements sont comptés

  • Les entonnoirs comptent des personnes, pas des événements. Chaque étape compte les installations qui ont envoyé l’événement au moins une fois, donc un paywall vu cinq fois, ou un onboardingCompleted renvoyé après un retour en arrière, compte une fois par personne.
  • N’importe quel ordre, par défaut. Une étape compte dès qu’elle a eu lieu. Activez Compter les étapes dans cet ordre uniquement dans un entonnoir quand l’ordre compte ; une étape ne compte alors qu’au moment de la précédente ou après.
  • Chaque événement compte quand même dans votre forfait. Les répétitions sont enregistrées (Parcours affiche chacune) et chacune compte dans le quota mensuel, sauf les événements gratuits ci-dessous.
  • Les heures sont celles du téléphone, sauf si elles datent de plus de 7 jours ou sont plus d’une heure dans le futur ; dans ce cas, l’heure d’arrivée est utilisée.

Invités et comptes

Signalez le propre identifiant utilisateur d’app de RevenueCat à chaque fois qu’il change : pour un invité, l’identifiant anonyme de RevenueCat, puis l’identifiant du compte qu’il crée ou auquel il se connecte. connectRevenueCat (SDK 0.3.2 ou plus récent) s’en charge pour vous ; sinon, appelez setUserId avec. Chaque identifiant qu’une installation a envoyé compte, donc un achat fait en tant qu’invité, ses renouvellements, et les achats que RevenueCat déplace plus tard vers un autre compte restent tous liés à l’installation qui a acheté.

Ce qui s’est passéÀ envoyer
A créé un nouveau compte (e-mail, Apple, Google, aussi après avoir été invité)signUp(method)
S’est connecté à un compte qu’il avait déjàsignIn(method)
A choisi de continuer sans comptesignUpSkipped() (SDK 0.3.2+, React Native 0.3.1+ ; SDK plus anciens : track("sign_up_skipped"))
Un invité qui s’inscrit plus tard, depuis les paramètressignUp(method) : il compte pour l’étape d’inscription de l’entonnoir quel que soit le moment
S’est connecté avec un mot de passe réinitialisésignIn(method) : le compte existait déjà
A essayé de s’inscrire avec un e-mail déjà enregistré, puis s’est connectésignIn(method)
S’est déconnectésetUserId(null)

Nouveau ou de retour avec Apple ou Google ? Le résultat de la connexion l’indique généralement. Firebase : additionalUserInfo.isNewUser. Supabase : un utilisateur dont le created_at est à quelques secondes de last_sign_in_at vient d’être créé.

Événements automatiques

Le SDK les envoie lui-même. Ils sont gratuits : ils ne comptent jamais dans votre forfait.

ÉvénementQuand
first_openUne fois par installation, au premier lancement. C’est l’installation.
session_startAu lancement, ou quand l’app revient après 30 minutes ou plus en arrière-plan.
app_backgroundQuand l’app passe en arrière-plan.

Événements personnalisés

track(name, properties) envoie tout le reste, et les événements personnalisés peuvent aussi être des étapes d’entonnoir.

  • Noms : commencent par une lettre, puis lettres, chiffres, _ et ., 64 caractères au maximum. level_up ou export.pdf. Un nom invalide est ignoré et consigné dans les logs.
  • Propriétés : 20 au maximum par événement. Les valeurs sont des chaînes (jusqu’à 200 caractères), des nombres ou des booléens, 4 Ko au total.
  • Ne mettez jamais de noms, d’e-mails, de numéros de téléphone ou d’autres données personnelles dans les propriétés.

État de l’utilisateur et de l’app

Ces appels n’envoient aucun événement propre.

AndroidiOSReact NativeFlutterCe qu’il fait
setUserId(id)setUserId(_:)setUserId(id)setUserId(id)L’identifiant utilisateur de votre app ; avec RevenueCat, le propre identifiant utilisateur d’app de RevenueCat. Stocké uniquement sous forme de hachage à sens unique par app. Rappelez-le chaque fois qu’il change (invité → compte) : chaque identifiant compte. Passez null (nil) à la déconnexion. 256 caractères au maximum.
connectRevenueCat { }connectRevenueCat { }connectRevenueCat(Purchases)connectRevenueCat(…)Garde l’identifiant utilisateur égal à l’identifiant utilisateur d’app de RevenueCat, invités compris (SDK 0.3.2+). Voir RevenueCat. Utilisez-le ou setUserId, pas les deux.
revenueCatUserChanged()revenueCatUserChanged()Envoie tout de suite le nouvel identifiant de RevenueCat : appelez-le après logIn et logOut (SDK 0.3.2+). React Native et Flutter le remarquent d’eux-mêmes.
setDeferredDeepLinkListener { }onDeferredDeepLink(_:)addDeferredDeepLinkListener(fn)setDeferredDeepLinkListener(fn)Appelé une fois par installation venue d’un lien Unolink. En pratique, Android uniquement.
getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()getPendingDeferredDeepLink(), consumeDeferredDeepLink()Le lien à ouvrir une fois l’onboarding ou la connexion terminés, puis à marquer comme ouvert. Il attend d’être consommé, même si l’app est fermée entre-temps, jusqu’à 30 jours (SDK 0.3.3+ ; React Native 0.3.1+ le gardait pour un seul lancement).
isConfigured()Indique si configure a été exécuté avec une clé (React Native 0.3.1+).
getInstallId()installIdgetInstallId()getInstallId()L’identifiant d’installation aléatoire de cette installation.
flush()flush()flush()flush()Envoie tout de suite les événements en file d’attente.
setEnabled(bool)setEnabled(_:)setEnabled(bool)setEnabled(bool)Désactive le suivi (les événements en file d’attente sont supprimés) ou le réactive.

RevenueCat

Quand RevenueCat est connecté, il fait foi pour tout ce qui concerne l’argent. Il remonte les essais, achats, renouvellements, annulations, remboursements, expirations et problèmes de paiement, même quand l’app n’est pas ouverte. Les appels de l’app à purchase et trialStarted sont ignorés, pour que rien ne compte deux fois. Votre app n’a besoin que de connectRevenueCat (ou setUserId avec l’identifiant de RevenueCat).

Quota du forfait

Le SDK fait partie des forfaits Pro et Studio. Chaque événement envoyé par votre app compte dans le quota mensuel d’événements : 1 million avec Pro, 5 millions avec Studio. Cela inclut les événements standard ci-dessus et vos événements personnalisés. Les événements automatiques (first_open, session_start, app_background) et les écrans d’onboarding (onboarding_step, onboarding_skipped) sont gratuits, tout comme les achats, renouvellements et remboursements qui arrivent de RevenueCat. Dépasser le quota ne bloque rien ; au-delà de deux fois le quota, les événements personnalisés sont refusés jusqu’au mois suivant, tandis que les événements standard, d’onboarding et automatiques sont toujours conservés.