iqbalhasandev/laravel-bulksmsbd
A Laravel package for sending SMS through the BulkSMSBD gateway. It wraps the BulkSMSBD API in a simple, configurable integration so you can dispatch single or bulk messages from your Laravel app with minimal setup.
Architecture fit. The package is a thin adapter over a single regional vendor: a Laravel service provider + facade (likely BulkSmsBD::send()) wrapping an HTTP call to bulksmsbd.net with api_key, senderid, number, and message parameters. It fits any Laravel app that needs transactional SMS termination in Bangladesh — OTP, order notifications, alerts. It is explicitly not a channel abstraction; it hard-codes one provider, one country, one API shape. Treat it as a leaf dependency, never as the seam your notification layer depends on.
Integration feasibility. Low effort. composer require, publish a config file, set credentials, call the facade. No migrations, no tables, no queue requirements imposed by the package, no webhook plumbing. The realistic work is 2–4 hours including a smoke test against sandbox credentials.
Technical risk. High, and structural rather than technical:
illuminate/* and PHP 7.4/8.0. Expect install conflict on Laravel 10/11 or PHP 8.2+.env() indirection isn't used.Key questions.
composer.json constraint actually permit on our target version?Stack fit. Any Laravel application. Because the underlying integration is a single form-encoded HTTP POST, the package buys you almost nothing you cannot write in ~100 lines with Laravel's Http client. Fit is "acceptable for a prototype, wrong for a platform."
Migration path. Do not adopt as a runtime dependency. Use it as a reference specification:
SmsGateway::send(SmsMessage $m): SmsResult — with the HTTP call in an adapter class, credentials in config/services.php via env().Compatibility. Verify composer constraints against the target Laravel version first; this is the most likely blocker and the cheapest thing to test. If constraints conflict, the MIT license makes forking or vendoring the source legally clean (retain the copyright notice). Forking is the fallback, not the plan — a fork you must maintain defeats the purpose.
Sequencing.
Maintenance. Upstream maintenance is zero; you own the code the moment it's installed. Budget 1–2 engineer-days to internalize and rewrite. The hidden cost is upgrade drag: a package pinned to an old illuminate/support will block a future Laravel major upgrade at the worst possible time. Pin the version explicitly or vendor the source, and add a synthetic check that the provider endpoint still responds.
Support. No maintainer triage, no issue response, no CVE process, no security disclosure path. Name an internal owner. The provider's support desk is your only escalation route, and only for provider-side failures — never for the PHP wrapper.
Scaling. The package issues a synchronous HTTP call. In the request path that adds roughly 200–800 ms to user-facing latency and couples your availability to a third party's. Push every send into a queued job with explicit timeouts, bounded retries, and a dead-letter path. Throughput is bounded by the provider's rate limits and your sender-ID allocation, not by the package — confirm those ceilings before committing to volume.
Failure modes to instrument for.
Ramp-up. Low technical ramp-up — a mid-level Laravel developer is productive in under an hour. The real ramp-up is domain knowledge that the package does not abstract: BTRC sender-ID/masking registration, masking vs. non-masking pricing, per-segment cost math, and the regulatory posture around storing Bangladeshi phone numbers.
TPM recommendation. Do not adopt as a dependency. Harvest it as a spec and build the thin adapter internally behind a provider-agnostic interface. That converts an archival liability into a controllable, multi-provider capability for roughly two days of engineering — cheaper than the first incident caused by a silent 200.
How can I help you explore Laravel packages today?