laravel-notification-channels/turbosms
A Laravel notification channel for sending SMS messages through TurboSMS. Integrate TurboSMS with Laravel notifications and deliver SMS using a simple, familiar channel API.
Architecture fit. Unchanged. The package follows the canonical laravel-notification-channels pattern: an auto-discovered service provider, a publishable config file, a TurboSmsChannel implementing send(), and a TurboSmsMessage value object. It is a thin translation layer between Laravel's Notification/via() dispatch model and the TurboSMS HTTP API. If the application already dispatches multi-channel notifications (mail, push, Slack), this drops into the same mental model with one new toTurboSms() method per notification class. No architectural change is induced beyond that — which is exactly what you want from a channel adapter. Critically, 1.1.1 contains no architectural or behavioral changes: it is a dependency-constraint update only.
Integration feasibility. Mechanically trivial and now marginally de-risked: composer require, publish config, set credentials in .env, add the channel to a notification's via() array. Realistic effort for a production-quality first message (including tests and a staging send) remains 0.5–2 engineer-days. The unknowns are still not "can we wire it up" but "what does it not cover" — API version, error surface, delivery callbacks — and 1.1.1 does not close any of those questions. Treat the integration effort estimate as unchanged and the discovery spike as still mandatory.
Technical risk. Reduced, but not resolved. 1.1.1 adds Laravel 11 (PR #10) and Laravel 12 (PR #12) support, with two separate external contributors merged. That is meaningful evidence against the abandonment vector: the package is tracking framework majors, and the maintainer is accepting community PRs. However:
composer update. It is a low-risk change in practice, but it argues for pinning exact versions and letting CI decide when constraints move.Key questions.
429/backoff?MammutAlex, gvital3230) plus the maintainer; still no stated SLA or succession plan.Stack fit. Now Laravel 11–12 with confidence, with Laravel 9–10 presumed supported from the 1.1.0 line (verify in composer.json before relying on it). Fits a standard app that dispatches SMS through queued notifications (ShouldQueue) — SMS should never be sent inline in a request cycle. No infrastructure requirements beyond outbound HTTPS to the TurboSMS endpoint; if the platform has restricted egress, that host must be allowlisted and the proxy configured on the Guzzle client.
Migration path. Unchanged. If SMS is currently sent via ad-hoc Guzzle calls or a hand-rolled wrapper, introduce an internal SmsSender contract first, move call sites onto Notification classes, and then treat this package as one implementation behind that contract. Migration cost is low because the package owns only the dispatch path — not templates, not storage, not consent records. The 1.1.1 framework bump does not alter this; it only means the adapter clears the current upgrade gate.
Compatibility. Verify illuminate/support and guzzlehttp/guzzle constraints against the app's lockfile before committing — and re-verify after any framework upgrade, since that is precisely the axis this release moved. Confirm package discovery registers cleanly, and check for config-key collisions with any existing TurboSMS SDK or custom config. Confirm there is no signature clash if another SMS SDK is already installed.
Sequencing.
Maintenance. Pin an exact version and treat upgrades as deliberate events rather than composer update side effects — reinforced by 1.1.1, where a patch bump carried framework-support changes. Budget roughly 1–2 days per quarter for upstream review. The fork policy remains necessary but is now a lower-probability path: the maintainer is merging external PRs, so the runbook should read "raise a PR upstream first, fork only if it stalls past one minor cycle." Retain a contract test suite with a mocked HTTP layer regardless — it converts a silent breakage into a red build on the Laravel upgrade PR, and it is what makes the fork/rebase option cheap.
Support. Community-only, no vendor SLA. Ownership is now visibly distributed across the maintainer plus two contributors, which is healthier than the prior single-maintainer read but still not a commitment. Internal ownership must remain explicit — assign a code owner. First-line support is an on-call engineer reading the source, which is only viable because the source is small enough to read in twenty minutes; keep it that way and resist patching it into something larger. Escalate delivery-side issues (sender registration, carrier filtering, blocked traffic) to TurboSMS support, not the package repo.
Scaling. Unchanged. Throughput is bounded by the TurboSMS account tier, provider rate limits, and queue worker concurrency — not by the package, which is stateless and issues one HTTP call per message with no pool to tune. The scaling variable that actually bites is segmentation: a template edit that pushes a Cyrillic message past 70 characters doubles unit cost and can split mid-word. Treat per-segment cost and character budget as a reviewed configuration, not an implementation detail.
Failure modes.
Ramp-up. Individual developer onboarding is under an hour — it is a textbook notification channel. Team-level readiness is the real cost: a short runbook covering credential storage and rotation, sender-ID registration, the fallback trigger, the canary check, and the fork procedure. Net assessment: integration risk low, operational risk medium (down from medium-high), and almost entirely reducible by treating the package as a replaceable adapter rather than a load-bearing dependency.
How can I help you explore Laravel packages today?