Architecture fit
Illuminate\Support\Facades\Http, which is the correct architectural direction: outbound calls now inherit Laravel's HTTP middleware, retry hooks, event dispatching, and — critically for us — Http::fake() testability instead of Guzzle mock handlers.CreateSsoToken work is not a feature, it is a survival requirement: AutoAuth was removed in WHMCS 8.1, so any application still depending on getAutoLoginUrl() / redirectAutoLogin() is coupled to a decommissioned upstream API surface. v2.0.0 is the only supported path for a modern WHMCS.rehashPasswordIfRequired() on the UserProvider contract confirms the package integrates at the auth-provider layer, not just as an API wrapper. That means it sits in the login path — high blast radius, and it should be treated as tier-1 infrastructure rather than a convenience library.Integration feasibility
WHMCS_TIMEOUT).Technical risk
user → whmcs_user) is the sneakiest risk. It is a silent behavioural change: users with existing sessions will lose their WHMCS linkage and appear logged out of the portal with no error. Any downstream code reading session('user') directly will break without a stack trace. This needs an explicit transition plan, not a default.E_USER_DEPRECATED. Usually benign, but strict error handlers and some observability configurations convert notices to exceptions. Verify handler configuration before shipping the compatibility path.Key questions
user session key directly, or persist it, rather than going through the package?WHMCS_TIMEOUT be per environment, and what is the user-facing fallback when the WHMCS call times out on the login path?sbGetClients() ordering/filtering ($orderby, $status, WHMCS 8.2+)? If so, that raises the minimum WHMCS version from 8.1 to 8.2.Stack fit
UserProvider implementation that plugs into the existing auth guards. No new infrastructure, no sidecar, no message broker — it is an HTTP client plus an auth adapter.Http facade means our existing outbound-HTTP observability (logging middleware, request IDs, Http::fake() in tests) applies with zero rework. That is a meaningful reduction in integration cost versus v1.x's raw Guzzle.Migration path
getAutoLoginUrl() → getSsoUrl(), redirectAutoLogin() → redirectSso(), WHMCS_URL must be https://, session key must be set explicitly to the legacy value (user) during transition, and WHMCS_TIMEOUT must be set per environment rather than relying on a library default.user and adopts the deprecated methods' replacements while keeping the old key readable; release 2 flips to whmcs_user after session TTLs have elapsed. Flipping everything at once produces a support-ticket spike that looks like an outage.Compatibility
sbGetClients() with $orderby / $status requires WHMCS 8.2+. Decide now whether we need it; if not, we keep optionality at 8.1 and reduce coupling.Sequencing
getAutoLoginUrl, redirectAutoLogin, and direct reads of the user session key.user, deprecation logging enabled so any missed call site surfaces.getSsoUrl() / createSsoToken() end-to-end against the real WHMCS instance, including token expiry and re-entry. Add Http::fake()-based contract tests so future releases do not silently change request shape.Maintenance
Support
E_USER_DEPRECATED output gives us a cheap "who is still calling the old methods" report — route it somewhere queryable rather than letting it scroll past.Scaling
sbGetClients() call is a synchronous dependency on the WHMCS instance. Horizontal scaling of the Laravel tier adds concurrent load to a system we do not control.WHMCS_TIMEOUT deliberately and set it low on the interactive login path. A generous default turns a WHMCS slowdown into a hung login page rather than a fast, understandable error.sbGetClients() with new $orderby / $status parameters may allow server-side narrowing, which is a scaling win if we currently pull and filter client-side. Confirm before assuming.Failure modes
rehashPasswordIfRequired() regression — sits in the credential path; a defect here locks users out rather than degrading a feature. Needs explicit regression coverage alongside the SSO tests.Ramp-up
How can I help you explore Laravel packages today?