287 lines
13 KiB
Gherkin
287 lines
13 KiB
Gherkin
# language: fr
|
|
Fonctionnalité: Contenus Premium exclusifs
|
|
En tant que créateur monétisé
|
|
Je veux pouvoir rendre certains contenus exclusifs aux abonnés Premium
|
|
Afin d'inciter les utilisateurs à s'abonner
|
|
|
|
Contexte:
|
|
Étant donné que je suis un créateur avec la monétisation activée
|
|
|
|
Scénario: Toggle "Réservé Premium" lors de la création
|
|
Étant donné que je crée un nouveau contenu
|
|
Quand j'accède aux options de publication
|
|
Alors je vois un toggle "Réservé aux abonnés Premium 👑"
|
|
Et je peux l'activer ou le désactiver
|
|
|
|
Scénario: Contenu marqué Premium lors de la création
|
|
Étant donné que je crée un nouveau contenu
|
|
Quand j'active le toggle "Réservé Premium"
|
|
Et que je publie le contenu
|
|
Alors le champ `is_premium` en base est mis à `true`
|
|
Et le contenu est visible uniquement pour les utilisateurs Premium
|
|
|
|
Scénario: Contenu gratuit par défaut
|
|
Étant donné que je crée un nouveau contenu
|
|
Quand je ne touche pas au toggle "Réservé Premium"
|
|
Et que je publie le contenu
|
|
Alors le champ `is_premium` en base est mis à `false` (défaut)
|
|
Et le contenu est accessible à tous les utilisateurs
|
|
|
|
Scénario: Modification d'un contenu existant en Premium
|
|
Étant donné que j'ai publié un contenu gratuit il y a 2 jours
|
|
Quand je modifie le contenu et active le toggle "Réservé Premium"
|
|
Et que j'enregistre les modifications
|
|
Alors le contenu devient immédiatement Premium
|
|
Et les utilisateurs gratuits ne peuvent plus y accéder
|
|
|
|
Scénario: Passage d'un contenu Premium en gratuit
|
|
Étant donné que j'ai publié un contenu Premium il y a 1 mois
|
|
Quand je modifie le contenu et désactive le toggle "Réservé Premium"
|
|
Et que j'enregistre les modifications
|
|
Alors le contenu devient immédiatement gratuit
|
|
Et tous les utilisateurs peuvent maintenant y accéder
|
|
|
|
Scénario: Aucune limite sur pourcentage de contenus Premium
|
|
Étant donné que je publie 10 nouveaux contenus
|
|
Quand je décide de rendre les 10 contenus Premium (100%)
|
|
Alors le système accepte sans limitation
|
|
Et je peux avoir 100% de mon catalogue en Premium
|
|
|
|
Scénario: Stratégie freemium - Mix gratuit/premium
|
|
Étant donné que je publie 10 nouveaux contenus
|
|
Quand je décide de rendre 5 contenus Premium et 5 gratuits (50/50)
|
|
Alors le système accepte cette stratégie
|
|
Et je peux tester différents mix pour optimiser mes revenus
|
|
|
|
Scénario: Stratégie tout gratuit possible
|
|
Étant donné que je suis monétisé via publicités
|
|
Quand je décide de ne mettre aucun contenu en Premium (0%)
|
|
Alors le système accepte cette stratégie
|
|
Et je génère des revenus uniquement via les publicités
|
|
|
|
Scénario: Badge 👑 visible sur l'interface utilisateur
|
|
Étant donné qu'un utilisateur consulte ma liste de contenus
|
|
Quand il voit un contenu Premium
|
|
Alors un badge 👑 "Premium" est affiché
|
|
Et le contenu est clairement identifiable comme réservé
|
|
|
|
Scénario: Utilisateur gratuit voit les contenus Premium dans la liste
|
|
Étant donné que je suis un utilisateur gratuit
|
|
Quand je consulte les contenus d'un créateur
|
|
Alors je vois aussi les contenus Premium dans la liste
|
|
Et ils sont affichés avec un badge 👑
|
|
Mais je ne peux pas les lire
|
|
|
|
Scénario: Tentative de lecture Premium par utilisateur gratuit - Overlay bloquant
|
|
Étant donné que je suis un utilisateur gratuit
|
|
Quand je clique sur un contenu Premium pour le lire
|
|
Alors un overlay bloquant apparaît
|
|
Et je vois le message:
|
|
"""
|
|
👑 Ce contenu est réservé aux abonnés Premium
|
|
|
|
Passez Premium pour 4.99€/mois et accédez à tous les contenus exclusifs !
|
|
"""
|
|
Et un bouton "Passer Premium" est affiché
|
|
|
|
Scénario: CTA "Passer Premium" redirige vers abonnement
|
|
Étant donné que je vois l'overlay de contenu Premium bloqué
|
|
Quand je clique sur "Passer Premium"
|
|
Alors je suis redirigé vers la page d'abonnement Premium
|
|
Et je peux m'abonner pour 4.99€/mois
|
|
|
|
Scénario: Utilisateur Premium peut lire tous les contenus Premium
|
|
Étant donné que je suis un utilisateur Premium actif
|
|
Quand je clique sur un contenu Premium
|
|
Alors le contenu se lance immédiatement
|
|
Et je n'ai aucun overlay bloquant
|
|
Et je peux profiter pleinement du contenu exclusif
|
|
|
|
Scénario: Contenus Premium inclus dans les recommandations
|
|
Étant donné que l'algorithme génère ma file de 5 contenus
|
|
Quand je suis un utilisateur gratuit
|
|
Alors les contenus Premium peuvent apparaître dans les recommandations
|
|
Et cela me fait découvrir qu'il existe du contenu exclusif
|
|
|
|
Scénario: Contenu Premium skippé automatiquement pour utilisateur gratuit
|
|
Étant donné que je suis un utilisateur gratuit
|
|
Et qu'un contenu Premium apparaît dans ma file de recommandation
|
|
Quand j'écoute le contenu précédent jusqu'à la fin
|
|
Alors le contenu Premium est automatiquement skippé
|
|
Et le contenu suivant (gratuit) est lancé
|
|
Et le slot Premium ne compte pas dans ma file de 5 contenus
|
|
|
|
Scénario: Contenu Premium diffusé normalement pour utilisateur Premium
|
|
Étant donné que je suis un utilisateur Premium
|
|
Et qu'un contenu Premium apparaît dans ma file de recommandation
|
|
Quand j'écoute le contenu précédent jusqu'à la fin
|
|
Alors le contenu Premium est lancé normalement
|
|
Et je profite du contenu exclusif sans interruption
|
|
|
|
Scénario: Champ `is_premium` boolean en base PostgreSQL
|
|
Étant donné qu'un contenu est créé
|
|
Quand il est stocké en base de données
|
|
Alors la table `contents` contient un champ `is_premium BOOLEAN DEFAULT FALSE`
|
|
Et ce champ est indexé pour requêtes rapides
|
|
|
|
Scénario: Index PostgreSQL sur `is_premium`
|
|
Étant donné que l'algorithme doit filtrer les contenus selon le statut Premium
|
|
Quand une requête SQL est exécutée:
|
|
```sql
|
|
SELECT * FROM contents
|
|
WHERE creator_id = :creator_id
|
|
AND (is_premium = FALSE OR :user_is_premium = TRUE)
|
|
ORDER BY created_at DESC;
|
|
```
|
|
Alors l'index sur `is_premium` accélère la requête
|
|
Et le temps de réponse reste <20ms
|
|
|
|
Scénario: Cache Redis pour statut Premium
|
|
Étant donné qu'un contenu Premium est consulté fréquemment
|
|
Quand l'API vérifie le statut Premium
|
|
Alors la valeur est récupérée depuis Redis:
|
|
```
|
|
content:[content_id]:premium = true
|
|
```
|
|
Et le cache a un TTL de 1 heure
|
|
Et cela évite des requêtes SQL inutiles
|
|
|
|
Scénario: Invalidation cache lors de modification statut Premium
|
|
Étant donné qu'un contenu est passé de gratuit à Premium
|
|
Quand le créateur enregistre la modification
|
|
Alors le cache Redis `content:[id]:premium` est invalidé immédiatement
|
|
Et la nouvelle valeur est mise à jour
|
|
Et les utilisateurs voient le changement en temps réel
|
|
|
|
Scénario: Justification liberté créateur - Stratégie personnalisée
|
|
Étant donné que chaque créateur a une audience différente
|
|
Quand un créateur décide de sa stratégie Premium
|
|
Alors il peut tester différentes approches:
|
|
| stratégie | % Premium | objectif |
|
|
| Tout gratuit | 0% | Maximiser audience + revenus pub |
|
|
| Mix 50/50 | 50% | Équilibrer audience et exclusivité |
|
|
| Premium majoritaire | 80% | Cibler abonnés fidèles |
|
|
| 100% Premium | 100% | Contenu ultra-exclusif |
|
|
|
|
Scénario: Justification incitation Premium - Argument fort pour s'abonner
|
|
Étant donné qu'un utilisateur gratuit voit beaucoup de contenus Premium
|
|
Quand il consulte les profils de ses créateurs préférés
|
|
Alors il voit que 60% de leur contenu est réservé Premium
|
|
Et cela l'incite à s'abonner pour 4.99€/mois
|
|
Et RoadWave augmente son taux de conversion vers Premium
|
|
|
|
Scénario: Justification équité - Petit créateur peut tout mettre en Premium
|
|
Étant donné que je suis un petit créateur avec 600 abonnés
|
|
Et que 50 sont abonnés Premium
|
|
Quand je mets 100% de mon contenu en Premium
|
|
Alors je génère des revenus uniquement via mes 50 abonnés Premium
|
|
Et cela me permet de vivre de mon contenu malgré une petite audience
|
|
|
|
Scénario: Justification équité - Gros créateur peut tout offrir gratuitement
|
|
Étant donné que je suis un gros créateur avec 50 000 abonnés
|
|
Et que je génère déjà beaucoup de revenus publicitaires
|
|
Quand je laisse 100% de mon contenu gratuit
|
|
Alors je maximise mon audience et mes revenus pub
|
|
Et je n'ai pas besoin de mettre du contenu en Premium
|
|
|
|
Scénario: Statistiques créateur - Ratio Premium/Gratuit
|
|
Étant donné que j'accède à mon tableau de bord créateur
|
|
Quand je consulte mes statistiques de contenus
|
|
Alors je vois:
|
|
| métrique | valeur |
|
|
| Contenus totaux | 47 |
|
|
| Contenus gratuits | 32 (68%) |
|
|
| Contenus Premium | 15 (32%) |
|
|
| Écoutes Premium ce mois | 12,345 |
|
|
| Écoutes gratuites ce mois | 28,901 |
|
|
|
|
Scénario: Statistiques créateur - Revenus par type
|
|
Étant donné que j'ai des contenus gratuits et Premium
|
|
Quand je consulte mes revenus détaillés
|
|
Alors je vois:
|
|
| source | montant |
|
|
| Revenus pub (gratuit) | 86.70€ |
|
|
| Revenus Premium (exclusifs) | 34.20€ |
|
|
| Revenus Premium (tout contenu)| 78.90€ |
|
|
Et je peux comparer l'efficacité de chaque stratégie
|
|
|
|
Scénario: Notification créateur - Contenu Premium très écouté
|
|
Étant donné que j'ai publié un contenu Premium il y a 3 jours
|
|
Et qu'il a généré 5 000 écoutes Premium (très élevé)
|
|
Quand le système détecte cette performance
|
|
Alors je reçois une notification:
|
|
"""
|
|
🔥 Votre contenu Premium "[Titre]" cartonne !
|
|
5 000 écoutes en 3 jours. Continuez à créer du contenu exclusif de qualité !
|
|
"""
|
|
|
|
Scénario: A/B test utilisateur - Impact badge Premium sur conversion
|
|
Étant donné que RoadWave veut optimiser le taux de conversion Premium
|
|
Quand un A/B test est lancé
|
|
Alors groupe A voit le badge 👑 "Premium"
|
|
Et groupe B voit le badge 💎 "Exclusif"
|
|
Et les taux de clic et conversion sont mesurés
|
|
Et le badge le plus performant est déployé définitivement
|
|
|
|
Scénario: Analytics plateforme - Adoption fonctionnalité Premium
|
|
Étant donné que RoadWave suit l'adoption de la fonctionnalité
|
|
Quand un admin consulte les métriques
|
|
Alors il voit:
|
|
| métrique | valeur |
|
|
| Créateurs utilisant Premium | 847 (68%) |
|
|
| % moyen contenus Premium | 23% |
|
|
| Taux conversion vers Premium (users) | 8.5% |
|
|
| Revenus Premium/mois | 47,890€ |
|
|
|
|
Scénario: Impact sur churn - Contenus Premium réduisent le churn Premium
|
|
Étant donné qu'un utilisateur Premium envisage de résilier
|
|
Mais qu'il a accès à 150 contenus Premium de ses créateurs préférés
|
|
Quand il voit la valeur exclusive qu'il perdrait
|
|
Alors il est moins susceptible de résilier (churn réduit de ~30%)
|
|
Et les contenus Premium augmentent la rétention
|
|
|
|
Scénario: Transparence - Créateur voit combien de contenus Premium il a
|
|
Étant donné que j'accède à mon profil créateur
|
|
Quand je consulte mes contenus
|
|
Alors je peux filtrer par statut:
|
|
| filtre | résultats |
|
|
| Tous | 47 |
|
|
| Gratuits | 32 |
|
|
| Premium 👑 | 15 |
|
|
Et je peux facilement gérer mon catalogue
|
|
|
|
Scénario: Export liste contenus avec statut Premium (RGPD)
|
|
Étant donné que je demande l'export de mes données
|
|
Quand l'export est généré
|
|
Alors la liste de mes contenus inclut le statut Premium:
|
|
```json
|
|
{
|
|
"contents": [
|
|
{
|
|
"title": "Mon épisode exclusif",
|
|
"is_premium": true,
|
|
"published_at": "2025-06-15T10:30:00Z"
|
|
},
|
|
{
|
|
"title": "Mon épisode gratuit",
|
|
"is_premium": false,
|
|
"published_at": "2025-06-14T08:15:00Z"
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
Scénario: Suppression compte créateur et contenus Premium
|
|
Étant donné que je supprime définitivement mon compte créateur
|
|
Quand la suppression est confirmée
|
|
Alors tous mes contenus (gratuits et Premium) sont supprimés
|
|
Et les utilisateurs Premium ne peuvent plus y accéder
|
|
Et les fichiers audio sont supprimés du CDN sous 7 jours
|
|
|
|
Scénario: Performance avec 1 million de contenus Premium
|
|
Étant donné que RoadWave a 1 million de contenus dont 300 000 Premium
|
|
Quand l'algorithme génère une recommandation
|
|
Alors la requête SQL filtre efficacement avec l'index `is_premium`
|
|
Et le temps de réponse reste <50ms
|
|
Et la scalabilité est garantie
|