Roadmap Dev SaaS Stack Moderne
Roadmap Dev SaaS Stack Moderne
js
⚡
ROADMAP DÉVELOPPEMENT
WEB SAAS
Stack moderne · Supabase · [Link] · Stripe · Vercel
Auth utilisateurs Supabase Auth ou Clerk Illimité (Supabase) / 10k MAU (Clerk)
⏱ Durée estimée (dev solo/duo) : 2–4 heures 💰💰 Coût outils (tier gratuit) : $0 (tout gratuit)
.[Link] Variables d'env → Créer le fichier .[Link] à la racine (jamais commité dans Git)
→ Ajouter NEXT_PUBLIC_SUPABASE_URL et
NEXT_PUBLIC_SUPABASE_ANON_KEY
→ Ajouter SUPABASE_SERVICE_ROLE_KEY (côté serveur
uniquement — jamais exposé)
→ Ajouter STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET,
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
→ Ajouter RESEND_API_KEY, NEXT_PUBLIC_APP_URL
→ Créer .[Link] (avec les noms des variables sans les valeurs)
pour l'équipe
→ Ajouter .[Link] dans .gitignore
# .[Link]
NEXT_PUBLIC_SUPABASE_URL=[Link]
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGc...
SUPABASE_SERVICE_ROLE_KEY=eyJhbGc... # SERVER ONLY
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
RESEND_API_KEY=re_...
NEXT_PUBLIC_APP_URL=[Link]
⏱ Durée estimée (dev solo/duo) : 4–8 heures 💰💰 Coût outils (tier gratuit) : $0 (tier gratuit : 500
MB, 2 projets)
Supabase CLI Migrations locales → Initialiser le projet local : npx supabase init
→ Login : npx supabase login
→ Lier au projet distant : npx supabase link --project-ref <ref-id>
→ Lancer Supabase localement : npx supabase start (démarre
PostgreSQL, Auth, Storage en local)
→ Workflow : modifier supabase/migrations/ → push vers la prod
SQL Editor Tables principales → Créer la migration initiale : npx supabase migration new
create_initial_schema
→ Table profiles : id (uuid, FK [Link]), email, full_name,
avatar_url, plan, created_at
→ Table organizations : id, name, slug (unique), owner_id, plan,
stripe_customer_id
→ Table memberships : user_id, org_id, role (owner|admin|member),
created_at
→ Table subscriptions : org_id, stripe_subscription_id, status, plan,
current_period_end
→ Créer les tables métier spécifiques à ton produit
→ Appliquer : npx supabase db push
Row Level Sécurité des → Activer RLS sur TOUTES les tables : ALTER TABLE table_name
Security données ENABLE ROW LEVEL SECURITY
→ Policy SELECT profiles : users can only see their own profile
→ Policy UPDATE profiles : users can only update their own profile
→ Policy SELECT organizations : members can see their orgs (JOIN
memberships)
→ Policy INSERT/UPDATE métier : vérifier le membership et le plan
Supabase Typage TypeScript → Générer les types TS depuis le schéma : npx supabase gen types
Types typescript --local > src/types/[Link]
→ Créer un script npm : 'supabase:types' dans [Link] pour
régénérer facilement
→ Importer Database type dans les server actions et API routes
⏱ Durée estimée (dev solo/duo) : 4–8 heures 💰💰 Coût outils (tier gratuit) : $0 (illimité avec
Supabase Auth)
[Link] Protection des → Créer src/[Link] pour intercepter toutes les requêtes
Middleware routes → Refresh automatique des tokens Supabase sur chaque requête
→ Rediriger les utilisateurs non connectés vers /login
→ Rediriger les utilisateurs connectés depuis /login vers /dashboard
→ Protéger les routes /dashboard/* et /api/* privées
Server Logic auth → Créer src/app/auth/[Link] avec les Server Actions [Link]
Actions → Action signUp : [Link]({ email, password, options: {
data: { full_name } } })
→ Action signIn : [Link]({ email,
password })
→ Action signOut : [Link]() → redirect vers /login
→ Action resetPassword :
[Link](email)
→ Action signInWithOAuth : [Link]({
provider: 'google' })
→ Gérer les erreurs avec des messages user-friendly (toast Sonner)
⚠ Pièges à éviter
→ Ne JAMAIS utiliser la service_role_key côté client — uniquement dans les Server Actions ou API Routes
→ Toujours activer RLS avant de mettre en production — sans RLS tout le monde accède à tout
→ Pour le SSR [Link], utiliser impérativement @supabase/ssr et non pas @supabase/auth-helpers
(déprécié)
⏱ Durée estimée (dev solo/duo) : 2–6 💰💰 Coût outils (tier gratuit) : $0 (pas d'outil
semaines (selon complexité) payant nécessaire)
Server Mutations de → Créer les Server Actions pour toutes les mutations (create, update,
Actions données delete)
→ Valider les inputs avec Zod dans chaque Server Action
→ Toujours vérifier l'authentification au début de chaque Server Action
→ Utiliser revalidatePath() ou revalidateTag() après chaque mutation
→ Gérer les erreurs et retourner des messages clairs
→ Utiliser useFormState + useFormStatus pour les formulaires
progressifs
Supabase Upload de fichiers → Créer les buckets dans Supabase Storage (ex: avatars, documents
Storage — public ou privé)
→ Configurer les policies RLS sur les buckets
→ Implémenter l'upload avec
[Link]('bucket').upload(path, file)
Supabase Temps réel → Activer Realtime sur les tables dans le Dashboard Supabase
Realtime → S'abonner aux changements : [Link]('table-
changes').on('postgres_changes', ...)
→ Implémenter les notifications in-app en temps réel
→ Utiliser les Broadcast channels pour les features collaboratives
→ Unsubscribe proprement au unmount du composant (cleanup dans
useEffect)
⏱ Durée estimée (dev solo/duo) : 8–16 heures 💰💰 Coût outils (tier gratuit) : $0 (Stripe ne
prélève qu'à la transaction : 1.4% + 0.25€ EU)
// src/app/(dashboard)/billing/[Link]
'use server'
import Stripe from 'stripe'
import { createClient } from '@/lib/supabase/server'
import { redirect } from 'next/navigation'
⚠ Pièges à éviter
→ Toujours vérifier la signature du webhook Stripe — ne jamais faire confiance au body sans vérification
→ Utiliser la service_role_key Supabase dans les webhooks pour contourner le RLS légitimement
→ Tester TOUS les événements webhook avec stripe trigger avant de passer en production
→ Ne pas mettre en prod sans avoir testé le flow complet : paiement → webhook → mise à jour DB
⏱ Durée estimée (dev solo/duo) : 3–6 heures 💰💰 Coût outils (tier gratuit) : $0 (3 000
emails/mois gratuits)
React Email Templates → Initialiser React Email : npx create-email@latest (crée le dossier
emails/)
→ Lancer le preview : npm run dev dans le dossier emails →
localhost:3000
→ Créer les templates React pour chaque email : welcome, invite,
reset-password, billing-alert
→ Utiliser les composants @react-email/components (Html, Button,
Text, Link, Img, Hr, Section)
→ Tester le rendu sur différents clients mail (Gmail, Outlook) via le
preview
// src/lib/[Link]
import { Resend } from 'resend'
import { WelcomeEmail } from '@/emails/welcome'
import { InvitationEmail } from '@/emails/invitation'
return [Link]({
from: 'Mon SaaS <hello@[Link]>',
to,
subject: 'Bienvenue sur Mon SaaS ! 🎉🎉',
react: WelcomeEmail({ name }),
})
}
⏱ Durée estimée (dev solo/duo) : 2–4 heures 💰💰 Coût outils (tier gratuit) : $0 (Vercel Hobby
tier : illimité pour projets perso)
Vercel Deploy initial → Créer un compte Vercel → Import Git Repository (connecter
GitHub)
→ Sélectionner le repo → Vercel détecte automatiquement [Link]
→ Configurer les variables d'environnement dans Vercel > Settings >
Environment Variables
→ Ajouter TOUTES les variables de .[Link] en Production et
Preview
→ Cliquer Deploy → Vercel build et déploie automatiquement
→ Configurer le domaine personnalisé : Settings > Domains → ajouter
ton domaine
→ Vercel configure automatiquement le SSL/TLS (Let's Encrypt)
Vercel CI/CD Automatisation → Chaque push sur main → déploiement automatique en Production
→ Chaque Pull Request → Preview Deployment avec URL unique
(partage facile pour review)
→ Configurer les Branch Protections sur GitHub (require PR before
merge)
→ Activer Vercel Analytics (Core Web Vitals intégrés) dans Settings >
Analytics
→ Activer Vercel Speed Insights pour les métriques de performance
Supabase Base de données → Créer un 2ème projet Supabase dédié à la production (ne jamais
Prod prod utiliser le projet dev en prod)
→ Appliquer toutes les migrations : npx supabase db push --db-url
<prod-db-url>
→ Mettre à jour les variables Vercel avec les clés du projet Supabase
de production
→ Configurer les URLs autorisées dans Supabase Auth avec le vrai
domaine
→ Activer les backups automatiques quotidiens dans Supabase
Dashboard
Supabase Optimisations DB → Créer les index sur les colonnes fréquemment filtrées (user_id,
org_id, status)
→ Activer le Connection Pooling (Supavisor) pour les environnements
serverless
→ Utiliser les vues matérialisées pour les agrégations coûteuses
→ Surveiller les queries lentes dans Supabase Dashboard > Reports
⏱ Durée estimée (dev solo/duo) : 4–6 heures 💰💰 Coût outils (tier gratuit) : $0 (tiers gratuits de
tous les outils)
Sentry Error tracking → Créer un projet Sentry sur [Link] (framework : [Link])
→ Installer le wizard : npx @sentry/wizard@latest -i nextjs
→ Le wizard configure automatiquement [Link],
[Link], [Link]
→ Configurer le SENTRY_DSN dans les variables Vercel
→ Ajouter les informations utilisateur dans le contexte Sentry (email,
id) après connexion
→ Configurer les alertes email/Slack pour les nouvelles erreurs
→ Utiliser [Link](error) dans les catch blocks
critiques
→ Configurer le seuil d'alertes (ex: > 10 occurrences en 1h = alerte
immédiate)
PostHog Analytics & Feature → Créer un compte PostHog Cloud (EU region pour RGPD)
flags → Installer : npm install posthog-js posthog-node
→ Créer src/providers/[Link] → tracker côté client
→ Tracker les événements business critiques : user_signed_up,
project_created, upgrade_clicked, payment_completed
→ Configurer les feature flags pour déployer les nouvelles features
progressivement
→ Créer des funnels pour analyser les conversions clés (Signup →
Activation → Paid)
→ Mettre en place les dashboards de métriques SaaS (MRR,
activation rate, churn)
→ Activer la session recording pour comprendre les comportements
utilisateurs
Better Stack Uptime monitoring → Créer un compte Better Stack (ex-Better Uptime) → tier gratuit très
généreux
→ Ajouter le monitor : URL [Link] → vérification toutes
les 3 minutes
→ Configurer les alertes : email + Slack en cas de downtime
Vercel Web vitals → Activer Vercel Analytics et Speed Insights dans les Settings
Analytics → Monitorer les Core Web Vitals (LCP, INP, CLS) en production
→ Configurer des alertes si un score descend sous le seuil
⏱ Durée estimée (dev solo/duo) : 4–8 heures 💰💰 Coût outils (tier gratuit) : $0
Supabase Sécurité données → Audit final de toutes les RLS policies — tester chaque table avec
RLS différents roles
→ Vérifier qu'aucune table n'a RLS désactivé sans raison explicite
→ Tester les injections SQL via les fonctions RPC Supabase
→ Valider que les policies multi-tenant isolent bien les organisations
entre elles
→ Activer les logs d'accès DB dans Supabase pour auditer les
requêtes suspectes
Rate Limiting Anti-abus → Implémenter le rate limiting sur les endpoints sensibles (login,
signup, API)
→ Utiliser Upstash Redis (serverless Redis gratuit) avec la lib
@upstash/ratelimit
→ Pattern : 10 tentatives de login par IP par 10 minutes → blocage
temporaire
→ Implémenter le CAPTCHA sur le formulaire d'inscription si
nécessaire (hCaptcha)
→ Configurer les rate limits Supabase Auth dans le Dashboard
[Link] = {
async headers() {
return [{ source: '/(.*)', headers: securityHeaders }]
},
}
⏱ Durée estimée (dev solo/duo) : 1 semaine de 💰💰 Coût outils (tier gratuit) : $0 (lancement
préparation Product Hunt, Twitter, etc.)
Tests E2E Validation finale → Tester le flow complet en mode incognito sur la prod : inscription →
activation → upgrade → utilisation
→ Tester l'inscription via Google et GitHub OAuth
→ Tester le paiement Stripe avec la carte test 4242 4242 4242 4242
→ Tester la réception de tous les emails transactionnels
→ Vérifier que le webhook Stripe met bien à jour le plan dans
Supabase
→ Tester la page de settings : changement de nom, avatar, mot de
passe
→ Tester la déconnexion et la reconnexion
→ Vérifier l'affichage mobile responsive sur iOS et Android
→ Tester avec un compte sur le plan Free et vérifier les limitations
SEO & Meta Visibilité → Configurer les balises meta dans src/app/[Link] (title,
description, og:image)
→ Créer l'Open Graph image (1200x630px) pour les partages sur
réseaux sociaux
→ Configurer le [Link] automatique : src/app/[Link]
→ Configurer le [Link] : src/app/[Link]
→ Vérifier le rendu des liens partagés (Facebook Debugger, Twitter
Card Validator)
→ Soumettre le sitemap à Google Search Console
Stripe Live Paiements en prod → Basculer Stripe en mode Live dans le Dashboard
→ Mettre à jour les clés dans Vercel : sk_live_ et pk_live_
→ Créer un nouveau webhook Live et mettre à jour
STRIPE_WEBHOOK_SECRET
→ Faire un vrai paiement de test avec une vraie carte (1€ ou 1ème
mois) et se rembourser
→ Configurer les emails Stripe (reçus, factures)
Product Hunt Lancement PH → Préparer les assets Product Hunt : logo, images produit
(1270x760px), vidéo démo
→ Rédiger le tagline (< 60 caractères) et la description
→ Planifier le lancement un mardi ou mercredi (meilleurs jours)
→ Prévenir ta communauté la veille (email, Twitter, LinkedIn)
PostHog Métriques produit → Taux d'activation : % users ayant complété l'onboarding dans les
24h
→ Time-to-value : temps entre inscription et première action clé
→ Rétention J1, J7, J30 : % users qui reviennent
→ Conversion Free → Paid : objectif > 2% pour un SaaS B2C, > 5%
pour B2B
→ Feature adoption : quelles features sont utilisées / ignorées
Stripe Métriques business → MRR (Monthly Recurring Revenue) : revenus mensuels récurrents
→ ARR (Annual Recurring Revenue) : MRR × 12
→ Churn rate mensuel : objectif < 5% mensuel (idéalement < 2%)
→ ARPU (Average Revenue Per User)
→ LTV/CAC ratio : objectif > 3:1
Amélioration Itération → Planifier des entretiens avec les 5 premiers clients payants (20 min
continue chacun)
→ Mettre en place un canal de feedback in-app (bouton 'Feedback' ou
widget Canny)
→ Analyser les sessions enregistrées dans PostHog pour identifier les
frictions
→ Prioriser le backlog post-lancement selon les retours
→ Publier un changelog public pour montrer la vélocité de livraison
Supabase 2 projets, 500 MB DB, 1 GB Pro : $25/mois — 8 GB DB, Quand DB > 500 MB ou > 50k
storage, 50k MAU 100 GB storage users actifs
Vercel Illimité (perso), bandwidth 100 Pro : $20/mois/membre — Équipe de 2+ ou > 100 GB
GB/mois bandwidth illimitée bande passante
Resend 3 000 emails/mois Starter : $20/mois — 50k Quand > 3 000 emails/mois
emails/mois (actif à ~1k users)
Sentry 5k erreurs/mois, 1 membre Team : $26/mois — 50k Quand > 5k erreurs ou équipe
erreurs, 2+ membres 2+
Better Stack 10 monitors, alertes email Starter : $24/mois — monitors Quand tu as besoin d'alertes
illimités + SMS SMS ou > 10 URLs
Stripe Gratuit + 1.4% + Idem (pas de plan fixe) Négocier les taux à partir de
0.25€/transaction EU 80k€/an