laravelcm/laravel-subscriptions
Laravel Subscriptions is a flexible plans and subscription management system for Laravel, with tools to run SaaS services efficiently. It provides migrations, config, and Eloquent models; payments are out of scope.
Architecture fit. The package is a Eloquent-centric domain model for plans, features, subscriptions, and (optionally) usage records. It is unopinionated about billing: it does not talk to Stripe, Paddle, or any gateway, and it does not process payments, dunning, or invoicing. That makes it a good fit for teams that want a first-class subscription/entitlement data model inside a Laravel monolith but already have or plan a separate billing integration (Cashier, Paddle, or a custom payment service). It composes via traits (e.g. HasSubscriptions), published migrations, and config-driven model bindings, which suits a modular monolith or a SaaS product where plans drive feature gating.
Integration feasibility. Installation is a standard composer require + publish config + publish migrations workflow. The main work is not the package but the product: defining plan catalog, feature tiers, and entitlement semantics, and mapping them onto the package's schema. Because models are swappable via config, it can coexist with existing User/tenant models without a rewrite. The trade-off is that upgrades may require re-publishing and diffing migrations, so integration needs to be treated as ownership of a dependency with a schema footprint, not a black box.
Technical risk. The most material risk is maintenance and ecosystem signals rather than code quality. 244 stars and zero recorded dependents indicate a small (possibly single-org) maintainer surface and limited third-party validation. The README badges Laravel 10.x, which suggests the package may lag current Laravel majors; confirm the support matrix before committing. There is no first-party payment, tax, invoice, or dunning logic, so any of those requirements become in-house scope. The published-release cadence looks active, but a bus-factor of one or two maintainers is a real continuity consideration.
Key questions.
Stack fit. Best fit is Laravel 10+ on MySQL/Postgres with an existing authentication model and a separate payment/gateway layer. It is a poor fit if the team expects the package to be a complete billing system (invoices, tax, refunds, proration engine) — that expectation should be reset early with stakeholders.
Migration path. Treat it as a domain-model addition: publish config and migrations, create app-level models extending the package's base classes, and keep the package's schema untouched except for additive indexes. If replacing a bespoke subscription table, run a one-way backfill (plan → subscription → entitlement) behind a feature flag, keep the old read path live during cutover, and reconcile counts before retiring it.
Compatibility. Pin the package version and the Laravel major explicitly in composer.json. Validate against the app's DB driver and timezone/clock strategy, since period boundaries are sensitive. Before adoption, run the package test suite and a smoke test of subscriber creation, plan change, and cancellation in a staging environment.
Sequencing. (1) Spike: install, publish, verify Laravel/PHP compatibility and DB driver. (2) Model: define plans/features/entitlement mapping with product. (3) Integrate: wire HasSubscriptions into user/tenant models. (4) Billing: connect gateway webhooks to subscription state transitions, with idempotency. (5) Gate: implement feature checks and admin/catalog UI. (6) Harden: reconciliation, edge-case tests, runbooks. Do not start with webhook plumbing before the plan/entitlement model is agreed — that is the rework risk.
Maintenance. Budget for in-house ownership: dependency updates, migration diffing on releases, and monitoring upstream issues. The license is permissive (MIT), and the code is forkable, which mitigates the continuity risk — but a fork becomes an ongoing internal commitment and should be a planned fallback, not a surprise.
Support. Expect community-only support via GitHub issues, with no SLA. For a revenue-bearing subscription system, that means the internal team is the primary escalation path; document the domain model and upgrade procedure so knowledge is not concentrated in one engineer.
Scaling. Subscription lookups are typical hot paths: index on subscriber, status, and period end, and expect entitlement checks on every request to be cacheable. Usage/metered tables, if used, grow fastest and need retention or partitioning policy. Schema-level scaling is straightforward; the scaling risk is query patterns and cache invalidation, not the package itself.
Failure modes. Watch for: webhook-driven state drift from the gateway (idempotency and replay handling), period-boundary miscalculations under timezone/clock skew, orphaned subscriptions after user deletion, migration drift on package upgrades, and silent config/model binding mismatches after deploy. Each maps to an observable check — reconciliation job, invariant tests, and a catalog/state audit.
Ramp-up. Low for Laravel developers (idiomatic Eloquent, published config), moderate for the TPM: the real learning curve is the product's plan and entitlement taxonomy, not the API. A one-to-two week spike with one engineer and one product partner is a reasonable discovery budget before a go/no-go decision; given the low dependents count and Laravel 10 badge, gate commitment on explicit version-support confirmation and an internal ownership decision.
How can I help you explore Laravel packages today?