octopush/sms-api
Laravel package for integrating the Octopush SMS API. Configure your credentials, send SMS messages through a simple facade or a dedicated Laravel notification channel, and add transactional or alert messaging to PHP applications with a clean, framework-friendly API.
What the package actually is. octopush/sms-api is a vendor-published PHP client for Octopush's REST SMS gateway, not a Laravel package. It ships a thin HTTP wrapper around send/balance/credit endpoints with no ServiceProvider, no facade, no publishable config, no queue integration, and no Notification channel. That distinction drives the whole assessment: we are buying a transport, and we will be building the Laravel-shaped layer on top of it ourselves.
Architecture fit. The lack of framework coupling is a genuine advantage. A stateless, dependency-light client nests cleanly behind an application-owned port (SmsSender interface) so the rest of the codebase never imports the vendor namespace. It also keeps our domain code swappable if Octopush's commercial terms or deliverability degrade. The cost is that every cross-cutting concern — retries, idempotency, rate limiting, structured logging, credential isolation, delivery-receipt ingestion — lands on us. None of that exists in the package.
Integration feasibility. High. composer require octopush/sms-api, wrap the client in a singleton bound to an interface, add a Notification channel class, and expose credentials via config/services.php and .env. Sending is a synchronous cURL call, so it must be moved behind a queued job from day one. Realistic estimate: 2–4 engineering days including tests, config, a sandbox smoke test, and a delivery-receipt webhook endpoint — with the caveat that the webhook is entirely ours to design, since the library does not manage callbacks or signature verification.
Technical risk. This is where the score and metadata matter more than the code.
| Risk | Severity | Rationale | Mitigation |
|---|---|---|---|
| Package staleness | High | Last release Jan 2022; ~4 years without a tag means PHP 8.2/8.3 compatibility and API drift are unverified | Compatibility spike before commitment; budget for a maintained fork |
| Near-zero adoption | Medium-High | 18 stars, 0 dependents — no community to surface breakage or patch it | Treat as first-party code; vendor it if necessary |
| Single-vendor dependency | Medium | Deliverability, pricing, and country coverage are entirely Octopush's | Abstract behind SmsSender; keep a second provider contract-ready |
| Opaque error semantics | Medium | Unclear whether failures throw, return status codes, or fail silently on partial batch sends | Explicit contract tests against sandbox + failure injection |
| No Laravel version contract | Medium | No illuminate/* constraints means no signal on framework compatibility |
Pin in composer.json; verify install on our target LTS |
Key questions for the spike.
Stack fit. Laravel with a queued-job or Notification-channel send path. The library's synchronous cURL transport is the only real friction point; once sends are dispatched to a queue worker, the integration behaves like any other outbound HTTP dependency. Credentials belong in config/services.php, never in the package's own configuration surface (it doesn't have one).
Migration path. If we are already on Twilio/Vonage, do not rip it out. Introduce the SmsSender interface first, register the existing provider as the default implementation, then add OctopushSender as a second binding. Traffic shifts by config flag, one route or one notification type at a time, with per-channel metrics on both sides. This makes the evaluation reversible and gives us a real cost and deliverability comparison rather than a vendor argument.
Compatibility. Pin the exact version in composer.json. Because the package is unmaintained in practice, prefer vendoring the source into a small internal namespace over depending on an unversioned remote — it removes supply-chain and packagist-availability risk and lets us patch PHP 8 compatibility in-place. Verify Composer's platform requirements early; a hard php: ^7.x constraint would force the fork decision before any code is written.
Sequencing.
SmsSender interface, OctopushSender implementation, config binding, unit tests with a faked transport.Maintenance. Effectively ours. With 18 stars, zero dependents, and no release since January 2022, there is no realistic prospect of timely upstream fixes. Budget for a named owner and a periodic compatibility review each time we bump PHP or the framework. The code surface is small, so this is hours per year, not days — but it must be someone's explicit responsibility rather than assumed.
Support. Layer the escalation path: Octopush account support for deliverability, sender ID registration, and billing; our own team for the integration layer. Expect the vendor's documentation to be more current than the library, so engineers should read the raw HTTP API docs and treat the package as a convenience, not a specification. Confirm the vendor's support hours and languages against our own on-call coverage before committing to SMS as an alerting channel.
Scaling. The library is stateless, so horizontal scaling is trivial — throughput is bounded entirely by Octopush's account-level rate limits, per-country sender registration, and prepaid credit balance. Two things to get right early: cost per segment is not linear with message length once UCS-2 encoding kicks in (non-Latin characters), so cost estimation must live in application code; and credit exhaustion is a hard global failure mode that deserves a proactive alert at a threshold, not a reactive one after a failed send.
Failure modes.
Ramp-up. Low for any PHP developer — the public API is a handful of methods. The real onboarding cost is domain knowledge, not code: country-specific sender ID rules, encoding and segment math, quiet hours, and opt-out handling for marketing traffic. Plan half a day of provider documentation review per engineer, and encode that knowledge in tests rather than tribal memory.
How can I help you explore Laravel packages today?