overtrue/laravel-sendcloud
A Laravel integration for the SendCloud email delivery service, providing a simple facade and configuration to send transactional and template emails through SendCloud's API. It wraps the SendCloud PHP SDK so you can fire off mail from any Laravel app with minimal setup.
Scope and positioning: overtrue/laravel-sendcloud 2.0.0 is a Laravel service-provider wrapper around the overtrue/sendcloud SDK — API bindings, explicitly not a Laravel Mail transport. The value is low-ceremony container wiring (auto-discovery, sendcloud alias, services.sendcloud config, facade) for direct SendCloud API calls. Confirm the business use case before adoption: if the requirement is "send transactional email via SendCloud," this package does not satisfy it.
Architecture fit:
Integration feasibility: Package wiring itself is small. The real cost is the platform jump — the version floor, not the code, drives the effort estimate.
Technical risk:
/apiv2/. These fail at runtime, not at compile time.upload() or multipart options must be used instead.Key questions:
overtrue/sendcloud ^2.0 alongside this package?Stack fit: PHP 8.3–8.5, Laravel 13.30+, Composer 2 with advisory blocking enabled, Guzzle 7.15.2+. Fits a modern Laravel monolith or modular service. Integration is code-level — inject the client or use the facade and call SDK methods directly.
Migration path (two projects, not one):
composer show across repos for laravel/framework, php, overtrue/laravel-sendcloud, overtrue/sendcloud, guzzlehttp/guzzle. Produce a blocked-services list; that list is the business case for the framework upgrade.overtrue/sendcloud ^2.0 and Guzzle 7.15.2+ in the same commit as overtrue/laravel-sendcloud ^2.0. Never mix 1.x package with 2.x SDK.upload()/multipart options.services.sendcloud keys and env vars; confirm credential precedence now favors configured values and that no runtime override is silently shadowed./apiv2/ path handling, redirect behavior, and error responses against a real SendCloud test account.Compatibility notes: pin ^2.0 on both package and SDK. Runtime config mutation does not propagate to existing or cached clients — per-tenant credential switching requires explicit facade/container reset, or a design that resolves a fresh client per tenant. If a service relies on redirects, they must remain same-origin and HTTPS-preserving or calls will fail.
Sequencing: framework upgrade → SDK + package co-upgrade → middleware/multipart remediation → sandbox verification → staged rollout (one non-critical service, then canary, then fleet). Keep the 1.x branch pinned and deployable until canary passes.
Maintenance: Smaller surface than a Mail transport, but two coupled dependencies must move together, and advisory blocking means builds will fail on new CVEs in either. That is desirable but requires a named owner and an explicit patch SLA rather than ad-hoc firefighting.
Support: Single-maintainer OSS upstream, no vendor SLA, no LTS statement attached to this release. Plan for internal ownership or a maintained fork; SendCloud API-level escalations go to the vendor directly.
Scaling: Transient client per resolution — no shared connection pool across resolutions. Fine for typical volumes; high-throughput batch shipping jobs should resolve once per worker and reuse rather than resolving per call.
Failure modes to instrument:
/apiv2/ alter request targets for code that assumed stripping.Ramp-up: Low for a Laravel developer — the provider/facade/config shape is idiomatic and immediately recognizable. Moderate for on-call, because the failure modes are client-lifetime and configuration-propagation issues that never reproduce locally. Add a startup assertion that the resolved client carries the expected base URI and credentials, and a runbook entry covering redirect and credential-precedence failures.
Recommendation: Adopt 2.0.0 only after the Laravel 13.30 / PHP 8.3 platform upgrade is delivered. Until then, pin 1.x, confirm it is still receiving security fixes, and treat 2.0.0 as a milestone on the platform roadmap rather than a routine dependency update.
How can I help you explore Laravel packages today?