ptondereau/laravel-ups-api
Laravel package that wraps the UPS API, letting you easily add shipping rates, tracking, address validation, and label creation to your Laravel applications through a clean, configurable integration.
@mixin facade typing work reduces the cost of our integration work (fewer mixed types, real return types in PhpStorm, static analysis catches misuse in CI before deploy). This shifts effort from "debugging runtime payload errors" toward feature work — a modest but real velocity argument for prioritizing the integration.Adopt when:
@mixin facade annotations and level-10 analysis mean our static analysis actually understands facade calls instead of degrading to mixed — genuine day-to-day DX and a lower defect rate on integration code.Look elsewhere (or wrap it) when:
To executives (one paragraph): We need UPS shipping in the product — rates at checkout, labels, tracking. Rather than build and maintain that connection ourselves, we can adopt a small, actively maintained Laravel package that handles it. The new v5.0.0 release keeps it current with our target platform (Laravel 13 / PHP 8.5) and adds strict static analysis, which lowers the chance of shipping broken shipping code to production. Cost is effectively zero in licensing; the real cost is a scheduled upgrade tied to our Laravel 13 migration. Recommendation: pin to v4.x today, adopt v5 as part of the framework upgrade, and put our own thin interface in front of it so we're not locked to one carrier.
To engineering: v5.0.0 is a major — Laravel 13 and PHP 8.5 support, so it's a coordinated upgrade, not a drop-in. The wins are real: PHPStan at level 10 in the package's own CI, and facades now declare @mixin to their Ups\* root classes, so facade calls resolve to concrete return types instead of mixed in PHPStan and PhpStorm. That means our integration code gets real autocomplete and our CI catches misuse before runtime. Action items: (1) confirm the exact supported-version matrix before we commit — "adds Laravel 13 support" may or may not mean older versions were dropped, and that determines whether this is a hard blocker; (2) wrap facade calls behind our own ShippingClient interface so multi-carrier stays possible and a package stall doesn't become our outage; (3) add PHPStan to our own CI at the same time, otherwise we don't capture the typing benefit.
How can I help you explore Laravel packages today?