Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Smsapi Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  1. Compatibility drift — partially resolved, but verify the constraint. Laravel 13.x support landed in 0.9.1. Two things to confirm before treating this as closed: (a) whether the PR added 13.x while retaining 11.x/12.x in 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.
  2. Bus factor and adoption signal — downgraded. Org affiliation plus a Laravel-Shift-authored compatibility PR is a meaningfully stronger signal than the raw star count suggested. Abandonment risk is now closer to "the org stops tending this channel" than "one person stops committing." Zero known dependents still means no downstream canary for regressions, and the fork contingency stays in the plan — but as contingency, not as the expected path. The code surface is small enough (a channel, a message DTO, a service provider, a config file) that self-maintenance remains a few hundred lines of work indefinitely.
  3. Error semantics — unchanged and still the top unverified item. Notification channels typically let provider exceptions propagate into the queue worker, so failed SMS become failed jobs that retry against a paid API. We still need to confirm exception types, whether non-2xx responses are surfaced or swallowed, and how per-message errors (invalid number, insufficient funds, blocked sender) are distinguished from transport errors. The compatibility release does not address this.

Key questions for the maintainer / spike.

  • Does 0.9.1's 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?
  • Does the channel throw on API failure, and with what exception class? Is the raw response body preserved for logging?
  • Is there support for per-notification sender overrides, scheduled send, or SMSAPI's bulk/fast send modes?
  • Does the message object expose a returned message ID so we can reconcile against delivery reports later?
  • Is there a sandbox/test mode, and does it short-circuit without network calls (needed for CI)?
  • Are sender names validated against registration requirements before send, or does that fail at the provider?
  • Given the org affiliation, is there a documented release/response cadence for this channel specifically, or is support purely best-effort?

Integration Approach

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.

  1. Day 1 spike (½ day): install 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.
  2. Vendor onboarding (parallel, 1–2 weeks elapsed): account, sender-name registration (often has lead time and paperwork), phone-number inventory, cost model sign-off.
  3. Pilot (1 sprint): one non-critical notification wired through the channel, with logging and failure alerting in place.
  4. General rollout: migrate remaining send sites, then retire the legacy path.
  5. Contingency: if the spike fails, write a first-party channel class (~1 day) calling SMSAPI's REST API directly. Vendor onboarding must not block on package evaluation — run them in parallel.

Operational Impact

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.

  • Provider transport failure → exception in a queued job → retry. Bound retries; ensure non-idempotent sends don't duplicate messages on retry; tune $tries and backoff per notification.
  • Permanent per-message rejection (invalid number, unregistered sender, insufficient balance) → must not retry indefinitely. Needs classification and dead-lettering, plus an alert on "insufficient funds," an account-level failure that will silently break every send.
  • Silent success — still the highest-risk mode. If the channel treats a 200-with-error-body as success, messages vanish with no signal. Capture message IDs, reconcile against delivery reports out-of-band, and track send volume against expected volume as a canary.
  • Credential expiry / rotation — token in env, no rotation story from the package; own it in secrets management.
  • Upstream abandonment — now lower probability; mitigated by the fork contingency either way.
  • Constraint change on upgrade — new to the list after 0.9.1. A patch-level dependency bump can alter the supported Laravel range. Pin exact versions and read the diff on 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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
jinas/dhivatar
store-doc/laravel-storage-driver
plus-it/laravel-translation-manager
diephp/perhaps
diephp/telegraph
osmaviation/spreadsheet
microsoft/fluentui-system-icons
mmccook/php-json-canonicalization-scheme
middlewares/firewall
qubiqx/montapacking
nyoncode/laravel-package-console