spatie/laravel-mailcoach-sdk
Laravel-friendly PHP SDK for the Mailcoach API (self-hosted v6+ and Mailcoach Cloud). Manage email lists, subscribers, and campaigns; create and send campaigns, send tests, and iterate through paginated endpoints with simple next() calls.
composer require spatie/laravel-mailcoach-sdk
php artisan vendor:publish --tag="mailcoach-sdk-config"
.env:
MAILCOACH_API_TOKEN=your_api_token_here
MAILCOACH_API_ENDPOINT=https://your-mailcoach-instance.com/api
use Spatie\MailcoachSdk\Facades\Mailcoach;
$emailLists = Mailcoach::emailLists();
Spatie\MailcoachSdk\Facades\Mailcoach (primary interface)EmailList, Subscriber, Campaign (for detailed operations)next(), previous(), etc.$list = Mailcoach::createEmailList(['name' => 'Newsletter']);
$list->name = 'Updated Newsletter';
$list->save();
$subscribers = Mailcoach::emailList($listUuid)->subscribers(['filter[email]=gmail.com']);
foreach ($subscribers as $subscriber) {
$subscriber->tags = ['promo'];
$subscriber->save();
}
$campaign = Mailcoach::createCampaign([
'email_list_uuid' => $listUuid,
'template_uuid' => $templateUuid,
'fields' => ['title' => 'Hello'],
]);
$campaign->sendTest('test@example.com'); // Test first
$campaign->send(); // Full send
$subscriber = Mailcoach::emailList($listUuid)->subscriber('user@example.com');
if (!$subscriber) {
$subscriber = Mailcoach::createSubscriber($listUuid, [
'email' => 'user@example.com',
'first_name' => 'John',
]);
}
$subscribers = Mailcoach::emailList($listUuid)->subscribers();
while ($subscribers->total() > $subscribers->currentPage() * 1000) {
foreach ($subscribers as $subscriber) { /* ... */ }
$subscribers = $subscribers->next();
}
user.registered → add subscriber).Mailcoach::queue(fn () => Mailcoach::emailList($listUuid)->subscribers()->each(...));
Mailcoach::withRetry() for idempotent operations:
Mailcoach::withRetry(3)->createCampaign(...);
API Token Permissions:
read/write access for required endpoints (e.g., campaigns).Pagination Limits:
$subscribers->take(500); // Override limit temporarily
UUID Validation:
Str::isUuid($uuid)) before passing to Mailcoach methods.Field Mismatches:
fields array exactly (case-sensitive). Use Mailcoach::campaign($uuid)->template->fields to verify.Mailcoach::getClient()->getEmitter()->attach(
new \GuzzleHttp\Middleware::tap(function ($request) {
\Log::debug('Mailcoach Request:', ['url' => $request->getUri(), 'body' => $request->getBody()]);
})
);
Mailcoach::fake() to mock responses:
Mailcoach::fake([
'campaigns' => ['uuid' => 'test-123', 'name' => 'Test Campaign'],
]);
Custom Resources:
Extend base resources (e.g., Spatie\MailcoachSdk\Resources\EmailList) to add methods:
class CustomEmailList extends \Spatie\MailcoachSdk\Resources\EmailList {
public function activeSubscribers() {
return $this->subscribers(['filter[status]=active']);
}
}
Register via service provider:
$this->app->bind(\Spatie\MailcoachSdk\Resources\EmailList::class, CustomEmailList::class);
API Middleware: Add request/response middleware to the Guzzle client:
Mailcoach::getClient()->getEmitter()->attach(
new \GuzzleHttp\Middleware::mapRequest(function ($request) {
$request = $request->withHeader('X-Custom-Header', 'value');
return $request;
})
);
Event Listeners: Listen for Mailcoach webhooks (e.g., campaign sent) via Laravel events:
Mailcoach::campaignSent(function ($campaign) {
event(new CampaignSent($campaign));
});
Mailcoach::setEndpoint() dynamically:
Mailcoach::setEndpoint('https://staging-mailcoach.com/api');
config/mailcoach-sdk.php:
'client' => [
'timeout' => 30, // seconds
],
How can I help you explore Laravel packages today?