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

jeffersongoncalves/laravel-paddle

Laravel Paddle provides a clean integration for Paddle billing in Laravel applications, simplifying subscriptions, payments, checkout flows, webhooks, and API configuration through familiar Laravel conventions.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Thin, resource-oriented SDK over the Paddle Billing API v1 — the right shape for a Laravel package: service provider + config publish + facade/DI bindings, no opinionated domain model forced on the application.
  • Resource coverage (products, prices, customers, subscriptions, transactions, discounts, adjustments, events, notifications) maps to the full Billing object graph, which means the package can serve both simple one-off checkout and full subscription lifecycle work without a second dependency.
  • The explicit PaddleException with Paddle's error body and machine-readable error_code is the most valuable architectural detail: it lets us branch on Paddle semantics (e.g. card declined vs. auth failure vs. validation) rather than string-matching or catching generic HTTP errors. It also makes our own error taxonomy and observability instrumentation straightforward.
  • Webhook verification being in-scope (HMAC-SHA256 over the raw body with a replay window) means we do not have to hand-roll signature checking or carry a middleware fork — a common source of security defects in-house integrations.

Integration feasibility

  • Low ceremony to get to a first successful call: composer require, publish config, set API key + PADDLE_SANDBOX, done. Sandbox support via a single env flag removes the usual "two config trees" problem and makes CI/staging parity cheap.
  • Webhook endpoint requires CSRF exemption and raw-body access; both are standard Laravel patterns but must be sequenced correctly or signature verification fails in a way that looks like a Paddle outage.
  • Main feasibility gap: nothing in the notes about test doubles, HTTP fakes, or contract tests. Laravel's Http::fake() will likely work if the package uses the HTTP client, but that is an assumption we must verify before committing to a test strategy.

Technical risk

  • This is a 1.0.0 with no prior 0.x lineage. A major-version number implies a stability and backwards-compatibility commitment that an initial release has not yet earned. We should treat it as functionally mature but operationally unproven.
  • No stated position on idempotency keys for outbound writes, retry/backoff on 429/5xx, or rate-limit awareness. Payment APIs demand all three; if the package is silent, we own that logic at the call site.
  • Replay-window verification depends on server clock accuracy and on our handlers being idempotent. The package can reject replays but cannot make our side effects idempotent — that remains our responsibility and is the highest-severity failure mode.
  • "Laravel 12 / 13" — Laravel 13 is a forward-looking claim. Unverifiable today; do not let it into a support matrix until a stable release exists.
  • Unclear maintainership signal: single release, no mention of changelog discipline, deprecation policy, or security reporting channel.

Key questions

  1. Overlap with Laravel Cashier Paddle — when do we use this SDK directly versus Cashier's opinionated subscription layer? Mixing both against the same Paddle account risks divergent local state.
  2. Does the package support idempotency keys, retries, and rate-limit handling, and are they configurable?
  3. Does it expose a test fake / HTTP-level abstraction, and what is the recommended testing pattern?
  4. What is the maintainer's backwards-compatibility and security-disclosure policy, and is there a published upgrade path from 0.x (if any)?
  5. How are webhook events exposed — typed event classes dispatched onto Laravel's queue, or raw payloads?
  6. Is the replay window configurable, and is it validated against a documented tolerance?

Integration Approach

Stack fit

  • Fits our Laravel/PHP 8.2+ baseline cleanly. No framework version conflict expected for Laravel 10/11 if the constraint is genuinely ^12|^13 we must confirm — the stated support may exclude our current LTS, which would be a blocker rather than a nicety.
  • Paddle Billing is the strategic API; adopting a Billing-native SDK avoids the Paddle Classic dead end and any legacy webhook/IPN translation layer.

Migration path

  • Greenfield billing: adopt directly, no migration surface.
  • From Cashier Paddle (Billing): do not rip out. Cashier's value is the local subscription state machine and migrations; this package is transport plus resources. Recommended path is to add the SDK alongside and use it for resource types Cashier does not model (discounts, adjustments, notifications), keeping Cashier as the subscription system of record.
  • From Paddle Classic: this is a genuine migration, not an SDK swap. Customer/subscription IDs do not carry over; plan a dual-write or cut-over window and a reconciliation job. Scope this as its own workstream, not as part of SDK adoption.
  • No prior assessment existed, so there is no assessment-level migration debt — but there is no proven upgrade path either. Pin the version exactly (1.0.0) rather than using ^1.0 for the first integration cycle.

Compatibility

  • Verify framework constraint against our actual Laravel version before anything else; the stated 12 / 13 support suggests a narrow window.
  • Confirm whether the HTTP layer uses Laravel's client (fakeable, middleware-friendly) or Guzzle directly — this determines whether we can reuse our existing retry/telemetry middleware.
  • Sandbox flag should be read at config-resolution time, not bootstrapped statically, or tests that toggle it per-case will be flaky.

Sequencing

  1. Spike: install, exercise sandbox for read-only resources, confirm HTTP client and fakeability.
  2. Land the webhook endpoint behind signature verification with idempotent handlers and a dead-letter path — before any write traffic.
  3. Integrate a single write path (e.g. one-off transaction) end to end in sandbox, including error-code branching via PaddleException.
  4. Expand to subscription lifecycle; only then evaluate whether Cashier remains necessary.
  5. Production with a single low-risk resource; keep the Classic migration out of this phase entirely.

Operational Impact

Maintenance

  • Thin SDKs are cheap to maintain if the vendor API is stable; Paddle Billing v1 is the current generation, so churn risk is moderate rather than high. Budget for an upgrade cycle per Paddle API version bump.
  • Pin the exact version and re-evaluate monthly for the first quarter. A 1.0.0 with no patch history has an unknown defect-discovery curve; early patch releases are likely.
  • Track webhook signature format changes as a hard dependency — a silent change there breaks all event ingestion at once.

Support

  • Support load concentrates in two places: webhook signature failures (clock skew, proxy body mutation, CSRF middleware) and Paddle error-code interpretation. Document both runbooks before launch.
  • PaddleException carrying the machine-readable code is what makes tier-1 triage possible without escalating to engineering — treat that as a first-class operational feature and map the codes we care about.
  • No stated security disclosure channel; ask for one, since we are depending on this package for payment webhook authentication.

Scaling

  • Most integrations will be low-volume (checkout + subscription events); the SDK itself is unlikely to be the bottleneck. Paddle's rate limits are the real ceiling, and without built-in backoff we must add it at the HTTP layer.
  • Webhook ingestion should go through a queue from day one. Synchronous handlers turn a slow downstream into Paddle-side retry storms and duplicate events.
  • Idempotency on our side is mandatory and does not scale automatically — dedupe keys must be persisted with a unique constraint, not held in cache.

Failure modes

  • Duplicate event delivery or replayed payloads producing double side effects (double provisioning, double credit). Highest severity, highest likelihood. Mitigate with persisted idempotency keys and a unique constraint on event ID.
  • Clock drift causing valid signatures to fail the replay window, presenting as a total webhook outage. Monitor signature-rejection rate as a first-class alert.
  • Unhandled 429/5xx from Paddle with no retry → silent lost writes. Alert on PaddleException rates by error code.
  • Sandbox flag misconfigured in production or vice versa — catastrophic in the sandbox-in-prod direction. Validate and assert the environment at boot.
  • Divergent local state if Cashier and this SDK both write subscription state; pick one system of record explicitly.

Ramp-up

  • Low for a Laravel developer: env + config + one resource call is under an hour. Realistic estimate of 2–4 days to a production-grade integration once webhook idempotency, retries, and error-code mapping are included — the SDK is the small part.
  • Require the first integrator to write the webhook runbook and the Paddle error-code map as deliverables, not side notes.
  • Given initial-release status, designate a single owner for the Paddle dependency and schedule a 30-day review with concrete metrics: signature-rejection rate, error-code distribution, retry volume, and any patches shipped upstream.
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.
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels
wazza/laravel-db-encryption
hokny/laravel-generator
vonsogt/backup
jengo/queues
jeremykenedy/laravel-observability
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums