Note: This documentation uses Next.js App Router. If you're still on Pages Router, see the migration guide.

Multi-tenant Application

Build a multi-tenant SaaS with team management and role-based access.

Steps in the UI

  1. Start with "Next.js + SQLite + Stripe" Quick Start
  2. Add the "Teams" module from the available modules list
  3. Add the "Admin" module for role management
  4. Configure team-specific Stripe settings

Modules included: teams, admin, stripe-core, auth-supabase

Routes générées

  • /teams- Gestion des équipes
  • /teams/[teamId]- Détails d'une équipe
  • /teams/create- Création d'une nouvelle équipe
  • /teams/[teamId]/members- Gestion des membres
  • /teams/[teamId]/settings- Paramètres de l'équipe
  • /admin- Interface d'administration
  • /admin/users- Gestion des utilisateurs
  • /admin/teams- Vue d'ensemble des équipes
  • /api/teams/route.ts- API de gestion des équipes
  • /api/teams/[teamId]/route.ts- API d'une équipe spécifique
  • /api/teams/[teamId]/members/route.ts- API des membres
  • /api/admin/users/route.ts- API d'administration des utilisateurs
  • /api/admin/teams/route.ts- API d'administration des équipes
  • /billing- Facturation par équipe
  • /api/billing/teams/[teamId]/route.ts- API de facturation d'équipe

.env minimal

# Database
DATABASE_URL="file:./dev.db"

# NextAuth
NEXTAUTH_SECRET="your-secret-key-here"
NEXTAUTH_URL="http://localhost:3000"

# Stripe
STRIPE_SECRET_KEY="sk_test_..."
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_..."
STRIPE_WEBHOOK_SECRET="whsec_..."

# Teams (optionnel)
TEAM_INVITE_EXPIRY="7d"
MAX_TEAM_MEMBERS="10"

# Admin
ADMIN_EMAILS="admin@example.com,super@example.com"

Smoke test

curl -I http://localhost:3000

Expected: HTTP/1.1 200 OK

curl -I http://localhost:3000/teams

Expected: HTTP/1.1 302 Found (redirection) ou 200 OK (si authentifié)

curl -X GET "http://localhost:3000/api/teams" \
  -H "Content-Type: application/json"

Expected: HTTP/1.1 401 Unauthorized (sans token) ou 200 OK (avec token)

curl -I http://localhost:3000/admin

Expected: HTTP/1.1 302 Found (redirection) ou 200 OK (si admin)

curl -X GET "http://localhost:3000/api/admin/users" \
  -H "Content-Type: application/json"

Expected: HTTP/1.1 403 Forbidden (non admin) ou 200 OK (admin)

Actions déclenchées

Invitations d'équipe

Quand : Un membre invite quelqu'un à rejoindre l'équipe

Voir le résultat :
  • Email d'invitation envoyé via Resend/Postmark
  • Dashboard email provider > Logs
  • Base de données : table `team_invitations`

Notifications de rôle

Quand : Changement de rôle dans une équipe

Voir le résultat :
  • Notification in-app dans `/notifications`
  • Email de notification (si configuré)
  • Logs dans la console de développement

Webhooks Stripe par équipe

Quand : Événements de paiement liés à une équipe

Voir le résultat :
  • Logs dans la console de développement
  • Dashboard Stripe > Webhooks > Logs
  • Base de données : table `team_subscriptions`

Need help?

If you need assistance with this example or have questions about boiler.plate modules, check out our documentation.