Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Paddle Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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):

  1. API-generation ambiguity. Paddle Classic is being retired in favor of Paddle Billing. Before committing, confirm which API the pinned version targets and that it is Billing-only; a Classic-era wrapper is a dead end regardless of release date. 2.10.0 does not address this — it is a framework-compatibility release only, so this remains the gating question.
  2. First-party overlap. Laravel ships 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.
  3. Adoption signal is weak. ~200 stars, zero dependents, and a mid-range package score. That is not disqualifying, but it means we are early adopters and should budget for reading the source rather than the docs.
  4. Bus factor. Effectively a single-maintainer package under the Protonemedia umbrella. Acceptable under MIT (we can fork and patch), but we should treat the code as vendorable. 2.10.0 was contributed by an external collaborator (laravel-shift), not the maintainer — a positive sign that the project is still visible enough to attract help, but it is a single compatibility PR, not evidence of shared ownership or a succession plan.
  5. Webhook correctness. Payment state lives behind an unauthenticated endpoint. Signature verification, idempotency on replay, and ordering guarantees are the highest-severity failure surface in the whole integration. Unchanged in 2.10.0.

Key questions to answer before approval:

  • Which Paddle API generation and which package major version are we pinning, and what is the upgrade path when Paddle ships breaking changes?
  • Does the package implement idempotent webhook processing, or is that on us?
  • What is our entitlement source of truth — Paddle state polled/cached, or our own subscription table synced by webhooks?
  • Why this over laravel/cashier-paddle? Document the answer.
  • Who owns patching if upstream goes quiet for 12 months?
  • New: Does the 2.10.0 compatibility patch cover the full test suite on Laravel 12, or only the dependency constraint? A widened illuminate/* range with untested framework code is a weaker signal than it appears — verify CI runs against 12.x before relying on it.

Integration Approach

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:

  • Greenfield billing: adopt directly; keep our domain layer (plans, entitlements, feature gates) independent of the package so the vendor is swappable.
  • From Stripe/bespoke: model plans and prices in Paddle first, then dual-write entitlement checks behind a feature flag; migrate existing subscribers at renewal rather than by forced card re-entry where possible.
  • From 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:

  1. Spike (3–5 days): sandbox credentials, one product/price, checkout + one webhook round-trip, confirm API generation and Laravel 12 support on our runtime. Kill criterion if any of these fail. 2.10.0 shortens this step — the framework-compatibility check is now a formality on 12.x rather than a risk.
  2. Design: canonical plan/price map, entitlement model, webhook idempotency store, refund/chargeback policy.
  3. Build: config + migrations, checkout flow, webhook handler (queued, signature-verified, idempotent), subscription lifecycle jobs, admin visibility.
  4. Harden: replay/out-of-order webhook tests, sandbox end-to-end with test cards, load test on webhook throughput, runbook.
  5. Rollout: internal dogfood → 5% of new signups → full. Keep a manual reconciliation path throughout.

Operational Impact

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:

  • Missed or delayed webhooks → stale entitlements. Mitigate with a scheduled reconciliation job against Paddle, not webhooks alone.
  • Duplicate/replayed webhooks → double-granted access or double-counted revenue. Require idempotency keys on event IDs.
  • Out-of-order delivery → subscription downgraded after upgrade. Compare event timestamps, not arrival order.
  • Signature secret rotation / sandbox-vs-production mismatch → silent 403s on every event. Alert on non-2xx webhook responses.
  • Package abandonment → no security patches. Fork-and-own contingency documented up front.
  • Framework skew → the package's Laravel 12 constraint and our runtime drift apart during a future upgrade. Mitigate by pinning the minor version and treating minor bumps as scheduled, tested work rather than auto-merged dependency noise.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
uni-method/symfony-lib
tacticmedia/scim-server-bundle
neika-ai/symfony-bundle
mattleads/agent-publishing-bundle
glavweb/framework-bundle
glavweb/extra-bundle
glavweb/api-bundle
glavweb/admin-bundle
adachsoft/api-version-bundle
elsayed85/laravel-api-exceptions
ouhssini/laravel-demo-mode
daworks/ncloud-outbound-mailer-driver
gp247/cms
ignibyte/aic-gates
nexa-merchant/blog
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
cgv/localized-resource