Multi-Tenant SaaS bouwen: Werkruimtes, Rollen, Facturatie en Isolatie

Hoe ontwerp je werkruimtes, op rollen gebaseerde toegang, facturatieniveaus en tenant-isolatie voor schaalbare SaaS. Praktische architectuur van DigiForge.

DFDigiForge TeamJul 20, 20268 min leestijd
Abstracte gloeiende onderling verbonden blokken op donkere achtergrond die multi-tenant SaaS-architectuur voorstellen.

Multi-tenant SaaS is de standaardarchitectuur voor elk B2B-platform dat wil groeien tot meer dan een handvol klanten. Maar de duivel zit in de details: hoe je werkruimten modelleert, rollen toewijst, facturatie structureert en tenants isoleert, bepaalt of je platform soepel schaalt of instort onder complexiteit. Bij DigiForge hebben we deze systemen tientallen keren opgebouwd en herbouwd voor talloze SaaS-producten. Dit is wat we hebben geleerd.

Werkruimten: de kerneenheid van organisatie

Een werkruimte is een logische container die gebruikers, gegevens en configuratie groepeert voor één klant (of een team binnen een klant). We hebben teams gezien die werkruimten verwarren met facturatieaccounts of zelfs met projecten – doe dat niet. Houd de werkruimte als de fundamentele tenant-scope en leg andere concepten er bovenop.

Belangrijke ontwerpbeslissingen:

  • Hiërarchisch of plat? Sommige platforms hebben werkruimten binnen werkruimten nodig (bijv. een onderneming met meerdere afdelingen). Wij raden een tweelaagse hiërarchie aan: organisatie (facturatie-entiteit) en werkruimte (teameenheid). Vermijd diepere nesting tenzij absoluut noodzakelijk – het compliceert rolovererving en gegevenstoegang.
  • Unieke identificatie: Gebruik een leesbare slug (zoals acme of acme-marketing) voor de werkruimte in URL's, maar vertrouw intern altijd op een UUID. Slugs kunnen veranderen; UUID's niet.
  • Soft-delete met respijtperiode: Het verwijderen van een werkruimte is een drastische actie. Implementeer een soft-delete van 30 dagen, zodat gebruikers gegevens kunnen herstellen. Stop onmiddellijk met factureren, maar bewaar de gegevens tot de respijtperiode is verstreken.

Wanneer een nieuwe gebruiker zich aanmeldt, overweeg dan de onboardingstroom. Moeten ze eerst een werkruimte aanmaken, of kunnen ze een sandbox verkennen? Wij geven de voorkeur aan een begeleide stroom waarbij de gebruiker een organisatie aanmaakt, vervolgens zijn eerste werkruimte, en meteen een prompt krijgt om teamgenoten uit te nodigen. Dit vermindert wrijving en schept de verwachting dat het platform collaboratief is.

Een veelgemaakte fout is het direct koppelen van factureringsplannen aan werkruimtes. Koppel facturering in plaats daarvan aan een organisatie die een of meer werkruimtes bevat. Dit stelt bedrijven in staat om één factuur te hebben terwijl elk team zijn eigen werkruimte krijgt.

Rollen en Machtigingen: Fijnmazig, maar niet te fijn

Op rollen gebaseerd toegangsbeheer (RBAC) is de industriestandaard, maar de granulariteit is belangrijk. Bij DigiForge beginnen we meestal met drie ingebouwde rollen—Admin, Lid, Kijker—en staan we aangepaste rollen toe voor geavanceerde abonnementen. De Admin-rol heeft volledige controle over de werkruimte, Leden kunnen de meeste bronnen aanmaken en bewerken, en Kijkers kunnen alleen lezen.

Waar het lastig wordt, is de reikwijdte van machtigingen. Machtigingen moeten standaard zijn ingesteld op de werkruimte, maar u kunt ook machtigingen op organisatieniveau nodig hebben (bijv. facturering beheren) of zelfs leestoegang over werkruimtes heen voor geconsolideerde rapportage. Modelleer machtigingen als een set van actie:resource-paren en wijs ze toe aan rollen. Sla toewijzingen op in een koppeltabel: (werkruimte_id, gebruiker_id, rol_id).

Pro-tip: Vermijd het controleren van machtigingen alleen op de applicatielaag. Duw zoveel mogelijk autorisatielogica naar je database met behulp van row-level security (RLS) of een policy engine zoals OPA. Dit verkleint de kans dat een bug in je weblaag de gegevens van iemand anders blootstelt.

Een patroon dat ons goed heeft gediend, is het cachen van de gebruikersrol in een sessietoken (JWT) in plaats van bij elk verzoek de database te raadplegen. Maar let op: als je rollen in JWTs cached, moet je een mechanisme hebben om tokens ongeldig te maken wanneer een rol verandert (bijv. korte tokenvervaltijd of een blokkeerlijst).

Denk ook aan rolovererving: moet een organisatiebeheerder automatisch beheerder zijn in alle werkruimten? Onze vuistregel: organisatierollen vormen een plafond, maar werkruimterollen kunnen restrictiever zijn. Een organisatiebeheerder heeft bijvoorbeeld toegang tot elke werkruimte, maar een werkruimtebeheerder heeft geen toegang tot facturatie.

Facturatie- en prijsmodellen: metadata, geen bedrijfslogica

Facturatie is waar multi-tenancy echt wordt. Je prijsmodel – per gebruiker, per werkruimte, op gebruik gebaseerd of in lagen – moet worden weerspiegeld in je datamodel, maar je facturatiesysteem moet worden losgekoppeld van je kernapplicatie. Gebruik een externe facturatieprovider (Stripe, Recurly, Chargebee) en bewaar alleen de abonnements-ID en plan-ID in je database.

We raden de volgende database-aanpak aan:

  1. Een plans-tabel die de plan-slug, prijs en feature-vlaggen definieert (bijv. max_users, storage_gb, api_rate_limit).
  2. Een organizations-tabel met een current_plan_id en billing_provider_subscription_id. Koppel organisaties aan werkruimten via een koppeltabel.
  3. Een features-tabel (of een eenvoudige JSON-kolom) die overschrijvingen opslaat. Als een klant bijvoorbeeld een aangepast tarief onderhandelt, overschrijf dan de prijs van het plan op organisatieniveau.

Het lastigste is het beperken van toegang op basis van het plan. Je hebt twee opties: limieten afdwingen in de applicatie (controleer max_users voordat je iemand uitnodigt) of via database-rijtellingen en triggers. Wij geven de voorkeur aan afdwinging op applicatieniveau omdat dit betere foutmeldingen voor de gebruiker oplevert, maar we voegen altijd een nachtelijke reconciliatiejob toe die organisaties markeert die hun limieten overschrijden.

Planupgrades en -downgrades vereisen zorgvuldige afhandeling. Wanneer een klant upgrade, verleen dan onmiddellijk toegang tot nieuwe functies, maar reken het facturatiebedrag naar rato aan via je provider. Bij downgrade moet je beslissen: blokkeer toegang tot functies die het nieuwe plan overschrijden, of sta een respijtperiode toe? Wij raden een respijtperiode van de huidige facturatiecyclus aan, waarna je beperkingen afdwingt.

Een les uit de praktijk: laat facturatiefouten nooit leiden tot gegevensverlies. Als een betaling mislukt, degradeer dan netjes (bijv. beperk schrijfbewerkingen), maar verwijder geen gegevens. Je klant betaalt uiteindelijk wel.

Tenantisolatie: Gedeeld versus Silo

Isolatie is de meest ingrijpende architectuurbeslissing. De standaardafweging is tussen een gedeelde database (één database voor alle tenants, met een tenant_id-kolom in elke tabel) en een database-per-tenant (elke werkruimte krijgt een eigen database). We hebben beide benaderingen toegepast en zijn voor de meeste projecten uitgekomen op een hybride aanpak.

  • Gedeeld met strikte RLS: Geschikt voor kleine tot middelgrote tenants (minder dan 10.000 gebruikers per tenant). Row-level security is ingebouwd in Postgres en we gebruiken een sessievariabele (app.tenant_id) om elke query te filteren. Dit is het eenvoudigst te beheren en te upgraden.
  • Database-per-tenant: Noodzakelijk wanneer tenants strikte naleving vereisen (HIPAA, SOC 2, AVG-gegevensopslag) of wanneer de applicatie per tenant I/O-intensief is. De operationele overhead is reëel—schema-migraties moeten worden toegepast op honderden databases—maar tools zoals Flyway en geautomatiseerde CI maken het beheersbaar.
  • Schema-per-tenant: Een middenweg met aparte schema's binnen één database. Het biedt meer isolatie dan een gedeelde tabel, maar minder operationele overhead dan volledige databases. We gebruiken dit voor onze lagere abonnementen en upgraden klanten naar database-per-tenant indien nodig.

Ongeacht de isolatiestrategie: sta nooit directe databasetoegang vanaf de client toe. Leid altijd via een API-laag die de tenantidentiteit afdwingt. En voor de liefde van je piketdienst: gebruik nooit, maar dan ook nooit tenant_id in URL's zonder te valideren dat de geverifieerde gebruiker tot die tenant behoort.

Datamigratie tussen isolatieniveaus is een realiteit. Wanneer een tenant bijvoorbeeld de gedeelde database ontgroeit, moet je ze mogelijk migreren naar een dedicated database. Plan daar vroeg op voor: schrijf een migratiescript dat gegevens exporteert en importeert, en test het met productieachtige gegevens. Het moet mogelijk zijn om zonder downtime uit te voeren door een blue-green-aanpak te gebruiken.

Geautomatiseerde Provisioning: Laat de Machine het Doen

Handmatig nieuwe tenants opzetten werkt misschien voor de eerste tien klanten, maar het schaalt niet. Zoals ContractorHUB's recente patentaanvraag benadrukt, is zero-touch implementatie een belangrijk onderscheidend kenmerk voor multi-tenant SaaS [1]. We hebben provisioning-workflows gebouwd die alles automatiseren, van het aanmaken van databases (of schema-clonen) tot het seeden van standaardgegevens en het versturen van welkomstmails.

Een typische geautomatiseerde provisioning-pijplijn:

  1. Een gebruiker meldt zich aan, maakt een organisatie aan en kiest een abonnement.
  2. Een webhook van je facturatieprovider start een provisioning-taak (bijv. een serverloze functie of een Kubernetes Job).
  3. De taak maakt de isolatielaag van de tenant aan (schema of database), voert initiële migraties uit en vult standaardrollen en -instellingen in.
  4. Een tweede taak stuurt een e-mail met inloginstructies en vervolgstappen.
  5. De gebruiker wordt doorgestuurd naar de nieuwe werkruimte—volledig functioneel—binnen enkele seconden.

Idempotentie is hier niet onderhandelbaar. Als de provisioning-taak halverwege faalt, moet het veilig zijn om opnieuw te proberen. We omhullen het hele proces in een state machine met een provisioning_status-kolom op de organisatierij: pending → creating → active → failed. Gefaalde toestanden worden naar een dead-letter queue gestuurd voor menselijke interventie.

Vergeet niet om ondersteunende infrastructuur in te richten: DNS-records voor aangepaste domeinen, CDN-cache-warmers, API-rate-limits per tenant en monitoring-alerts. Automatiseer alles wat gescript kan worden, want handmatige stappen worden onder druk snel vergeten.

Conclusie: De Multi-Tenant-mentaliteit

Multi-tenancy is niet iets wat je achteraf toevoegt. Het moet vanaf dag één je datamodel, toegangscontrole, facturatie-integratie en implementatiestrategie sturen. Het goede nieuws: als je deze vier pijlers—werkruimten, rollen, facturatie, isolatie—goed hebt, wordt de rest van je SaaS aanzienlijk eenvoudiger te bouwen en te onderhouden.

Elke SaaS is anders, maar bovenstaande patronen hebben ons goed gediend in verschillende branches. Of je nu net begint met je MVP of opschaalt naar duizenden tenants, we moedigen je aan om diep over deze beslissingen na te denken. En als je een tweede paar ogen op je architectuur wilt, we kijken er graag naar.

#multi-tenant#saas#werkruimtes#rollen#facturatie#isolatie#provisioning
DF

DigiForge Team

Het DigiForge-engineeringteam — bouwt moderne websites, modules en automatisering, en schrijft over het vak van het leveren van snelle, duurzame webproducten.

Laten we praten

Heb je een project
in gedachten?

Vertel ons wat je bouwt — we stippelen een duidelijk plan uit en bepalen de juiste aanpak voor je product.

Start je project