# NoteToQuote — Roadmap produit

_Dernière mise à jour : 2026-05-30_

---

## État actuel (livré et fonctionnel)

- Module Dolibarr installable via ZIP, testé sur mlsolutions
- Backend Express/TypeScript dockerisé, API sur api.notetoquote.com
- Portal Next.js sur notetoquote.com (accueil, dashboard client, aide, admin)
- 4 plans Stripe : Solo 29€, Essentiel 49€, Pro 79€, Agence 199€ + trial 10 devis
- Licence domain-locked (binding Dolibarr ↔ clé à la première utilisation)
- Dashboard client persistant (localStorage), flag visible, CTA upgrade trial
- Génération IA : notes → lignes devis HT, few-shot corrections, catalogue, photos OCR
- Alertes quota 80%/100% via webhook

---

## 🔴 BLOQUANT — Avant toute démo ou vente

### 1. Stripe production
**Qui peut le faire : humain uniquement (accès Stripe dashboard)**
- [ ] Créer le webhook `https://notetoquote.com/api/webhook` dans Stripe prod
  - Events : `checkout.session.completed`, `customer.subscription.updated`, `customer.subscription.deleted`
  - Récupérer le `whsec_live_...` généré
- [ ] Remplacer dans `portal/.env.local` :
  - `STRIPE_SECRET_KEY=sk_live_...`
  - `STRIPE_WEBHOOK_SECRET=whsec_live_...`
  - `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...`
  - `STRIPE_PRICE_STARTER`, `STRIPE_PRICE_ESSENTIEL`, `STRIPE_PRICE_PRO`, `STRIPE_PRICE_AGENCY` avec price IDs prod
- [ ] Rebuild : `npm run build && systemctl restart notetoquote-portal`

### 2. Réception d'emails contact@notetoquote.com
**Qui peut le faire : humain uniquement (accès OVH)**
- [ ] Dans OVH → Zone DNS → ajouter :
  ```
  MX  10  mx1.mail.ovh.net
  MX  20  mx2.mail.ovh.net
  ```
- [ ] Créer la boîte contact@notetoquote.com dans OVH Mail
- Actuellement : tout email envoyé à contact@ rebondit silencieusement

### 3. Pages légales (obligation LCEN + RGPD — France)
**Qui peut le faire : agent IA (structure) + humain (données société)**
- [ ] `/mentions-legales` — nom société, SIRET, adresse, hébergeur, directeur de publication
- [ ] `/cgv` — conditions de vente, durée abonnement, résiliation, remboursement
- [ ] `/confidentialite` — données collectées, durée conservation, droits RGPD
- [ ] Ajouter ces 3 liens dans le footer (`portal/src/app/layout.tsx`)
- **Sans ces pages, le site est en infraction avec la loi française (LCEN art. 6-III).**

---

## 🟠 HAUTE PRIORITÉ — Dans les 2 semaines

### 4. Sécurité — findings ouverts

#### 4a. Rate limit sur /api/download
**Fichier : `portal/src/app/api/download/route.ts`**
- [ ] Max 5 téléchargements/heure par IP
- Actuellement : n'importe qui avec une clé valide peut aspirer le ZIP en boucle

#### 4b. Headers de sécurité HTTP
**Fichier : `portal/next.config.ts` ou `next.config.js`**
- [ ] Ajouter via `headers()` dans la config Next.js :
  - `X-Frame-Options: DENY`
  - `X-Content-Type-Options: nosniff`
  - `Referrer-Policy: strict-origin-when-cross-origin`
  - `Permissions-Policy: camera=(), microphone=(), geolocation=()`
  - `Content-Security-Policy` minimaliste

#### 4c. Download non bloquant
**Fichier : `portal/src/app/api/download/route.ts`**
- [ ] Remplacer `readFileSync` par `fs.createReadStream` pour ne pas bloquer le thread Node

#### 4d. Validation des variables d'environnement au démarrage
**Fichiers : `portal/src/lib/env.ts` (à créer), `backend/src/index.ts`**
- [ ] Au boot, vérifier que toutes les env vars critiques sont présentes et non vides
- [ ] Exit propre avec message clair si une var manque

### 5. Emails transactionnels via Resend

#### 5a. Email de bienvenue à la création d'un trial
**Fichier : `portal/src/app/api/trial/route.ts`**
- [ ] Après insertion en base, envoyer via Resend :
  - Sujet : "Votre clé NoteToQuote — 10 devis gratuits"
  - Corps : clé `LAU-XXXX-XXXX-XXXX`, lien /aide, lien /dashboard
- Actuellement : la clé n'est jamais envoyée par email à la création

#### 5b. Email quota 80% et 100% à l'utilisateur
**Fichier : `backend/src/lib/licence.ts` — `sendQuotaAlert()`**
- [ ] La fonction log + envoie un webhook mais n'envoie pas d'email au client
- [ ] Brancher Resend depuis le backend (ajouter `RESEND_API_KEY` dans `backend/.env`)
- [ ] Email à `licence.email` avec quota restant et lien vers /#plans pour upgrader

#### 5c. Email de confirmation après paiement
**Fichier : `portal/src/app/api/webhook/route.ts`**
- [ ] Sur `checkout.session.completed`, envoyer un email de confirmation avec la clé de licence

### 6. OG / Social meta tags
**Fichier : `portal/src/app/layout.tsx`**
- [ ] Ajouter dans `<head>` les balises Open Graph et Twitter Card
- [ ] Créer `portal/public/og-image.png` (1200×630px)
- Actuellement : partager l'URL sur LinkedIn/WhatsApp affiche un aperçu vide

---

## 🟡 MOYEN TERME — Dans le mois

### 7. Vérifier et corriger le flow trial → payant
**Fichier : `portal/src/app/api/webhook/route.ts`**
- [ ] Quand un utilisateur trial paye, le webhook doit **mettre à jour la licence existante** (même clé, plan + quota + reset_at mis à jour)
- [ ] Si actuellement ça crée une nouvelle licence : l'utilisateur doit reconfigurer Dolibarr — bug UX critique
- [ ] Tester le flow complet en mode test Stripe : trial → paiement → dashboard → générer un devis

### 8. Analytics privacy-friendly
- [ ] Installer Plausible Analytics (pas de cookies, conforme RGPD, ~9€/mois)
- [ ] Ajouter le script dans `portal/src/app/layout.tsx`
- Sans ça : impossible de savoir combien de gens visitent, d'où ils viennent, quel plan convertit

### 9. Monitoring uptime
- [ ] UptimeRobot (gratuit) sur `https://notetoquote.com` et `https://api.notetoquote.com/health`
- [ ] Alerte email si un service tombe
- Actuellement : tu découvres une panne quand un client se plaint

### 10. Error monitoring
- [ ] Sentry free tier sur le portal Next.js et le backend Express
- [ ] Les erreurs 500 remontent avec stack trace + contexte utilisateur

### 11. sitemap.xml + robots.txt
**Fichiers : `portal/public/sitemap.xml`, `portal/public/robots.txt`**
- [ ] sitemap listant `/`, `/aide`, `/dashboard`, `/mentions-legales`, `/cgv`, `/confidentialite`
- [ ] robots.txt excluant `/admin` et `/api`

### 12. Facturation annuelle
**Fichiers : `portal/src/app/page.tsx`, `portal/src/lib/stripe.ts`, `portal/src/app/api/checkout/route.ts`**
- [ ] Créer prix annuels dans Stripe (10 mois facturés = 17% de remise)
- [ ] Toggle "Mensuel / Annuel" sur la page des plans
- [ ] Passer le bon `priceId` selon la période choisie

### 13. Dashboard admin enrichi
**Fichier : `portal/src/app/admin/page.tsx`**
- [ ] Ajouter : MRR estimé, licences actives par plan, licences à quota épuisé, graph usage hebdomadaire (depuis table `usage_logs`)

### 14. Notification de mise à jour dans Dolibarr
**Fichiers : `module/notetoquote/admin/setup.php`, `portal/src/app/api/version/route.ts` (à créer)**
- [ ] Endpoint `GET /api/version` retourne `{ version: "x.y.z" }`
- [ ] `setup.php` appelle cet endpoint et affiche une bannière si version distante > version locale

### 15. Renouveler le token Supabase Management
- [ ] **Date limite : 28 juin 2026**
- [ ] supabase.com → Account → Access Tokens → nouveau token 30 jours
- [ ] Mettre à jour `backend/.env` : `SUPABASE_MANAGEMENT_TOKEN=sbp_...`
- [ ] `docker restart api-notetoquote`

---

## 🟢 LONG TERME — 3 à 6 mois

### 16. PWA mobile pour saisie sur chantier
- App web installable (iOS + Android), fonctionnement hors-ligne avec sync différée
- Bouton "Dicter" : Web Speech API → texte injecté dans le champ notes
- Interface minimaliste pour utilisation sur le terrain (gants, soleil, une main)

### 17. Facturation intégrée (sans portail Stripe externe)
- Afficher les factures PDF directement dans le dashboard client via l'API Stripe Invoices
- Plus branded, moins de friction pour le client

### 18. Programme partenaire / revendeur
- Dashboard revendeur avec lien d'affiliation et suivi des commissions (20-30%)
- Pricing wholesale pour les intégrateurs Dolibarr
- Cible : les prestataires Dolibarr qui ont déjà des dizaines de clients artisans

### 19. Codes promo
**Fichier : `portal/src/app/api/checkout/route.ts`**
- [ ] Passer un coupon Stripe via paramètre URL dans la session checkout
- [ ] Interface admin pour créer/désactiver des codes promo
- Utile pour les lancements, salons professionnels, partenariats

### 20. Multi-langue
- Version anglaise du site et du module (UK, Belgique, Suisse)
- Chaînes `langs/en_US/` déjà en place côté module Dolibarr

### 21. Devis PDF sans Dolibarr
- Pour les artisans qui n'utilisent pas encore Dolibarr : notes → PDF direct avec logo uploadé
- Funnel d'acquisition plus large, puis conversion vers Dolibarr + NoteToQuote

### 22. Multi-sources de données
- Import plans DWG simplifiés, rapports PDF de diagnostic
- L'IA croise ces données avec les notes pour un devis plus précis

---

## Fichiers clés

```
dolibarr-ia/
├── portal/                          # Next.js — notetoquote.com (port 3011)
│   ├── src/app/
│   │   ├── page.tsx                 # Homepage + plans tarifaires
│   │   ├── aide/page.tsx            # Guide d'utilisation
│   │   ├── dashboard/page.tsx       # Espace client (auth localStorage)
│   │   ├── admin/page.tsx           # Admin interne
│   │   ├── success/page.tsx         # Page post-paiement Stripe
│   │   └── api/
│   │       ├── checkout/route.ts    # Crée session Stripe Checkout
│   │       ├── webhook/route.ts     # Events Stripe
│   │       ├── licence/route.ts     # GET — lookup clé par hash
│   │       ├── trial/route.ts       # POST — crée clé trial
│   │       ├── download/route.ts    # GET — télécharge le ZIP module
│   │       ├── portal/route.ts      # POST — ouvre Stripe Billing Portal
│   │       └── admin/licences/      # CRUD admin licences
│   ├── src/lib/
│   │   ├── stripe.ts               # Config PLANS (Solo/Essentiel/Pro/Agence)
│   │   ├── supabase.ts             # Client admin + hashKey
│   │   └── admin-auth.ts           # timingSafeEqual, rate limit, getClientIp
│   └── .env.local                  # Stripe keys, Supabase, Resend, ADMIN_SECRET
│
├── backend/                         # Express/TS — api.notetoquote.com (port 3010)
│   ├── src/
│   │   ├── lib/licence.ts          # validateLicence (domain_lock, quota, flagged)
│   │   ├── lib/anthropic.ts        # Prompt système + generateProposalLines
│   │   ├── routes/generate.ts      # POST /api/generate
│   │   ├── types/index.ts          # LicenceRecord
│   │   └── migrate.ts              # Migrations via Supabase Management API
│   └── .env                        # Anthropic, Supabase, MANAGEMENT_TOKEN
│
├── module/notetoquote/              # Source module Dolibarr
│   ├── ajax/generate.php            # Envoie X-Dolibarr-Domain, gère domain_mismatch
│   └── js/notetoquote.js            # Messages erreur FR
│
├── dist/notetoquote.zip             # Module packagé — distribué aux clients
├── logo-prompt.txt                  # Prompt pour générateur de logo IA
└── deploy.sh                        # Build + restart backend Docker
```

---

## Coût API estimé

| Scénario | Coût Anthropic estimé |
|----------|----------------------|
| Notes courtes, sans catalogue | ~$0.006 |
| Notes moyennes + catalogue 50 items | ~$0.018 |
| Cas courant (notes + catalogue + quelques photos) | ~$0.025 |

**Marge sur l'IA : ~93%** — 0.30€ facturé en moyenne par génération, ~0.02€ coût réel Anthropic.
