Initial commit
This commit is contained in:
319
docs/regles-metier/09-abonnements-notifications.md
Normal file
319
docs/regles-metier/09-abonnements-notifications.md
Normal file
@@ -0,0 +1,319 @@
|
||||
## 8. Abonnements et notifications
|
||||
|
||||
### 8.1 Impact sur l'algorithme
|
||||
|
||||
**Décision** : Boost +30% au score + reste dans le mix
|
||||
|
||||
**Boost de score abonnements** :
|
||||
- **+30% au score final** pour contenus d'un créateur suivi
|
||||
- Application : multiplicateur sur le score calculé
|
||||
|
||||
```
|
||||
score_final_avec_boost = score_final × 1.3
|
||||
```
|
||||
|
||||
**Reste dans le mix** :
|
||||
- ❌ **Pas de priorité absolue** (pas de file dédiée abonnements)
|
||||
- ✅ Contenu suivi entre en **compétition avec autres contenus**
|
||||
- ✅ Si créateur suivi publie contenu faible engagement → peut être battu par contenu viral non-suivi
|
||||
|
||||
**Exemple concret** :
|
||||
```
|
||||
Utilisateur à Paris, 2 contenus disponibles :
|
||||
|
||||
Contenu A (créateur NON suivi) :
|
||||
- Score géo : 0.9 (très proche)
|
||||
- Score intérêts : 0.8
|
||||
- Score engagement : 0.7
|
||||
→ Score final : 0.80
|
||||
|
||||
Contenu B (créateur suivi) :
|
||||
- Score géo : 0.5 (moyennement proche)
|
||||
- Score intérêts : 0.6
|
||||
- Score engagement : 0.5
|
||||
→ Score final : 0.53
|
||||
→ Score avec boost : 0.53 × 1.3 = 0.69
|
||||
|
||||
→ Contenu A proposé en premier (0.80 > 0.69)
|
||||
```
|
||||
|
||||
**Cas où abonnement fait la différence** :
|
||||
```
|
||||
Contenu A (non suivi) : score 0.70
|
||||
Contenu B (suivi) : score 0.60 → avec boost 0.78
|
||||
→ Contenu B proposé (boost fait pencher la balance)
|
||||
```
|
||||
|
||||
**Justification** :
|
||||
- **Équilibre** : valorise abonnements sans enfermer utilisateur
|
||||
- **Découverte** : contenus viraux/locaux peuvent toujours émerger
|
||||
- **Prévisible** : boost fixe, pas de logique opaque
|
||||
- **Coût 0** : multiplicateur simple dans l'algo
|
||||
|
||||
---
|
||||
|
||||
### 8.2 Notifications contextuelles
|
||||
|
||||
**Décision** : Push adapté selon contexte (voiture vs à pied) + limite 10/jour
|
||||
|
||||
**Détection contexte utilisateur** :
|
||||
|
||||
| Contexte | Détection | Comportement |
|
||||
|----------|-----------|--------------|
|
||||
| **En voiture** | Vitesse GPS >10 km/h | Notifications silencieuses (in-app uniquement) + commandes volant |
|
||||
| **À pied** | Vitesse GPS <5 km/h | Notifications push actives + interface tactile/vocale |
|
||||
|
||||
**Notifications activées** :
|
||||
|
||||
#### En voiture (mode conduite)
|
||||
|
||||
| Événement | Notification | Comportement |
|
||||
|-----------|--------------|--------------|
|
||||
| **Nouveau contenu créateur suivi** | In-app uniquement | Badge compteur, pas de push (sécurité) |
|
||||
| **Live créateur suivi** | In-app uniquement | Badge compteur, pas de push |
|
||||
| **Point d'intérêt proche** | Audio notification | Bip + annonce vocale : "Audio-guide disponible" |
|
||||
|
||||
#### À pied (mode piéton)
|
||||
|
||||
| Événement | Notification | Comportement |
|
||||
|-----------|--------------|--------------|
|
||||
| **Nouveau contenu créateur suivi** | ✅ Push | Si utilisateur dans zone géo du contenu |
|
||||
| **Live créateur suivi** | ✅ Push | Si utilisateur dans zone géo |
|
||||
| **Audio-guide disponible** | ✅ Push | "📍 Audio-guide disponible : [Lieu]" |
|
||||
| **Séquence suivante suggérée** | Audio notification | Annonce vocale : "Pièce suivante disponible" |
|
||||
|
||||
**Format notifications** :
|
||||
|
||||
**Nouveau contenu** :
|
||||
```
|
||||
🎧 [Nom créateur] a publié : "[Titre contenu]"
|
||||
Tap pour écouter
|
||||
```
|
||||
|
||||
**Live en direct** :
|
||||
```
|
||||
🔴 [Nom créateur] est en direct : "[Titre live]"
|
||||
Tap pour rejoindre
|
||||
```
|
||||
|
||||
**Audio-guide à pied** :
|
||||
```
|
||||
📍 Audio-guide disponible : [Nom du lieu]
|
||||
Choisissez parmi 3 guides pour [Musée du Louvre]
|
||||
Tap pour explorer
|
||||
```
|
||||
|
||||
**Filtrage géographique** :
|
||||
- Si contenu/live hors zone utilisateur → **pas de notification**
|
||||
- Évite frustration : "notification pour contenu que je ne peux pas écouter"
|
||||
- Exception : contenu national → notifie tous les abonnés
|
||||
|
||||
**Fréquence maximale** :
|
||||
- **Maximum 10 notifications push/jour** par utilisateur (tous types confondus)
|
||||
- Si dépassement : notifications regroupées
|
||||
- Message groupé : "🎧 3 nouveaux contenus de créateurs suivis"
|
||||
|
||||
**Plages horaires** :
|
||||
- **Mode silencieux** : 22h-8h (pas de push, sauf live)
|
||||
- Paramétrable utilisateur (désactivation totale possible)
|
||||
- Option "Notifications importantes uniquement" (lives uniquement)
|
||||
|
||||
**Gestion préférences** :
|
||||
|
||||
| Préférence | Défaut | Description |
|
||||
|------------|--------|-------------|
|
||||
| **Nouveaux contenus** | ✅ Activé | Push à chaque nouveau contenu (à pied uniquement) |
|
||||
| **Lives** | ✅ Activé | Push au démarrage live (à pied uniquement) |
|
||||
| **Audio-guides proximité** | ✅ Activé | Push quand audio-guide détecté à <100m |
|
||||
| **Mode silencieux** | ✅ Activé (22h-8h) | Pas de push nocturne |
|
||||
| **Limite quotidienne** | 10 | Modifiable 5-20 |
|
||||
|
||||
**Justification** :
|
||||
- **Sécurité routière** : pas de push en conduite (distraction)
|
||||
- **Engagement piéton** : push actifs pour audio-guides (valeur ajoutée tourisme)
|
||||
- **Pas de spam** : limite 10/jour + mode silencieux
|
||||
- **Filtrage géo** : pertinence maximale (pas de notif inutiles)
|
||||
- **Coût** : Firebase Cloud Messaging (gratuit jusqu'à volume élevé)
|
||||
|
||||
---
|
||||
|
||||
### 8.3 Mode Audio-guide (piéton)
|
||||
|
||||
**Décision** : Navigation manuelle multiséquence + choix parmi plusieurs guides
|
||||
|
||||
**Fonctionnement** :
|
||||
|
||||
#### Détection et proposition
|
||||
|
||||
1. Utilisateur à pied (<5 km/h) passe à <**100m** d'un lieu avec audio-guides
|
||||
2. **Notification push** : "📍 Audio-guide disponible : [Musée du Louvre]"
|
||||
3. Tap notification → **Page de sélection** audio-guides
|
||||
|
||||
#### Page de sélection
|
||||
|
||||
**Affichage** :
|
||||
```
|
||||
📍 Musée du Louvre
|
||||
|
||||
Choisissez votre guide :
|
||||
|
||||
┌─────────────────────────────────┐
|
||||
│ 🎨 Visite complète (45 min) │
|
||||
│ Par [Créateur A] • 12 séquences│
|
||||
│ ⭐ 4.8 • 1.2K écoutes │
|
||||
└─────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────┐
|
||||
│ 🏛️ Œuvres majeures (20 min) │
|
||||
│ Par [Créateur B] • 5 séquences │
|
||||
│ ⭐ 4.9 • 3.5K écoutes │
|
||||
└─────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────┐
|
||||
│ 👶 Visite famille (30 min) │
|
||||
│ Par [Créateur C] • 8 séquences │
|
||||
│ ⭐ 4.7 • 850 écoutes │
|
||||
└─────────────────────────────────┘
|
||||
```
|
||||
|
||||
#### Interface audio-guide
|
||||
|
||||
**Après sélection** :
|
||||
```
|
||||
🎨 Visite complète • Musée du Louvre
|
||||
|
||||
Piste actuelle : 2/12
|
||||
"La Joconde - Histoire et mystères"
|
||||
[████████────────────] 3:24 / 6:50
|
||||
|
||||
Liste des séquences :
|
||||
✅ 1. Introduction et architecture
|
||||
▶️ 2. La Joconde - Histoire et mystères
|
||||
⏸️ 3. Vénus de Milo
|
||||
⏸️ 4. Victoire de Samothrace
|
||||
⏸️ 5. Peintures Renaissance
|
||||
...
|
||||
⏸️ 12. Conclusion et boutique
|
||||
```
|
||||
|
||||
**Navigation** :
|
||||
|
||||
| Action | Geste | Effet |
|
||||
|--------|-------|-------|
|
||||
| **Séquence suivante** | Tap "Suivant" ou commande vocale "Suivant" | Passe à séquence N+1 |
|
||||
| **Séquence précédente** | Tap "Précédent" ou commande vocale "Précédent" | Revient à séquence N-1 |
|
||||
| **Saut direct** | Tap séquence dans liste | Lecture séquence choisie |
|
||||
| **Pause** | Tap bouton pause | Met en pause, reprise position exacte |
|
||||
| **Quitter** | Tap "×" | Sauvegarde progression, sortie guide |
|
||||
|
||||
**Guidage vocal automatique** :
|
||||
- Entre 2 séquences : "Vous avez terminé la séquence 2. Dirigez-vous vers la Vénus de Milo pour la séquence 3."
|
||||
- Si utilisateur s'éloigne (>50m de la prochaine pièce) : "Vous vous éloignez de la prochaine étape. Consultez le plan."
|
||||
|
||||
**Sauvegarde progression** :
|
||||
- Position dans guide sauvegardée automatiquement
|
||||
- Retour ultérieur : "Reprendre à la séquence 5 ?" ou "Recommencer depuis le début"
|
||||
- Historique : guide marqué "Terminé" si toutes séquences écoutées
|
||||
|
||||
**Création audio-guide multiséquence** :
|
||||
|
||||
**Processus créateur** :
|
||||
1. Créateur upload **plusieurs fichiers audio** (1 par séquence)
|
||||
2. Numérote les séquences : "Séquence 1", "Séquence 2", etc.
|
||||
3. Titre chaque séquence : "Introduction", "La Joconde", etc.
|
||||
4. Définit **point GPS unique** pour tout le guide (centre du lieu)
|
||||
5. Métadonnées : durée totale calculée automatiquement
|
||||
|
||||
**Format stockage** :
|
||||
```json
|
||||
{
|
||||
"guide_id": "abc123",
|
||||
"title": "Visite complète Musée du Louvre",
|
||||
"location": {"lat": 48.8606, "lon": 2.3376, "radius": 200},
|
||||
"sequences": [
|
||||
{
|
||||
"sequence_number": 1,
|
||||
"title": "Introduction et architecture",
|
||||
"audio_url": "https://cdn.../seq1.mp3",
|
||||
"duration_seconds": 180
|
||||
},
|
||||
{
|
||||
"sequence_number": 2,
|
||||
"title": "La Joconde - Histoire et mystères",
|
||||
"audio_url": "https://cdn.../seq2.mp3",
|
||||
"duration_seconds": 410
|
||||
},
|
||||
...
|
||||
],
|
||||
"total_duration_seconds": 2700,
|
||||
"creator_id": "creator_xyz"
|
||||
}
|
||||
```
|
||||
|
||||
**Justification** :
|
||||
- **UX piéton** : navigation tactile adaptée (pas de commandes volant)
|
||||
- **Autonomie** : utilisateur maître de son rythme (pas d'enchaînement forcé)
|
||||
- **Choix** : plusieurs guides = diversité styles (famille, expert, rapide)
|
||||
- **Engagement** : sauvegarde progression = incitation terminer
|
||||
- **Coût** : réutilise infra contenu standard (juste métadonnées séquences)
|
||||
|
||||
---
|
||||
|
||||
### 8.4 Limites et désabonnement
|
||||
|
||||
**Décision** : 200 abonnements max + désabonnement -5% jauges
|
||||
|
||||
**Nombre maximum d'abonnements** :
|
||||
- **200 créateurs maximum** par utilisateur
|
||||
- Raisons :
|
||||
- **Évite spam** : au-delà de 200, notifications ingérables
|
||||
- **Usage réaliste** : 200 créateurs = déjà énorme (vs 100-150 sur YouTube/Twitter)
|
||||
- **Performance** : requêtes SQL optimisées (index sur 200 max)
|
||||
|
||||
**Si limite atteinte** :
|
||||
- Message : "Vous suivez déjà 200 créateurs. Désabonnez-vous d'un créateur pour en suivre un nouveau."
|
||||
- Liste triable : par date abonnement, nb contenus écoutés, dernière activité
|
||||
- Suggestion : "Vous n'avez pas écouté [Créateur X] depuis 6 mois, le désabonner ?"
|
||||
|
||||
**Abonnement initial** :
|
||||
- Impact : **+5% toutes jauges tags du créateur** (défini en [ADR-010](../adr/010-commandes-volant.md))
|
||||
- Action : Bouton "S'abonner" dans profil créateur (interface mobile)
|
||||
- Immédiat à l'action
|
||||
|
||||
**Désabonnement** :
|
||||
- Impact : **-5% toutes jauges tags du créateur** (symétrique)
|
||||
- Action : Bouton "Se désabonner" dans profil créateur
|
||||
- Immédiat à l'action
|
||||
- Pas de confirmation (action réversible)
|
||||
|
||||
**Exemple** :
|
||||
```
|
||||
Créateur tague ses contenus : Automobile, Voyage
|
||||
|
||||
Abonnement :
|
||||
→ Jauge Automobile : 60% → 65% (+5%)
|
||||
→ Jauge Voyage : 55% → 60% (+5%)
|
||||
|
||||
3 mois plus tard, désabonnement :
|
||||
→ Jauge Automobile : 65% → 60% (-5%)
|
||||
→ Jauge Voyage : 60% → 55% (-5%)
|
||||
```
|
||||
|
||||
**Gestion multi-tags** :
|
||||
- Si créateur a 3 tags → **+5% sur chacun des 3 tags**
|
||||
- Logique : abonnement = signal fort d'affinité à TOUS les sujets du créateur
|
||||
|
||||
**Abonnements réciproques** :
|
||||
- ❌ **Pas d'abonnement mutuel visible**
|
||||
- Créateur ne voit pas qui est abonné (privacy)
|
||||
- Créateur voit uniquement : nombre total abonnés (métrique globale)
|
||||
|
||||
**Justification** :
|
||||
- **Limite 200** : équilibre entre liberté et gestion spam
|
||||
- **Symétrie +5%/-5%** : cohérence mathématique, prévisibilité
|
||||
- **Privacy** : pas de liste publique abonnés (évite stalking)
|
||||
- **Coût** : table abonnements PostgreSQL standard
|
||||
|
||||
---
|
||||
|
||||
## Récapitulatif Section 8
|
||||
Reference in New Issue
Block a user