The challenge
The product had grown from a single-customer deployment into a multi-customer platform without the data model catching up. Tenant separation was enforced in application code rather than at the database boundary, and invoicing was a monthly script that had begun to require manual correction.
The product was live and could not take scheduled downtime, existing customers were on bespoke pricing that had to be preserved exactly, and enterprise prospects were asking security questions the team could not answer well.
