Architecture multi-tenant pour SaaS : le guide technique 2026
Comment isolez-vous les données de vos clients ? Une seule base partagée, un schema par client, ou une base dédiée ? Cette décision architecturale, prise dès le premier jour, conditionne pour des années la sécurité, les coûts d'infrastructure et la scalabilité de votre SaaS. Voici le guide technique honnête pour faire le bon choix.
Chez HEXAIT, nous avons conçu et fait évoluer des dizaines d'architectures SaaS ces dernières années, de la plateforme B2B servant quelques centaines de clients aux applications métier opaque traitant des données sensibles. La question du multi-tenant revient systématiquement au cadrage : c'est la décision technique la plus structurante, celle qu'il est le plus coûteux de modifier après coup. Une migration de modèle multi-tenant sur un SaaS déjà en production se compte en mois de travail et en risques de régression. Mieux vaut bien la prendre dès le départ.
Ce guide s'adresse aux CTO, lead développeurs et fondateurs techniques qui conçoivent un SaaS ou envisagent de faire évoluer leur architecture. Nous y partageons les 3 modèles classiques, leurs avantages et leurs pièges, les 5 défis techniques à anticiper, et notre approche concrète chez HEXAIT.
Qu'est-ce qu'une architecture multi-tenant ?
Une architecture multi-tenant est un modèle logiciel dans lequel une seule instance applicative (et son infrastructure) sert plusieurs clients, appelés tenants. Chaque tenant accède à ses propres données de manière isolée, mais partage le même code, le même serveur d'application et bien souvent la même base de données que les autres clients. C'est l'opposé du modèle single-tenant, où chaque client dispose d'une instance dédiée : son propre serveur, sa propre base, son propre déploiement.
En single-tenant, chaque nouveau client signe une multiplication directe de l'infrastructure : nouveau serveur, nouvelle base, nouvelle pipeline de déploiement, nouveau monitoring. C'est viable pour quelques clients enterprise (model historique de l'ère on-premise), mais devient ingérable dès qu'on vise la centaine ou le millier d'abonnés.
Le multi-tenant est devenu le standard de l'industrie SaaS depuis le milieu des années 2010, porté par les leaders comme Salesforce, Slack ou Stripe. La logique est simple : mutualiser les ressources pour offrir un service moins cher, plus rapide à déployer et plus simple à maintenir. Mais derrière cette logique business se cachent des décisions techniques précises qui méritent d'être comprises.
Pourquoi le multi-tenant est stratégique dès le premier jour
La mutualisation des coûts d'infrastructure
C'est le levier économique le plus évident. En multi-tenant, un même cluster PostgreSQL, un même pool d'instances Node.js et un même reverse proxy servent des centaines ou des milliers de clients. Le coût marginal par tenant additionnel est très faible, ce qui permet de proposer des plans entre 19 et 99 euros par mois tout en maintenant des marges saines. En single-tenant, le coût fixe par client démarre souvent à plusieurs centaines d'euros par mois, ce qui exclut de fait toute stratégie de plans low-touch ou self-service.
La vitesse de déploiement de nouveaux clients
En multi-tenant, l'onboarding d'un nouveau client se résume à une insertion en base de données : création d'un nouveau tenant, association d'un premier utilisateur admin, éventuellement provisioning de quelques données de démarrage. Le tout en quelques secondes, sans intervention humaine. C'est ce qui permet aux SaaS modernes de proposer un essai gratuit instantané et un workflow self-service complet. En single-tenant, l'onboarding implique un déploiement d'infrastructure : plusieurs minutes au mieux, plusieurs jours au pire.
La maintenance et les déploiements unifiés
Avec une architecture multi-tenant, vous déployez votre code une seule fois et tous vos clients bénéficient instantanément de la mise à jour. Les correctifs de bug, les patchs de sécurité, les nouvelles fonctionnalités : tout est unifié. En single-tenant, chaque déploiement doit être orchestré sur N instances, avec le risque de dérive (drift) entre versions, des matrices de compatibilité à maintenir, et un coût opérationnel qui croît linéairement avec le nombre de clients.
Le piège du "on migrera plus tard"
Une erreur récurrente que nous voyons dans les MVP : démarrer en single-tenant en se disant qu'on basculera en multi-tenant quand on aura plus de clients. C'est rarement viable. Le multi-tenant exige une discipline architecturale qui infuse partout dans le code : modèles de données avec colonne tenant_id, requêtes ORM filtrées, middleware d'authentification, gestion du cache, routage par sous-domaine, tests unitaires. Refactorer une codebase single-tenant pour la rendre multi-tenant revient souvent à une réécriture partielle. Mieux vaut concevoir multi-tenant dès le début, même avec un seul client en production. Voir notre article MVP SaaS : budget realiste, délais et erreurs à éviter pour les autres pièges du démarrage.
Les 3 modèles de multi-tenancy
Il existe trois modèles canoniques pour implémenter une architecture multi-tenant, du plus mutualisé au plus isolé. Chacun a sa logique, ses cas d'usage et ses contraintes. Aucun n'est universellement meilleur : le bon choix dépend de votre marche, de votre volumétrie cible et de la sensibilité des données traitées.
Modèle 1 — Base de données partagée, schema partage (shared DB, shared schema)
C'est le modèle le plus mutualisé. Une seule base de données, un seul schema, et chaque table porte une colonne tenant_id qui identifie le client propriétaire de chaque ligne. Toutes les requêtes applicatives doivent impérativement filtrer sur ce champ pour éviter de remonter des données d'un autre client. Salesforce a historiquement popularisé ce modèle, qui reste aujourd'hui le choix par défaut de la majorité des SaaS B2B grand public.
Avantages
- •Coût d'infrastructure minimal : une seule instance PostgreSQL sert tous les tenants.
- •Onboarding ultra rapide : une seule ligne INSERT pour créer un nouveau tenant.
- •Migrations de schema simples : on alter la table une fois, c'est applique à tous.
- •Reporting cross-tenant facile : utile pour les métriques produit et les analytics.
Inconvénients
- •Risque élevé de fuite de données : une seule requête sans filtre tenant_id et tout est exposé.
- •Scaling compliqué passe quelques millions de lignes par table : index volumineux, requêtes ralenties.
- •Personnalisation limitée : tous les tenants partagent exactement le même modèle de données.
- •Backup/restore par tenant non triviaux : impossible de restaurer un seul client sans logique applicative.
Quand le choisir ? Pour un SaaS B2B grand public avec des plans low-touch (moins de 100 euros par mois), une volumétrie attendue de plusieurs milliers à centaines de milliers de tenants, et des données relativement standards qui ne tombent pas sous un cadre réglementaire strict. Notion, Linear ou Intercom utilisent ce modèle à très grande échelle.
Modèle 2 — Base de données partagée, schema par tenant (shared DB, schema per tenant)
Une approche intermédiaire. Toujours une seule instance PostgreSQL, mais chaque tenant dispose de son propre schema (au sens PostgreSQL : un namespace logique qui contient ses propres tables). Les noms de tables sont identiques d'un schema a l'autre, mais les données sont physiquement séparées. L'application route les requêtes vers le bon schema en fonction du tenant authentifié, généralement via une commande SET search_path en début de connexion.
Avantages
- •Isolation logique forte : impossible techniquement de mixer les données de deux tenants dans une même requête.
- •Personnalisation possible : chaque tenant peut avoir des champs ou des tables additionnels.
- •Backup et export par tenant simplifiés : on dump un schema avec pg_dump --schema=tenant_xxx.
- •Compromis coût/sécurité avantageux pour le mid-market.
Inconvénients
- •Limite à quelques centaines de schemas par instance PostgreSQL avant dégradation des performances.
- •Migrations de schema coûteuses : il faut itérer sur tous les schemas à chaque release.
- •Reporting cross-tenant compliqué : il faut faire des UNION sur N schemas.
- •Pool de connexions à redimensionner : chaque connexion doit changer de search_path.
Quand le choisir ? Pour un SaaS B2B mid-market (plans 200 à 2000 euros par mois), une volumétrie cible entre 50 et 500 clients, des besoins de customisation par client (champs personnalisés, intégrations spécifiques), et un compromis recherche entre coût et isolation. C'est aussi un bon choix transitoire pour des SaaS qui anticipent une demande future de database-per-tenant pour leurs gros comptes.
Modèle 3 — Base de données dédiée par tenant (database per tenant)
Le modèle le plus isolé. Chaque tenant dispose de sa propre base de données physique (ou logique selon le moteur). L'application maintient un registre central qui associe chaque tenant à sa chaine de connexion, et route dynamiquement les requêtes vers la bonne base. Les données sont totalement segregees, y compris au niveau du stockage disque.
Avantages
- •Isolation maximale : zéro risque de fuite cross-tenant, même en cas de bug applicatif majeur.
- •Compliance simplifiée : argument fort pour HIPAA, RGPD, SOC 2, ISO 27001.
- •Performance par tenant isolée : un client "bruyant" ne ralentit pas les autres.
- •Localisation des données par juridiction triviale (EU, US, APAC).
- •Restauration et suppression d'un tenant en une commande.
Inconvénients
- •Coût d'infrastructure élevé : chaque base consomme RAM, CPU et stockage minimal.
- •Complexité opérationnelle : monitoring, backups et migrations à orchestrer sur N bases.
- •Pool de connexions à gérer finement : maintenir une connexion par tenant n'est pas viable au-delà de quelques centaines.
- •Reporting cross-tenant pratiquement impossible sans pipeline de replication vers un entrepot.
Quand le choisir ? Pour un SaaS enterprise (plans 5000+ euros par mois), des secteurs réglementés (santé, finance, défense, juridique), des clients qui exigent contractuellement une isolation physique, ou des besoins de souveraineté des données par pays. C'est le modèle standard de Workday, ServiceNow ou SAP Business ByDesign.
Comment choisir le bon modèle pour son SaaS
Le choix se joue sur quatre critères principaux. Pas de règle absolue, mais une matrice de décision qui clarifie la majorité des situations.
Critères de décision
- Volumétrie attendueMoins de 50 tenants enterprise ? Database per tenant est viable. Entre 50 et 500 tenants mid-market ? Schema per tenant est idéal. Plus de 1000 tenants, ou ambition de millions d'utilisateurs ? Shared schema avec RLS.
- Sensibilité des donnéesDonnées publiques ou faiblement personnelles (productivité, marketing) ? Shared schema convient. Données personnelles RGPD standard ? Schema per tenant ou shared avec RLS strict. Données de santé (HIPAA), financières (PCI-DSS), défense ? Database per tenant quasi-obligatoire.
- Budget infrastructure cibleSi vos plans démarrent à 19 euros par mois, vous devez tendre vers le modèle 1 pour rester économiquement viable. Si vos plans démarrent à 1000 euros par mois, vous pouvez absorber le coût d'une isolation plus forte.
- Complexité de personnalisationSi vos clients ont besoin de champs custom, de workflows spécifiques ou d'intégrations sur mesure, le schema per tenant offre une flexibilité naturelle. En shared schema, vous devez modéliser les customisations en JSONB ou tables EAV, plus complexe.
Une approche pragmatique consiste à coder l'abstraction tenant dès le départ (middleware, repository pattern, tests) en commençant par le modèle le plus simple (shared schema avec RLS), puis à basculer certains gros comptes vers un modèle plus isolé quand le besoin commercial le justifie. C'est l'approche qu'a historiquement choisie Atlassian.
Les 5 défis techniques du multi-tenant
Choisir un modèle n'est que le début. La vraie complexité du multi-tenant reside dans cinq problèmes transverses qu'il faut traiter avec rigueur dès le premier commit.
1. L'isolation des données
C'est le risque numéro un. Une seule requête SQL qui oublie le filtre tenant_id, et les données d'un client se retrouvent exposées à un autre. Les conséquences : breach de données, perte de confiance, sanction RGPD. Et ce risque ne diminue jamais : plus la codebase grandit, plus les opportunités de l'oublier se multiplient.
La défense en profondeur impose deux niveaux. Au niveau base de données, activer le Row Level Security de PostgreSQL : on définit une policy qui filtre automatiquement chaque SELECT en fonction d'une variable de session (current_setting('app.tenant_id')). Même si le code applicatif oublie le filtre, la base refuse de remonter des lignes du mauvais tenant. Au niveau applicatif, un middleware injecte automatiquement le tenant_id dans toutes les requêtes ORM (Prisma middleware, Sequelize hooks, Drizzle plugins). La combinaison des deux rend la fuite techniquement impossible.
Il faut compléter par des tests d'intégration dédiés : pour chaque endpoint critique, on crée deux tenants distincts et on vérifie qu'ils ne voient pas les données l'un de l'autre. Ces tests doivent être obligatoires dans la CI.
2. Sécurité et permissions
Le modèle de permissions classique RBAC (Role-Based Access Control) devient multi-dimensionnel en multi-tenant. Chaque utilisateur appartient à un ou plusieurs tenants, et à un role spécifique dans chacun d'eux. Il faut aussi gérer les super-administrateurs (votre équipe interne) qui peuvent accéder à tous les tenants pour le support, en traçant scrupuleusement chaque accès (audit log). Les invitations croisées entre tenants, les transferts d'utilisateurs, les SSO d'entreprise (SAML, OIDC) ajoutent une complexité supplémentaire qu'il faut modéliser dès le départ.
3. Scalabilité et performance
En shared schema, la première optimisation est l'index composite (tenant_id, colonne_metier) sur chaque table critique. Sans ces index, les requêtes dégénèrent dès qu'une table dépasse quelques millions de lignes. La deuxième : le sharding horizontal par tenant, qui consiste à repartir les tenants sur plusieurs bases en fonction d'un hash de leur ID. Solutions comme Citus ou Vitess automatisent cette logique au-dessus de PostgreSQL ou MySQL.
Le cache aussi doit être cloisonné par tenant. Une clé Redis commeuser:123 est dangereuse : si deux tenants partagent des IDs (ce qui est normal en multi-tenant), vous mélangez leurs caches. La bonne pratique : préfixer toutes les clés par le tenant_id, par exempletenant_abc:user:123.
4. Backup, restore et conformité
Un backup global de toute la base est facile. Le restaurer aussi. Mais qu'est-ce qu'il se passe quand un seul client demande la restauration de ses données à J-2 ? En shared schema, c'est compliqué : il faut extraire les lignes du client depuis un dump, les comparer à l'état actuel, et réinjecter. En schema per tenant, on dump et restaure un schema spécifique. En database per tenant, on restaure la base dédiée.
Le RGPD ajoute deux obligations opérationnelles : l'export complet des données d'un tenant (droit à la portabilité) et la suppression complète (droit à l'oubli). Ces deux opérations doivent être scriptées et testées. En multi-tenant mature, on les expose même via une API interne pour permettre au support de les déclencher en quelques clics.
5. Onboarding et provisioning
Créer un nouveau tenant doit être instantané et idempotent. En shared schema, c'est trivial. En schema per tenant, il faut créer le schema, exécuter toutes les migrations, éventuellement injecter des données seed (roles par défaut, templates, exemples). En database per tenant, il faut créer la base, exécuter les migrations, configurer les utilisateurs, mettre à jour le routeur applicatif. Plus le modèle est isolé, plus le provisioning est complexe et lent. Il faut donc le piloter par une file de jobs asynchrone (BullMQ, Sidekiq, Temporal) pour découpler du parcours utilisateur.
Les migrations de schema multi-tenant sont un sujet à part entière. En shared schema, c'est une migration unique. En schema per tenant ou database per tenant, il faut orchestrer la migration sur N entités, gérer les échecs partiels, et avoir une stratégie de rollback. Des outils comme Flyway ou Liquibase, combinées à une logique maison ou un orchestrateur (Temporal), sont indispensables.
Outils et frameworks pour le multi-tenant
Heureusement, l'écosystème moderne fournit des outils robustes pour implémenter chacun de ces modèles sans tout coder à la main. Voici les briques que nous utilisons le plus chez HEXAIT.
PostgreSQL avec Row Level Security (RLS)
Le combo gagnant pour le modèle shared schema. PostgreSQL permet de définir des policies qui filtrent automatiquement les lignes en fonction du contexte de session. On stocke le tenant_id dans une variable de session (SET app.tenant_id = 'xxx') au début de chaque requête HTTP, et toutes les queries sont automatiquement scopées. Quasi-impossible à contourner par erreur. Supabase utilise massivement cette approche.
Prisma avec multi-schema
Prisma supporte nativement le multi-schema depuis 2024. On déclare ses modèles dans un schema Prisma, on peut créer dynamiquement de nouveaux schemas PostgreSQL au runtime, et utiliserprisma.$extends() pour router les requêtes vers le bon schema en fonction du tenant. Les migrations Prisma savent aussi itérer sur l'ensemble des schemas tenants.
Drizzle et Sequelize
Pour les projets non-Prisma, Drizzle ORM offre une API ergonomique pour gérer le search_path dynamiquement par requête. Sequelize, plus ancien, supporte le multi-schema via un middleware applicatif. Les deux conviennent pour des architectures schema per tenant.
Solutions cloud-native : Supabase et Neon
Supabase fournit un PostgreSQL managed avec RLS active par défaut, ce qui rend le modèle 1 quasi-trivial à implémenter. Neon, de son cote, propose des bases serverless qui scalent à zéro : un excellent fit pour le modèle database per tenant, car le coût d'une base inactive est négligeable. Les deux intègrent nativement les pipelines Vercel/Next.js que nous utilisons sur la plupart de nos projets, comme détaillé dans notre article Pourquoi choisir Next.js pour votre application web.
Notre approche chez HEXAIT
Sur un nouveau projet SaaS, nous démarrons systématiquement par un atelier d'architecture d'une demi-journée avec l'équipe technique du client. Nous y challengeons trois hypothèses : la volumétrie de tenants envisagée à 3 ans, la sensibilité réelle des données traitées (souvent surestimée, parfois sous-estimée), et la complexité des personnalisations attendues par client. Ces trois axes déterminent à 80 % le choix du modèle.
Pour la majorité de nos projets SaaS B2B (entre 50 et 500 clients attendus, données personnelles standard, plans 100-500 euros par mois), nous recommandons une stack éprouvée : PostgreSQL avec Row Level Security, Prisma pour l'ORM, middleware Next.js qui injecte le tenant_id dans le contexte de chaque requête API, et des tests d'isolation systématiques dans la CI. Cette combinaison offre le meilleur compromis entre coût d'infrastructure, sécurité et vélocité de développement.
Pour les clients sur des marchés réglementés ou avec des comptes enterprise exigeant l'isolation physique, nous basculons sur une approche schema per tenant ou database per tenant, en utilisant Neon pour son scaling serverless. Vous pouvez voir comment nous avons appliqué ces principes sur des projets réels dans notre portfolio de réalisations comme Welyx, Mently ou SoCaftan. Notre offre de back-office et dashboard SaaS sur mesure inclut systématiquement le cadrage architecture et couvre l'implémentation complète jusqu'à la mise en production.
4 erreurs fréquentes à éviter
Erreur 1 — Coder le tenant_id manuellement partout
Compter sur la discipline des développeurs pour ajouterWHERE tenant_id = ? dans chaque requête est une bombe à retardement. Il suffit d'une seule requête oubliée pour exposer les données d'un client. La protection doit être infrastructurelle : Row Level Security au niveau base, middleware ORM au niveau applicatif. Le tenant_id ne doit jamais être une responsabilité du développeur de feature.
Erreur 2 — Mettre tous les tenants dans la même base sans index dédiés
Une table avec 50 millions de lignes sans index composite (tenant_id, colonne_query) devient ingérable. Chaque requête scanne potentiellement toute la table. On le voit dès le franchissement du million de lignes : les latences explosent. Tous les index doivent avoir le tenant_id en première position de la clé, sans exception.
Erreur 3 — Ignorer le multi-tenant au départ, "on verra plus tard"
Démarrer en single-tenant en se disant qu'on migrera quand on aura des clients est l'une des erreurs stratégiques les plus coûteuses. La conversion d'une codebase single-tenant en multi-tenant prend typiquement 3 à 6 mois et bloque toute évolution produit pendant cette période. Mieux vaut concevoir multi-tenant dès le premier client, même si on ne l'active réellement qu'au troisième.
Erreur 4 — Choisir database per tenant dès le début sans en avoir besoin
L'erreur inverse, plus rare mais aussi destructrice. Imposer une base par tenant dès le MVP, sans contrainte réglementaire ou commerciale qui le justifie, crée une charge opérationnelle disproportionnée (backups, migrations, monitoring, coût d'infrastructure) qui ralentit toute la vitesse produit. Mieux vaut démarrer en shared schema avec RLS, et basculer un client spécifique en isolation physique le jour où il l'exigera contractuellement.
Vous concevez un SaaS multi-tenant ?
HEXAIT vous accompagne dans le choix du bon modèle d'architecture, son implémentation et sa montée en charge. Un cadrage technique gratuit pour partir sur de bonnes bases dès le premier jour.
Articles recommandés
Retool, Airtable, Notion : quand basculer vers un outil sur mesure ?
Les signaux concrets pour savoir quand rester sur le no-code et quand migrer.
Back-office sur mesure : le guide complet pour PME
Signes, fonctionnalités à prioriser et budgets réels pour votre back-office.
Agent IA en entreprise : comment ça marche et combien ça coûte
ChatGPT vs agent sur mesure, garde-fous et budgets — avec l'exemple Mently.
