mmanos/laravel-billing
mmanos/laravel-billing is a Laravel subscription billing package that adds plans, coupons, invoices, and recurring payments to Eloquent models. It integrates with Stripe and provides traits and models for managing billable users and subscriptions.
mmanos/laravel-billing), then register Mmanos\Billing\BillingServiceProvider and the Billing facade in app/config/app.php.php artisan config:publish mmanos/laravel-billing
php artisan migrate --package="mmanos/laravel-billing"
app/config/packages/mmanos/laravel-billing/.User model so the user becomes a billing "customer" that owns subscriptions, cards, and invoices.src/ (the service provider, the Billing facade, and the gateway driver(s)), and the migrations — the migrations are the real contract: they define customers, plans, subscriptions, invoices, charges/coupons tables.Billing::customer($user)->card($token); // attach token
Billing::customer($user)->subscription($plan); // start subscription
Plan rows whose gateway plan IDs match what you create in Stripe. Always resolve plans server-side by ID; never accept client-supplied prices.subscriptions row as a cache of gateway state and reconcile via webhooks.invoice.payment_failed, customer.subscription.updated, customer.subscription.deleted, and route them into package handlers or your own listeners. This is how renewals, dunning, and cancellations actually land.Billing::customer($user)->subscription(...) and its plan, rather than duplicating subscription logic.Billing::… behind your own BillingService/repository so you can mock it in tests and swap gateways (or the entire package) later without touching controllers.app/config/packages/mmanos/laravel-billing/, not the L5+ config/ directory. Don't copy L5 instructions.card tokens may fail against a modern Stripe account unless you pin an appropriate API version — test subscribe, charge, and cancel against the current API early.subscribe() call does not mean the renewal succeeded. Failed payments happen out of band; without webhooks your local state silently drifts.php artisan migrate:status) — --package behavior differs across L4 versions, and the schema's unique indexes on gateway IDs matter.app/storage/logs, plus enable gateway request logging in config.How can I help you explore Laravel packages today?