Adding a SMS Provider
Plug a new SMS gateway into the platform's SmsService — implement a sender class, wire it through configuration, and route specific phone-number prefixes to it.
Adding a SMS Provider
The platform's Fleetbase\Services\SmsService ships with Twilio (default) and CallPro. Both implement the same minimal contract: a constructor that reads config, plus a send($to, $text, $options?) method. Adding a third provider is a matter of writing the sender class, exposing it via config, and (if you want auto-routing) updating the routing rules.
1. Implement the Provider Class
Mirror CallProSmsService — a plain class with config-driven constructor and a public send method:
<?php
// server/src/Services/MessageBirdSmsService.php
namespace MyOrg\MyExtension\Services;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class MessageBirdSmsService
{
protected string $apiKey;
protected string $from;
protected string $baseUrl;
public function __construct()
{
$this->apiKey = config('services.messagebird.api_key', '');
$this->from = config('services.messagebird.from', '');
$this->baseUrl = config('services.messagebird.base_url', 'https://rest.messagebird.com');
}
public function send(string $to, string $text, ?string $from = null): array
{
if (empty($this->apiKey)) {
throw new \Exception('MessageBird API key not configured.');
}
$response = Http::withHeaders([
'Authorization' => "AccessKey {$this->apiKey}",
])->post("{$this->baseUrl}/messages", [
'originator' => $from ?? $this->from,
'recipients' => [$to],
'body' => $text,
]);
if (!$response->successful()) {
Log::error('MessageBird send failed', [
'status' => $response->status(),
'body' => $response->json(),
'to' => $to,
]);
throw new \Exception('MessageBird SMS failed: ' . $response->body());
}
return [
'success' => true,
'provider' => 'messagebird',
'message_id' => $response->json('id'),
'response' => $response->json(),
];
}
}2. Add Configuration
In your extension's server/config/services.php (or merge into Laravel's existing config/services.php):
return [
'messagebird' => [
'api_key' => env('MESSAGEBIRD_API_KEY'),
'from' => env('MESSAGEBIRD_FROM'),
'base_url' => env('MESSAGEBIRD_BASE_URL', 'https://rest.messagebird.com'),
],
];Merge it from your service provider:
public function boot()
{
parent::boot();
$this->mergeConfigFrom(__DIR__ . '/../../config/services.php', 'services');
}3. Wire the Provider into SmsService
The cleanest pattern is to extend SmsService and add your provider — that keeps the core class untouched and lets users opt in.
<?php
// server/src/Services/ExtendedSmsService.php
namespace MyOrg\MyExtension\Services;
use Fleetbase\Services\SmsService;
class ExtendedSmsService extends SmsService
{
public const PROVIDER_MESSAGEBIRD = 'messagebird';
public function send(string $to, string $text, array $options = [], ?string $provider = null): array
{
$provider ??= $this->resolveProvider($to);
if ($provider === self::PROVIDER_MESSAGEBIRD) {
return app(MessageBirdSmsService::class)->send($to, $text, $options['from'] ?? null);
}
return parent::send($to, $text, $options, $provider);
}
}Bind it in your service provider's register():
public function register()
{
parent::register();
$this->app->singleton(SmsService::class, ExtendedSmsService::class);
$this->app->singleton(MessageBirdSmsService::class);
}Now any code resolving SmsService from the container (app(SmsService::class)) gets your extended subclass.
4. Configure Phone-Prefix Routing
To auto-route specific country codes through MessageBird, extend the routing config. In your service provider's boot():
config([
'sms.routing_rules' => array_merge(
config('sms.routing_rules', []),
['+31' => ExtendedSmsService::PROVIDER_MESSAGEBIRD], // Netherlands
['+44' => ExtendedSmsService::PROVIDER_MESSAGEBIRD], // United Kingdom
),
]);Now $smsService->send('+31612345678', 'Hello') routes through MessageBird automatically. Calls to other prefixes still go through the default Twilio provider.
5. Test
$sms = app(\Fleetbase\Services\SmsService::class);
// Auto-routed (uses MessageBird because +31)
$sms->send('+31612345678', 'Test message');
// Forced provider
$sms->send('+15551234567', 'Test', [], ExtendedSmsService::PROVIDER_MESSAGEBIRD);Reference
core-api/src/Services/SmsService.php— base service with auto-routingcore-api/src/Services/CallProSmsService.php— reference provider class- API Services → SmsService — service overview
- Laravel container singleton binding
Adding a Payment Gateway Driver
Plug a new payment gateway (PayPal, Razorpay, etc.) into Ledger by extending AbstractGatewayDriver and registering it with the PaymentGatewayManager.
Registering Notifications
Define notification classes that show up in user notification preferences and dispatch via mail, SMS, push, broadcast, and database channels.