protonemedia/laravel-paddle
Laravel Paddle offers a clean integration for Paddle billing in Laravel apps, including subscription management, checkout, webhook handling, and API helpers. It simplifies recurring payments, receipts, and customer data so you can add Paddle-powered billing quickly.
What it is: protonemedia/laravel-paddle is a community Laravel wrapper around Paddle's payment APIs. It ships a service provider + facade, a publishable config file, migrations/models for receipts and subscriptions, a webhook endpoint with signature verification, and a fluent checkout/subscription API. Paddle is a merchant of record (MoR), so it absorbs global sales tax/VAT and chargeback handling — the commercial reason teams pick it over Stripe.
Architecture fit: Good for a standard Laravel monolith or modular monolith. It leans on Laravel idioms we already use — config publishing, queued jobs, events/listeners, Eloquent — so it slots in without new infrastructure. If our billing logic is currently a bespoke service class or a Stripe-style abstraction, the package replaces a meaningful chunk of glue code (checkout session creation, webhook routing, subscription state sync).
Integration feasibility: Low-friction install: composer require protonemedia/laravel-paddle, publish config + migrations, set PADDLE_* env vars, expose a CSRF-exempt webhook route, run a queue worker. Effort is dominated by product/billing decisions (plan mapping, entitlement rules, dunning UX), not by the package itself. Realistically 1–2 sprints for a first integration, most of it in webhook-driven state reconciliation and test coverage.
Technical risk (ranked):
laravel/cashier-paddle, which covers subscriptions, webhooks, and a Paddle::fake()-style test harness with first-party support guarantees. Choosing a third-party wrapper needs a clear justification (ergonomics, fewer abstractions, existing team familiarity) or it becomes avoidable maintenance. Note that cashier-paddle will also carry Laravel 12 support on its own schedule, so 2.10.0 does not create differentiation here.Key questions to answer before approval:
laravel/cashier-paddle? Document the answer.illuminate/* range with untested framework code is a weaker signal than it appears — verify CI runs against 12.x before relying on it.Stack fit: Native Laravel. Requirements are a modern PHP/Laravel baseline. Update from 2.10.0: Laravel 12.x is now supported, which removes the most likely install blocker and means we no longer need to pin below a framework upgrade. Verify the exact PHP floor in composer.json — Laravel 12 implies PHP 8.2+, which may itself be the constraint that bites first. No new services required beyond a queue worker we already run. Works cleanly with multi-tenant apps if we scope subscription records per tenant ourselves.
Migration path:
laravel/cashier-paddle: the migration is mostly a facade/API rename plus data-model reconciliation. Only do this if there is a concrete capability gap — otherwise stay first-party. 2.10.0 does not create such a gap: both options now target Laravel 12.Compatibility considerations: Pin the package version explicitly in composer.json ("protonemedia/laravel-paddle": "^2.10") and record the Paddle API version alongside it. Check that published migrations don't collide with existing tables, that the webhook route lands outside our auth/CSRF middleware group, and that the package's event names map onto our internal event bus without renaming churn. Sequencing note: if we are mid-upgrade to Laravel 12, take 2.10.0 in the same window rather than as a separate change — it is a low-risk bump best batched with the framework move.
Sequencing:
Maintenance: Low day-to-day, moderate in aggregate. The package is thin and MIT-licensed; the real upkeep is Paddle API drift and webhook schema changes. Budget roughly a few days per quarter for version bumps and a standing "fork if abandoned" decision. Vendor the dependency (no auto-merge of major bumps) and keep our billing domain layer package-agnostic. 2.10.0 is mildly reassuring on the maintenance axis — a same-cycle Laravel 12 compatibility release is what a healthy wrapper looks like. Treat it as one data point, not a trend; the release contains no functional change and does not reduce the underlying API-drift or abandonment risk.
Support: Community-only — GitHub issues, single maintainer, no SLA. Escalation path for payment outages is Paddle's own support, not the package's. We must own the on-call story: alerting on webhook failure rate and on subscriptions stuck in a non-terminal state for >N hours. No change in support posture; an external compatibility contributor is not a support commitment.
Scaling: Checkout and webhook volume are modest for typical SaaS; the package itself is stateless. Watch (a) queue depth during promotions, (b) growth of receipt/subscription tables without pruning, (c) DB write contention if webhooks are processed synchronously — they must be queued. Paddle's API rate limits, not Laravel, become the ceiling at high volume. No scaling-relevant changes in 2.10.0.
Failure modes to design for:
Ramp-up: One backend engineer can be productive in under a week given Laravel familiarity; the learning curve is Paddle's domain model (prices, transactions, subscription lifecycle, proration) rather than the package. Plan for a second engineer to review the webhook path — that is where the money is, and it should never be single-owner.
Assessment of 2.10.0: Worth taking, not worth re-deciding on. It is a one-line compatibility release that clears our most likely install blocker and confirms the package is still maintained through the current Laravel cycle. It changes nothing about the ranked risks that actually gate approval — API generation, first-party overlap, webhook correctness, and bus factor all stand. Recommendation: adopt ^2.10, batch it into the Laravel 12 upgrade window, and keep the decision review focused on the unanswered key questions above.
How can I help you explore Laravel packages today?