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

Gocardless Laravel Package

omnipay/gocardless

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. Omnipay is a framework-agnostic PHP payment abstraction: a Gateway class exposing purchase(), authorize(), createMandate(), etc., returning Request/Response objects over a shared HTTP layer. omnipay/gocardless slots into that pattern as a thin driver, and in a Laravel context it would normally be bound through the container via a service provider (e.g. a PaymentGateway facade resolved from config) so controllers and jobs depend on an interface rather than the concrete gateway. That is architecturally sound in principle — the abstraction is the right shape for a Laravel app that may hold multiple providers — but the fit is only as good as the driver's alignment with the current GoCardless product surface. The package was last released in September 2015, which places it in the Omnipay 2.x era and against GoCardless's legacy API, not the GoCardless Pro REST API (customers / mandates / payments / subscriptions / webhooks) that GoCardless has since standardised on. Direct Debit is also a fundamentally different flow from card capture: mandate creation, redirect/authorisation, asynchronous settlement (BACS ~3 working days, SEPA ~4–6), and webhook-driven state transitions. A 2015-era driver almost certainly models none of that correctly today.

Integration feasibility. Low as-is. A 2015 Omnipay 2.x driver will pull in omnipay/common v2 and Guzzle 3.x, which do not run cleanly on PHP 8 and therefore conflict with Laravel 9/10/11's PHP floor. Getting it to boot would mean pinning an old PHP runtime, an old Laravel, or forking the driver — and even a successful fork still speaks to a retired endpoint. The realistic integration is not this package but the official gocardless/gocardless-pro SDK (actively maintained, PHP 7.3+/8.x, idempotency keys, webhook signature verification) wrapped in a small adapter that preserves the interface your application code was going to depend on anyway.

Technical risk. The dominant risk is not code quality but dead-end dependency: the underlying API generation is gone, so the failure is total rather than partial.

Risk Severity Notes
Upstream API retired/deprecated Critical Driver targets legacy GoCardless API; no working endpoint to test against
PHP/Laravel incompatibility High Omnipay 2.x + Guzzle 3 vs. PHP 8 / Laravel 9+
No releases since 2015 High No security patches, no PSR-7, no retries/backoff
Low adoption (15 stars, score 0.415) Medium Effectively no peer review, no community triage
Direct Debit domain gaps Medium Mandate lifecycle, webhooks, idempotency, scheme rules likely unmodelled
Licence None MIT — permissive, no legal blocker

Key questions.

  1. What is the actual business flow — one-off Direct Debit, recurring subscriptions, or mandate-only capture? Subscriptions change the integration materially.
  2. Is GoCardless already contracted, or is this a provider evaluation? If evaluating, the SDK choice is independent of this package.
  3. Which PHP/Laravel versions are in scope, and is there any hard constraint forcing an Omnipay-shaped interface (e.g. an existing multi-gateway abstraction)?
  4. Does the product need BACS (UK), SEPA (EU), or both, and who owns mandate/webhook state?
  5. Who absorbs the cost if the integration must be rebuilt in 6–12 months — is a throwaway spike acceptable?

Integration Approach

Stack fit. Treat Omnipay as an optional abstraction, not a requirement. In Laravel the clean shape is: a DirectDebitGateway contract in app/Contracts, a GoCardlessGateway implementation wrapping gocardless/gocardless-pro, config in config/services.php, credentials in .env, webhook handling in a dedicated route with signature verification and a queued listener. That gives you the same seam Omnipay would have provided, with a maintained transport underneath. If a multi-provider abstraction is genuinely needed later, league/omnipay (Omnipay 3) can be introduced then — but do not adopt it because of this package.

Migration path. If the legacy driver is already in the codebase: (1) inventory every call site and the flows behind them; (2) map each to the GoCardless Pro equivalent (customer → mandate → payment/subscription); (3) build the adapter behind the existing interface so call sites are untouched; (4) run in GoCardless sandbox against real webhook traffic; (5) cut over per-flow, not big-bang, since mandate state cannot be safely double-written. If this is greenfield, skip steps 1–3 and start from the SDK.

Compatibility. Validate explicitly: PHP version against the SDK's floor; Laravel's HTTP client and queue worker behaviour; timezone/date handling for settlement dates; currency and scheme constraints (GBP/BACS vs EUR/SEPA); and webhook replay protection. Confirm the sandbox supports the exact flows you need before committing — GoCardless's test environment differs from live in webhook timing.

Sequencing.

  1. Feasibility spike (1–2 days). Prove a mandate + payment round-trip in sandbox with the official SDK. This also settles the "is the legacy driver dead" question empirically.
  2. Interface design. Define the contract you actually need — do not mirror Omnipay's surface wholesale.
  3. Adapter + webhook handler. Signature verification, idempotency keys, queue-backed processing.
  4. Dual-run / shadow mode. New integration in sandbox, old path untouched.
  5. Cutover + decommission. Remove Omnipay dependencies and the pinned PHP constraint.

Operational Impact

Maintenance. The package is unmaintained; there is no path to a security or compatibility fix other than forking it yourself. That converts an OSS dependency into an owned asset with no upstream — an ongoing, unbudgeted cost. The official SDK inverts this: routine composer update, vendor-supported deprecations.

Support. No vendor relationship, no SLA, 15 stars means effectively no community. Any production incident traces to your team plus GoCardless support, and GoCardless support will not debug a third-party legacy driver. Escalation paths must be defined internally before launch.

Scaling. Direct Debit scales on webhook volume and settlement latency rather than request throughput, so the real scaling concerns are queue depth, idempotent webhook processing, and reconciliation against GoCardless's records. The legacy driver offers no retry/backoff or idempotency primitives, so any scale-out requires building that layer regardless. Rate limits sit with GoCardless and should be respected via queued jobs, not synchronous request paths.

Failure modes. Expect: hard failure against a retired endpoint (loud, easy to detect); silent state divergence between your records and GoCardless (mandate created but not persisted, payment settled but not reconciled — quiet, expensive); duplicate webhook processing without idempotency; and unhandled scheme rejections (insufficient funds, mandate cancelled, invalid account). Each needs an explicit detection path — webhook logs, daily reconciliation job, and alerting on unmatched settlements. The 2015 driver gives you none of these.

Ramp-up. The learning curve is the Direct Debit domain, not Omnipay: mandate lifecycle, authorisation redirects, BACS/SEPA settlement windows, webhook event ordering, and refund/chargeback semantics. Budget for one engineer to own that domain for 2–3 weeks including sandbox work. The Omnipay API itself is a half-day of reading — which is precisely why it is not where the risk or the value sits.

Recommendation. Do not adopt omnipay/gocardless for new work, and treat any existing usage as a technical-debt item with a defined removal date. Use gocardless/gocardless-pro behind a Laravel-owned interface. The 0.415 score and 2015 release date are consistent with a package whose useful life has ended; the decision to make is the migration timeline, not whether to use it.

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.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package