tomatophp/tomato-saas
Tomato SaaS is a Laravel/TomatoPHP package for building SaaS applications faster, with reusable modules for plans, subscriptions, tenants, and billing. It helps teams add monetization and multi-tenant features without starting from scratch.
What the release actually tells us. v1.1.4 ships with no changelog body — only an autogenerated compare link (v1.1.3...v1.1.4). From a release-management standpoint that is a zero-signal release: we cannot tell whether it is a one-line dependency bump, a migration change, or a quiet breaking change to a published config file. Semantic versioning implies patch = safe, but patch-level discipline is not something this vendor has demonstrated to us, and small-team Laravel packages routinely ship schema or config changes under a patch number. This assessment is therefore a baseline orientation, not a verdict on v1.1.4 specifically, and it should be treated as provisional until the diff is read.
Architecture fit. tomato-saas is a Tomatophp SaaS scaffolding package for Laravel: plans/subscriptions, tenant-or-team modelling, billing hooks, and a Filament-based admin surface, distributed as a Composer package with publishable config and migrations. Fit is bimodal:
users/teams shape and the panel's navigation and auth flow. Retrofitting means either bending your schema to theirs or maintaining a fork.Integration feasibility. Mechanically easy (composer require, publish config/assets, run migrations, register the Filament plugin). The cost is not installation, it is convergence: deciding whether the package's opinion about tenants, roles, and plan gating matches yours, and what happens at the boundary when it doesn't. Budget the evaluation time against the domain model, not the install.
Technical risk.
Key questions to answer before committing.
database/migrations/, config/, or composer constraints?Stack fit. Confirm the composer constraints resolve against our Laravel/PHP/Filament versions before any spike. A failed composer require in a throwaway app is a ten-minute answer to a question that otherwise costs a week. Note that this package likely pulls Filament transitively — that makes Filament a coupled dependency across the whole admin surface, which is a significant architectural commitment for an admin-panel decision, not just a SaaS decision.
Reading the release. Treat v1.1.4 as unverified until reviewed. Concretely: clone the repo, git diff v1.1.3 v1.1.4 --stat, then read the diff for migrations, config keys, and public method signatures. This is a 30-minute task and it is the single highest-value action available right now. If the diff is empty or trivial, the risk profile is unchanged and we can adopt at v1.1.4. If it contains a migration or config-key rename, we need a documented upgrade note before anything reaches staging.
Migration path. Adopt at a pinned exact version, never a floating constraint ("tomatophp/tomato-saas": "1.1.4"), with composer.lock committed. Upgrades become deliberate, reviewed events rather than background drift. Budget for a fork: fork the repo into our org, tag our own releases, and pull upstream on our cadence. This costs little and removes the abandonment and opaque-release risks almost entirely.
Compatibility. Run the spike in an isolated branch against a snapshot of the real database, not a fresh one. Fresh-install success tells you nothing about migration behaviour on populated tables. Exercise: install, migrate, seed a plan, create a tenant, run a subscription transition, fire a webhook, roll back. Rollback is the step most evaluations skip and the one that determines how bad a bad upgrade gets.
Sequencing.
Maintenance. Ongoing cost is dominated by version coupling, not by the package's own bug rate. Every Laravel, PHP, and Filament upgrade now has a second-order dependency on whether this package has caught up. Assume 2–4 hours per quarter in routine alignment, plus a half-day whenever Filament or Laravel cuts a major. The fork-and-pin strategy converts unpredictable vendor-cadence risk into predictable internal work, which is the right trade for anything on the money path.
Support. Expect GitHub-issues-level support with no SLA. That is acceptable for scaffolding and unacceptable for a billing critical path unless we own the fork. Establish an internal owner — a named engineer or small team — responsible for the fork, upgrade cadence, and security review. An unowned third-party dependency on the revenue path is the failure mode that shows up in postmortems.
Scaling. The package is not the scaling bottleneck. Application-level PHP code for plan lookups and subscription records is trivial next to the real constraints: webhook throughput and idempotency, subscription-state query patterns, and whether entitlement checks are cached or hit the database on every request. Review the entitlement-check path specifically — if it issues a query per feature gate, that is a hot-path problem at scale and worth wrapping in a cache layer early. Multi-tenant data isolation is the other scaling concern; confirm the tenant scoping is enforced at the query layer and cannot be bypassed by a forgotten where.
Failure modes, ranked.
Ramp-up. A Laravel developer is productive with the package in 1–2 days; productive safely on the billing path in 1–2 weeks, and that extra time is spent on the billing domain (plan transitions, proration, dunning, webhook replay), not on the package's API. Two things shorten the curve materially: an architecture decision record documenting the integration boundary and the fork policy, and a written runbook for "upgrade this dependency" that includes the diff-review step that this release makes obviously necessary.
How can I help you explore Laravel packages today?