Can Studios created a custom Laravel plugin and retained a key eLearning client
Key clientRetained with contract renewal
1 packageTo isolate tenant-specific features
SupportedUbuntu and MySQL versions restored
Laravel
Vue
MySQL
AWS
Docker
REST API
PHPUnit
Laravel Dusk
SAML SSO
One key client needed bespoke behaviour without a fork
Can Studios builds eLearning platforms, including Training Post, a multi-tenant Laravel product used by multiple organisations.
When I joined, they had a familiar product problem: one important client needed bespoke behaviour, but the platform still had to stay maintainable for everyone else. They had also recently lost a senior Laravel engineer, which left a knowledge gap and increased delivery risk across the platform at exactly the wrong time. Their largest and most commercially important client needed functionality tied to its own systems and workflow, and there was a real risk of churn if the work could not be delivered.
The obvious answer would have been to bolt bespoke code directly into the main application. That would have solved the short-term delivery pressure, but it would also have made every future platform change riskier.
RoleStabilising an inherited Laravel product under pressure
I was brought in to keep the existing platform stable while delivering the client-specific work safely.
The role needed someone who could understand an inherited Laravel application quickly, work within the constraints of a multi-tenant product, and avoid turning one client’s requirements into a permanent maintenance burden.
I also supported infrastructure upgrades because the platform was running on Ubuntu and MySQL versions approaching end of life. That made the brief broader than feature delivery. The product had to keep moving, but the foundations needed attention too.
SolutionA tenant-specific package instead of a second platform
I proposed and built a tenant-specific extension approach using a bespoke Laravel package.
The package was conditionally loaded per Training Post instance, which kept the core application independent for other customers. It had its own routes, controllers, views, migrations, and background jobs, so the bespoke work had a clear boundary instead of being scattered through the main app.
The feature set included a secure REST API integration, SAML SSO, data mapping into existing Training Post records, and custom export tooling. I supported the work with PHPUnit tests and Laravel Dusk browser tests, then worked closely with QA and the client through weekly check-ins.
Challenges
Protecting the core product from special-case code
The main challenge was protecting the product from its own success.
The client-specific requirements were commercially important, but they could not be allowed to reshape the whole platform. A forked codebase would have created a second product to maintain. A messy set of conditionals in the core app would have made future development harder for every tenant.
The package approach kept the bespoke behaviour close to the client that needed it. It also made the trade-off explicit: a little more structure up front in return for a cleaner long-term boundary.
The infrastructure work had to happen carefully too. Upgrading platform dependencies is rarely glamorous, but unsupported server and database versions quietly increase risk. The goal was to move the platform back onto supported ground without disrupting delivery.
OutcomeThe client stayed and the platform moved onto safer ground
Can Studios retained the key client with a contract renewal, delivered the bespoke workflow without forking Training Post, and kept the wider product stable for other tenants.
The platform was also moved onto supported Ubuntu and MySQL versions, giving the team a safer base for security patching and future delivery.
Adam gave us a clean way to deliver bespoke client requirements without compromising the core product. He understood the Laravel architecture quickly, worked well with QA, and helped us keep an important client relationship on track.
