Files
roadwave/docs/domains/monetization/features/monetisation/sources-revenus.feature
jpgiannetti 5e5fcf4714 refactor(docs): réorganiser la documentation selon principes DDD
Réorganise la documentation du projet selon les principes du Domain-Driven Design (DDD) pour améliorer la cohésion, la maintenabilité et l'alignement avec l'architecture modulaire du backend.

**Structure cible:**
```
docs/domains/
├── README.md (Context Map)
├── _shared/ (Core Domain)
├── recommendation/ (Supporting Subdomain)
├── content/ (Supporting Subdomain)
├── moderation/ (Supporting Subdomain)
├── advertising/ (Generic Subdomain)
├── premium/ (Generic Subdomain)
└── monetization/ (Generic Subdomain)
```

**Changements effectués:**

Phase 1: Création de l'arborescence des 7 bounded contexts
Phase 2: Déplacement des règles métier (01-19) vers domains/*/rules/
Phase 3: Déplacement des diagrammes d'entités vers domains/*/entities/
Phase 4: Déplacement des diagrammes flux/états/séquences vers domains/*/
Phase 5: Création des README.md pour chaque domaine
Phase 6: Déplacement des features Gherkin vers domains/*/features/
Phase 7: Création du Context Map (domains/README.md)
Phase 8: Mise à jour de mkdocs.yml pour la nouvelle navigation
Phase 9: Correction automatique des liens internes (script fix-markdown-links.sh)
Phase 10: Nettoyage de l'ancienne structure (regles-metier/, diagrammes/, features/)

**Configuration des tests:**
- Makefile: godog run docs/domains/*/features/
- scripts/generate-bdd-docs.py: features_dir → docs/domains

**Avantages:**
 Cohésion forte: toute la doc d'un domaine au même endroit
 Couplage faible: domaines indépendants, dépendances explicites
 Navigabilité améliorée: README par domaine = entrée claire
 Alignement code/docs: miroir de backend/internal/
 Onboarding facilité: exploration domaine par domaine
 Tests BDD intégrés: features au plus près des règles métier

Voir docs/REFACTOR-DDD.md pour le plan complet.
2026-02-07 17:15:02 +01:00

308 lines
14 KiB
Gherkin
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# language: fr
Fonctionnalité: Sources de revenus créateurs
En tant que créateur monétisé
Je veux générer des revenus via publicités et abonnés Premium
Afin d'être rémunéré pour mon travail
Contexte:
Étant donné que je suis un créateur avec la monétisation activée
Et que mon KYC est validé
# ===== PUBLICITÉS (UTILISATEURS GRATUITS) =====
Scénario: CPM créateur de 3€ / 1000 écoutes complètes
Étant donné que mes contenus ont généré 1000 écoutes complètes par des utilisateurs gratuits
Quand le calcul des revenus du mois est effectué
Alors je touche 3.00 pour ces 1000 écoutes
Et ce montant est ajouté à mon solde disponible
Scénario: 10 000 écoutes gratuits → 30€ de revenus pub
Étant donné que mes contenus ont généré 10 000 écoutes complètes (utilisateurs gratuits)
Quand le mois se termine
Alors je touche 30.00 de revenus publicitaires
Et ces revenus sont visibles en temps réel dans mon tableau de bord
Scénario: 50 000 écoutes gratuits → 150€ de revenus pub
Étant donné que mes contenus ont généré 50 000 écoutes complètes (utilisateurs gratuits)
Quand le mois se termine
Alors je touche 150.00 de revenus publicitaires
Scénario: 100 000 écoutes gratuits → 300€ de revenus pub
Étant donné que mes contenus ont généré 100 000 écoutes complètes (utilisateurs gratuits)
Quand le mois se termine
Alors je touche 300.00 de revenus publicitaires
Scénario: Répartition économique - Plateforme garde 94%
Étant donné qu'une publicité facturée 0.05/écoute génère 50 CPM
Quand la plateforme calcule la répartition
Alors le créateur touche 3 (6% du CA pub)
Et la plateforme garde 47 (94%) pour:
| poste budgétaire | coût estimé |
| CDN + infrastructure | 10-15 |
| Modération + support | 5-10 |
| Développement + R&D | 10-15 |
| Marge opérationnelle | 10-15 |
Scénario: Écoute complète = ≥80% du contenu écouté
Étant donné qu'un utilisateur gratuit écoute mon contenu de 10 minutes
Quand il écoute 8 minutes (80%)
Alors l'écoute compte comme "complète"
Et je génère 0.003 de revenus pub (3/1000)
Scénario: Écoute incomplète <80% ne compte pas
Étant donné qu'un utilisateur gratuit écoute mon contenu de 10 minutes
Mais il skip après 5 minutes (50%)
Quand le calcul des revenus est effectué
Alors cette écoute ne compte pas comme "complète"
Et je ne génère aucun revenu publicitaire pour cette écoute
Scénario: Écoutes Premium ne comptent pas pour les revenus pub
Étant donné qu'un utilisateur Premium écoute 100% de mon contenu
Quand le calcul des revenus publicitaires est effectué
Alors cette écoute ne compte pas dans les revenus pub
Car les utilisateurs Premium ne voient pas de publicités
Mais elle compte dans les revenus Premium (système séparé)
Scénario: Détection bots - Écoutes exclues
Étant donné qu'un bot génère 10 000 écoutes artificielles sur mes contenus
Quand le système détecte le pattern suspect (rate limiting, IP unique, etc.)
Alors ces écoutes sont marquées comme frauduleuses
Et elles sont exclues du calcul des revenus publicitaires
Scénario: Comparaison avec YouTube (3-5€/1000 vues)
Étant donné que YouTube paie 3-5/1000 vues
Quand RoadWave fixe le CPM créateur à 3/1000 écoutes
Alors le tarif est aligné sur le bas de la fourchette YouTube
Et cela est compétitif pour un MVP sans marché publicitaire mature
Scénario: Comparaison avec Spotify (3-4€/1000 écoutes)
Étant donné que Spotify paie ~3-4/1000 écoutes
Quand RoadWave fixe le CPM créateur à 3/1000 écoutes
Alors le tarif est aligné sur l'industrie musicale
Et les créateurs audio peuvent anticiper des revenus similaires
Scénario: Tableau de bord - Revenus pub temps réel
Étant donné que j'accède à mon tableau de bord créateur
Quand je consulte mes revenus publicitaires
Alors je vois:
| métrique | valeur exemple |
| Écoutes complètes ce mois (gratuit)| 23 456 |
| Revenus pub ce mois | 70.37 |
| CPM effectif | 3.00 |
Et ces valeurs sont mises à jour toutes les 10 minutes
# ===== ABONNÉS PREMIUM =====
Scénario: Répartition 70/30 - Créateur touche 70%
Étant donné qu'un utilisateur Premium paie 4.99/mois
Quand la répartition est calculée
Alors 3.49 sont reversés aux créateurs écoutés (70%)
Et 1.50 sont gardés par la plateforme (30%)
Scénario: Utilisateur écoute 3 créateurs - Répartition proportionnelle
Étant donné qu'un utilisateur Premium paie 4.99/mois
Et qu'il écoute 3 créateurs ce mois:
| créateur | temps écoute | ratio |
| Créateur A | 10h | 50% |
| Créateur B | 6h | 30% |
| Créateur C | 4h | 20% |
Quand le calcul des revenus Premium est effectué
Alors la répartition est:
| créateur | revenus |
| Créateur A | 1.75 |
| Créateur B | 1.05 |
| Créateur C | 0.70 |
Et la somme totale versée aux créateurs est 3.50 (70% de 4.99)
Scénario: Calcul SQL proportionnel au temps d'écoute
Étant donné qu'un utilisateur Premium a écouté plusieurs créateurs
Quand le système calcule les revenus du mois
Alors la requête SQL suivante est exécutée:
```sql
SELECT
creator_id,
SUM(listen_duration_seconds) AS total_seconds,
(SUM(listen_duration_seconds) / (SELECT SUM(listen_duration_seconds) FROM premium_listens WHERE user_id = :user_id AND month = :current_month)) AS ratio,
(4.99 * 0.70 * ratio) AS revenue_euros
FROM premium_listens
WHERE user_id = :user_id
AND month = :current_month
GROUP BY creator_id;
```
Scénario: Utilisateur écoute un seul créateur - 100% à ce créateur
Étant donné qu'un utilisateur Premium paie 4.99/mois
Et qu'il n'écoute qu'un seul créateur (moi)
Quand le mois se termine
Alors je touche 3.49 (70% de 4.99)
Et je reçois 100% de la part créateurs
Scénario: Utilisateur Premium inactif - Aucun revenu généré
Étant donné qu'un utilisateur Premium paie 4.99/mois
Mais qu'il n'écoute aucun contenu ce mois
Quand le calcul des revenus Premium est effectué
Alors aucun créateur ne reçoit de revenus de cet utilisateur
Et les 3.49 de la part créateurs restent à la plateforme
Et cela couvre les coûts d'infrastructure
Scénario: Comparaison avec YouTube Premium (70/30)
Étant donné que YouTube Premium reverse 70% aux créateurs
Quand RoadWave fixe également 70/30
Alors le modèle est aligné sur le standard industrie
Et les créateurs ont confiance dans l'équité du système
Scénario: Comparaison avec Spotify (70/30)
Étant donné que Spotify reverse 70% aux artistes
Quand RoadWave fixe également 70/30
Alors le modèle est identique à Spotify
Et les créateurs audio comprennent facilement le système
Scénario: Apple Music moins avantageux (52/48)
Étant donné qu'Apple Music ne reverse que 52% aux artistes
Quand RoadWave offre 70% aux créateurs
Alors RoadWave est plus avantageux de 18 points
Et cela devient un argument marketing fort
Scénario: Justification équité - Créateurs les plus écoutés gagnent plus
Étant donné que 2 créateurs ont le même nombre d'abonnés Premium
Mais que le Créateur A est écouté 20h/mois et le Créateur B seulement 2h/mois
Quand les revenus Premium sont calculés
Alors le Créateur A gagne 10× plus que le Créateur B
Et cela récompense la qualité et l'engagement (pas juste l'abonnement)
Scénario: Pas de "winner takes all" - Équité totale
Étant donné qu'un utilisateur Premium écoute 10 créateurs différents
Quand les revenus sont calculés
Alors chacun des 10 créateurs reçoit sa part proportionnelle
Et il n'y a pas de système où un seul créateur prend tout
Scénario: Marge plateforme 30% couvre absence revenus pub Premium
Étant donné qu'un utilisateur Premium ne voit aucune publicité
Quand la plateforme calcule ses revenus
Alors elle ne touche que les 30% de l'abonnement Premium (1.50)
Et cette marge compense la perte des revenus publicitaires (qui auraient été ~47/1000 écoutes)
Scénario: Tableau de bord - Revenus Premium temps réel
Étant donné que j'accède à mon tableau de bord créateur
Quand je consulte mes revenus Premium
Alors je vois:
| métrique | valeur exemple |
| Abonnés Premium actifs ayant écouté | 47 |
| Heures d'écoute Premium ce mois | 234h |
| Revenus Premium ce mois | 89.23 |
Et ces valeurs sont mises à jour toutes les 10 minutes
# ===== CUMUL REVENUS PUB + PREMIUM =====
Scénario: Revenus cumulés pub + premium
Étant donné que j'ai généré ce mois:
| source | montant |
| Revenus pub | 150.00 |
| Revenus Premium | 89.23 |
Quand je consulte mon solde disponible
Alors le total est 239.23
Et ce solde sera versé le 15 du mois prochain (si 50)
Scénario: Dashboard créateur - Vue d'ensemble
Étant donné que j'accède à mon tableau de bord créateur
Quand je consulte la page revenus
Alors je vois:
```
===== REVENUS DU MOIS EN COURS =====
📊 Publicités (utilisateurs gratuits)
- Écoutes complètes: 50,234
- Revenus pub: 150.70
👑 Abonnés Premium
- Abonnés actifs: 47
- Heures d'écoute: 234h
- Revenus Premium: 89.23
💰 TOTAL CE MOIS: 239.93
===== HISTORIQUE =====
Mois dernier: 178.45 (versé le 15/01)
Il y a 2 mois: 156.78 (versé le 15/12)
```
Scénario: Export comptable CSV pour expert-comptable
Étant donné que je clique sur "Exporter pour comptable"
Quand l'export est généré
Alors je télécharge un fichier CSV:
```csv
Mois,Revenus Pub,Revenus Premium,Total,Statut
2025-01,150.70,89.23,239.93,En attente versement
2024-12,123.45,55.00,178.45,Versé le 15/01/2025
2024-11,100.30,56.48,156.78,Versé le 15/12/2024
```
Et je peux transmettre ce fichier à mon expert-comptable
Scénario: Notification hebdomadaire progression revenus
Étant donné que je suis créateur monétisé
Quand chaque lundi matin arrive
Alors je reçois un email récapitulatif:
"""
📊 Vos revenus de la semaine dernière:
- Revenus pub: +23.45 (3,456 écoutes)
- Revenus Premium: +12.78 (12 abonnés actifs)
- Total semaine: 36.23
- Projection mois: ~150
"""
Scénario: Graphique évolution revenus sur 12 mois
Étant donné que je suis monétisé depuis 12 mois
Quand j'accède à mes statistiques
Alors je vois un graphique en courbes montrant:
| mois | revenus pub | revenus premium | total |
| Jan 25 | 150 | 89 | 239 |
| Déc 24 | 123 | 55 | 178 |
| Nov 24 | 100 | 56 | 156 |
| ... | ... | ... | ... |
Et cela m'aide à suivre ma progression
Scénario: Top 3 contenus les plus rentables du mois
Étant donné que j'ai publié 20 contenus ce mois
Quand je consulte mes statistiques détaillées
Alors je vois mon top 3 contenus:
| titre | écoutes | revenus pub | revenus premium | total |
| Mon meilleur épisode | 12,345 | 37.04 | 23.45 | 60.49 |
| Discussion tech | 8,901 | 26.70 | 15.67 | 42.37 |
| Road trip Bretagne | 7,234 | 21.70 | 12.34 | 34.04 |
Et cela m'aide à comprendre quel type de contenu plaît le plus
Scénario: Alertes seuils de revenus
Étant donné que j'ai activé les notifications de seuils
Quand mes revenus du mois dépassent 100 pour la première fois
Alors je reçois une notification:
"""
🎉 Félicitations ! Vous venez de dépasser 100 de revenus ce mois !
Continuez comme ça !
"""
Scénario: Performance calcul avec 100 000 créateurs
Étant donné que RoadWave a 100 000 créateurs monétisés
Quand le calcul des revenus mensuels est lancé le dernier jour du mois
Alors un job asynchrone traite tous les créateurs
Et le calcul prend environ 2-4 heures pour tous les créateurs
Et les résultats sont stockés dans la table monthly_revenues
Scénario: Cache Redis pour métriques temps réel
Étant donné que je consulte mon dashboard plusieurs fois par jour
Quand la page se charge
Alors les compteurs sont récupérés depuis Redis:
| clé Redis | valeur exemple |
| creator:[id]:complete_listens:202501 | 50234 |
| creator:[id]:premium_hours:202501 | 234 |
| creator:[id]:revenue_ads:202501 | 150.70 |
| creator:[id]:revenue_premium:202501 | 89.23 |
Et le temps de réponse est <30ms
Scénario: Prévision revenus fin de mois
Étant donné que nous sommes le 20 du mois
Et que mes revenus actuels sont 160
Quand le système calcule la projection
Alors il estime les revenus fin de mois à ~240 (extrapolation linéaire)
Et affiche "Projection fin de mois: ~240"
Et cela m'aide à anticiper mes revenus