How to choose your isolation model before you choose tools
The tool list above assumes one decision is already made: shared schema with a tenant_id column on every table. That is the right default for almost every SaaS starting out, but it is a decision, not a given. There are three models, and picking the wrong one is the mistake that actually hurts later:
- Shared database, shared schema — one
tenant_idcolumn, RLS enforces the boundary. Cheapest to run, easiest to query across tenants for analytics, fastest to ship. This is what I used on both BookBed and Callidus. - Shared database, schema-per-tenant — a Postgres schema per customer. Sounds tidy; in practice migrations become N migrations and connection pooling gets awkward. Skip unless a contract forces it.
- Database-per-tenant — full physical isolation. Only worth it when an enterprise buyer's compliance team puts it in the contract, or one tenant's load genuinely threatens the others.
The instinct to start with heavy isolation "to be safe" is backwards. Heavy isolation is harder to build, harder to migrate, and slower to ship. Start shared, and let a signed contract — not a hypothetical — be the thing that pushes you up a tier.