laravel-notification-channels/sms77
Laravel notification channel for sms77 that sends SMS messages through the sms77 API using Laravel’s native notification system. Configure your API key and sender, then deliver transactional, alert, or verification texts via a simple channel class.
Architecture fit. laravel-notification-channels/sms77 is a thin driver package, not a platform. Its entire surface area is a Laravel notification channel class, a message value object, a service provider, and a config file that wraps the Seven (formerly sms77) HTTP API. That means it slots into an existing Laravel notification architecture with essentially zero architectural negotiation: any notifiable model or on-demand route can gain an sms77 channel by adding one entry to via() and one toSms77() method. The architectural question is not "does this fit" but "do we want a vendor-specific channel class threaded through our domain objects," which is a lock-in decision, not a technical one. v1.0.7 does not change this surface area at all — the release is a CI/dependency-hygiene bump with no runtime API changes, no new features, and no deprecations.
Integration feasibility. High and low-effort. Composer install, publish config, set SMS77_API_KEY and sender identity in env, add the channel to a notification. A competent Laravel engineer can have a working send in under an hour. The real integration work is around it: phone number normalization to E.164, queue configuration, failure handling, and abuse throttling — none of which the package provides, and none of which v1.0.7 adds. Note that the Laravel 13 bump in this release is a test-matrix/dev-dependency change (PHPUnit and laravel/framework in require-dev), so it signals upstream readiness rather than altering what the package does at runtime.
Technical risk. The dominant risk remains stewardship, but v1.0.7 is a mild positive revision to that picture: the maintainer merged an external contribution (PR #13) to add Laravel 13 coverage, so the project is not abandoned and is tracking framework releases rather than sitting static. That is the single most likely drift event for a package like this, and it has been addressed proactively. It does not, however, change the community-validation picture — still single-digit stars and no dependents, so edge cases (Guzzle/HTTP client conflicts, Seven API revisions) will still surface on your timeline first. Secondary risks: (1) the sms77 → Seven.io rebrand leaves historical endpoint and payload assumptions in the wrapper that may drift; (2) the release cadence is now confirmable as "low but alive" — one substantive compat release plus automated StyleCI fixes, which is exactly the maintenance floor you would expect for a few-hundred-line driver; (3) SMS channels remain fire-and-forget, with no delivery-receipt or webhook handling, so the deliverability blind spot is unchanged; (4) the provider is a German/EU gateway — data residency and DPA terms still need procurement review if recipient numbers or message bodies include PII.
Key questions.
composer.json constraint (e.g. illuminate/*: ^10|^11|^12|^13) and whether earlier Laravel versions were dropped — a narrowing constraint is the one way this "hygiene" release could bite us.Verdict. Adopt conditionally — usable, cheap, and low-complexity, with a slightly improved but still unproven stewardship profile. Justify it only behind an internal abstraction (see below) so the exit cost stays near zero. The v1.0.7 release does not change the verdict; it marginally de-risks the maintainer half of it.
Stack fit. Native. This is a first-party-shaped Laravel package conforming to Illuminate\Notifications\Notification conventions; it requires no bootstrapping beyond auto-discovery and no framework modification. It composes cleanly with queued notifications, Notifiable traits, and Notification::route() for on-demand recipients. v1.0.7 is a drop-in patch — no migration steps, no config republish, no code changes expected.
Update action for v1.0.7. Treat as a routine patch pin: bump, run the notification test suite, and verify the resolved illuminate/support and guzzlehttp/guzzle versions in composer.lock. The only failure mode worth pre-checking is a minimum-version raise: if the release narrowed constraints to require a newer Laravel than we run, the bump will fail resolution rather than fail at runtime — which is the safe way to find out, but it should be caught in CI, not in a deploy.
Abstraction layer (recommended, non-negotiable). Do not let Sms77Channel::class appear in domain code. Define an application-level SmsSender port (send(string $to, string $body, array $opts): SendResult) with a Seven/Sms77 adapter and a null adapter for tests. Notifications then reference our own channel that delegates to the port. Cost: roughly a day. Benefit: provider swap (Vonage, Twilio, MessageBird, a local aggregator) becomes a container binding plus config, and we can A/B or fail over between providers during incidents. This single decision converts the package's low stewardship score from a strategic risk into an operational nuisance — and it is what makes accepting a maintainer-driven Laravel bump a one-line change instead of a project.
Migration path. If we already send SMS through a direct SDK call or a hand-rolled Guzzle client, migrate per-notification rather than per-system: stand up the new channel alongside the old sender, route one low-risk notification through it, and dual-run compare before cutting over. If we are greenfield, start on the abstraction from day one and treat the package as an interchangeable driver.
Compatibility checks before merge. Verify (a) the post-v1.0.7 Laravel/PHP constraint set against our composer.json and our next framework upgrade — this release exists specifically to satisfy that check for Laravel 13; (b) transitive HTTP client version constraints — guzzlehttp/guzzle conflicts are the most common failure for packages in this family; (c) config publishing does not collide with existing config/sms77.php; (d) the dev-dependency changes in this release do not leak into our production install (--no-dev resolution).
Sequencing.
SmsSender port + adapter + null/fake implementation for CI; config and secret management; E.164 normalizer with a validation library.Maintenance. The package itself is near-zero-maintenance; the maintenance load is version-drift. v1.0.7 moves that risk out by one framework cycle: the project is demonstrably tracking Laravel majors, which was the single most probable trigger for a private fork. Push the expected fork horizon from 12–18 months out, but keep the budget — roughly ~1 engineer-day per year for vendoring, plus review time on each upstream Seven API change. Pin the version exactly; the cadence here is infrequent, small, and low-signal, so floating on ^1.0 buys nothing and forfeits the ability to review a diff before it lands. Note the composition of this release — one compat PR plus automated StyleCI — and calibrate expectations: this maintainer ships hygiene, not features. The functional gaps identified earlier (no receipts, no throttling, no retry semantics) will not close on their own.
Support. Two disjoint support surfaces: the package (community-only, no SLA, no commercial backing — but now with evidence of a maintainer who merges outside contributions) and the gateway (Seven provides account-level support, delivery troubleshooting, and sender-ID registration). Architecturally, put delivery disputes in the vendor's lap: log provider message IDs on every send so any "did the customer get it" ticket is answerable from our own records rather than a manual vendor query. Confirm DPA, sub-processor list, and EU data-residency posture during procurement, not after launch.
Scaling. SMS volume is typically bursty and modest, so raw throughput is rarely the constraint — but three things bite. (1) Queueing: notifications must implement ShouldQueue and sit on a dedicated queue so an SMS provider slowdown cannot stall web requests or share a worker pool with critical jobs. (2) Provider rate limits and balance: Seven enforces per-account limits; a depleted balance returns an error, not a silent drop, so a balance-check job with alerting is mandatory. (3) Fraud: OTP endpoints are a known SMS-pumping target; the package has no throttling, so per-phone-number, per-IP, and per-account-per-minute limits must live in our application layer before we expose any OTP flow. None of this is affected by v1.0.7.
Failure modes.
Ramp-up. Low: one Laravel engineer, half a day to first send, two to three days to production-grade including the abstraction, throttling, and runbook. The knowledge that matters is not the package — it is the operational envelope: which destinations require pre-registered sender IDs, what Seven's error codes mean, how the balance check works, and who gets paged. Write that runbook before the first customer-facing send.
How can I help you explore Laravel packages today?