picqer/sendcloud-php-client
A PHP client for the SendCloud API that helps you create shipments, generate labels, manage parcels and returns, and integrate SendCloud shipping into PHP or Laravel applications.
Architecture fit
picqer/sendcloud-php-client is a framework-agnostic PHP SDK, not a Laravel package. There is no service provider, facade, config stub, or publishable assets. That is the correct trade-off for a vendor SDK (it serves Symfony, plain PHP, and legacy apps), but it means the integration layer is our code, not theirs.Integration feasibility
composer require, bind a configured client as a singleton, wrap in an adapter. A mid-level engineer can produce a working label-creation path in 1–2 days.Order/Shipment models.Http::fake() will not intercept calls unless we inject a mock handler or put our own interface in front of it. Plan the interface first, or we will end up with untestable shipping code.Technical risk
Key questions for the maintainer / SendCloud
429/Retry-After in a typed way?Stack fit
ShippingProviderInterface (create label, void label, fetch rates, get tracking) in our domain layer, implement SendCloudProvider using this client. This is what makes the vendor choice reversible.config/services.php with credentials in the secret manager, never in .env committed to the repo. Bind the client as a scoped or singleton service; scoped is safer if we ever introduce per-tenant credentials.shipments table carrying provider, provider_reference, tracking_number, label_disk_path, status, carrier, service_point_id. Do not rely on re-querying SendCloud to render customer-facing tracking.Migration path
tracking_number and carrier normalised into the new schema so customer-facing order pages do not regress on day one.Compatibility
Sequencing
Maintenance
Support
Scaling
429s and partial batches.Failure modes to instrument explicitly
401 after credential rotation — alert on auth failures separately from general errors; they are an outage, not a blip.429 throttling — requires backoff and queue depth alerts, otherwise labels silently stop.Ramp-up
Recommendation Adopt, with conditions: pin the version, invert the dependency behind our own interface, confirm the API-version sunset timeline and idempotency behaviour before writing retry logic, and accept that this package is a leg up rather than a solution — the durable asset we build is the adapter, not the dependency.
How can I help you explore Laravel packages today?