314 lines
10 KiB
Markdown
314 lines
10 KiB
Markdown
# PLANS_TARIFAIRES.md — Expria / Coach TCF Canada
|
||
|
||
> **Document de référence — Version 1.1**
|
||
> Toute modification des plans tarifaires doit être reflétée dans ce fichier en premier.
|
||
> Tout le code, tout prompt à Claude, tout débat sur une feature part d'ici.
|
||
|
||
---
|
||
|
||
## 1. Vue d'ensemble
|
||
|
||
| Feature | Découverte (Free) | Standard | Premium |
|
||
|---|---|---|---|
|
||
| Mode entraînement | ✅ | ✅ | ✅ |
|
||
| Simulations | 5 à vie | Illimitées | Illimitées |
|
||
| EE — Tâches 1, 2, 3 | ✅ | ✅ | ✅ |
|
||
| EO — Tâche 1 et 3 | ✅ | ✅ | ✅ |
|
||
| EO — Tâche 2 live | ❌ | ❌ | ✅ |
|
||
| Rapport basique (score + NCLC) | ✅ | ✅ | ✅ |
|
||
| Rapport détaillé (critères + erreurs) | 🔒 flouté | ✅ | ✅ |
|
||
| Tips (idées, modèle, exercices/production) | 🔒 tronqués | ✅ | ✅ |
|
||
| Historique + dashboard | ❌ | ✅ | ✅ |
|
||
| Mode examen | ❌ | ❌ | ✅ |
|
||
| Analyse patterns (5 dernières prod.) | ❌ | ❌ | ✅ |
|
||
| Exercices long terme | ❌ | ❌ | ✅ |
|
||
| Indice de préparation | ❌ | ❌ | ✅ |
|
||
|
||
---
|
||
|
||
## 2. Détail par plan
|
||
|
||
---
|
||
|
||
### 🟢 PLAN DÉCOUVERTE — Gratuit
|
||
|
||
**Rôle :** Acquisition / frustration contrôlée.
|
||
Laisser l'utilisateur goûter le produit et voir que la correction existe, sans lui permettre de construire un entraînement sérieux sur le plan gratuit.
|
||
|
||
#### Accès
|
||
- Mode entraînement uniquement
|
||
- **5 simulations à vie** (toutes tâches confondues, compteur global, ne se remet jamais à zéro)
|
||
|
||
#### Expression Écrite
|
||
- Tâches 1, 2, 3 disponibles ✅
|
||
|
||
#### Expression Orale
|
||
- Tâche 1 et Tâche 3 disponibles ✅
|
||
- Tâche 2 (interaction live) ❌ — cadenas + mention "Exclusivité Premium"
|
||
|
||
#### Correction
|
||
- Score global /20 ✅
|
||
- Niveau NCLC estimé ✅
|
||
- Feedback court (2-3 lignes) ✅
|
||
- Détail par critère → **flouté** + "Disponible en Standard" 🔒
|
||
- Explication des erreurs → **floutée** 🔒
|
||
|
||
#### Tips (entraînement)
|
||
- Suggestions d'idées/arguments → 1 phrase visible + "Voir plus en Standard" 🔒
|
||
- Production modèle → 1 phrase visible + "Voir plus en Standard" 🔒
|
||
- Exercices personnalisés → titre visible + "Disponible en Standard" 🔒
|
||
|
||
#### Données utilisateur
|
||
- Pas d'historique ❌
|
||
- Pas de dashboard ❌
|
||
- Aperçu flouté du dashboard complet avec mention "Disponible en Standard"
|
||
|
||
#### Mode examen
|
||
- Non disponible ❌
|
||
|
||
#### Logique backend
|
||
```typescript
|
||
free: {
|
||
simulations_lifetime: 5,
|
||
oral_t2_live: false,
|
||
detailed_report: false, // visible mais flouté côté frontend
|
||
tips: false, // visible mais tronqué côté frontend
|
||
dashboard: false,
|
||
exam_mode: false,
|
||
pattern_analysis: false,
|
||
preparation_index: false,
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🔵 PLAN STANDARD — 19,90€ / 4 semaines
|
||
|
||
**Rôle :** Progression sérieuse.
|
||
Débloquer l'entraînement complet avec correction détaillée et suivi des productions.
|
||
|
||
#### Accès
|
||
- Mode entraînement illimité ✅
|
||
- Simulations illimitées ✅
|
||
|
||
#### Expression Écrite
|
||
- Tâches 1, 2, 3 disponibles ✅
|
||
|
||
#### Expression Orale
|
||
- Tâche 1 et Tâche 3 disponibles ✅
|
||
- Tâche 2 (interaction live) ❌ — cadenas + mention "Exclusivité Premium"
|
||
|
||
#### Correction
|
||
- Score global /20 ✅
|
||
- Niveau NCLC estimé ✅
|
||
- Détail par critère ✅
|
||
- Explication des erreurs détectées ✅
|
||
|
||
#### Tips (entraînement)
|
||
- Suggestions d'idées/arguments ✅ (activables via toggle avant la simulation)
|
||
- Production modèle basée sur la copie ✅
|
||
- Exercices personnalisés liés à CETTE production ✅
|
||
- Mode focus disponible (masquer les tips pour simuler les conditions réelles) ✅
|
||
|
||
#### Données utilisateur
|
||
- Historique complet des productions ✅
|
||
- Dashboard (consultation des copies et rapports passés) ✅
|
||
- Indice de préparation ✅ (activé après 5 productions)
|
||
|
||
#### Mode examen
|
||
- Non disponible ❌ — cadenas + mention "Exclusivité Premium"
|
||
|
||
#### Analyse avancée
|
||
- Analyse des patterns multi-productions ❌
|
||
- Exercices long terme ❌
|
||
|
||
#### Logique backend
|
||
```typescript
|
||
standard: {
|
||
simulations_lifetime: null, // illimité
|
||
oral_t2_live: false,
|
||
detailed_report: true,
|
||
tips: true,
|
||
dashboard: true,
|
||
exam_mode: false,
|
||
pattern_analysis: false,
|
||
preparation_index: false,
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 🟣 PLAN PREMIUM — 39,90€ / 4 semaines
|
||
|
||
**Rôle :** Réussite — viser NCLC 9+.
|
||
Tout Standard, plus les outils de simulation réelle et d'intelligence long terme.
|
||
|
||
#### Accès
|
||
- Tout le plan Standard ✅
|
||
- Mode examen ✅
|
||
- EO Tâche 2 live ✅
|
||
- Analyse avancée multi-productions ✅
|
||
|
||
#### 🔥 Mode Examen (feature majeure)
|
||
|
||
**Expression Écrite :**
|
||
- 3 tâches affichées simultanément
|
||
- Timer 60 minutes — inarrêtable ⛔
|
||
- Zone de saisie figée (readOnly) à T=0 ⛔
|
||
- Envoi automatique déclenché à T=0 ✅
|
||
|
||
**Expression Orale :**
|
||
- 3 tâches enchaînées
|
||
- Timer global 12 minutes — inarrêtable ⛔
|
||
- Enregistrement stoppé et envoi automatique à T=0 ✅
|
||
|
||
Productions enregistrées dans le dashboard avec tag **"Mode Examen"**.
|
||
|
||
#### 🔥 EO Tâche 2 — Simulation live (différenciateur clé)
|
||
- Interaction dynamique en temps réel avec l'examinateur IA
|
||
- Le candidat répond en audio
|
||
- L'IA adapte ses relances selon les réponses du candidat
|
||
- Rapport complet généré à la fin du dialogue
|
||
- Productions enregistrées avec tag **"T2 Live"**
|
||
|
||
> ❗ Exclusivité Premium — aucun concurrent ne propose cette feature.
|
||
|
||
#### 🔥 Analyse des patterns (intelligence long terme)
|
||
- Analyse automatique des 5 dernières productions
|
||
- Détection des erreurs récurrentes classées par type :
|
||
- Structurelles (organisation, cohérence)
|
||
- Lexicales (répétitions, registre, richesse)
|
||
- Morphosyntaxiques (accords, conjugaison, syntaxe)
|
||
- Distinction : erreur ponctuelle vs pattern répété (3+ occurrences sur 5 productions)
|
||
- Exercices long terme générés sur la base des patterns détectés
|
||
- **Distinction clé :** ces exercices sont différents des exercices du rapport individuel (qui sont spécifiques à une seule production)
|
||
|
||
#### 🔥 Indice de préparation
|
||
- Score dynamique 0 → 100
|
||
- Basé sur : moyenne des scores récents + régularité des sessions + courbe de progression
|
||
- Messages interprétatifs :
|
||
- < 40 : "Continuez à vous entraîner régulièrement"
|
||
- 40–70 : "Bonne progression — visez NCLC 7-8"
|
||
- \> 70 : "Vous êtes en bonne voie pour NCLC 9+"
|
||
|
||
#### Logique backend
|
||
```typescript
|
||
premium: {
|
||
simulations_lifetime: null,
|
||
oral_t2_live: true,
|
||
detailed_report: true,
|
||
tips: true,
|
||
dashboard: true,
|
||
exam_mode: true,
|
||
pattern_analysis: true,
|
||
preparation_index: true,
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Source de vérité unique (lib/access.ts)
|
||
|
||
```typescript
|
||
export const PLANS = {
|
||
free: {
|
||
simulations_lifetime: 5,
|
||
oral_t2_live: false,
|
||
detailed_report: false,
|
||
tips: false,
|
||
dashboard: false,
|
||
exam_mode: false,
|
||
pattern_analysis: false,
|
||
preparation_index: false,
|
||
},
|
||
standard: {
|
||
simulations_lifetime: null,
|
||
oral_t2_live: false,
|
||
detailed_report: true,
|
||
tips: true,
|
||
dashboard: true,
|
||
exam_mode: false,
|
||
pattern_analysis: false,
|
||
preparation_index: false,
|
||
},
|
||
premium: {
|
||
simulations_lifetime: null,
|
||
oral_t2_live: true,
|
||
detailed_report: true,
|
||
tips: true,
|
||
dashboard: true,
|
||
exam_mode: true,
|
||
pattern_analysis: true,
|
||
preparation_index: true,
|
||
},
|
||
}
|
||
```
|
||
|
||
> Tout le code lit depuis cet objet. Aucune condition de plan n'est écrite en dur ailleurs dans le code.
|
||
|
||
---
|
||
|
||
## 4. Règles transversales
|
||
|
||
### Upgrades possibles
|
||
- Découverte → Standard
|
||
- Découverte → Premium (accès direct, sans passer par Standard)
|
||
- Standard → Premium
|
||
|
||
Dans tous les cas : immédiat après confirmation du webhook Stripe, sans délai, sans reconnexion requise.
|
||
|
||
### Upgrade en cours d'abonnement — Prorata automatique (Stripe)
|
||
|
||
Quand un utilisateur Standard souhaite passer en Premium avant la fin de sa période, il ne paie **pas le plein tarif Premium**. Stripe calcule automatiquement le prorata :
|
||
|
||
- Les jours restants du plan Standard sont **crédités**
|
||
- Les jours restants sont **refacturés au tarif Premium**
|
||
- L'utilisateur paie uniquement la **différence de valeur pour le temps restant**
|
||
|
||
**Exemple :**
|
||
Un utilisateur a payé 19,90€ pour 4 semaines. Il upgrade après 2 semaines.
|
||
Stripe crédite ~10€ (2 semaines non consommées de Standard) et facture ~20€ (2 semaines au tarif Premium).
|
||
→ Il paie ~10€, pas 39,90€.
|
||
|
||
**Ce que cela implique côté implémentation :**
|
||
- Utiliser `subscription.update()` dans l'API Stripe avec `proration_behavior: 'always_invoice'`
|
||
- Stripe génère automatiquement une facture de prorata et débite le montant exact
|
||
- Le webhook `invoice.paid` confirme le paiement → mettre à jour le plan à `"premium"` dans Supabase
|
||
|
||
**Ce que l'utilisateur voit dans l'interface :**
|
||
Avant de confirmer l'upgrade, afficher le montant exact calculé par Stripe :
|
||
> "Vous paierez [montant calculé]€ aujourd'hui pour accéder au plan Premium jusqu'au [date de fin]."
|
||
> [Confirmer] [Annuler]
|
||
|
||
Pas de surprise, pas de frustration.
|
||
|
||
### Downgrades / Résiliations
|
||
- Premium → Standard
|
||
- Premium → Découverte (résiliation sans remplacement)
|
||
- Standard → Découverte (résiliation sans remplacement)
|
||
|
||
### Conservation des données
|
||
Les productions sont toujours conservées en base, quel que soit le changement de plan. Seul l'accès aux features change. L'utilisateur ne perd jamais ses données.
|
||
|
||
### Compteur de simulations Free
|
||
- Global (EE + EO confondus)
|
||
- Ne se remet jamais à zéro
|
||
- Une simulation = un envoi pour correction
|
||
- Si l'utilisateur a consommé 3/5 simulations avant de s'abonner, puis résilie, il lui reste 2 simulations gratuites
|
||
|
||
### Expiration d'abonnement
|
||
- Déclenchée par le webhook Stripe : `customer.subscription.deleted`
|
||
- Rôle remis à `"free"` dans Supabase
|
||
- Productions conservées, accès features coupé immédiatement
|
||
- Message affiché à la prochaine connexion : "Votre abonnement a expiré. Vos productions sont conservées. Renouvelez pour retrouver l'accès complet."
|
||
|
||
### Stripe — Produits à créer (mode Test d'abord)
|
||
| Plan | Produit Stripe | Prix |
|
||
|---|---|---|
|
||
| Standard | "Expria Standard" | 19,90€ / 4 semaines |
|
||
| Premium | "Expria Premium" | 39,90€ / 4 semaines |
|
||
|
||
Webhooks à écouter :
|
||
- `checkout.session.completed` → mettre à jour le plan dans Supabase (nouveau abonnement)
|
||
- `invoice.paid` → mettre à jour le plan dans Supabase (upgrade avec prorata)
|
||
- `customer.subscription.deleted` → remettre le plan à "free"
|