tomatophp/filament-subscriptions
Filament plugin for managing subscription plans and recurring subscriptions in Laravel admin panels. Define plans and features, assign subscribers, and control access from a clean Filament interface that plugs into your existing billing workflow.
Architecture fit. This is a Filament panel plugin layered over laravelcm/laravel-subscriptions 1.8, and the responsibility split is the one a TPM should want: the domain engine owns plans, features, subscriptions, and recurring periods; this package supplies Filament resources, pages, billing UI, widgets, translations, and install scaffolding. We are adopting an admin surface, not a second billing engine. Two boundaries must be stated up front because they define scope. First, there is no headless billing API and no payment-provider abstraction — this is in-panel administration, not a payments platform, so Stripe Billing/Paddle-style scope stays out of the package. Second, the plugin assumes plans and features are the system of record for entitlements; if entitlements also live in a feature-flag service, CRM, or warehouse, we are buying a reconciliation project and should decide that deliberately rather than discover it in QA.
The defining constraint is major-version lockstep with Filament. v5.0.0 targets Filament v5 and explicitly routes Filament v3 users to a 1.x / v3 branch. The plugin's major tracks the UI framework's major, not its own semantics, so our panel upgrade cadence is this dependency's cadence. It can never be the reason we upgrade, and it must never be the reason we cannot.
Integration feasibility. Feasible for teams already on Laravel 12 / PHP 8.2+ / Filament v5. Two prerequisites land together and neither is optional: Filament v5 and laravelcm/laravel-subscriptions 1.8. The install-command fix — migrating before creating the main plan — removes an ordering assumption that made first-run setup fragile and directly de-risks automated provisioning (CI seeds, container init, preview environments, fresh-tenant bootstrap). That is a reportable delivery-risk reduction, not a changelog footnote. The billing page now honoring configured subscription models and resolving panel URLs/redirects (#20) means we are not forced onto library defaults and can wire it behind our actual panel path.
Technical risk.
cancels_at column (medium). Renewal no longer writes it. Any report, export, dashboard, or downstream integration reading it must be found and retired. Open question: does the migration drop the column or leave it orphaned? An orphaned column returning stale data fails silently — worse than a hard error.Key questions.
cancels_at dropped by migration or orphaned, and what is the remediation path for existing rows?composer.json?v3 / 1.x branch — security fixes, or de facto end-of-life?Stack fit. Best fit: Laravel 12, PHP 8.2+, Filament v5, laravelcm/laravel-subscriptions 1.8, single-tenant or straightforward multi-tenant admin. Poor fit: Filament v3 or v4, Laravel 10/11, PHP 8.1, a different subscription engine, or any architecture where billing administration is a standalone service rather than a panel concern. One structural assumption to surface in the design review: the plugin treats the plan/feature/subscription schema as the source of truth, so an external entitlement store is a reconciliation project, not an integration detail.
Migration path. Cheapest at the start of a panel build, before bespoke billing screens exist; adopting later means retiring custom CRUD, which usually costs more than the head start saves. For existing installations, land Filament v5 first, then take this package — v5.0.0 is not a supported target for v4. If we are on Filament v3 today, the real decision is whether to fund a v3→v5 panel migration at all. This package is a passenger in that decision, never the driver, and it should not appear in the business case as a reason to move.
Compatibility. Pin exact versions of Filament, this package, and the subscriptions library together; avoid caret ranges on all three. Bump this package and the library in the same commit, never one without the other. Treat Laravel 13 as unproven until we exercise it in our own matrix. Verify the billing page behind our real panel path, proxy, and tenancy setup rather than assuming the default.
Sequencing.
cancels_at (reports, exports, dashboards, BI extracts) and retire them before or with the upgrade.Maintenance. Budget this as a recurring line item tied to Filament's release cadence, not a one-time integration. Every Filament major forces a coordinated bump of Filament + this package + laravelcm/laravel-subscriptions, with no supported mixed-version state. Plan one upgrade workstream per Filament major and expect a small number of patch-level follow-ups whenever Filament ships a breaking minor. Single-maintainer risk is real at 64 stars and zero dependents: assign one named engineer as owner of the subscription domain, and decide in advance whether we will fork and locally patch or wait on upstream. Waiting is acceptable for cosmetic issues; it is not acceptable for security fixes on a billing-adjacent surface.
Support. Internal support load splits in two, and both tickets should route to the same owner. Admin-user questions ("why can't I blank this locale?", "where did my cancellation date go?") are predictable and answerable with a short internal note; upstream bug reports go to a second tracker with no SLA. Because entitlements are assumed to be plan/feature-driven, support will also absorb any drift between our panel and whatever else claims to know a customer's access level — that is the operational cost of not making the schema authoritative. Set expectations accordingly: this is community-supported MIT software, and the 1.x / v3 branch is not an LTS commitment.
Scaling. Functionally, this scales with the panel: it is admin CRUD and a billing page, so load follows admin concurrency, not end-user traffic — rarely a capacity concern. The real scaling limit is organizational. Feature limits and plan definitions are managed by humans in a UI, with no bulk-edit or API path described, so large catalogues or frequent packaging experiments will feel manual. Multi-tenancy is unverified behind non-default panel paths and proxies, which makes it a scaling question rather than a networking detail: validate before committing to a tenancy model. Multi-language catalogues scale fine in the number of locales but not in nuance, since auto-fill removes intentional gaps.
Failure modes. Ranked by how quietly they fail:
cancels_at data (silent). If the column is orphaned rather than dropped, reports keep producing plausible wrong answers. Highest-priority pre-flight check.Ramp-up. Engineering effort is modest: install, migrate, pin, and validate — days, not weeks — provided Filament v5 is already landed. The hidden cost is domain ramp-up, not setup: whoever owns this must understand the split between laravelcm/laravel-subscriptions semantics and this plugin's UI behavior, across two upstream trackers with different maintainers and release rhythms. Plan for one owner plus at least one informed backup so knowledge does not centralize. Admin-side ramp-up is near zero — native Filament tables and forms mean existing panel users need no new mental model — but content owners need a short brief on translation auto-fill before the first plan edit, and support needs the cancels_at story straight before the first "where did that field go" ticket.
How can I help you explore Laravel packages today?