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
- Start with "Next.js + SQLite + Stripe" Quick Start
- Add the "Teams" module from the available modules list
- Add the "Admin" module for role management
- 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
- •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
- •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
- •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.