ipop/plans
ipop/plans is a lightweight Laravel package for defining and managing plans within your application. Installed via Composer, it offers a simple way to organize plan data and integrate plan handling with your existing Eloquent models and workflows, making it a practical fit for projects that need str...
Architecture fit. ipop/plans is a Laravel domain package for SaaS plan catalogs, feature entitlements, subscriptions, plan events, and countable/limited feature usage. Architecturally it slots into a Laravel monolith as an entitlement layer sitting beside, not replacing, a billing provider (Cashier/Stripe/Paddle). It is the kind of package that owns three concerns most SaaS apps eventually hand-roll: plan definitions, feature gating, and usage counters. That is a good fit only if your app is already a Laravel monolith with an Eloquent subscriber model (User/Team) that can take a trait. It is a poor fit for polyglot services, event-driven billing cores, or teams needing a provider-agnostic entitlement API, since the package presumably assumes Laravel conventions end to end.
Integration feasibility. Mechanically simple: composer require, publish config and migrations, attach a trait to the billable model, seed plans/features. The real feasibility questions are version constraints (illuminate/*, PHP), whether its migrations collide with Cashier's subscriptions table, and whether the feature model distinguishes boolean entitlements from metered quotas. None of that can be confirmed from the public signals — the repository shows 1 star and 0 dependents, which means no third party has validated it in production and no ecosystem compatibility has been proven.
Technical risk. High, and concentrated in blast radius rather than complexity. Entitlement logic is revenue-critical: a defect in plan lookup or countable-feature consumption either over-grants paid features or under-serves paying customers. The package has a single maintainer, no visible dependents, and a 0.005 score — treat it as unmaintained-by-default. Bus factor 1, no security review, unknown test coverage, and unknown upgrade posture across Laravel majors. The code volume is likely small enough to audit and vendor, which is the mitigating factor: risk is manageable only if you accept ownership.
Key questions.
subscriptions table that conflicts with Cashier, and can table names be configured?Stack fit. Suitable for a Laravel-first SaaS where the plan catalog and feature gates live in the same database as users and teams. It complements rather than substitutes for a payment provider: keep Stripe/Cashier as the source of truth for money, and use this package (or a wrapper around it) as the source of truth for entitlements. If the app is multi-tenant with per-tenant plan overrides, verify the subscriber relationship is polymorphic and supports your tenant model before committing.
Migration path. Adopt behind your own seam. Define an internal EntitlementResolver / SubscriptionService interface with methods like can(subscriber, feature), remaining(subscriber, feature), consume(subscriber, feature, qty), and currentPlan(subscriber), and implement it with this package. That keeps package models out of controllers and policies and makes a later fork, in-house replacement, or swap to a competitor a one-file change. Publish and review migrations before running them; prefix tables to avoid Cashier collisions.
Compatibility. Check composer constraints against your Laravel version and confirm no table/model name clashes with Cashier, Sanctum, or existing plans/features tables. Verify the package does not assume a specific payment provider. Run the suite against your lowest and highest supported Laravel versions before merging.
Sequencing.
Maintenance. Assume you own it. With one maintainer and no dependents, upstream fixes for new Laravel majors, PHP versions, or security issues should not be expected on your release cadence. Plan to vendor the source into the repo or an internal fork, pin the version, and budget a small recurring maintenance allocation for Laravel upgrade compatibility. Keep the diff from upstream minimal so you can cherry-pick if the author remains active.
Support. No vendor support, thin documentation, and issues answered at the author's discretion. Operational runbooks must be written internally: how plans are seeded, how a subscription is corrected, how a miscounted feature is reconciled. On-call engineers will be debugging your fork, not a documented product.
Scaling. Two pressure points. First, feature checks on hot paths (every request gating a feature) add query load — cache resolved entitlements per subscriber with invalidation on plan change. Second, countable features are a write-contention problem: if consumption is read-modify-write it will lose increments under concurrency, so verify atomic decrement (UPDATE ... SET used = used + ? WHERE used + ? <= limit) or a usage-ledger design during the spike. Subscription and event tables grow with plan changes; ensure indexes on subscriber and timestamps.
Failure modes.
Ramp-up. Conceptual ramp-up is low: the domain is familiar and the API surface is likely a handful of models and methods. Due-diligence ramp-up is high: thin docs, no production references, and no test-coverage signal mean an engineer must read the source to trust it. Budget roughly one to two sprints for audit, spike, abstraction layer, contract tests, and a concurrency harness before this is safe to put in front of paying customers — and treat the outcome as "we now own an entitlement layer," not "we installed a dependency."
How can I help you explore Laravel packages today?