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

Clickatell Bundle Laravel Package

archer/clickatell-bundle

Symfony bundle that integrates the Clickatell SMS gateway, providing configuration and a service for sending text messages through Clickatell’s API. Useful for adding SMS notifications to Symfony applications.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit — fundamentally mismatched with a Laravel target. The package is a Symfony bundle (archer/clickatell-bundle), not a Laravel package. Laravel has no bundle registration lifecycle, no DI extension/compiler pass, and no configuration tree to consume. In a Laravel codebase the bundle is not installable as a dependency — the only salvageable asset is the Clickatell HTTP client class and the message-composition logic embedded in it. A TPM should reframe the work item from "integrate this package" to "use this package as reference source for a ~150–200 LOC owned adapter." That reframing changes the effort estimate, the ownership model, and the risk profile simultaneously, and it is the single most important decision in this evaluation.

Integration feasibility — low as a dependency, moderate as a rewrite seed. The bundle's conventions (PSR-0 autoloading, services.xml, Symfony 2.x framework constraints, PHP 5.3+ era) cannot coexist with a supported Laravel (9–12) / PHP 8.x runtime. More critically than framework mechanics, the transport is dead: it targets Clickatell's legacy HTTP API (api.clickatell.com/http/sendmsg with user/password/api_id query parameters), which has been superseded by the REST API (/rest/message, X-Version header, bearer/API-key auth). Even a clean install would produce a client that fails against the live vendor. Feasibility is therefore gated on the vendor's API version, not on Composer resolving.

Technical risk — high, in four specific places.

  • Supply chain: 0 stars, 0 dependents, score 0. No downstream validation, no issue history, no fork community, no CVE feed. Any adoption transfers 100% of maintenance liability to us with zero leverage.
  • Credential exposure: legacy Clickatell auth embeds username/password/api_id in query strings — visible in proxy logs, APM traces, and curl error output. Incompatible with current secrets-management and audit expectations; likely a finding in any security review.
  • Silent failure: the legacy API returns HTTP 200 with body ID: <msgid> on success and ERR: <code>, <text> on failure. Bundles of this vintage frequently check only the transport status code, meaning rejected messages appear as successes to the caller. Verifying this is a five-minute code read and the highest-value diligence item on the list.
  • Capability gap: evidence covers one-way outbound send only. No delivery receipts, inbound/two-way, templating, scheduling, retries, idempotency, or observability. Product scope must not assume any of those.

Key questions for the requester.

  1. Which system actually carries this dependency today — a legacy Symfony service, or a greenfield Laravel evaluation? If greenfield, the answer is "don't adopt; write the client."
  2. Is Clickatell a signed commercial commitment or an inherited vendor? If inherited, Twilio/MessageBird/SNS should be evaluated alongside — integration cost is comparable and the maintenance profile is far better.
  3. Do we need delivery receipts, inbound messaging, or sender-ID registration? All are bespoke work regardless of this package.
  4. What is monthly volume and peak burst? This determines whether synchronous send is tolerable or a queue is mandatory.
  5. Who owns Clickatell account administration, and when was the API version last confirmed with the vendor?
  6. Are we on Laravel, Symfony, or both? This bifurcates the recommendation entirely.

Integration Approach

Stack fit — reject as a dependency; adopt as reference. For a Laravel target, the correct integration is a thin ClickatellClient (Guzzle, ~150 LOC) behind an SmsChannel/NotificationChannel contract, bound in a service provider, exposed via a facade, and dispatched through the queue. This yields Laravel-native HTTP fakes, config caching, retry semantics, and testability that the bundle cannot provide. For a legacy Symfony target, the correct successor is symfony/clickatell-notifier (the maintained Symfony Notifier bridge) — a like-for-like replacement, not a fork.

Migration path.

  1. Inventory (0.5 day): grep for the service ID and any Clickatell namespace references; confirm no live code path depends on the bundle. Packagist shows 0 dependents, but private forks won't surface — ask the team directly.
  2. Extract intent (0.5 day): lift message composition, number normalisation (E.164), and any sender-ID handling. That is the only durable IP in the package.
  3. Rebuild transport (1–2 days): REST v2 client, token from the secrets manager, structured response parsing that maps Clickatell error codes to typed exceptions.
  4. Harden (1 day): idempotency key per message, retry with backoff on 5xx/429 only, queue dispatch, per-number rate limiting, structured logging with no PII in the body.
  5. Cutover: shadow-send to staging numbers, diff against legacy output for a week, then decommission.

Compatibility. Assume Symfony 2.0–2.2 and PHP 5.3–5.6 until composer.json says otherwise. If the constraint is dev-master with no branch alias, the package is unpinned and therefore unreproducible — an independent argument against adoption.

Sequencing. Run this as a standalone 3–5 day spike, never as a tracked dependency inside a larger delivery. It must not sit on the critical path for feature work. Two long-lead items precede any code: vendor account provisioning and sender-ID / alphanumeric originator approval. Start procurement on day one; the code is not the bottleneck. Ship behind a SmsSender interface with a config flag so provider choice (Clickatell/Twilio/Vonage) is a deployment decision, not a rewrite.

Operational Impact

Maintenance. Effectively unforkable. No upstream to patch, no CVE feed, no PHP 8 compatibility work in flight, no maintainer responsiveness signal. Adoption converts into permanent ownership of a dead Symfony 2 idiom — the worst maintenance ratio available. The economics are unambiguous: a 200-line owned adapter costs less over one year than the ongoing tax of vendoring and defending an abandoned bundle.

Support. Documentation is a README. There is no community to escalate to and no issue history to mine for known failure modes. Support burden falls entirely on whoever last read the source — a bus-factor-1 artifact. Any incident becomes an archaeology exercise rather than a vendor ticket.

Scaling. Synchronous single-message requests with no batching, no connection-reuse guarantees, and no queue integration. At a few hundred messages/day this is invisible; at burst volume it becomes a blocking call inside the request cycle and a latency multiplier on every user action that triggers an SMS. Clickatell's own rate limits will surface as unhandled errors rather than as backpressure. For OTP flows in particular — the highest-value SMS use case — added latency directly degrades conversion, so this is a product-visible concern, not just an infrastructure one.

Failure modes to design against.

  • HTTP 200 + ERR: body — the dominant failure mode; must be parsed and raised as an exception, not logged and swallowed.
  • Duplicate sends — no idempotency in the legacy call path; a naive retry double-charges and double-messages the customer.
  • Credential leakage — query-string auth in logs, traces, and error output.
  • Silent queue loss — a wrapper job without $tries/failed() handling drops messages invisibly.
  • Number normalisation errors — E.164 handling is the usual root cause of "the message went nowhere" tickets; validate at the boundary.

Ramp-up. Near-zero transferable knowledge. An engineer needs roughly a day to read the bundle and another day to unlearn its idioms; ramp-up cost exceeds rewrite cost. Framing matters operationally: position the work as "build a Clickatell adapter," not "integrate this package." The first framing produces a small owned asset with an interface and tests; the second produces inherited liability with no owner.

Recommendation. Reject as a dependency. Retain as a reference implementation only if a legacy Symfony consumer genuinely exists, in which case plan replacement with the maintained Notifier bridge or a Laravel-native Guzzle client within one quarter. Approve a ~3–5 day build of an owned, provider-agnostic SMS adapter behind an interface, and start Clickatell account provisioning and sender-ID approval in parallel — those are the real long-lead items, and they gate delivery regardless of which integration path is chosen.

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.
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log