lucasdotvin/laravel-soulbscription
Laravel Soulbscription is an elegant subscription and feature management package for Laravel. Define plans and features, attach subscriptions to any model, and control consumable quotas, renewals, and access through a simple, expressive API built for real-world billing flows.
Architecture fit. laravel-soulbscription is a Laravel-native subscription/entitlement package: Eloquent models (Plan, Feature, Subscription, FeatureConsumption), publishable migrations, a service provider with auto-discovery, and a trait applied to the subscriber model. It fits cleanly into a standard Laravel app that needs plan-based feature gating and consumption tracking without adopting a full billing platform (Stripe Billing, Chargebee, Lago). It is an entitlement layer, not a payments layer — that distinction drives most of the evaluation below.
Integration feasibility. Low-to-moderate. composer require lucasdotvin/laravel-soulbscription, publish and run migrations, add the trait to the billable model, seed plans and features, then gate features in policies/middleware. A working vertical slice is achievable in days, not weeks. The real effort is not installation but deciding the entitlement model (which features are consumable vs. boolean, which plans are periodic vs. lifetime) before schema and seed data harden.
Technical risk. Moderate, concentrated in three areas:
periodicity = null, renewal, and expiration. Similar edge cases (grace periods, suppressed subscriptions, timezone boundaries) should be assumed to exist.Key questions.
Stack fit. Standard Laravel (service provider auto-discovery, Eloquent, migrations, config publish). No queue, cache, or external service is mandatory, so it drops into an existing app without infrastructure change. The only structural requirement is a subscriber model (typically User) and a relational database.
Migration path. Two distinct scenarios:
EntitlementService::can($user, $feature)), backfill plans/subscriptions from the legacy tables, and run both paths in shadow mode for a billing cycle before removing the old checks.Compatibility. 4.3.2 is a patch release with no reported breaking changes; it is a drop-in for 4.3.1. Pin with ^4.3 and treat minor bumps as requiring a read of the changelog. Because 4.3.2 corrects behavior rather than adding capability, no code changes are expected on our side — but any subscription created or renewed on a non-periodic plan under ≤4.3.1 may carry a spurious expires_at that must be audited and cleared as data remediation, not just a dependency bump.
Sequencing.
EntitlementService wrapper so no application code calls package APIs directly.Maintenance. Low ongoing code maintenance, moderate dependency-watch burden. The package surface is small and stable; the risk is upstream drift, not churn in our code. Recommend: pin the version, subscribe to GitHub releases, and maintain a thin internal wrapper so a fork or replacement is a contained change. Budget ~1–2 days per quarter for upgrade evaluation.
Support. No commercial SLA. Support is GitHub issues at the maintainer's discretion, so internal ownership is mandatory — assign a named engineer as package owner. If entitlements gate revenue, an unresponsive upstream is a business risk, not just a technical one; pre-negotiate the option to fork (MIT-licensed, small codebase, fork is cheap).
Scaling. The subscription/consumption model is row-per-event; feature_consumptions will grow fastest. Plan for indexes on (subscriber, feature, created_at), a retention/pruning job, and moving renewal processing to a queued scheduled command so a large renewal cohort doesn't block a request cycle. Read paths (feature checks) should be cheap; if they aren't, cache entitlements per subscriber with invalidation on subscription change.
Failure modes.
expires_at on renewal → lifetime customers silently expire → access denial or, worse, silent over-provisioning if checks are lenient. Because it is silent and data-level, it will not surface in logs; it surfaces in support tickets.expires_at comparisons across DST or app-vs-UTC timezone are a classic source of off-by-hours entitlement loss.Ramp-up. A mid-level Laravel developer reaches productive use in roughly 2–4 days; full fluency with the domain model (periodicity, grace days, suppression, consumable vs. boolean features) takes 1–2 sprints of real use. The learning cost is in the subscription domain, not the API. Onboarding material should be the team's own plan catalog and the internal EntitlementService, not the upstream README — and it should explicitly document how non-periodic plans are expected to behave, since that is precisely where upstream just shipped a defect.
How can I help you explore Laravel packages today?