RevenueCat

Si votre app utilise RevenueCat, connectez son webhook et Unolink reçoit chaque essai, achat, renouvellement, annulation et remboursement directement depuis RevenueCat, y compris les renouvellements et remboursements qui ont lieu quand l’app n’est même pas ouverte. Les revenus de votre entonnoir deviennent nets des remboursements. Forfait Pro et plus.

1. Connecter

Dans Unolink, ouvrez votre app → Paramètres → RevenueCat → Connecter. Copiez l’URL du webhook et la valeur de l’en-tête Authorization (affichée une seule fois).

2. Ajouter le webhook dans RevenueCat

Dans RevenueCat, ouvrez votre projet → Integrations → Webhooks → Add new configuration :

  • Webhook URL et Authorization header value : collez-les.
  • Environment : les deux. Les achats sandbox sont comptés comme appareils de test, ils restent donc en dehors de vos vrais chiffres.
  • App : cette app. Events : tous.

Enregistrez, puis Send test event. La carte RevenueCat dans Unolink indique quand il arrive.

Les achats sont reliés à l’installation (et au lien d’où elle vient) grâce à l’identifiant utilisateur signalé par votre app : le propre identifiant utilisateur d’app de RevenueCat. Avec le SDK 0.3.2 ou plus récent, une seule ligne le tient à jour. Appelez-la une fois au lancement, avant ou après configure :

Unolink.connectRevenueCat { Purchases.isConfigured ? Purchases.shared.appUserID : nil }
Unolink.connectRevenueCat { Purchases.sharedInstance.appUserID }
import Purchases from "react-native-purchases"

Unolink.connectRevenueCat(Purchases)
Unolink.connectRevenueCat(
  () => Purchases.appUserID,
  addListener: Purchases.addCustomerInfoUpdateListener,
  removeListener: Purchases.removeCustomerInfoUpdateListener,
);

Unolink lit l’identifiant au lancement, chaque fois que l’app revient au premier plan et chaque fois qu’il change, et ne l’envoie que s’il est nouveau. Cela n’ajoute pas RevenueCat à votre app : c’est vous qui lui passez RevenueCat. Sur iOS et Android, appelez aussi Unolink.revenueCatUserChanged() après Purchases.logIn et Purchases.logOut pour envoyer le nouvel identifiant tout de suite (sinon il part avec le prochain événement). React Native et Flutter remarquent le changement d’eux-mêmes.

Sans connectRevenueCat (un SDK plus ancien, ou si vous préférez le faire vous-même), appelez setUserId avec l’identifiant de RevenueCat après Purchases.configure, après chaque Purchases.logIn et Purchases.logOut, et à chaque lancement. Utilisez l’un ou l’autre, pas les deux :

Unolink.setUserId(Purchases.shared.appUserID)
Unolink.setUserId(Purchases.sharedInstance.appUserID)
Unolink.setUserId(await Purchases.getAppUserID())
Unolink.setUserId(await Purchases.appUserID);

Pour un invité, c’est l’identifiant anonyme de RevenueCat, donc un achat fait avant l’inscription est relié à l’installation tout de suite. Après logIn, c’est l’identifiant du compte. Unolink conserve chaque identifiant signalé par une installation, donc l’achat de l’invité reste relié.

Si votre app ne signale que l’identifiant du compte, l’achat d’un invité est quand même relié, mais seulement avec le prochain événement RevenueCat pour ce client qui liste les deux identifiants (par exemple le premier renouvellement). Jusque-là, la personne apparaît comme n’ayant pas encore payé. Signaler l’identifiant de RevenueCat évite cette attente.

Quand quelqu’un appuie sur « continuer en invité », appelez aussi Unolink.signUpSkipped() (SDK 0.3.2 ou plus récent, React Native 0.3.1 ; SDK plus anciens : track("sign_up_skipped")), pour que l’étape Continué en invité de l’entonnoir les compte. Voir Invités et comptes.

Unolink ne stocke jamais l’identifiant lui-même, seulement un hash à clé, différent pour chacune de vos apps. Un achat qui arrive avant que l’app ait remonté son utilisateur attend, et est relié à l’installation dès que c’est fait. Les paiements qui arrivent des jours ou des semaines plus tard comptent quand même, et le Rapport montre combien de temps les gens mettent : voir Paiements et identifiants utilisateur, qui couvre aussi la confidentialité et les règles d’Apple.

Ce qui arrive

RevenueCatDans Unolink
INITIAL_PURCHASE (essai)Essai commencé
INITIAL_PURCHASE, NON_RENEWING_PURCHASE, conversion d’essaiA payé, avec revenus
RENEWALRenouvelé, avec revenus
CANCELLATION (remboursement)Remboursé, revenus déduits
CANCELLATION, EXPIRATION, BILLING_ISSUEAbonnement annulé, Abonnement expiré, Problème de paiement

Une fois RevenueCat connecté, il fait foi pour les achats et les essais : si votre app appelle aussi Unolink.purchase() ou trialStarted(), ces appels sont ignorés, donc rien n’est compté deux fois. Les renouvellements, annulations et le reste peuvent être ajoutés comme étapes dans n’importe quel entonnoir (Entonnoir → Modifier).