PHPackages                             nugsoft/signalbridge-laravel-sdk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. nugsoft/signalbridge-laravel-sdk

ActiveLibrary

nugsoft/signalbridge-laravel-sdk
================================

Laravel SDK for SignalBridge SMS Gateway - Send SMS messages through multiple vendors with unified API

v1.0.0(5mo ago)11MITPHPPHP ^8.1|^8.2|^8.3|^8.4

Since Nov 27Pushed 5mo agoCompare

[ Source](https://github.com/nugsoft/signalbridge-laravel-sdk)[ Packagist](https://packagist.org/packages/nugsoft/signalbridge-laravel-sdk)[ RSS](/packages/nugsoft-signalbridge-laravel-sdk/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (6)Versions (2)Used By (0)

SignalBridge Laravel SDK
========================

[](#signalbridge-laravel-sdk)

[![Latest Version on Packagist](https://camo.githubusercontent.com/249bf2ff1aca8efd5487eaad6abead91134b176a7c3e71381652694a10628d07/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6e7567736f66742f7369676e616c6272696467652d6c61726176656c2d73646b2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/nugsoft/signalbridge-laravel-sdk)[![Total Downloads](https://camo.githubusercontent.com/bf4bc3efbe4c817a3f16f1a4d04f5bb1dea43cc5dddbd2f61bf2668c78d882fa/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6e7567736f66742f7369676e616c6272696467652d6c61726176656c2d73646b2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/nugsoft/signalbridge-laravel-sdk)

Laravel SDK for SignalBridge SMS Gateway - Send SMS messages through multiple vendors (SpeedaMobile, Africa's Talking) with a unified API. Built specifically for Nugsoft product/project teams.

Features
--------

[](#features)

- **Simple API** - Clean, Laravel-style interface
- **Balance Management** - Check balance, view transactions, get usage reports
- **Scheduled Messages** - Schedule SMS for future delivery
- **Segment Calculation** - Automatic cost estimation (GSM 7-bit vs Unicode)
- **Custom Exceptions** - Typed exceptions for better error handling
- **Facade Support** - Use `SignalBridge::sendSms()` syntax
- **Dependency Injection** - Constructor injection support
- **Laravel 10, 11, 12** - Compatible with modern Laravel versions
- **PHP 8.1+** - Modern PHP features
- **Queue** - Supports message queueing for reliable delivery with retry logic and monitoring via Laravel's queue system

Requirements
------------

[](#requirements)

- PHP 8.1 or higher
- Laravel 10.0, 11.0, or 12.0
- Guzzle HTTP 7.0+

Installation
------------

[](#installation)

### 1. Install via Composer

[](#1-install-via-composer)

```
composer require nugsoft/signalbridge-laravel-sdk
```

### 2. Publish Configuration (Optional)

[](#2-publish-configuration-optional)

```
php artisan vendor:publish --tag=signalbridge-config
```

This creates `config/signalbridge.php` where you can customize settings.

### 3. Configure Environment Variables

[](#3-configure-environment-variables)

Add these to your `.env` file:

```
SIGNALBRIDGE_TOKEN=your_api_token_here
```

**Getting Your API Token:**

Contact your system administrator or generate a token via:

```
curl -X POST https://signal-bridge.nugsoftstagging.com/api/tokens \
  -H "Content-Type: application/json" \
  -d '{
    "email": "your-product@nugsoft.com",
    "password": "your-password",
    "expires_in_days": 365
  }'
```

Note

You can also generate your token through the SignalBridge settings page in your account.

Usage
-----

[](#usage)

### Quick Start

[](#quick-start)

#### Using the Facade (Recommended)

[](#using-the-facade-recommended)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;

// Send SMS
$result = SignalBridge::sendSms(
    recipient: '256700000000',
    message: 'Hello from Laravel!',
    options: [
        'metadata' => ['user_id' => 123]
    ]
);
```

#### Using Dependency Injection

[](#using-dependency-injection)

```
use Nugsoft\SignalBridge\SignalBridgeClient;

class NotificationService
{
    public function __construct(
        private SignalBridgeClient $signalBridge
    ) {}

    public function sendWelcomeSms(string $phone, string $name)
    {
        return $this->signalBridge->sendSms(
            recipient: $phone,
            message: "Welcome {$name}! Thanks for joining us."
        );
    }
}
```

### Real-World Examples

[](#real-world-examples)

#### 1. Send OTP/Verification Code

[](#1-send-otpverification-code)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;
use Illuminate\Support\Facades\Cache;

public function sendOTP(Request $request)
{
    $code = rand(100000, 999999);

    // Store in cache for 5 minutes
    Cache::put("otp:{$request->phone}", $code, now()->addMinutes(5));

    try {
        $result = SignalBridge::sendSms(
            recipient: $request->phone,
            message: "Your verification code is {$code}. Valid for 5 minutes.",
            options: [
                'metadata' => [
                    'user_id' => $request->user()->id,
                    'action' => 'otp_verification',
                    'ip_address' => $request->ip(),
                ]
            ]
        );

        return response()->json([
            'success' => true,
            'message' => 'OTP sent successfully',
            'cost' => $result['data']['cost'],
        ]);

    } catch (\Nugsoft\SignalBridge\Exceptions\InsufficientBalanceException $e) {
        return response()->json([
            'success' => false,
            'message' => 'Insufficient balance',
            'required' => $e->getRequiredBalance(),
            'available' => $e->getCurrentBalance(),
        ], 402);
    }
}
```

#### 2. Batch SMS Notifications

[](#2-batch-sms-notifications)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;

public function notifyStudents(Request $request)
{
    $students = $request->input('students'); // Array of student data

    // Build batch messages
    $messages = collect($students)->map(function ($student) {
        return [
            'recipient' => $student['phone'],
            'message' => "Hi {$student['name']}, your exam results are ready. Score: {$student['score']}/100",
            'metadata' => [
                'student_id' => $student['id'],
                'exam_id' => $request->exam_id,
            ]
        ];
    })->toArray();

    try {
        $result = SignalBridge::sendBatch($messages);

        return response()->json([
            'success' => true,
            'sent' => $result['data']['successful'],
            'failed' => $result['data']['failed'],
        ]);

    } catch (\Nugsoft\SignalBridge\Exceptions\ValidationException $e) {
        return response()->json([
            'success' => false,
            'errors' => $e->getErrors(),
        ], 422);
    }
}
```

#### 3. Scheduled Reminders

[](#3-scheduled-reminders)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;
use Carbon\Carbon;

public function schedulePaymentReminders()
{
    $invoices = Invoice::whereDue(today()->addDay())->get();

    $messages = $invoices->map(function ($invoice) {
        return [
            'recipient' => $invoice->customer_phone,
            'message' => "Reminder: Invoice #{$invoice->number} of {$invoice->amount} UGX is due tomorrow.",
            'scheduled_at' => Carbon::tomorrow()->setTime(9, 0)->toIso8601String(),
            'metadata' => [
                'invoice_id' => $invoice->id,
                'type' => 'payment_reminder',
            ]
        ];
    })->toArray();

    return SignalBridge::sendBatch($messages);
}
```

#### 4. Balance Check Before Sending

[](#4-balance-check-before-sending)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;

public function sendBulkWithValidation(array $recipients, string $message)
{
    // Get current balance
    $balance = SignalBridge::getBalance('UGX');

    // Calculate cost
    $segments = SignalBridge::calculateSegments($message);
    $estimatedCost = count($recipients) * $segments * $balance['segment_price'];

    // Validate sufficient balance
    if ($balance['available_balance'] < $estimatedCost) {
        throw new \Exception(
            "Insufficient balance. Required: {$estimatedCost}, Available: {$balance['available_balance']}"
        );
    }

    // Proceed with sending
    $messages = collect($recipients)->map(fn($phone) => [
        'recipient' => $phone,
        'message' => $message,
    ])->toArray();

    return SignalBridge::sendBatch($messages);
}
```

#### 5. Usage Reporting

[](#5-usage-reporting)

```
use Nugsoft\SignalBridge\Facades\SignalBridge;

public function getMonthlyReport(string $month)
{
    $startDate = Carbon::parse($month)->startOfMonth()->format('Y-m-d');
    $endDate = Carbon::parse($month)->endOfMonth()->format('Y-m-d');

    $transactions = SignalBridge::getTransactions([
        'type' => 'debit',
        'start_date' => $startDate,
        'end_date' => $endDate,
        'per_page' => 100,
    ]);

    // Group by message type
    $summary = collect($transactions['data'])
        ->groupBy(fn($tx) => $tx['metadata']['type'] ?? 'general')
        ->map(fn($group) => [
            'count' => $group->count(),
            'cost' => $group->sum('amount'),
        ]);

    return [
        'period' => $month,
        'total_cost' => collect($transactions['data'])->sum('amount'),
        'by_type' => $summary,
    ];
}
```

API Reference
-------------

[](#api-reference)

### Send SMS

[](#send-sms)

```
SignalBridge::sendSms(
    recipient: '256700000000',
    message: 'Your message here',
    options: [
        'metadata' => [],                   // Optional: Custom data
        'is_test' => false,                 // Optional: Test mode flag
        'scheduled_at' => '2025-12-01...',  // Optional: ISO 8601 datetime
    ]
);
```

**Returns:**

```
[
    'success' => true,
    'message' => 'SMS queued successfully',
    'data' => [
        'message_id' => 1234,
        'status' => 'queued',
        'vendor' => 'SpeedaMobile',
        'segments' => 1,
        'cost' => 75.00,
        'balance_after' => 9925.00
    ]
]
```

### Send Batch SMS

[](#send-batch-sms)

```
SignalBridge::sendBatch(
    messages: [
        [
            'recipient' => '256700000000',
            'message' => 'Message 1',
            'metadata' => ['order_id' => 123]
        ],
        [
            'recipient' => '256700000001',
            'message' => 'Message 2',
            'metadata' => ['order_id' => 124]
        ],
    ],
    options: [
        'is_test' => false,
    ]
);
```

**Returns:**

```
[
    'success' => true,
    'message' => 'Batch SMS processed: 2 successful, 0 failed',
    'data' => [
        'total' => 2,
        'successful' => 2,
        'failed' => 0,
        'messages' => [...]
    ]
]
```

### Get Balance

[](#get-balance)

```
$balance = SignalBridge::getBalance('UGX');
```

**Returns:**

```
[
    'success' => true,
    'balance' => 100.00,
    'currency' => 'UGX',
    'available_balance' => 100.00,
    'credit_limit' => 0.00,
    'segment_price' => 0.02
]
```

### Get Balance Summary

[](#get-balance-summary)

```
$summary = SignalBridge::getBalanceSummary();
```

### Get Transactions

[](#get-transactions)

```
$transactions = SignalBridge::getTransactions([
    'per_page' => 15,
    'page' => 1,
    'type' => 'debit',
    'start_date' => '2025-11-01',
    'end_date' => '2025-11-30',
]);
```

### Calculate Segments

[](#calculate-segments)

```
$segments = SignalBridge::calculateSegments('Your message here');
// Returns: 1 (for messages up to 160 GSM chars or 70 Unicode chars)
```

### Estimate Cost

[](#estimate-cost)

```
$cost = SignalBridge::estimateCost(
    message: 'Your message here',
    segmentPrice: 0.02
);
// Returns: 0.02 (segments * price)
```

### Token Management

[](#token-management)

```
// Get all tokens
$tokens = SignalBridge::getTokens();

// Revoke current token
$result = SignalBridge::revokeCurrentToken();
```

Exception Handling
------------------

[](#exception-handling)

The SDK provides typed exceptions for better error handling:

```
use Nugsoft\SignalBridge\Exceptions\InsufficientBalanceException;
use Nugsoft\SignalBridge\Exceptions\ValidationException;
use Nugsoft\SignalBridge\Exceptions\NoClientException;
use Nugsoft\SignalBridge\Exceptions\ServiceUnavailableException;
use Nugsoft\SignalBridge\Exceptions\SignalBridgeException;

try {
    SignalBridge::sendSms('256700000000', 'Test message');

} catch (InsufficientBalanceException $e) {
    // Handle insufficient balance
    $required = $e->getRequiredBalance();
    $current = $e->getCurrentBalance();
    $segments = $e->getSegments();

} catch (ValidationException $e) {
    // Handle validation errors
    $errors = $e->getErrors();
    $firstError = $e->getFirstError();

} catch (NoClientException $e) {
    // Handle no client associated

} catch (ServiceUnavailableException $e) {
    // Handle service unavailable (no SMS vendor configured)

} catch (SignalBridgeException $e) {
    // Handle other API errors
    $data = $e->getData();
}
```

SMS Segments &amp; Pricing
--------------------------

[](#sms-segments--pricing)

Messages are charged based on segments:

**GSM 7-bit Encoding** (standard characters):

- Single segment: Up to 160 characters
- Multi-part: 153 characters per segment

**Unicode Encoding** (emojis, Arabic, Chinese, etc.):

- Single segment: Up to 70 characters
- Multi-part: 67 characters per segment

The SDK automatically detects encoding and calculates segments.

Configuration
-------------

[](#configuration)

After publishing the config file, you can customize:

```
// config/signalbridge.php

return [
    'url' => env('SIGNALBRIDGE_URL', 'https://signal-bridge.nugsoftstagging.com/api'),
    'token' => env('SIGNALBRIDGE_TOKEN'),
    'timeout' => env('SIGNALBRIDGE_TIMEOUT', 30),
    'default_sender_id' => env('SIGNALBRIDGE_SENDER_ID', config('app.name')),
    'logging' => env('SIGNALBRIDGE_LOGGING', true),
];
```

Testing
-------

[](#testing)

```
composer test
```

License
-------

[](#license)

The MIT License (MIT). This package is proprietary to Nugsoft.

Credits
-------

[](#credits)

- **Asaba William**
- **Nugsoft Dev team**

---

**Made with ❤️ by Nugsoft**

###  Health Score

35

—

LowBetter than 79% of packages

Maintenance70

Regular maintenance activity

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

167d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/1ad0558c40180cf17ecd186801a6167e16385039763d197d2dd9a9b1217081ab?d=identicon)[Nugsoft](/maintainers/Nugsoft)

---

Top Contributors

[![Williamug](https://avatars.githubusercontent.com/u/15543507?v=4)](https://github.com/Williamug "Williamug (8 commits)")

---

Tags

laravelnotificationssmsmessagingsignalbridgenugsoftafrica-talkingspeedamobile

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/nugsoft-signalbridge-laravel-sdk/health.svg)

```
[![Health](https://phpackages.com/badges/nugsoft-signalbridge-laravel-sdk/health.svg)](https://phpackages.com/packages/nugsoft-signalbridge-laravel-sdk)
```

###  Alternatives

[laravel/slack-notification-channel

Slack Notification Channel for laravel.

89069.7M111](/packages/laravel-slack-notification-channel)[tzsk/sms

A robust and unified SMS gateway integration package for Laravel, supporting multiple providers.

320244.3k6](/packages/tzsk-sms)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)[truckersmp/steam-socialite

Laravel Socialite provider for Steam OpenID.

1516.7k](/packages/truckersmp-steam-socialite)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
