RevenueCat : abonnements dans Finance et Notifications
Brancher RevenueCat donne à Appwin les chiffres d'abonnement de ton app : MRR, revenus, churn, abonnés actifs, essais.
C'est la source de la quasi-totalité du produit Finance. Sans elle, la page reste vide et propose de connecter le compte.
Deux canaux, complémentaires :
| Canal | Rôle |
|---|---|
| Reçois tous tes achats en temps réel | Webhook : chaque achat, renouvellement ou remboursement dès qu'il a lieu |
| Importe tout ton historique RC | Scheduled Data Exports (S3) : tout le passé, puis une mise à jour quotidienne |
Le webhook ne couvre que le futur. Le dépôt S3 ramène aussi le passé.
Réglages → Projets → ton app → Intégrations → RevenueCat.
1. Reçois tous tes achats en temps réel
Dans Appwin, la fiche RevenueCat → carte Reçois tous tes achats en temps
réel affiche le Project ID RevenueCat, l'URL du webhook et un
secret (préfixe whsec_…). Tu colles l'URL et le secret dans RevenueCat.
- 1
Copie le Project ID
Ouvre RevenueCat, sélectionne ton projet, puis Project settings → Project ID, et colle-le dans Appwin. Il figure aussi dans l'URL RevenueCat :
app.revenuecat.com/projects/<Project ID>/….
- 2
Relève URL et secret dans Appwin
Génère le secret si besoin, puis copie l'URL et le secret depuis la carte.

- 3
Ouvre Integrations → Webhooks
Ouvre RevenueCat, sélectionne ton projet, puis Integrations, et clique la carte Webhooks.

- 4
Colle l'URL et le secret
Ajoute un webhook. Sur Appwin, copie URL du webhook (forme
https://ingestion.appwin.io/ingest/v1/revenuecat/<id>) et colle-la dans le champ Webhook URL de RevenueCat.Choisis l'auth Authorization header et colle le secret tel quel (préfixe
whsec_inclus), puis sauvegarde dans RevenueCat.
- 5
Confirme dans Appwin
Une fois le webhook sauvegardé chez RevenueCat, clique C'est bon dans RevenueCat sur la fiche Appwin. On ne peut pas vérifier l'envoi avant le premier achat : ce bouton enregistre seulement que tu as terminé la manip.
2. Importe tout ton historique RC
Sans export planifié, Finance ne voit que les événements reçus après l'activation du webhook. Le dépôt S3 comble le passé.
Avant de coller les champs dans RevenueCat, crée le dépôt sur la fiche RevenueCat → carte Importe tout ton historique RC → Créer mon dépôt S3. Appwin affiche Endpoint, Bucket, Access Key, Secret Key, et le bucket folder (l'id de ce projet).
- 1
Ouvre Scheduled Data Exports
Ouvre RevenueCat, sélectionne ton projet, puis Integrations et la carte Scheduled Data Exports.

- 2
Choisis S3
Sous Choose a cloud storage provider, clique Configure sur Scheduled Data Exports (S3).

- 3
Credential type → S3-Compatible
Dans le formulaire, Credential type → S3-Compatible (pas Access Key Amazon classique : le dépôt Appwin est un stockage S3-compatible).

- 4
Colle les identifiants Appwin
Remplis avec les valeurs de la carte Appwin :
Champ RevenueCat Valeur Appwin AWS Access Key ID AWS Access Key ID AWS Secret Access Key AWS Secret Access Key Endpoint URL Endpoint URL Bucket name Nom du bucket Bucket folder Bucket folder (ce projet) - l'id du projet, pas un chemin inventé 
- 5
Next export start time
Renseigne Next export start time (maintenant ou bientôt). Attention au AM/PM : le sélecteur est en 12 heures UTC. Une heure PM saisie en AM retarde le premier export de 12 heures.

- 6
Décoche l'export incrémental
Décoche Receive new and updated transactions only. Si tu le laisses coché, RevenueCat n'envoie que le futur, pas l'historique.

- 7
Active l'export
Laisse la fréquence à 24 heures, le format en CSV, puis Add integration.

3. Notifications : subscription_status
Appwin tient à jour le statut d'abonnement de chaque utilisateur, même s'il ne rouvre jamais l'app. Un abonnement qui expire, est annulé ou échoue au renouvellement change l'audience de l'utilisateur dans Notifications et peut déclencher une automatisation.
Ce qui le tient à jour
| Élément | Rôle | Où |
|---|---|---|
identify() avec l'identifiant utilisateur RevenueCat | Dit à Appwin à quel utilisateur correspond un abonné | Ton app (ci-dessous) |
| Webhook | Pousse chaque achat, renouvellement, annulation, échec de paiement et expiration en quelques secondes, app fermée | Étape 1 |
| Export S3 | Pose le statut des abonnés existants, puis rattrape chaque jour un webhook que RevenueCat aurait abandonné | Étape 2 |
Relier l'abonné RevenueCat à l'utilisateur Appwin
Appelle identify() avec le même identifiant utilisateur que celui que tu
donnes à RevenueCat avec logIn(). Appwin compare l'app_user_id RevenueCat
(et ses alias) à cet identifiant.
_ = try await Purchases.shared.logIn(user.id)
try await AppwinCore.identify(externalId: user.id)
Utilisateurs sans compte
Si ton app vend des abonnements à des utilisateurs anonymes (pas de logIn(),
identifiant RevenueCat qui commence par $RCAnonymousID:), il n'y a pas
d'identifiant commun. Pose plutôt l'identifiant d'appareil Appwin dans
l'attribut d'abonné RevenueCat appwin_device_id :
if let id = AppwinCore.deviceId {
Purchases.shared.attribution.setAttributes(["appwin_device_id": id])
}
Ce que tu peux cibler
| Propriété | Valeurs |
|---|---|
subscription_status | trial, active, cancelled (encore actif jusqu'à la fin de la période), billing_issue, paused, expired |
subscription_expires_at | Fin de la période en cours |
subscription_product | Identifiant produit du store |
subscription_entitlements | Entitlements actifs, séparés par des virgules |
Ces propriétés viennent du store : une fois remplies par RevenueCat pour un utilisateur, les valeurs envoyées par l'app pour les mêmes clés sont ignorées.
Déclencheurs d'automatisation
Avec le webhook branché, les changements de statut déclenchent des automatisations : Essai démarré, Abonnement souscrit, Essai converti, Abonnement renouvelé, Abonnement annulé, Échec de paiement, Abonnement expiré. Ils peuvent aussi faire sortir d'un parcours, par exemple quitter une reconquête sur Abonnement souscrit.
Chaque déclencheur atteint tous les appareils de l'utilisateur, comme si l'app avait envoyé l'événement.
Abonnés existants
Le webhook ne voit que ce qui se passe à partir de maintenant. L'export S3 pose le statut de tes abonnés existants à son premier dépôt, puis le rafraîchit chaque jour. Il ne déclenche pas d'automatisation : il enregistre où en sont les gens, il ne rejoue pas leur historique.
Ce que ça débloque
Les métriques de Finance alimentées par RevenueCat :
| Métrique | Contenu |
|---|---|
| MRR | Revenu mensuel récurrent |
| ARR | Revenu annuel récurrent |
| Revenue | Revenus encaissés sur la période |
| Churn | Taux d'attrition |
| Active subscribers | Abonnés actifs |
| Refund rate | Taux de remboursement |
| LTV per customer | Valeur vie moyenne |
| New trials | Essais démarrés |
| Trial conversion rate | Conversion des essais en payant |
| New customers | Nouveaux clients |
Chacune s'affiche en valeur unique ou en série temporelle, sur les périodes proposées par le produit (7 jours à 1 an, MTD, QTD, YTD, mois/trimestre/année précédents).
Fraîcheur
| Canal | Délai typique |
|---|---|
| Webhook | Quasi immédiat après l'événement chez les stores |
| Export S3 | Quotidien une fois l'export activé ; le premier dépôt peut prendre plus longtemps |
Les tableaux de bord peuvent encore mettre en cache quelques minutes une agrégation déjà calculée : un rafraîchissement de page ne relance pas forcément un recalcul.
Dépannage
| Symptôme | Cause probable |
|---|---|
| Aucun nouvel achat n'apparaît | Webhook non sauvegardé, mauvaise URL, ou secret sans le préfixe whsec_ |
| Historique vide, flux live OK | Dépôt S3 non créé, Scheduled Data Exports off, ou Receive new and updated transactions only resté coché |
| 401 côté RevenueCat sur le webhook | Secret incorrect ou auth autre que Authorization header |
| Page Finance vide | Aucune donnée reçue sur la période choisie |
| Bucket folder refusé | Tu as inventé un dossier : utilise l'id du projet affiché dans Appwin |
| Statut jamais posé | identify() appelé avec un autre identifiant que le logIn() RevenueCat, ou utilisateur anonyme sans appwin_device_id |
| Statut posé, aucune automatisation déclenchée | Webhook pas branché (l'export S3 seul pose le statut sans rien déclencher), ou automatisation pas active |
| Le statut revient en arrière après une mise à jour de l'app | Ton app écrit elle-même des attributs subscription_* avant que RevenueCat les ait remplis : arrête de les envoyer |
Suite
- Finance - ce que le produit fait de ces chiffres
- Notifications - audiences et automatisations sur le statut d'abonnement
- Adjust - le versant dépenses, pour rapprocher coût et revenu