zapmizer/laravel-notification-zapmizer
| Install | |
|---|---|
composer require zapmizer/laravel-notification-zapmizer |
|
| Latest Version: | v1.0.1 |
| PHP: | ^8.2 |
| Laravel: | 10 · 11 |
| Older releases: | 8 · 9 · 12 · 13 |
| License: | MIT |
| Last Updated: | Oct 17, 2026 |
| Links: | GitHub · Packagist |
Zapmizer WhatsApp notification channel for Laravel 8 to 13
Installation
You can install the package via composer:
composer require zapmizer/laravel-notification-zapmizer
Now publish config file
php artisan vendor:publish --provider="Notification\Zapmizer\ZapmizerServiceProvider" --tag=config --force
Setting up your Zapmizer account
- Create a API TOKEN.
- Paste your API token in your
zapmizer.phpconfig file. - Add environment viariables with values
ZAPMIZER_API_TOKEN="your-api-token"
ZAPMIZER_FROM_NUMBER="558181643260"
Usage
In every Notification you wish to notify via WhatsApp, you must add a toZapmizer function and add 'zapmizer' drive into via's array:
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return ['mail', 'zapmizer'];
}
/**
* Get the WhatsApp representation of the notification.
*/
public function toZapmizer(object $notifiable)
{
$message = 'This is a message!' . PHP_EOL;
//WID must follow the WhatsApp pattern, example: 558181643260; 558181643260@c.us 128172192@g.us(groups)
return ZapmizerMessage::create(from: config('zapmizer.from_number'), to: $notifiable->wid)->type('chat')->text($message)->send();
}
Number verification
Mirroring Laravel's MustVerifyEmail: implement an interface and use a trait on your User model, and it gains the verification methods you'd expect. The user verifies through a hosted page on the Zapmizer domain — they message the team's WhatsApp number via wa.me and type back the code the bot replies with. Your app confirms the code (hosted page or your own input) and/or receives the terminal state on the team's webhooks. State lives in the package's own tables — your users table is never touched.
use NotificationChannels\Zapmizer\Contracts\MustVerifyWhatsapp as MustVerifyWhatsappContract;
use NotificationChannels\Zapmizer\MustVerifyWhatsapp;
class User extends Authenticatable implements MustVerifyWhatsappContract
{
use MustVerifyWhatsapp;
}
<a href="{{ route('zapmizer.verify_number') }}">Verify your WhatsApp</a>
$user->hasVerifiedWhatsapp(); // true after the user completes the hosted page
See the full setup guide — credentials, env vars, migrations, User model, signed return URL, confirmation webhook and events — in docs/verify-number.md.
Connecting a number per team (multi-tenant)
Mirroring Cashier's Billable: put the Connectable trait on the model that owns a WhatsApp number (a Team, a User, ...) and it gets its own Zapmizer connection. The whole flow happens in one hosted popup on Zapmizer — authorization, QR code pairing, webhook registration — and the callback lands with everything: no wizard, no QR code, no polling on your side. A connect button and a connection panel ship as publishable Inertia + Vue stubs. Inbound messages arrive signed on the package's webhook and fire MessageReceived with the connection that received them.
use NotificationChannels\Zapmizer\Connectable as ConnectsZapmizer;
use NotificationChannels\Zapmizer\Contracts\Connectable;
class Team extends Model implements Connectable
{
use ConnectsZapmizer;
}
$team->zapmizerMessage('5511999999999')->text('Hello')->send();
Event::listen(function (MessageReceived $event) {
$event->message->fromPhone; // who wrote
$event->message->body;
$event->connection?->connectable; // the Team — null when the delivery was
// signed with the single-tenant secret
});
Bot events (message, ...) are only accepted signed. Single-tenant applications set ZAPMIZER_WEBHOOK_SECRET to the secret of the webhook they registered on Zapmizer; connected models store their own.
See docs/connect.md for the setup: partner credentials, the resolver, routes and statuses, the Vue stubs, the signed webhook and secret rotation. Requires Zapmizer 1.149.0 or later (hosted pairing); receiving media ($connection->media($message)) requires 1.150.0 or later.
Related Packages
Laravel package for WhatsApp device management via WuzAPI with multi-owner suppo...
Rocket.Chat Notifications channel for Laravel 5.6+
A Laravel notification channel for sending PagerDuty events.
Production-grade communications domain for Laravel - outbound, inbound, and inte...
Version History
| Version | Released | PHP | Laravel | License |
|---|---|---|---|---|
| v1.0.1 | ^8.2 | ~10.0 || | MIT | |
| v1.0.0 | ^8.2 | ~10.0 || | MIT | |
| 0.4.1 | ^8.1 | ^8.83 || | MIT | |
| 0.4.0 | ^8.1 | ^8.83 || | MIT | |
| 0.3.1 | ^8.2 | ~10.0 || | MIT | |
| 0.3.0 | ^8.2 | ~10.0 || | MIT | |
| 0.2.0 | ^8.2 | ~10.0 || | MIT | |
| 0.1.1 | ^8.2 | ~10.0 || | MIT | |
| 0.1.0 | ^8.2 | ~10.0 || | MIT | |
| 0.0.6 | ^8.2 | ~10.0 || | MIT | |
| 0.0.5 | ^8.2 | ~10.0 || | MIT | |
| 0.0.4 | ^8.2 | ~10.0 || | MIT | |
| 0.0.3 | ^8.2 | ~10.0 || | MIT | |
| 0.0.2 | ^8.2 | ~10.0 || | MIT | |
| 0.0.1 | ^8.2 | ~10.0 || | MIT |