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énement | Android | iOS | React Native | Flutter | Étape d’entonnoir |
|---|---|---|---|---|---|
onboarding_step | onboardingStep(step, index, flow) | onboardingStep(_:index:flow:) | onboardingStep(step, { index, flow }) | onboardingStep(step, index:, flow:) | Onglet Onboarding, pas une étape |
onboarding_skipped | onboardingSkipped(step) | onboardingSkipped(_:) | onboardingSkipped(step) | onboardingSkipped(step) | Onglet Onboarding, pas une étape |
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:) | Si vous l’ajoutez |
sign_up | signUp(method) | signUp(method:) | signUp(method) | signUp(method:) | Inscription |
sign_in | signIn(method) | signIn(method:) | signIn(method) | signIn(method:) | Connecté |
sign_up_skipped | signUpSkipped() | signUpSkipped() | signUpSkipped() | signUpSkipped() | Continué en invité |
trial_started | trialStarted(productId) | trialStarted(productId:) | trialStarted(productId) | trialStarted(productId:) | Essai |
purchase | purchase(amount, currency, productId) | purchase(amount:currency:productId:) | purchase(amount, currency, productId) | purchase(amount, currency, productId:) | A payé |
purchase_cancelled | purchaseCancelled(productId) | purchaseCancelled(productId:) | purchaseCancelled(productId) | purchaseCancelled(productId:) | Si vous l’ajoutez |
purchase_failed | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | purchaseFailed(productId, reason) | purchaseFailed(productId:reason:) | Si vous l’ajoutez |
| les vôtres | track(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.
placementindique 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.methodindique comment le compte a été créé :email,apple,google. Envoyé commemethod.productIdest l’identifiant de votre produit dans le store. Envoyé commeproduct_id.purchasetransmet le prix sous forme décimale (AndroidBigDecimal, iOSDecimal, 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_step | Quand chaque écran d’onboarding apparaît, pas quand on appuie sur son bouton. Voir Écrans d’onboarding. |
onboarding_skipped | Quand quelqu’un appuie sur Passer, avec l’écran sur lequel il a appuyé. |
onboarding_completed | Quand 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_skipped | Quand 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_up | Juste après la création d’un nouveau compte. Pas quand quelqu’un se connecte à un compte qu’il avait déjà. |
sign_in | Quand 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_skipped | Quand 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, purchase | Quand le store le confirme. Ne les envoyez pas si RevenueCat est connecté. |
purchase_cancelled | Quand quelqu’un ferme la fenêtre d’achat du store sans payer. |
purchase_failed | Quand 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);
stepest 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/paywallSkippedetsignUp. Un paywall fermé sans achat est unpaywallSkipped, jamais unonboardingSkipped. onboardingCompletedse 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
stepouflow. 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
onboardingCompletedmontre 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
onboardingCompletedrenvoyé 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 compte | signUpSkipped() (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ètres | signUp(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énement | Quand |
|---|---|
first_open | Une fois par installation, au premier lancement. C’est l’installation. |
session_start | Au lancement, ou quand l’app revient après 30 minutes ou plus en arrière-plan. |
app_background | Quand 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_upouexport.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.
| Android | iOS | React Native | Flutter | Ce 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() | installId | getInstallId() | 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.