makfly/stripe-cashier-bundle
makfly/stripe-cashier-bundle brings Stripe subscription billing to Symfony applications, offering Cashier-style customer, subscription, invoice, and webhook handling so you can integrate recurring payments with less boilerplate.
This is a Symfony bundle, not a Laravel package. If you're a Laravel developer, your day-to-day Stripe work should stay on laravel/cashier — it's first-party, heavily tested, and documented. This bundle is relevant to you only if you also maintain Symfony services or are evaluating it as a reference port. That framing hasn't changed in v1.6.0.
Minimal setup on a Symfony app:
composer require makfly/stripe-cashier-bundle:^1.6.0 (pin the minor — see Gotchas).config/bundles.php (MakFly\StripeCashierBundle\StripeCashierBundle::class => ['all' => true]).config/packages/stripe_cashier.yaml) and set STRIPE_KEY, STRIPE_SECRET, STRIPE_WEBHOOK_SECRET in .env.subscriptions, subscription_items, and invoice-related tables.Billable).First use case: attach a subscription to a user after checkout — inject the Cashier-style manager service, call subscribe($user, 'price_xxx'), and persist the returned subscription entity. Confirm the webhook endpoint is reachable before you wire any UI.
Where to look first: the README — which now has substantive 1.6.0 sections covering multi-plan, Meters API, and automatic tax — then the DependencyInjection/ config loader and the Entity/ directory. The source is still the primary documentation; there's no doc site.
Billable contract: your User gets subscriptions(), subscribed(), onTrial(), subscribedToPrice() helpers. Treat the trait as the seam — wrap it behind your own application service rather than calling the bundle directly from controllers, because the API surface is a small, single-maintainer project and you'll likely need to swap or pin it.Cashier:: facade; inject the cashier manager into your checkout/subscription services. Keep the bundle types out of your controller signatures and map to your own DTOs so an upgrade can't cascade through your app.refactor: real multi-plan operations means you can hold several plans on one subscription entity instead of hand-rolling parallel subscriptions. Model your app around the subscription's items rather than the subscription itself — this is also the shape you'll need for metered lines.createUsageRecord is superseded by Stripe's Meters API in this release. If you're porting existing usage-billing code, create the meter in Stripe first, attach a metered price, then report usage through the bundle's manager. Verify the quantity method signatures — the same release ships an explicitly named align quantity method signatures refactor, which is the kind of change that renames arguments on you.Stripe-Signature before you trust any event; if the bundle's listener doesn't, add your own guard kernel event.event.ids yourself and short-circuit duplicates, especially for invoice.paid and customer.subscription.updated. New in 1.6.0: metered-usage and tax events add more idempotency surface — dedupe on event.id, not on your own subscription ID.STRIPE_WEBHOOK_SECRET per-environment, expose /stripe/webhook as an unauthenticated POST route excluded from CSRF, and test with stripe listen --forward-to. For Connect, or features beyond subscriptions/meters/tax, reach for the raw stripe/stripe-php SDK the bundle already depends on.^1.6.0 at most), read the changelog before every update, and budget for the possibility that you become the maintainer of your fork.main. Good change, but the existing tag history is polluted: old tags/dates you see on Packagist may not correspond to intentional releases. Trust specific tags (v1.6.0) and the changelog over the release list, and sanity-check commit SHAs before pinning.2026-07-18 oddity traces back to the auto-tag pipeline; with that workflow removed, release dates from 1.6.0 forward should be trustworthy. Don't carry the old suspicion forward, but don't retroactively trust the pre-1.6.0 dates either.Cashier:: facade, no familiar Billable namespace, no artisan commands, and Doctrine entities instead of Eloquent models. Any "just like Cashier" assumption will cost you time.Event/ or Http/ and confirm Webhook::constructEvent is invoked with the raw body. A mis-verified listener is a silent security hole — and 1.6.0 touches the payload paths (meter payload hardening, tax events), so re-audit rather than trusting a prior review.subscription_items semantics — review the diff before migrating a table with live rows.Resources/config/ are where you'd override the manager or swap an entity. Prefer decorating the manager service over editing vendor code — you'll need that overlay when you patch webhook handling or the new tax flow.stripe/stripe-php directly with two Doctrine entities (Subscription, SubscriptionItem). That gap is narrower than it was — 1.6.0 now covers meters and tax, which used to be the strongest argument for going raw — but the SDK remains the only thing with Stripe's own support behind it.How can I help you explore Laravel packages today?