New tenant provisioning required an engineer to manually create a database, configure environment variables, set up DNS, deploy a tenant-specific instance, and run seed scripts. Average time from contract signed to tenant live: 14 business days
No tenant isolation at the application layer. A bug in one tenant's custom configuration could (and did) crash the shared application server, taking all tenants offline. This happened 3 times in 6 months
Role-based access control was hardcoded per tenant. Adding a new permission level required a code change, a deployment, and a prayer that it didn't break another tenant's access rules
Each tenant ran on a separate application instance with its own deployment pipeline. 18 tenants meant 18 deployments for every release. A single feature update took 2 full days to roll out across all tenants
Resource usage was invisible. The company couldn't tell which tenants consumed the most compute, storage, or bandwidth. Pricing was flat-rate, meaning heavy-usage tenants were subsidized by light-usage ones
Tenant-specific customizations (branding, workflows, integrations) were implemented as code branches. 18 tenants, 18 branches, 18 merge conflicts on every release