spatie/laravel-float-sdk
A Laravel-friendly SDK for the Float.com API v3, with config publishing, API token and user-agent setup, and a FloatClient for interacting with the API. Not a full Float API implementation, but extensible via PRs.
Architecture fit
The package is a thin, Laravel-native read client over the Float.com API v3 — not an integration platform. It provides:
FloatClient (named to dodge PHP's float reserved word) injectable into controllers, jobs, and services.users(), projects(), projectTasks(), clients(), allocations(), timeOff(), publicHolidays().GetUsersParams, GetProjectsParams, GetAllocationsParams, etc.) covering pagination (page, perPage default 50, sort), sparse fieldsets (fields), and relationship expansion (expand).FLOAT_API_TOKEN, FLOAT_USER_AGENT) plus a publishable float-sdk-config file.It fits a specific posture: Float remains the system of record for resourcing, and we build delivery-ops surfaces (utilization/capacity dashboards, allocation-vs-time-off conflict views, client and project rollups, holiday-aware scheduling) on top of it. It does not fit any requirement to push data into Float (create allocations, log time, submit expenses) or to react to Float events — there is no write surface and no webhook support documented. Those are separate scopes, and a roadmap item that depends on them should not be planned against this package.
The underlying HTTP layer is Saloon (introduced in 0.0.1), which is a meaningful architectural positive: if we need an endpoint the package doesn't expose, we can add a Saloon request class rather than re-architecting, and the connector/auth pattern is one our team already encounters in Laravel codebases.
Integration feasibility
Genuinely low effort on the happy path. composer require, two env vars, optional vendor:publish, then constructor injection. A developer can produce a working "list active projects with client expanded" call in under an hour. Rough order of magnitude for a first read-only integration: days, not weeks — and most of that is deciding what to build with the data, not wiring the client.
The honest framing for a build-vs-buy discussion: a competent Laravel developer could hand-roll this same read wrapper against Float v3 in roughly comparable effort. The package's value is not owning the plumbing and inheriting upstream fixes (e.g., the 1.0.1 correction to single-allocation response parsing), not unlocking a capability we couldn't otherwise reach. That is a real but small decision.
Technical risk
Key questions
.env is fine for one app; it becomes a governance question if multiple services share it.Stack fit
Near-perfect for a Laravel-first team. Composer install, .env configuration, container-resolved client, Laravel-idiomatic parameter objects. No queue, cache, or database assumptions imposed — we choose those. The FloatClient injection pattern composes cleanly with the layers we already use: a service class per domain (capacity, utilization) wrapping the client, controllers or Livewire/Inertia pages consuming the services, scheduled commands for snapshot jobs.
The package does not impose a persistence model. That is the right call for an SDK and the right call for us: we should treat Float as the source of truth and decide deliberately whether to cache responses, persist daily snapshots for trend analysis, or query live each time.
Migration path
There is no migration in the data sense — nothing to move off. The migration is code-level, and it only applies if we already have bespoke Float HTTP calls:
float.com, any existing Saloon connectors, any Http:: calls to the Float host).If we have no existing Float integration, this is a greenfield adoption — even simpler.
Compatibility
composer.json constraints before planning an upgrade window.Sequencing
all().Maintenance
Low baseline, with a real tail risk. The package itself needs nothing — no migrations, no config drift, no scheduled tasks. Maintenance cost is concentrated in two places: keeping composer.json constraints current as we move Laravel majors, and filling endpoint gaps as consumers expand. Budget a modest ongoing allocation (a few days per year) plus incremental effort per new endpoint, not a dedicated owner.
The version surface is small and semver-respecting (0.0.x → 1.0.0 → 2.x with a framework-support release), which is a good sign for predictable upgrades. Pin to a caret range and let Renovate/Dependabot surface updates.
Support
No commercial support. Spatie's OSS is community-maintained via GitHub issues and PRs; response times are best-effort. The pragmatic position: we support it ourselves. Keep the fork-or-vendor option warm — MIT license, one composer package, small codebase. If upstream goes quiet and we need an endpoint, we add a Saloon request locally. This is not a "we're blocked" scenario; it's a "we now own 200 lines" scenario.
Document internally: where the token lives, who rotates it, which endpoints we depend on, and where our extensions live. That document is the actual support contract.
Scaling
Two dimensions to plan for:
perPage is 50, and the SDK does not appear to auto-iterate pages. Any bulk operation — pulling a year of allocations across all projects, or a full user roster — becomes a manual pagination loop. Naive implementations will produce N sequential round-trips and slow page loads. Wrap bulk reads in queued jobs, cache results with a sensible TTL, and honor Float's rate limits (verify the concrete numbers against Float's docs; they are not in this README).For dashboards read on every page load, plan for a cache or a scheduled snapshot table from the start rather than retrofitting it after the first latency complaint.
Failure modes
Ramp-up
Hours for a Laravel developer already comfortable with dependency injection and Saloon; a day or two for someone unfamiliar with Saloon to read the request/connector pattern. The README is complete enough to work from for the seven covered groups, and the parameter objects are self-documenting at the call site. Onboarding risk is low, and the knowledge is transferable — what the team learns here applies to every other Saloon-based integration in the codebase.
The real ramp-up cost is domain, not technical: someone needs to understand Float's data model (how allocations, project tasks, and time off actually relate) before any capacity or utilization surface is worth building. Budget for that, not for learning the SDK.
How can I help you explore Laravel packages today?