initbiz/oc-cumuluscore-plugin
CumulusCore is the foundation plugin for building SaaS applications on October CMS, providing shared models, services, and backend components for multi-tenant setups, plans, subscriptions, and related core functionality. It is designed to be extended by Cumulus-based plugins and custom projects.
Architecture fit
initbiz/oc-cumuluscore-plugin is not a general-purpose Laravel package — it is an OctoberCMS plugin. It ships a PluginBase registration class, database migrations, Eloquent models, backend controllers/list-form configuration, and event/hook wiring that only executes inside OctoberCMS's plugin lifecycle. Architecturally it provides the tenancy and identity core of a SaaS scaffold: a Company (tenant) entity, membership/pivot records linking users to companies, invitations, roles, and plan-assignment hooks intended to pair with the companion oc-cumulus-plugin (subscriptions/billing). It depends on RainLab.User for authentication and user records.
This means the fit question is binary:
Integration feasibility
Feasible but conditional on version compatibility. Installation is standard October marketplace/Composer, migrations are non-destructive, and the backend UI comes for free. The practical constraints:
composer.json and version.yaml.RainLab.User version; that plugin moves independently and has had breaking model/API changes.initbiz_cumuluscore_*), so collision risk is low, but they will not be re-run or reconciled for us.Technical risk
Key questions
RainLab.User already our auth source of truth, or does it duplicate an existing IdP (SSO/OIDC)?Stack fit
Acceptable only for an OctoberCMS application. Confirm the concrete matrix before committing: October branch ↔ Laravel ↔ PHP ↔ RainLab.User ↔ this plugin. Treat the plugin as a component to be vendored, not a floating dependency — commit it (or a fork) into plugins/initbiz/cumuluscore with a lockfile-pinned Composer graph so a marketplace update cannot silently change behavior.
Migration path
RainLab.User, run migrations on a scratch database, and smoke-test company creation, invitation acceptance, role assignment, and the plan hook. Two days, not two weeks.Tenant scope, and discard the October controllers. This is the recommended path if we are not already committed to October.Compatibility
Verify the plugin's declared version constraints against our lockfile, and check the last commit date against the Laravel/October releases that followed it. Confirm RainLab.User's current model extension points still match the plugin's extendUserModel-style hooks. Confirm migrations are idempotent enough for repeated local spins.
Sequencing
oc-cumulus-plugin, or stub the plan hooks behind an interface for Stripe/our own service.Do not parallelize steps 1–3 with product work; the fork-and-harden step is where the real cost sits.
Maintenance
The plugin itself is small (a few dozen files, a handful of migrations), so day-to-day maintenance is low. The compounding cost is the October platform — CMS major upgrades, marketplace churn, and a plugin that will not keep pace. Budget an owner and a recurring fork-sync/rebase task each October upgrade cycle. Without a named owner, this becomes an unpatched dependency within two quarters.
Support
Community forum and GitHub issues only; no vendor SLA. Practical escalation is "we read the source and patch it." That is acceptable if the team has October fluency and unacceptable if it does not — the fallback is contracting outside help, which erodes the cost argument for adopting it in the first place.
Scaling
The plugin adds negligible runtime overhead. The scaling limits are in the domain model, not the code: tenant-scoped queries need composite indexes on (company_id, user_id) and consistent scoping discipline; invitation and notification sends must move to the queue; and backend list controllers will need pagination tuning as company/user counts grow. For a multi-tenant SaaS, plan for a per-tenant index strategy and a periodic orphaned-invitation cleanup job.
Failure modes
RainLab.User major version bump → model extension hooks break.Mitigations: vendor-fork, tenancy tests in CI, disable marketplace auto-update for this plugin, queue all outbound mail, and add expiry sweeps.
Ramp-up
A mid-level Laravel developer with no October experience needs roughly 1–2 weeks to become productive in October's plugin conventions (backend controllers, list/form YAML, behaviors, events) before this plugin is even tractable. A developer with October experience needs a day or two to read it. Add product-level time on top: the tenancy decisions (one company per user vs. many, role granularity, seat semantics, invitation policy) are product decisions the plugin only hints at, and getting them wrong is far more expensive than the code.
Recommendation framing
Given the 15-star adoption signal, single-maintainer risk, and low opportunity score, treat this as a design reference, not a dependency — unless we are already committed to OctoberCMS, in which case a two-day spike followed by a vendor-fork and a tenancy-isolation hardening sprint is a defensible, bounded bet.
How can I help you explore Laravel packages today?