laravel-notification-channels/smsapi
A Laravel notification channel for SMSAPI that lets your application send SMS notifications through the SMSAPI gateway using Laravel’s familiar notification API. Simple to install, configure, and integrate into existing apps.
Architecture fit. Unchanged. This package is a thin adapter that plugs into Laravel's first-party notification system: it supplies a channel class plus a message value object, so it fits the framework's existing dispatch, queueing, and multi-channel fan-out model without introducing a new abstraction. Adoption remains a config-plus-one-method change (via() returns the channel; the notification exposes a toSmsapi() payload) — no service container overrides, no event hooks, no schema changes. The caveat is unchanged: it is a delivery adapter only, and does not model inbound messages, delivery reports, sender-name registration, or SMSAPI's MFA/2FA product surface. Any workflow needing confirmation-of-delivery or two-way messaging requires additional integration work outside this package.
Integration feasibility. Slightly improved. The 0.9.1 release confirms two things we previously listed as open questions: the package is maintained under the laravel-notification-channels GitHub organization (the canonical community home for Laravel notification channel packages, alongside Twilio, Vonage, Slack, etc.), and its framework compatibility work is being handled by laravel-shift — the automation service behind Laravel Shift, which routinely issues these compatibility PRs across the channel-package ecosystem. That is a materially better maintenance signal than "a repository with 24 stars." Requirements remain: Composer install, published config (API token, default sender name, optional test-mode flag), credentials in env. The commercial question is unchanged and still the real gate: SMSAPI's pricing, coverage, and sender-name registration rules are regionally weighted toward Poland/EU.
Technical risk. Reordered, with one item downgraded:
illuminate/support, or replaced them — a replace is effectively a silent minimum-version bump for anyone on an older major; and (b) whether a CI matrix backs the claim, since the release note describes only the PR title. Note also the shape of the change: framework-major compatibility shipped in a patch release (0.9.0 → 0.9.1). That is semver-legal here but means dependency-constraint changes can arrive without a minor bump, which is an argument for pinning to an exact version and reviewing lockfile diffs rather than floating on ^0.9.Key questions for the maintainer / spike.
illuminate/support constraint include our target Laravel version and the previous major, or did the 13.x PR narrow it? Is there a CI matrix proving the stated support range?fast send modes?Stack fit. Unchanged. Assumes Laravel with the queue worker running — send via ShouldQueue notifications rather than synchronously, since SMS is I/O against an external API and should never sit in a request path. Sits alongside existing mail/database channels with no interference. Ideal for transactional messaging: OTP, order status, appointment reminders, delivery notifications. Poor fit for marketing/bulk campaigns, where a direct API client or the vendor's campaign tooling gives better control over batching, scheduling, and cost.
Migration path. Unchanged. From raw Guzzle calls or a legacy gateway SDK, the migration is a refactor of the send call site into a Notification class — mechanical, and it usually reduces code because templating, queueing, and retry come from the framework. From another notification channel package, it is a channel swap behind via() plus a message-object rewrite; surrounding notification classes and call sites stay intact. Keeping SMS behind the Notification abstraction keeps the vendor a config decision, not an architectural one.
Compatibility and constraints. The 0.9.1 release directly targets the concern we flagged as the most likely blocker, so Laravel 13.x is now plausibly covered — but this is the item to verify first, not to assume. Concretely: read the composer.json constraint in the tagged release rather than the release note, confirm PHP versions, and confirm no transitive dependencies beyond illuminate/* and an HTTP client. Pin explicitly ("0.9.1", not "^0.9") given both the low release cadence and the demonstrated pattern of constraint changes arriving in patch releases.
Sequencing.
0.9.1 in a scratch branch, read the composer.json constraint, send one message to a real number in test mode, and read the channel and message classes end-to-end (they are short) to answer the error-semantics questions. The compatibility check is now faster — a constraint read plus one send — but still not skippable.Maintenance. Unchanged in shape, improved in outlook. The code surface is small and self-contained. Two paths remain: depend on upstream, or fork/vendor into our codebase. The 0.9.1 release makes the first path more defensible — framework compatibility is being tracked deliberately, by automation, inside an org that does this across many channels — so I would now default to depending on upstream with an exact version pin, and keep vendoring as a documented fallback rather than the plan. The recurring task remains Laravel upgrade compatibility, which is predictable and schedulable, and now has evidence of being handled ahead of our need rather than after it.
Support. Still community-only — no vendor SLA flows from this package; SMSAPI's own support covers the API, not the Laravel wrapper. But the escalation path is now better defined: our logs → SMSAPI status/support → the laravel-notification-channels org's issue tracker → our own read of the channel source. Document that chain in the runbook so on-call doesn't hunt for a lone maintainer. Realistically the source is readable in minutes, so the third and fourth steps are the practical ones.
Scaling. Unchanged. Throughput is bounded by SMSAPI's API rate limits and account tier, not the package. The real concerns are cost at volume and queue design: keep SMS sends on a dedicated queue so a provider slowdown doesn't starve other jobs, and tune worker concurrency to stay under rate limits. Watch for thundering-herd patterns on broadcast notifications — rate-limit middleware on the queue is the right control, not changes to the channel.
Failure modes to design for.
$tries and backoff per notification.composer.json before any upgrade, including patch upgrades.Ramp-up. Unchanged and very low: the pattern is idiomatic and the source is short enough to read in one sitting. Roughly half a day for a Laravel developer to be productive. The actual critical path remains vendor-side onboarding — account, sender registration, compliance — which is organizational, not technical.
Overall recommendation. Low technical risk, low integration cost, and a materially better maintenance signal than at the previous review. Approve for evaluation and pilot contingent on (a) reading the 0.9.1 composer.json constraint to confirm it covers our target Laravel version without dropping the major we're on, (b) confirmed exception and error-classification semantics, and (c) a business case for SMSAPI's coverage and pricing in our target markets. The package is now reasonable to depend on directly with an exact version pin; keep the ~1-day first-party channel fallback documented in case the org's attention on this channel lapses.
How can I help you explore Laravel packages today?