expdev07/laravel-cashier-stripe-connect
Laravel Cashier Stripe Connect extends Cashier with Stripe Connect support, letting platforms manage connected accounts, charge customers, and handle payouts and transfers—ideal for marketplaces, SaaS platforms, and multi-vendor apps built on Laravel.
What this package is: A thin extension of Laravel Cashier that adds Stripe Connect semantics to Cashier's billable models — destination charges, application fees, and platform-controlled transfers. The value proposition is not new Stripe capability (Stripe Connect is a mature, first-class Stripe product with an official SDK) but ergonomics: expressing marketplace splits through the Cashier API surface our engineers already know. That framing matters for the build-vs-buy call, because the underlying capability is available to us either way; what we would be buying is an abstraction and the maintenance of it.
Architecture fit: Reasonable, with one caveat. Because it extends Cashier rather than replacing it, it inherits Cashier's decisions — the Billable trait, cashier_customer_columns/subscriptions migrations, webhook controller conventions, and Cashier's Stripe SDK version pin. Fit is therefore contingent on our existing Cashier posture: if we already run Cashier for subscriptions, this is additive and low-friction; if we do not, adopting it means adopting Cashier's schema and billing model as a package deal. The second caveat is where marketplace state lives: a two-sided marketplace needs connected-account identity, onboarding/KYC status, fee configuration, and payout reconciliation. A package of this size almost certainly does not own that state for us — we will still own the account-to-seller mapping and any ledger of record. We should assume we own the data model and validate that assumption before designing around it.
Integration feasibility: Mechanically easy — Composer install, likely config publishing and a migration, possibly a trait on existing models. The real work is not the package; it is the Connect lifecycle around it: account creation, hosted onboarding and re-onboarding after requirement changes, capability checks before allowing a charge, webhook handling for account.updated and capability.updated, and reconciliation of fees and transfers. A TPM should size the feature, not the dependency, and treat the dependency as a minority of that estimate.
Technical risk:
Key questions (answer before committing engineering time):
composer.json directly.account.updated, capability changes, payout.*), or does everything except charge creation remain ours to build?stripe/stripe-php? If it is two to three weeks, this package's maintenance risk may not clear the bar.Stack fit: Target Laravel 9 / PHP 8.x with Cashier already in the stack. If we are on Laravel 10+, assume this package is not an option until proven otherwise and plan the build-direct path instead. The decision rule for the TPM is: the framework roadmap is the input; the package is the constraint to solve — never let a marketplace feature pin the platform to an unsupported runtime.
Migration path:
composer why-not against laravel/framework, laravel/cashier, and stripe/stripe-php. Record the resolved versions; that triplet is the maintenance contract we are accepting.Compatibility: The critical check is the full dependency graph, not a green install. Pin Cashier and the Stripe SDK explicitly in composer.json rather than floating ranges — the three-way constraint is where this breaks. Pin the Stripe API version on the account and document it. Test webhook signature verification and idempotency in staging; Stripe retries, and duplicate transfer logic is a real money bug.
Sequencing: (a) Constraint audit and build-vs-buy sizing — two to three days, no code merged. (b) Spike against Stripe test mode — one week. (c) Decision gate: adopt package vs build direct against the Stripe SDK. (d) Feature build with the package as a helper — several weeks, dominated by onboarding and reconciliation, not by the package. (e) Staging soak with a test connected account and replayed webhooks. (f) Production pilot, one seller, feature-flagged. Keep the package bump and any framework upgrade in separate changes so failures are attributable.
Maintenance: The dominant recurring cost is that this package is effectively unmaintained relative to the framework cadence. That creates a standing tax: every Laravel or Cashier upgrade starts with a blocked-on-vendor investigation, and the likely end state is forking the package or inlining its charge logic into our codebase. Budget for that outcome rather than treating it as an exception. Set an explicit abandonment threshold — for example, no release within one framework major cycle, or a Cashier constraint that blocks a planned upgrade — and pre-authorize the fork-or-replace decision trigger so it is not argued mid-sprint. Pin versions; never float this dependency.
Support: Community OSS, MIT, no SLA, no escalation path, likely one maintainer. Stripe's own support covers the Connect platform APIs but not our wrapper, so any incident debugs against a two-layer gap. Assign a named engineer as de facto owner for the marketplace money path — this is one of the few areas where ownership is non-optional — and document the fallback in the runbook: which module contains the fee logic, how to bypass the package, and how to reconcile a discrepancy manually. If we are a payments-adjacent business, a second reviewer on any change touching fee computation or transfer creation is a reasonable standing control.
Scaling: The package itself introduces no scaling characteristics. What scales is the Stripe integration: API rate limits, webhook volume (account and capability updates across many sellers), and the reconciliation job's runtime as transaction history grows. Design webhook handling to be queued and idempotent from day one — retrofitting idempotency after a duplicate transfer is an expensive audit. Fee configuration should be data-driven per seller, not hardcoded, because marketplace fee changes are a commercial decision that should not require a deploy.
Failure modes:
Ramp-up: Roughly one week of engineering to audit constraints, spike the package against Stripe test mode, and produce the build-vs-buy recommendation. The feature itself is larger, with onboarding and reconciliation consuming most of the effort. The TPM recommendation at the current information state is: treat this package as a candidate charge helper, not as a marketplace billing foundation. Run the constraint audit and the build-direct comparison in parallel, and gate adoption on whether the package survives the first dependency upgrade cleanly. If our framework roadmap goes past Laravel 9, the honest answer is that this dependency is already a write-off and the marketplace should be built directly against the Stripe SDK.
How can I help you explore Laravel packages today?