rubis/docs/produit.md
ordinarthur 801168fc74 docs(audit-1/3): aligner top-level + produit sur le code
Issu d'un audit de cohérence doc-vs-code. Corrige les claims périmés
sur le périmètre V1, la nomenclature des plans, les statuts de
facture et les sources typographiques.

CLAUDE.md
- IN/V1 : ajout Microsoft SSO + Stripe billing + mode démo (livrés)
- IN/V1 : « admin blog (à venir PR3) » → admin blog livré
- IN/V1 : 4 plans nommés concrètement (Standard B2B, Rapide, Patient,
  Ferme) au lieu de la mention vague « 4 plans fournis »
- Glossaire : « Check-in » → « Confirmation » (terme migré dans
  flow.md depuis ADR-008, alignement)
- Brand identité : typo Bricolage + Inter sont self-hosted via
  @fontsource-variable, pas Google Fonts via <link>
- Brand : lien `/brand-identity.html` → `/docs/brand-identity.html`
  (chemin réel) + retrait du caveat « or accent obsolète » (HTML
  sera nettoyé dans le batch brand)
- Bumpé la dernière maj 2026-05-07 → 2026-05-09

docs/produit.md
- §4.1 : ajout Microsoft SSO
- §4.3 : 4 plans réels (Standard B2B / Rapide / Patient / Ferme),
  variables Mustache réelles ({{client.name}}, {{amount}},
  {{dueDate}}), tons réels (amical | courtois | ferme |
  mise_en_demeure)
- §7 : trial commercial 30 jours (vs 14j historique). Note
  l'incohérence avec la « grâce 3 mois » dans billing.ts à fixer
  dans un PR séparé
- §8 : statut `relanced` → `in_relance` (constants/index.ts) +
  « check-in » → « confirmation »
- Header bumpé 2026-05-05 v0.1 → 2026-05-09 v0.2

docs/flow.md
- §6.1 : tons d'étapes corrigés (était amical|ferme|stricte —
  réel : amical|courtois|ferme|mise_en_demeure)
- Slug exemple : `standard-b2b` → `standard-30j` (réel)

docs/wireframes-mvp.html
- Compteur « 13 écrans » nuancé : c'était le scope low-fi initial,
  la SPA livrée en compte ~15 + onboarding multi-étapes

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-09 19:06:59 +02:00

196 lines
11 KiB
Markdown

# Spécification produit — Rubis Sur l'Ongle
> Version : 0.2 (MVP — blog + Stripe livrés) · Dernière maj : 2026-05-09
Ce document est la source de vérité produit. Il décrit ce qu'on fait, pour qui, comment, et **ce qu'on ne fait pas**. Quand un wireframe et ce document divergent, ce document gagne.
---
## 1. Vision
Rubis Sur l'Ongle libère le temps des dirigeants de TPE-PME en automatisant la relance des factures impayées. Là où les concurrents proposent des outils de "recouvrement" complexes pour DAF d'ETI, on propose un outil **émotionnellement orienté temps libéré**, conçu pour qu'un boulanger ou une consultante puisse l'utiliser en autonomie en moins de 5 minutes.
## 2. Cible
### Profil principal
- **Taille** : TPE-PME, 5 à 50 salariés
- **Volume** : 10 à 200 factures émises par mois
- **Décideur** : le dirigeant lui-même, ou son comptable interne (1 personne max)
- **Pas de** : crédit manager, DAF, équipe finance dédiée
- **Outils existants** : facturation déjà gérée ailleurs (Sage, Pennylane, Henrri, Excel) — **on ne remplace pas** le logiciel de facturation, on relance ce qui sort de là
### Persona type
> "Sophie, 42 ans, gérante d'une SARL de prestation B2B (5 salariés). Elle émet 30 factures/mois, 6 sont en retard à tout moment. Elle relance le lundi soir entre 19h et 20h, à la main, en pestant. Elle a essayé un Excel de suivi qui n'a pas tenu 3 mois. Elle gagne 80 €/h facturés. Sa douleur : ne pas pouvoir oublier les retards mentalement."
### Anti-persona
- DAF d'ETI > 250 salariés (use case Dunforce/Upflow)
- Freelance unique avec 3 factures/mois (volume insuffisant pour ressentir la douleur)
- Pure facturation B2C (pas notre cas d'usage)
## 3. Principes UX
1. **3 clics maximum** pour lancer une relance sur une nouvelle facture. Idéal : 2 si plan par défaut bien configuré.
2. **Mobile first** sur le geste rapide (photo de facture en déplacement). Desktop pour la config et le suivi.
3. **L'OCR fait 90 %, l'humain 10 %** — l'utilisateur corrige, ne saisit pas.
4. **Plans pré-fournis** — 4 modèles par défaut, l'utilisateur n'arrive jamais sur une page blanche.
5. **Le ton monte progressivement** — rappel doux → relance ferme → mise en demeure (jamais auto).
6. **Toute action irréversible passe par une modale de confirmation** — envoyer une mise en demeure, supprimer un plan utilisé, archiver une facture en cours.
## 4. Fonctionnalités V1 (IN)
### 4.1 Authentification & onboarding
- Inscription email/password (2 champs minimum)
- Google SSO + Microsoft SSO en option (via Adonis Ally)
- Onboarding 3 étapes au max :
1. Compte (email, mot de passe)
2. Entreprise (nom, SIRET facultatif, secteur, volume mensuel via chips)
3. Signature email (nom, fonction, coordonnées) — sera utilisée dans tous les emails de relance
### 4.2 Gestion des factures
- **Drag & drop** : zone d'upload acceptant PDF, PNG, JPG, jusqu'à 20 fichiers en simultané
- **OCR automatique** sur l'upload — extrait : client, email, numéro de facture, montant TTC, date d'échéance
- **Vérification OCR** : interface split (PDF à gauche, formulaire pré-rempli à droite). Tous les champs déjà remplis, l'utilisateur corrige uniquement
- **Saisie manuelle** : modale 6 champs avec recherche client autocomplete
- **Liste filtrable** : par statut (toutes, à relancer, en relance, encaissées, litige) via chips
- **Actions en lot** : checkboxes pour relancer manuellement, changer le plan, archiver
### 4.3 Plans de relance
- **Bibliothèque** : 4 plans pré-fournis par défaut (cf. `apps/api/app/services/default_plans.ts`)
- *Standard B2B* (`standard-30j`) : J+3, J+10, J+25 — *amical → courtois → mise en demeure*
- *Rapide* (`rapide-15j`) : J+1, J+7, J+15 — cadence resserrée pour récurrents / délais courts
- *Patient* (`patient-60j`) : J+15, J+30 — clients de longue date, on laisse respirer
- *Ferme* (`ferme-7j`) : cadence stricte pour clients à risque
- **Personnalisation** : l'utilisateur crée ses propres plans via `/plans/nouveau` (variantes / sur-mesure)
- **Éditeur** : cadence à gauche, contenu email à droite. Variables sous forme de chips drag-to-insert (`{{client.name}}`, `{{numero}}`, `{{amount}}`, `{{dueDate}}`, `{{signature}}`)
- **Tonalité** affichée comme tag visible — 4 valeurs : `amical`, `courtois`, `ferme`, `mise_en_demeure` (la dernière déclenche `requiresManualValidation: true`)
### 4.4 Check-in email (réconciliation V1)
> Remplace l'intégration banking en V1.
**Comment ça marche** :
1. L'utilisateur configure dans son plan : "Vérifier auprès de moi avant chaque relance" (oui/non + délai en jours, ex. T-2 jours avant la relance suivante)
2. À T-2 du prochain envoi prévu, Rubis envoie un email **à l'utilisateur** : *"Avez-vous été payé pour la facture F-2024-0042 (1 240 €, Boulangerie Martin) ?"* avec deux boutons : **Oui (stopper le plan)** / **Non (continuer la relance)**
3. Si l'utilisateur répond "Oui" → la facture est marquée encaissée, le plan est arrêté
4. Si l'utilisateur répond "Non" ou ne répond pas dans le délai → la relance part comme prévu
**Pourquoi cette mécanique** :
- Évite les relances "fantômes" sur des factures déjà payées hors plateforme
- Conserve l'utilisateur en boucle sans le surcharger
- Architecture compatible avec le futur banking : à terme, le check-in sera automatique via la banque, l'email user devient fallback
**À prévoir côté architecture V1** :
- Modèle d'événement réutilisable (`payment_status_check`) qui peut être déclenché par email-réponse OU plus tard par webhook bancaire
- Le statut de la facture (`pending`, `paid`, `awaiting_user_confirmation`, `cancelled`) doit être pivotable, pas spécifique au flow email
### 4.5 Mise en demeure
- **Toujours validation manuelle** via modale de confirmation. Pas de checkbox d'auto-envoi, c'est une décision produit forte.
- Modale affiche : montant, client, contenu de l'email, conséquences légales rappelées (loi LME)
- Utilisateur doit explicitement cliquer "Envoyer la mise en demeure" pour activer l'envoi
- Email envoyé en accusé de réception possible (option), pas par défaut
### 4.6 Dashboard & rubis
- **Hero** : compteur de rubis du mois en cours, conversion en heures libérées
- **KPIs** : factures à relancer, en relance, encaissé du mois, DSO moyen
- **Activité du jour** : flux des actions automatiques exécutées par Rubis
- **Top mauvais payeurs** : top 3 clients avec le plus de retards (interne uniquement, jamais visible côté client)
### 4.7 Détail facture
- Timeline mixant passé (plein) et futur (estompé) des étapes du plan
- Tracking d'ouverture des emails (X ouvertures)
- Bouton "Relancer maintenant" pour envoi manuel hors cadence
- Notes internes en libre
### 4.8 Mobile
- Responsive web (pas d'app native en V1)
- Action prioritaire : "Photo de facture" (use de la caméra → OCR)
- Tab bar 4 entrées max : Accueil · Factures · Plans · Réglages
- Le rubis reste hero du mobile
## 5. Fonctionnalités OUT (V2+)
### V2 (planifié)
- **SMS** : étape de relance par SMS, **réservé au plan le plus cher**
- **Multi-utilisateurs** : invitations, rôles (admin / éditeur / lecteur), **réservé aux plans payants**
- **Personnalisation avancée des emails** : signature HTML, logo client, branding sortant
- **Wordmark logo** (direction C) : à monter en complément du logo A
### V3+ (plus tard, à anticiper en archi)
- **Intégration banking** : Bridge / GoCardless / Tink, réconciliation automatique. Le check-in V1 devient un fallback
- **Intégrations comptable** : Sage, Pennylane, Quickbooks, Pennylane, Cegid
- **Multi-devises et multi-langues**
- **API publique** pour les ERP partenaires
- **App native** iOS/Android
### Hors scope définitif
- Émission de factures (on ne devient pas un Henrri-bis)
- CRM / pipeline commercial (on ne devient pas Sellsy)
- Gestion de trésorerie complète (on ne devient pas Agicap)
## 6. User flows clés (résumé)
### Flow 1 — Première facture (onboarding hot path)
1. Inscription (2 champs) → setup wizard 3 étapes → arrivée sur Factures (vide)
2. Drag PDF dans la dropzone → OCR → vérification 30 sec → "Valider"
3. Plan par défaut sélectionné → "Lancer la relance" → écran récompense rubis
**Cible** : moins de 4 minutes du début de l'inscription au premier rubis.
### Flow 2 — Routine hebdomadaire
1. Lundi matin, l'utilisateur reçoit un email check-in : "3 factures en attente — avez-vous été payé ?"
2. L'utilisateur clique "Oui" sur 1, "Non" sur 2 → les 2 relances partent automatiquement
3. Total temps utilisateur : <60 secondes
### Flow 3 — Mise en demeure
1. Étape J+20 d'un plan notification dans l'app : "Brouillon prêt"
2. L'utilisateur ouvre la facture relit le contenu clique "Envoyer la mise en demeure"
3. Modale de confirmation avec rappel légal confirme envoi
## 7. Pricing (esquisse à tester)
| Plan | Prix | Cible | Limites | V1 |
|---|---|---|---|---|
| **Free** | 0 | Freelance, test | 5 factures actives en relance, 1 utilisateur, plans standards seulement | |
| **Pro** | 19 €/mois | TPE 1-5 salariés | Illimité factures + OCR + plans, 1 utilisateur | |
| **Business** | 49 €/mois | PME 5-50 salariés | + multi-utilisateurs, + branding email, + SMS (V2) | partiel |
**Stratégie** : prix d'entrée agressif vs Sellsy/Axonaut (~30 €) défendable parce qu'on est mono-produit. Argument : *"moins cher qu'une heure de votre temps mensuel"*.
**Trial commercial** : 30 jours d'essai sans carte bancaire (CTA landing : *« Commencer l'essai 30 jours »*). Le code utilise actuellement une *« période de grâce 3 mois »* post-signup côté `apps/api/app/services/billing.ts` incohérence à aligner sur 30 jours dans un PR séparé (cf. `docs/decisions.md`).
## 8. Notes architecture (à formaliser avec stack)
Quelques contraintes produit qui doivent guider l'architecture :
- **Statuts de facture pivotables** : `pending`, `awaiting_user_confirmation`, `paid`, `in_relance`, `litigation`, `cancelled` pas hardcodés au flow email (cf. `packages/shared/src/constants/index.ts`)
- **Modèle d'événement abstrait** pour la confirmation : un `payment_status_check` peut être déclenché par email-réponse en V1, par webhook banking en V2 l'app ne doit pas savoir d' vient le signal
- **Multi-tenant dès le jour 1** : même si V1 est mono-user par compte, la structure DB doit supporter `organization` `users` `invoices` pour ne pas refactorer en V2
- **OCR** : provider abstrait derrière une interface on doit pouvoir switcher Mindee Document AI Tesseract sans toucher au reste
- **Email outbound** : provider abstrait (Resend / Postmark / SendGrid) avec retry et tracking
- **Jobs/scheduler** : la cadence des relances et check-ins est un job persistant préférer Inngest/Trigger.dev/queue dédiée à `setTimeout`
## 9. Métriques produit à instrumenter
- **Activation** : % d'utilisateurs ayant lancé leur 1ère relance dans les 7 jours suivant l'inscription
- **Engagement** : nombre de rubis gagnés par utilisateur par mois
- **Rétention** : MAU / WAU
- **Conversion business** : taux de passage Free Pro
- **Satisfaction métier** : DSO moyen des comptes (avant/après Rubis)
- **Anti-métrique** : taux de "non" sur les check-in emails (si trop bas, on relance trop tôt et c'est inutile)