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

11 KiB

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'où vient le signal
  • Multi-tenant dès le jour 1 : même si V1 est mono-user par compte, la structure DB doit supporter organizationusersinvoices 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)