spatie/laravel-mailcoach-sdk
Laravel SDK for the Mailcoach API (self-hosted v6+ and Mailcoach Cloud). Manage email lists, subscribers and campaigns, create and send campaigns, send test emails, and easily iterate paginated API resources with next().
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/api
use Spatie\MailcoachSdk\Facades\Mailcoach;
$lists = Mailcoach::emailLists();
foreach ($lists as $list) {
echo $list->name;
}
Spatie\MailcoachSdk\Facades\Mailcoach (primary entry point).EmailList, Subscriber, Campaign (for detailed operations).next(), total(), etc.).CRUD Operations:
// Create
$list = Mailcoach::createEmailList(['name' => 'Newsletter']);
$subscriber = Mailcoach::createSubscriber(
emailListUuid: $list->uuid,
attributes: ['email' => 'user@example.com']
);
// Read
$campaign = Mailcoach::campaign('campaign-uuid');
// Update
$campaign->subject = 'Updated Subject';
$campaign->save();
// Delete
$subscriber->delete();
Pagination Handling:
$subscribers = Mailcoach::emailList('list-uuid')->subscribers();
while ($subscribers->next()) {
foreach ($subscribers as $subscriber) {
// Process subscriber
}
}
Campaign Management:
$campaign = Mailcoach::createCampaign([
'email_list_uuid' => 'list-uuid',
'name' => 'Welcome Email',
'fields' => ['title' => 'Welcome!'],
]);
$campaign->sendTest('test@example.com'); // Test send
$campaign->send(); // Live send
Subscriber Filtering:
$subscribers = Mailcoach::emailList('list-uuid')
->subscribers(['filter[email]=gmail.com']);
sent events.class MailcoachService {
public function syncSubscribers(array $emails) {
foreach ($emails as $email) {
Mailcoach::createSubscriber(/* ... */);
}
}
}
Pagination Edge Cases:
next() returns null before looping (avoid infinite loops).total() to pre-calculate iterations if needed.API Token Misconfiguration:
MAILCOACH_API_TOKEN and MAILCOACH_API_ENDPOINT in .env.Mailcoach::fake() in tests to avoid real API calls:
Mailcoach::fake();
Mailcoach::createCampaign([/* ... */]);
Mailcoach::assertSent();
Subscriber Confirmation:
confirm()/unsubscribe()—no direct DB updates.Template Fields:
fields in createCampaign() match the template’s placeholders exactly (case-sensitive).Mailcoach::getLastResponse() for raw API responses.429 errors.Str::isUuid()) before passing to SDK methods.Custom Resources:
Extend Spatie\MailcoachSdk\Resources\Resource to add custom attributes:
class CustomSubscriber extends Subscriber {
public function getCustomAttribute() { /* ... */ }
}
Middleware:
Add request/response middleware via Mailcoach::extend():
Mailcoach::extend(function ($mailcoach) {
$mailcoach->before(function ($request) {
// Modify request
});
});
Testing:
Use Mailcoach::fake() to mock API calls and assert interactions:
Mailcoach::fake();
Mailcoach::createCampaign([/* ... */]);
Mailcoach::assertSentTimes(1);
Mailcoach::setEndpoint() dynamically for multi-instance setups.'pagination' => [
'limit' => 500, // Default per-page limit
],
How can I help you explore Laravel packages today?