Repository navigation
Brancher RevenueCat et construire l'écran Premium (E-17) #67
Copy link
Copy link
Open
Labels
area:mobileapps/mobileapps/mobileprio:P0BloquantBloquantstatus:blockedBloqué, voir commentaire ⛔Bloqué, voir commentaire ⛔type:featureNouvelle fonctionnalitéNouvelle fonctionnalité
Milestone
Description
Contexte
Epic : #11
Maquette : E-17, E-05 · validées le 2026-09-29 (D-072 à D-074)
Compte-et-Monetisation · Ecrans · E-17, E-09 · D-002. Niveau 2 : nouveau sous-traitant et flux d'achat.
Comportement attendu (révisé le 2026-09-29, D-072, https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog)
- Quatre produits RevenueCat : abonnement mensuel (3,99 €) et annuel (29,99 €) avec essai de 7 jours ; pass 7 jours non renouvelable (2,99 €) ; déblocage d'un parcours (1,99 €), rattaché au parcours côté serveur (Appliquer les parcours Premium, le déblocage à l'unité et la limite anti-spam dans l'API #66). Prix toujours lus depuis le store.
- E-17 : trois formules (pass 7 jours, annuel, mensuel) ; depuis un parcours, en plus « Seulement ce parcours ». Ordre et présélection selon le profil, calculés sur le téléphone : langue autre que le français ou région hors de France, pass en tête ; sinon l'annuel.
- E-05 : encart d'un parcours Premium avec achat du parcours seul en direct et lien du pass, qui ouvre E-17 avec le pass présélectionné ; parcours débloqué ; pass activé (toast avec date et heure de fin).
- Achat possible sans compte, le compte reste facultatif (règle App Store 5.1.1(v)) ; achats rattachés au compte à la connexion (Appliquer les parcours Premium, le déblocage à l'unité et la limite anti-spam dans l'API #66).
- Achat sans compte (D-099, qui amende D-096) : avant toute opération du store faite sans compte (débloquer un parcours, pass, abonnement, « Restaurer les achats »), s'il n'y en a pas encore sur le téléphone, l'app crée un compte anonyme Firebase (
signInAnonymously) puis fait lelogInRevenueCat avec son uid ; elle envoie ensuite son jeton sur les routes à authentification facultative. Pour l'utilisateur rien ne change : il reste « sans compte » et la sheet « pour le garder » suit toujours un déblocage (D-073). Créer un compte sur ce téléphone lie l'identité au compte anonyme (linkWithCredential) : même uid, rien à rattacher. Se connecter à un compte qui existe déjà : l'app prend un jeton frais du compte anonyme juste avant la connexion (il expire en 1 h), l'envoie àPOST /me/merge-anonymous(Reconnaître un achat fait sans compte : compte anonyme, fusion à la connexion et purge (API) #532) une fois connectée, puis faitlogInRevenueCat avec le nouvel uid etsyncPurchases. Un 401 sur le compte anonyme (purgé) : l'app oublie le compte et repart sans jeton. Firebase : fournisseur anonyme activé, nettoyage automatique des comptes anonymes laissé désactivé. - Premium offert : le webhook laisse intact un compte à
plan_source = giftet n'écrase pas sa date de fin (décision d'Ilan du 2026-10-16, découverte de Marco sur Admin : utilisateurs et rôles (A-06) #341, PR feat(admin): gérer les utilisateurs et leurs rôles (A-06) #499). - E-17 ne s'ouvre plus depuis « Créer un parcours » (création gratuite).
- Textes, états (en attente, restauration « Aucun achat Widoo sur ce compte App Store. »), valeurs :
mappings.premiumde tokens.json v34. - Maquettes : E-17, E-05. Reste en planche 2 de Design — révision du freemium : création gratuite, pass 7 jours et déblocage à l'unité (E-17, E-05, E-08, E-09) #210 : pass en cours dans les Réglages, compte facultatif après un achat.
Critères d'acceptation
- Achat sandbox iOS et Android : le compte passe Premium en moins de 10 s et la programmation bloquée s'exécute
- Restaurer les achats sur un nouvel appareil fonctionne
- Aucune clé secrète RevenueCat dans l'app (clé publique seulement)
- Depuis une fiche Premium sans abonnement, le bouton et l'encart ouvrent E-17 ; après achat, la fiche normale revient
- Tous les textes visibles sont au vouvoiement
- Chaque ouverture de E-17 affiche sa raison, et
paywall_shownportereasonetsource - Après un achat ou une restauration réussis, l'app relance la recherche en vidant son cache des résultats, et la carte reçoit les cards Premium déverrouillées (
isLocked: false) sans redémarrage (D-075) - Achat d'un parcours à l'unité sans compte en sandbox : la fiche s'ouvre débloquée sans créer de compte visible ; puis création d'un compte sur le même téléphone : même uid, parcours toujours débloqué
- Achat sans compte puis connexion à un compte existant : déblocage et Premium passent au compte connecté par
POST /me/merge-anonymous;syncPurchasesvérifié sur un achat de test (pass et abonnement compris) - « Restaurer les achats » sans compte crée le compte anonyme et rend le pass ou l'abonnement visible pour l'API
- Test du webhook : un événement RevenueCat sur un compte à
plan_source = giftne change niplan, niplan_source, niplan_expires_at
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:mobileapps/mobileapps/mobileprio:P0BloquantBloquantstatus:blockedBloqué, voir commentaire ⛔Bloqué, voir commentaire ⛔type:featureNouvelle fonctionnalitéNouvelle fonctionnalité
Activity
IlanAMG commentedon Sep 25, 2026
Planche 1 de E-17 validée le 2026-09-25 (D-040, https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : produits RevenueCat à 3,99 € par mois et 29,99 € par an, offre d'introduction gratuite de 7 jours sur les deux, annuel présélectionné avec pastille « Le plus avantageux » ; page plein écran bleue (mappings.premium, design/design-system/ruban-widoo.svg) ; haut de page selon l'ouverture (photo du parcours ou trois photos) ; deux avantages. Événements d'achat avec la propriété trial. Maquettes : https://github.com/Inprogress-Agency/widoo-app/wiki/Ecrans#e-17--premium. Reste bloqué par #75 (planches 2 et 3).
IlanAMG commentedon Sep 25, 2026
Planche 2 de E-17 validée le 2026-09-25 (D-044, https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog), états à coder (mappings.premium.states) :
Maquettes : https://github.com/Inprogress-Agency/widoo-app/wiki/Ecrans#e-17--premium. Reste bloqué par Design — E-17 écran Premium #75 (planche 3).
IlanAMG commentedon Sep 25, 2026
D-045 (décision d'Ilan, https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : ajouter purchase_failed (reason, hors annulation par l'utilisateur), purchase_pending et purchase_restored (found), avec plan et trial. Détail : https://github.com/Inprogress-Agency/widoo-app/wiki/Analytics
IlanAMG commentedon Sep 25, 2026
Tokens v18 (D-046) arrivent par la synchro automatique. Règle du texte agrandi dans les composants de base : #174.
IlanAMG commentedon Sep 28, 2026
Révision du 2026-09-28 (décision d'Ilan, https://github.com/Inprogress-Agency/widoo-app/wiki/Compte-et-Monetisation#freemium-mvp) : quatre produits RevenueCat au lieu de deux (mensuel, annuel, pass 7 jours non renouvelable, déblocage d'un parcours non consommable par parcours ou consommable rattaché au parcours, à trancher côté technique). E-17 est à redessiner (#210) : needs-design jusqu'à la planche.
6 remaining items
IlanAMG commentedon Sep 29, 2026
D-074 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : E-17 complet (états de l'achat avec les trois formules et le parcours seul : en cours, impossible, en attente, essai déjà utilisé, restauration, rien à restaurer « Aucun pass ni abonnement Widoo sur ce compte App Store. », hors connexion « reconnectez-vous pour acheter », « Pass Premium restauré »), texte agrandi, contrôle accessibilité. needs-design retiré. Reste le point technique : rattacher au compte les achats faits sans compte (#66).
PaulThiberville commentedon Sep 29, 2026
📋 Report de D-075 (2026-09-29, correction de D-066 sur la card de recherche Premium, décision de Paul au nom d'Ilan ; voir #161) : critère ajouté au corps. Après un achat ou une restauration, l'app relance la recherche (cache des résultats vidé) pour recevoir les cards Premium déverrouillées.
PaulThiberville commentedon Oct 14, 2026
📋 MANAGER (2026-10-14), deux points liés à ce ticket :
GET /me(Distinguer le pass et l'abonnement dans GET /me #424) et l'achat « Débloquer ce parcours » de ce ticket ; elle aura son ticket mobile au découpage de Distinguer le pass et l'abonnement dans GET /me #424 ;paywall_dismissedetpurchase_*que ce ticket émet n'acceptent queplanmonthly/annualdans Analytics : ni pass 7 jours ni déblocage (D-072) → Donner aux événements d'achat le pass 7 jours et le déblocage à l'unité #447 (needs-design).IlanAMG commentedon Oct 14, 2026
Chef de projet (2026-10-14) : pour mémoire, D-092 : en attendant ce ticket, l'encart Premium de la fiche (E-05) sans prix du store garde « Débloquer ce parcours » désactivé et n'affiche pas le lien du pass. C'est un état provisoire : il disparaît quand l'achat à l'unité et le pass sont branchés ici.
IlanAMG commentedon Oct 16, 2026
Chef de projet (16/10/2026, décisions d'Ilan en séance) : critère à ajouter, découvert par Marco sur #341 (PR #499) : le webhook RevenueCat laisse intact un compte à
plan_source = gift(Premium offert) et n'écrase pas sa date de fin. Voir aussi #413 (déblocage sans compte rattaché aulogIn).PaulThiberville commentedon Oct 19, 2026
📋 MANAGER, 2026-10-19 — report de D-096 (décision d'Ilan sur #413) : le corps porte l'achat sans compte et le rattachement au
logInRevenueCat (l'API ne rattache que sur la foi de RevenueCat), avec un critère sandbox. Ajouté aussi le critère du Premium offert (plan_source = giftlaissé intact), décidé par Ilan le 2026-10-16 et resté en commentaire.Dépendances : #413 (tranché) retiré ; ajoutés #532 (migration de
route_unlockset service de rattachement, que le webhook appelle) et #531 (needs-design: lecture de la fiche débloquée par un acheteur sans compte). #245 (comptes des stores,human) le retient toujours.IlanAMG commentedon Oct 20, 2026
Chef de projet (point du 20/10/2026) : D-099 (décision d'Ilan sur #531, fermé) amende D-096 : compte anonyme avant toute opération du store faite sans compte,
logInRevenueCat avec l'uid,linkWithCredentialà la création du compte, plus de rattachement aulogIn. Corps à mettre à jour par MANAGER. Reste bloqué par #532 et #245.IlanAMG commentedon Oct 20, 2026
Chef de projet (2026-10-20) : report de D-099 (décision d'Ilan sur #531). La puce « Achat sans compte et rattachement » et le critère de rattachement sont remplacés : compte anonyme avant la première opération du store,
linkWithCredentialà la création du compte, fusion puissyncPurchasesà la connexion à un compte existant. Ajouté : jeton anonyme pris juste avant la connexion, car il expire en 1 h. Reste bloqué par #532 et #245.