Skip to content

Brancher RevenueCat et construire l'écran Premium (E-17) #67

Open

Description

@IlanAMG

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 le logIn RevenueCat 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 fait logIn RevenueCat avec le nouvel uid et syncPurchases. 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 = gift et 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.premium de 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_shown porte reason et source
  • 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 ; syncPurchases vé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 = gift ne change ni plan, ni plan_source, ni plan_expires_at

Activity

  1. added this to the v0.4 milestone on Sep 21, 2026
  2. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    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).

  3. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    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) :

    • achat réussi : E-17 redescend, retour au contexte débloqué avec un toast ; depuis « Créer un parcours », l'éditeur s'ouvre ; depuis un encart, l'encart disparaît ; focus sur le titre de la page d'origine ;
    • annulation dans le store : aucun message ;
    • échec : toast « Achat impossible » avec « Réessayer » ;
    • achat en attente de validation : toast d'information « Achat en attente » ;
    • essai déjà utilisé : prix seul et « S'abonner » ;
    • restauration : toast « Premium restauré », « Restauration impossible » en erreur, état « rien à restaurer » ;
    • prix non chargés : squelette ;
    • hors connexion : page lisible, bouton d'achat et « Restaurer les achats » inactifs.
      Maquettes : https://github.com/Inprogress-Agency/widoo-app/wiki/Ecrans#e-17--premium. Reste bloqué par Design — E-17 écran Premium #75 (planche 3).
  4. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    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

  5. added
    status:readySpec complète, prêt à coder
    and removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Sep 25, 2026
  6. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    Tokens v18 (D-046) arrivent par la synchro automatique. Règle du texte agrandi dans les composants de base : #174.

  7. IlanAMG commented on Sep 28, 2026

    @IlanAMG
    MemberAuthor

    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.

  8. added
    needs-designQuestion ou maquette à produire en mode DESIGN
    and removed
    status:readySpec complète, prêt à coder
    on Sep 28, 2026
  9. 6 remaining items

  10. added
    status:blockedBloqué, voir commentaire ⛔
    and removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Sep 29, 2026
  11. IlanAMG commented on Sep 29, 2026

    @IlanAMG
    MemberAuthor

    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).

  12. PaulThiberville commented on Sep 29, 2026

    @PaulThiberville
    Collaborator

    📋 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.

  13. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-14), deux points liés à ce ticket :

  14. IlanAMG commented on Oct 14, 2026

    @IlanAMG
    MemberAuthor

    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.

  15. IlanAMG commented on Oct 16, 2026

    @IlanAMG
    MemberAuthor

    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é au logIn).

  16. PaulThiberville commented on Oct 19, 2026

    @PaulThiberville
    Collaborator

    📋 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 logIn RevenueCat (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 = gift laissé intact), décidé par Ilan le 2026-10-16 et resté en commentaire.

    Dépendances : #413 (tranché) retiré ; ajoutés #532 (migration de route_unlocks et 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.

  17. IlanAMG commented on Oct 20, 2026

    @IlanAMG
    MemberAuthor

    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, logIn RevenueCat avec l'uid, linkWithCredential à la création du compte, plus de rattachement au logIn. Corps à mettre à jour par MANAGER. Reste bloqué par #532 et #245.

  18. IlanAMG commented on Oct 20, 2026

    @IlanAMG
    MemberAuthor

    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 puis syncPurchases à 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions