moovly/recurly
A Laravel/PHP package for integrating Recurly subscription billing into your application. It provides convenient access to Recurly API functionality for managing accounts, subscriptions, plans, invoices, and related billing data within your Laravel projects.
Architecture fit
moovly/recurly occupies a single, well-understood slot in a Laravel codebase: an infrastructure-layer HTTP/SDK adapter that talks to Recurly's REST API. It is a vendor-namespaced repackaging (or fork) of Recurly's PHP client, not a Laravel billing abstraction. There is no service provider, config publishing, facade, or queue-aware webhook handling described, and no Cashier-equivalent exists for Recurly — so whichever client we pick, we own the domain wrapper (BillingService, SubscriptionRepository, webhook consumer).
From a TPM standpoint, that reframes the decision: architecture fit is neutral and non-differentiating. Any Recurly PHP client sits in the same slot behind the same adapter. The real decision is supplier selection for that slot, and the correct default is Recurly's own recurly/recurly-client. This package is glue, not leverage — it does not unlock roadmap capability, it only changes how cheaply we wire up capability we've already decided to buy from Recurly.
Integration feasibility
Technically trivial (composer require), strategically questionable. Zero stars, zero dependents, score 0 is a strong negative signal: no public adoption, no discoverability, no evidence of maintenance. The most likely origin is an internal Moovly fork that surfaced on a public index, or an abandoned personal publication. Either way we cannot treat it as a dependency we consume; we'd be adopting source code.
Feasibility depends entirely on an answer we don't yet have: what does this fork change relative to upstream? A fork of a payment SDK is only justifiable if it carries a documented patch that upstream refused or hasn't shipped, or pins an API version we specifically need. Absent that, the fork is pure liability with no offsetting benefit.
Technical risk
Accept headers; an unpinned or outdated version can change behavior silently when Recurly moves defaults.Key questions
recurly/recurly-client?Verdict to carry into planning: conditional reject. Budget it as a 1–2 day audit task, not a delivery task. Default to upstream.
Stack fit
Framework-agnostic PHP SDK; all Laravel ergonomics are our work regardless of supplier. Recommended shape: package → thin RecurlyClientInterface adapter → BillingService domain API → controllers/jobs. Nothing outside the adapter imports package classes. This is the single most important mitigation, because it makes the supplier decision reversible at low cost and decouples roadmap delivery from the audit outcome.
Migration path
composer.json, check license, scan for network calls or telemetry beyond Recurly endpoints.recurly/recurly-client directly. If a patch is genuinely needed, carry it as a cweagans/composer-patches patch rather than a whole forked SDK — far cheaper to own.Compatibility
Confirm PHP constraint, Guzzle major, PSR-7/18 implementations, and any symfony/* ranges against our Laravel release. Expect no auto-discovery; if a service provider ships, verify it doesn't register conflicting bindings. Verify the Recurly API version header is explicit and pinned.
Sequencing
Do not let roadmap pressure invert this. Billing integration work is a dependency chain; starting feature development before Gate 1 clears converts a 2-day audit risk into a multi-week rework risk.
Maintenance
Effectively fork-and-own. Budget 2–5 engineer-days annually for dependency bumps plus unbudgeted incident time when a breaking change lands. Every app-wide PHP/Guzzle upgrade becomes a manual verification of an unmaintained payment SDK — that recurring tax is the true cost of "free."
Support
No vendor support: Recurly supports their API, not third-party wrappers. No community: zero dependents means no issue history, no Stack Overflow corpus, no one to escalate to. First-line debugging requires reading SDK source. Escalation path terminates internally.
Scaling
The client is not the bottleneck; Recurly is. Real constraints are Recurly's per-endpoint rate limits (429s) and webhook throughput. Require exponential backoff with jitter, idempotency keys on all mutating calls, and a queue-backed webhook consumer. If the package doesn't expose configurable timeouts and retry hooks, we wrap or fork it — which is precisely the maintenance burden we're trying to avoid, and should be costed as such in the build/buy comparison.
Failure modes
Ramp-up
Low code volume, high cognitive overhead: no docs beyond the repo, so engineers read source. Estimate 1–2 days for a strong Laravel engineer to be productive against the adapter, plus the audit time. The adapter interface substantially reduces this — new engineers learn our BillingService, not the SDK — which is another reason to invest in the wrapper before evaluating the supplier.
TPM summary: plan the audit as a 2-day spike with a hard decision gate; pre-commit to upstream Recurly unless the fork carries a documented, still-needed patch; and fund the adapter regardless, because it is the only thing that keeps the supplier question cheap to revisit.
How can I help you explore Laravel packages today?