laravel-notification-channels/jet-sms
Jet SMS notification channel for Laravel. Send SMS messages through the Jet SMS API using Laravel’s notification system, with a simple channel integration for direct or queued notifications.
Architecture fit. The package is a single-purpose Laravel notification channel driver: it registers a JetSmsChannel that implements Laravel's channel contract, binds a service provider via package auto-discovery, and exposes a toJetSms() method on notification classes plus a routeNotificationForJetSms() hook on the notifiable. That is the correct, idiomatic extension point — it composes with Notification::send(), queues, and existing multi-channel fan-out without touching our domain code. If the platform is already on Laravel Notifications, the architectural fit is high and the change is additive. If we are not on Notifications, this package is unusable and we would be paying adapter cost for nothing.
Integration feasibility. Favorably small: MIT license, one channel class, one service provider, one config file, one HTTP client dependency. No database migrations, no published assets, no event hooks. Integration work is dominated by (a) Composer constraint surgery and (b) credential/API verification, not by code comprehension.
Technical risk. The dominant risk is abandonment, not design.
| Risk | Signal | Impact |
|---|---|---|
| Unmaintained | Last release 2020-03-07; ~5 years stale | No Laravel 10/11 or PHP 8.2+ fixes; we own the fork |
| Unvalidated | 9 stars, 0 dependents, score ~0.60 | No production battle-testing to borrow; bugs are ours to find |
| Framework drift | 2020-era composer.json targets Laravel 5.5–7 / PHP 7.x |
Likely hard-blocked install on modern Laravel; needs constraint bump and deprecation fixes |
| Vendor lock-in | JetSMS is a Turkey-focused SMS aggregator | Regional reach only; migrating later means rewriting the channel |
| Transport opacity | Channel implementations of this vintage typically call Guzzle directly rather than Laravel's Http client |
Loses Http::fake() testability and centralized retry/timeout policy |
| Scope gaps | Delivery receipts, webhooks, templated/unicode messaging likely out of scope | Cannot confirm delivery; silent failure detection must be built by us |
Key questions to resolve before commitment.
config/jet-sms.php still live?Stack fit. Requires Laravel with the Notifications component. Works cleanly as one channel among many (mail, database, sms) — recommend treating SMS as an additional channel on existing notifications rather than a parallel sending path.
Migration path — three viable options:
| Option | Effort | When to choose |
|---|---|---|
| A. Install as-is | Hours | Legacy app already on Laravel ≤7 and PHP 7.x; zero code changes |
| B. Fork and modernize | 2–5 days | App on Laravel 10/11; bump constraints, replace Guzzle calls with Http, add PHPUnit + Http::fake() coverage, cut a tagged internal release |
| C. Reimplement in-house | 2–3 days | We want vendor-swappable SMS abstraction anyway; ~150 LOC behind an interface |
For a modern Laravel codebase, B or C is the realistic path — option A is only available if we happen to be on a matching legacy version. If SMS is likely to expand beyond one Turkish provider, C is cheaper long-term because it forces an interface boundary we control.
Compatibility. Verify on a throwaway branch before any estimate is committed: composer require against the actual composer.json, then a smoke test through Notification::fake()/Http::fake(). Do not trust the 2020 constraints as a proxy for compatibility.
Sequencing.
SmsSender interface regardless so the vendor is swappable.Maintenance. Assume full ownership from day one: no upstream commits since 2020 means we are the maintainers. Budget a small recurring allowance for PHP/Laravel upgrade breaks and vendor API drift; the codebase is small enough that this is hours per year, not weeks — but it is non-zero and must have a named owner. The abandoned-dependency surface is genuinely low risk (no auth, no DB, no file I/O), so the security exposure is limited to the HTTP client dependency, which Composer will manage independently.
Support. The laravel-notification-channels org is community-run with no SLA; GitHub issues on a 9-star repo should be assumed unanswered. Vendor support for JetSMS is a separate commercial relationship and must be contracted directly — do not conflate "package works" with "we have SMS support."
Scaling. Throughput is bounded by the vendor's rate limits and our queue workers, not by the package. Send via queued notifications and set an explicit queue + tries/backoff policy; a synchronous send inside a web request will couple user-facing latency to a third-party API in another region. Per-message cost and vendor-side batching are commercial levers, not code levers. No horizontal-scaling concerns on our side — the channel is stateless.
Failure modes to instrument explicitly:
| Failure | Current behavior (expected) | Mitigation we must add |
|---|---|---|
| Vendor 5xx / timeout | Exception thrown from queue job | Retry policy + alert on repeated failures |
| Silent rejection (bad number, unregistered sender ID) | Likely returns 200 with vendor error body | Parse and log response body; assert on success codes |
| Credential expiry/rotation | All sends fail at once | Config-driven credentials, health-check notification |
| No delivery receipt | Fire-and-forget | Do not promise delivery SLAs; add vendor DLR polling if available |
| Rate-limit exhaustion | Errors under burst | Queue throttling, per-tenant quotas |
Ramp-up. Low: a competent Laravel engineer reads the whole package in under an hour. The real ramp-up cost is domain knowledge — Turkish sender-ID regulation, vendor dashboard, and message encoding (GSM-7 vs. UCS-2 affects segment count and cost) — which lives with the vendor, not the code.
Recommendation. Proceed only if JetSMS is a confirmed commercial requirement for a Turkish market. In that case, treat this package as reference source, not a dependency: fork it, add HTTP faking and failure-path tests, and place it behind an internal SMS interface. If JetSMS is not contractually required, the 2020 last-release date and zero dependents make this a poor default choice against an actively maintained multi-provider SMS abstraction.
How can I help you explore Laravel packages today?