PHPackages                             ashararsi/laravel-whatsapp-cloud - 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. [Admin Panels](/categories/admin)
4. /
5. ashararsi/laravel-whatsapp-cloud

ActiveLibrary[Admin Panels](/categories/admin)

ashararsi/laravel-whatsapp-cloud
================================

Production-ready Laravel 13 WhatsApp platform with Meta Cloud API, Twilio, multi-account support, webhooks, conversation inbox, admin panel, queues, and notifications

v1.0.0(1mo ago)04↓85.7%MITPHPPHP ^8.3CI failing

Since Jun 9Pushed 1mo agoCompare

[ Source](https://github.com/ashararsi/laravel-whatsapp-cloud)[ Packagist](https://packagist.org/packages/ashararsi/laravel-whatsapp-cloud)[ Docs](https://github.com/ashararsi/ashararsi-laravel-whatsapp-cloud)[ RSS](/packages/ashararsi-laravel-whatsapp-cloud/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (14)Versions (2)Used By (0)

Laravel WhatsApp Cloud
======================

[](#laravel-whatsapp-cloud)

[![Tests](https://github.com/ashararsi/ashararsi-laravel-whatsapp-cloud/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/ashararsi/ashararsi-laravel-whatsapp-cloud/actions/workflows/test.yml)[![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](LICENSE)[![Latest Stable Version](https://camo.githubusercontent.com/cc3491f37cce67dc2cc893a447c1414afd409e985d19d988e016a55a31fafde5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f72656c656173652d76312e302e302d677265656e2e737667)](https://github.com/ashararsi/ashararsi-laravel-whatsapp-cloud/releases/tag/v1.0.0)

**v1.0.0** — First public stable release.

A production-ready **WhatsApp conversation platform** for Laravel. Send messages via **Meta Cloud API** or **Twilio WhatsApp** using one unified fluent API, with contacts, conversations, campaigns, analytics, AI automation, and a full admin panel.

Features
--------

[](#features)

- **Meta Cloud API** — Direct Graph API integration with retry, rate-limit handling, and media upload
- **Twilio Provider** — Unified API for Twilio WhatsApp messaging
- **Multi Account Support** — Multiple Meta/Twilio accounts with encrypted credentials
- **Conversations** — Inbox with message timeline and reply form
- **Contacts** — CRM with notes and tags
- **Campaigns** — Broadcast messaging with queue support
- **Analytics** — Dashboard with charts, delivery rate, and cost estimation
- **AI Auto Reply** — OpenAI-powered automatic responses
- **Workflow Engine** — Configurable multi-step AI workflows
- **Template Sync** — Admin UI and CLI to sync Meta templates
- **Scheduled Messages** — Deferred send via `whatsapp:scheduled:send`
- **Admin Panel** — Bootstrap UI for accounts, settings, templates, and system monitoring
- **Database Settings** — Runtime configuration without `.env` changes

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

[](#requirements)

- PHP 8.3+
- Laravel 13.x

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

[](#installation)

```
composer require ashararsi/laravel-whatsapp-cloud
php artisan whatsapp:install
php artisan migrate
```

During install you choose **single app** or **multi-tenant** mode:

- **Single app** (default) — no `whatsapp_tenants` table, no `tenant_id` columns
- **Multi-tenant** — creates tenant tables and `tenant_id` columns on migrate

Non-interactive install:

```
php artisan whatsapp:install --single --migrate
php artisan whatsapp:install --tenant --migrate
```

Set `WHATSAPP_TENANT_ENABLED` in `.env` **before** `migrate` if you skip the installer prompt.

Configure runtime settings at `/admin/whatsapp/settings` after migration.

Provider Comparison
-------------------

[](#provider-comparison)

FeatureMeta Cloud APITwilio WhatsAppSetupMeta Business + Graph API tokenTwilio Account SID + Auth TokenTemplatesNative WhatsApp templatesTwilio Content SIDMediaURL-based (`link`)URL-based (`MediaUrl`)LocationNative location messageSent as formatted textWebhooksBuilt-in (`/whatsapp/webhook`)Built-in (`/whatsapp/twilio/webhook`)Status callbacksMeta delivery/read events`/whatsapp/twilio/status`Message ID`wamid.*``SM*` (Twilio SID)Best forDirect Meta integrationTeams already on TwilioQuick Start
-----------

[](#quick-start)

```
use Vendor\LaravelWhatsAppCloud\Facades\WhatsApp;

// Send a text message (uses default account)
WhatsApp::send('923001234567', 'Hello World');

// Target a specific account
WhatsApp::account(1)->sendText('923001234567', 'Hello');
WhatsApp::using('marketing')->send('923001234567', 'Sale Started');

// Queue for background delivery
WhatsApp::queue()->send('923001234567', 'Queued message');

// Send a template with variables
WhatsApp::template('923001234567', 'order_confirmed', ['Ali', '#12345']);
```

### Supported Methods

[](#supported-methods)

```
WhatsApp::sendText($to, $message, $previewUrl = false);
WhatsApp::sendTemplate($to, 'hello_world', 'en_US', $components);
WhatsApp::template($to, 'order_confirmed', ['Ali', '#12345']);
WhatsApp::sendImage($to, 'https://example.com/image.jpg', $caption);
WhatsApp::sendDocument($to, 'https://example.com/doc.pdf', $filename, $caption);
WhatsApp::sendAudio($to, 'https://example.com/audio.mp3');
WhatsApp::sendVideo($to, 'https://example.com/video.mp4', $caption);
WhatsApp::sendLocation($to, 24.86, 67.00, 'Office', 'Address');
```

Meta Cloud API Setup
--------------------

[](#meta-cloud-api-setup)

### 1. Create a Meta App

[](#1-create-a-meta-app)

1. Go to [Meta for Developers](https://developers.facebook.com/)
2. Create an app with **WhatsApp** product enabled
3. Add a phone number and generate a **permanent access token**
4. Copy **Phone Number ID** and **Access Token**

### 2. Create Account (code or admin)

[](#2-create-account-code-or-admin)

```
use Vendor\LaravelWhatsAppCloud\Models\WhatsAppAccount;

WhatsAppAccount::create([
    'name' => 'primary',
    'provider' => WhatsAppAccount::PROVIDER_META,
    'phone_number' => '923001234567',
    'phone_number_id' => 'YOUR_PHONE_NUMBER_ID',
    'access_token' => 'YOUR_ACCESS_TOKEN',
    'app_secret' => 'YOUR_META_APP_SECRET',
    'webhook_verify_token' => 'my-secret-token',
    'is_default' => true,
    'is_active' => true,
]);
```

### 3. Configure Webhook

[](#3-configure-webhook)

```
GET/POST  /whatsapp/webhook

```

In **Admin → Settings** (`/admin/whatsapp/settings`):

- Set **Global App Secret** (or store per-account `app_secret` on `whatsapp_accounts` — recommended)
- Enable **Require Meta Webhook Signature** for production

Twilio WhatsApp Setup
---------------------

[](#twilio-whatsapp-setup)

### 1. Enable WhatsApp in Twilio

[](#1-enable-whatsapp-in-twilio)

1. Sign up at [Twilio](https://www.twilio.com/)
2. Enable WhatsApp Sandbox or register a WhatsApp sender
3. Copy **Account SID**, **Auth Token**, and **WhatsApp number**

### 2. Create Twilio Account

[](#2-create-twilio-account)

```
WhatsAppAccount::create([
    'name' => 'twilio-support',
    'provider' => WhatsAppAccount::PROVIDER_TWILIO,
    'phone_number' => '923001234567',
    'twilio_sid' => 'ACxxxxxxxx',
    'twilio_token' => 'your_auth_token',
    'twilio_whatsapp_number' => '14155238886',
    'is_default' => false,
    'is_active' => true,
]);
```

### 3. Configure Twilio Webhooks

[](#3-configure-twilio-webhooks)

Point your Twilio WhatsApp sender to:

```
POST  /whatsapp/twilio/webhook   (inbound messages)
POST  /whatsapp/twilio/status    (delivery status callbacks)

```

Enable **Require Twilio Webhook Signature** in **Admin → Settings** (enabled by default).

Twilio signs requests with `X-Twilio-Signature` using the account **Auth Token** stored on each `WhatsAppAccount`.

### 4. Send via Twilio provider

[](#4-send-via-twilio-provider)

```
WhatsApp::using('twilio-support')->sendText('923001234567', 'Hello from Twilio');
```

Provider Architecture
---------------------

[](#provider-architecture)

```
WhatsApp::send()
    └── WhatsAppManager
            └── ProviderFactory::make($account)
                    ├── MetaProvider
                    └── TwilioProvider

```

### Extend with custom providers

[](#extend-with-custom-providers)

Implement `WhatsAppProviderInterface` and register in `config/whatsapp.php`:

```
'providers' => [
    'meta' => \Vendor\LaravelWhatsAppCloud\Providers\MetaProvider::class,
    'twilio' => \Vendor\LaravelWhatsAppCloud\Providers\TwilioProvider::class,
],
```

Conversation Platform
---------------------

[](#conversation-platform)

The package automatically tracks conversations:

TablePurpose`whatsapp_contacts`Per-account contact records`whatsapp_conversations`One thread per contact`whatsapp_conversation_messages`Incoming &amp; outgoing timeline- **Incoming**: stored automatically from Meta and Twilio webhooks
- **Outgoing**: stored when `WhatsApp::send()` succeeds
- **Message log**: all directions stored in `whatsapp_messages` (`direction`: `incoming` / `outgoing`)
- **Reply from inbox**: conversation detail page includes a reply form (sync or queued)

Disable with `WHATSAPP_CONVERSATIONS_ENABLED=false`.

### Admin URLs

[](#admin-urls)

URLFeature`/admin/whatsapp`Dashboard (stats + 7-day message volume)`/admin/whatsapp/contacts`Contact list + search`/admin/whatsapp/contacts/{id}`Contact detail with notes and tags`/admin/whatsapp/conversations`Conversation list + search`/admin/whatsapp/conversations/{id}`Message timeline + reply form`/admin/whatsapp/campaigns`Broadcast campaigns`/admin/whatsapp/templates`Message templates (sync, search, filter)`/admin/whatsapp/accounts`Account management`/admin/whatsapp/settings`Runtime settings (database)`/admin/whatsapp/system`Queue, API, and rate-limit health### CRM: Notes &amp; Tags

[](#crm-notes--tags)

On the contact detail page you can:

- Add and view internal notes
- Create tags and assign them to contacts
- Remove tags from a contact

Tags are scoped per WhatsApp account.

### Template Manager

[](#template-manager)

Manage Meta WhatsApp message templates from the admin panel or CLI.

URL / CommandPurpose`/admin/whatsapp/templates`List, search, and filter templates`/admin/whatsapp/templates/{id}`View template details and components`php artisan whatsapp:templates:sync`Sync templates from Meta**Categories:** `UTILITY`, `AUTHENTICATION`, `MARKETING`

**Statuses:** `APPROVED`, `PENDING`, `REJECTED`

#### Sync templates

[](#sync-templates)

```
# All active Meta accounts
php artisan whatsapp:templates:sync

# Specific account (ID or name)
php artisan whatsapp:templates:sync --account=primary

# Filter by provider
php artisan whatsapp:templates:sync --provider=meta
```

Requires a Meta account with `waba_id` (or `phone_number_id` as fallback) and a valid access token with `whatsapp_business_management` permission.

#### Send a template (simple variables)

[](#send-a-template-simple-variables)

Maps body placeholders `{{1}}`, `{{2}}`, … to an ordered variable list:

```
use Vendor\LaravelWhatsAppCloud\Facades\WhatsApp;

// Sends order_confirmed template with body variables
WhatsApp::template('923001234567', 'order_confirmed', [
    'Ali',      // {{1}}
    '#12345',   // {{2}}
]);

// Specific account + language override
WhatsApp::using('marketing')->template('923001234567', 'order_confirmed', ['Ali', '#12345'], 'en_US');
```

#### Send a template (full Meta components)

[](#send-a-template-full-meta-components)

For header/button parameters, use the low-level API:

```
WhatsApp::sendTemplate('923001234567', 'order_confirmed', 'en_US', [
    [
        'type' => 'body',
        'parameters' => [
            ['type' => 'text', 'text' => 'Ali'],
            ['type' => 'text', 'text' => '#12345'],
        ],
    ],
]);
```

#### Database table: `whatsapp_templates`

[](#database-table-whatsapp_templates)

ColumnDescription`account_id`Owning WhatsApp account`provider``meta` or `twilio``template_name`Meta template name`category``UTILITY`, `AUTHENTICATION`, `MARKETING``language`BCP-47 code (e.g. `en_US`)`status``APPROVED`, `PENDING`, `REJECTED``components_json`Raw Meta components array`meta_template_id`Meta Graph API template ID`synced_at`Last sync timestampThe dashboard shows approved, pending, and rejected template counts.

### Broadcast Campaigns

[](#broadcast-campaigns)

Create campaigns from `/admin/whatsapp/campaigns` or run pending drafts:

```
php artisan whatsapp:campaigns:run
```

Enable **Queue Campaign Sends** in **Admin → Settings** to queue bulk sends.

### AI &amp; Automation (optional)

[](#ai--automation-optional)

Set `WHATSAPP_OPENAI_API_KEY` in `.env` (secret — not stored in DB). Enable features in **Admin → Settings**:

- **AI Auto Reply**
- **Audio Transcription**
- **Keyword Auto Reply**
- **Process Incoming Messages**
- **Download Incoming Media**
- **Auto-reply rules** — keyword, first-message, and AI modes (`whatsapp_auto_replies` table)
- **Workflows** — `whatsapp_ai_workflows` with step fallback when OpenAI is unavailable
- **Media download** — Meta incoming attachments saved to disk (`WHATSAPP_MEDIA_DISK` in `.env`)
- **Audio transcription** — Whisper via OpenAI when enabled

Multi-Tenant Mode (Optional)
----------------------------

[](#multi-tenant-mode-optional)

Choose **multi-tenant** during `php artisan whatsapp:install`, or set manually:

```
WHATSAPP_TENANT_ENABLED=true
WHATSAPP_TENANT_RESOLVER=App\\WhatsApp\\TenantResolver
```

**Single-app mode** (default) skips `whatsapp_tenants` and all `tenant_id` columns entirely.

Implement `TenantResolverInterface` in your app:

```
use Vendor\LaravelWhatsAppCloud\Contracts\TenantResolverInterface;

class TenantResolver implements TenantResolverInterface
{
    public function resolve(): ?int
    {
        return auth()->user()?->tenant_id;
    }
}
```

Register the resolver in a service provider:

```
$this->app->bind(
    \Vendor\LaravelWhatsAppCloud\Contracts\TenantResolverInterface::class,
    TenantResolver::class,
);

config(['whatsapp.tenant.resolver' => TenantResolver::class]);
```

When tenant mode is enabled:

- Admin routes automatically run `ResolveWhatsAppTenant` middleware (disable with `WHATSAPP_TENANT_ADMIN_MIDDLEWARE=false`)
- Queries are scoped to the active tenant once `TenantContext` is set
- Webhooks and CLI commands still work globally (no tenant scope until you set one)
- `tenant_id` is auto-filled on create from the active tenant or related account

Run code for a specific tenant without middleware:

```
app(\Vendor\LaravelWhatsAppCloud\Services\TenantContext::class)
    ->runForTenant($tenantId, fn () => WhatsApp::sendText('923001234567', 'Hello'));
```

> **Scope note:** Filament admin resources are not included. The package ships a Bootstrap admin panel; publish views to integrate with your own layout.

Admin Panel
-----------

[](#admin-panel)

`/admin/whatsapp/accounts` — create accounts with provider-specific fields:

- **Meta**: Phone Number ID, Access Token, App Secret, Webhook Verify Token
- **Twilio**: Account SID, Auth Token, WhatsApp Number

Customizing Admin Views &amp; Theme
-----------------------------------

[](#customizing-admin-views--theme)

All admin UI lives in the **package**. Your Laravel app does not need to create CRUD views manually.

### Where views live

[](#where-views-live)

LocationPurposePackage (default)`vendor/ashararsi/laravel-whatsapp-cloud/resources/views/`Published override`resources/views/vendor/whatsapp/` in your appPackage views are loaded with the `whatsapp::` namespace:

```
@extends('whatsapp::layouts.admin')
```

Laravel uses **published views first**. If a file exists in `resources/views/vendor/whatsapp/`, it overrides the package copy.

### Publish views to your project

[](#publish-views-to-your-project)

```
php artisan vendor:publish --tag=whatsapp-views
```

Published structure:

```
resources/views/vendor/whatsapp/
├── layouts/
│   └── admin.blade.php          # Master layout (sidebar, menu, alerts)
└── admin/
    ├── dashboard.blade.php
    ├── accounts/
    ├── contacts/
    └── conversations/

```

Re-publish after package updates (overwrites your copies):

```
php artisan vendor:publish --tag=whatsapp-views --force
```

Back up customized files before using `--force`.

### Option 1 — Enhance the package master layout

[](#option-1--enhance-the-package-master-layout)

Edit the published master layout:

```
resources/views/vendor/whatsapp/layouts/admin.blade.php

```

This file controls:

- Sidebar / top navigation
- Active menu state
- Flash messages (`success`, `error`)
- Page wrapper around `@yield('content')`
- `@yield('title')` for the page heading

Child pages only fill the content section. Example account list:

```
@extends('whatsapp::layouts.admin')

@section('title', 'WhatsApp Accounts')

@section('content')
    {{-- your table / forms here --}}
@endsection
```

Add your CSS, JS, fonts, or branding inside `admin.blade.php` (or link your existing admin assets).

### Option 2 — Use your app's main admin theme (recommended)

[](#option-2--use-your-apps-main-admin-theme-recommended)

If your project already has a layout (Filament, AdminLTE, custom `layouts.app`, etc.), point package pages to **your** layout instead of the package default.

**Step 1.** Publish views:

```
php artisan vendor:publish --tag=whatsapp-views
```

**Step 2.** Change `@extends` in published admin pages. Example for accounts index:

```
{{-- resources/views/vendor/whatsapp/admin/accounts/index.blade.php --}}
@extends('layouts.app')   {{-- your app master layout --}}

@section('content')
    @include('whatsapp::admin.accounts.partials.header')
    {{-- keep existing table markup from the published file --}}
@endsection
```

**Step 3.** Move package navigation into your sidebar. Reuse the same routes:

```
Dashboard
Contacts
Conversations
Accounts
```

**Step 4.** Optionally replace only the master layout by making your layout extend the package structure, or delete sidebar from `layouts/admin.blade.php` and `@include` your global header/sidebar.

### Option 3 — Override a single page

[](#option-3--override-a-single-page)

You do not need to publish everything. Publish once, then edit only the pages you care about:

```
resources/views/vendor/whatsapp/admin/accounts/_form.blade.php

```

Unpublished pages still load from the package automatically.

### View resolution order

[](#view-resolution-order)

```
1. resources/views/vendor/whatsapp/...   (your app — wins)
2. vendor/ashararsi/laravel-whatsapp-cloud/resources/views/...   (package default)

```

### After customization

[](#after-customization)

```
php artisan view:clear
```

### Tips

[](#tips)

- Keep `@section('content')` and `@section('title')` when overriding child views.
- Do not rename route names (`whatsapp.admin.*`); controllers depend on them.
- For provider fields (Meta / Twilio), customize `admin/accounts/_form.blade.php`.
- For conversation bubbles styling, see CSS classes `timeline-incoming` and `timeline-outgoing` in the master layout.

Incoming Messages
-----------------

[](#incoming-messages)

Every webhook delivery is logged to `whatsapp_messages` when **Log Outgoing Messages** is enabled in **Admin → Settings**:

ColumnDescription`direction``incoming` or `outgoing``from` / `to`Sender and recipient phone`whatsapp_message_id`Meta `wamid.*` or Twilio `SM*` (unique)`meta_json`Raw webhook payload`status``received`, `sent`, `delivered`, `read`, `failed`Duplicate webhook deliveries are ignored via unique `whatsapp_message_id` constraints.

Doctor Command
--------------

[](#doctor-command)

Run a full health check before production:

```
php artisan whatsapp:doctor
```

Checks database tables, queues, routes, webhook secrets, Meta/Twilio credentials, storage, and cache. Output levels: **PASS**, **WARNING**, **ERROR**.

Runtime Settings (Database)
---------------------------

[](#runtime-settings-database)

Operational settings are stored in the `whatsapp_settings` table and managed from the admin panel. **No `.env` variables are required** for these — changes apply at runtime without redeploying.

**Admin URL:** `/admin/whatsapp/settings`

Setting keyDefaultGroup`general.default_account`*(empty)*General`general.default_provider``meta`General`general.api_version``v21.0`General`webhook.app_secret`*(empty)*Webhook`webhook.require_signature``false`Webhook`twilio.require_signature``true`Twilio`graph_api.timeout``30`Graph API`graph_api.max_retries``3`Graph API`queue.enabled``true`Queue`queue.tries``3`Queue`campaigns.use_queue``false`Campaigns`cost.utility` / `cost.marketing``0.005` / `0.015`Cost`ai.enabled``false`AI`ai.transcription_enabled``false`AI`auto_reply.enabled``true`Auto Reply`media.enabled``true`Media`events.process_incoming``true`Events`log_messages``true`Logging`admin.authorization_enabled``true`Admin```
// Programmatic access
app(\Vendor\LaravelWhatsAppCloud\Services\WhatsAppSettingsService::class)->get('queue.enabled');
app(\Vendor\LaravelWhatsAppCloud\Services\WhatsAppSettingsService::class)->updateMany([
    'webhook.require_signature' => true,
]);
```

After `php artisan migrate`, defaults are seeded automatically.

Environment Variables (infrastructure only)
-------------------------------------------

[](#environment-variables-infrastructure-only)

Use `.env` only for **host-app infrastructure and secrets** — not runtime feature toggles:

```
# Queue infrastructure
WHATSAPP_QUEUE_CONNECTION=
WHATSAPP_QUEUE_NAME=default

# Admin routing (optional)
WHATSAPP_ADMIN_PREFIX=admin/whatsapp
WHATSAPP_ADMIN_GATE=manage-whatsapp

# Webhook route prefix
WHATSAPP_WEBHOOK_PREFIX=whatsapp

# Storage & API base
WHATSAPP_MEDIA_DISK=local
WHATSAPP_API_BASE_URL=https://graph.facebook.com

# OpenAI secret (never store in DB)
WHATSAPP_OPENAI_API_KEY=

# Optional infrastructure
WHATSAPP_CONVERSATIONS_ENABLED=true
WHATSAPP_CACHE_ENABLED=true
WHATSAPP_CACHE_TTL=300
```

Notifications
-------------

[](#notifications)

```
use Vendor\LaravelWhatsAppCloud\Notifications\WhatsAppChannel;

public function via($notifiable): array
{
    return [WhatsAppChannel::class];
}

public function toWhatsApp($notifiable): array
{
    return [
        'using' => 'twilio-support', // or account ID
        'text' => 'Your order shipped!',
        'queue' => true,
    ];
}
```

Webhooks
--------

[](#webhooks)

### Meta

[](#meta)

```
GET/POST  /whatsapp/webhook

```

Per-account `app_secret` on `whatsapp_accounts` is used for `X-Hub-Signature-256` verification. Falls back to the **Global App Secret** from **Admin → Settings** when the account secret is empty.

```
use Vendor\LaravelWhatsAppCloud\Events\MessageReceived;

Event::listen(MessageReceived::class, function (MessageReceived $event) {
    // Handle incoming message (Meta or Twilio)
});
```

### Twilio

[](#twilio)

```
POST  /whatsapp/twilio/webhook
POST  /whatsapp/twilio/status

```

Supports inbound text, media, and location payloads plus status callbacks: `queued`, `sent`, `delivered`, `failed`, `undelivered`.

Testing &amp; Quality
---------------------

[](#testing--quality)

```
composer test
composer analyse    # PHPStan
composer format     # Laravel Pint
```

Security Recommendations
------------------------

[](#security-recommendations)

1. Enable **Require Meta Webhook Signature** in **Admin → Settings** for production.
2. Store a unique `app_secret` per Meta account when running multiple apps.
3. Keep **Require Twilio Webhook Signature** enabled (default) for Twilio webhooks.
4. Never commit access tokens or auth tokens — they are encrypted on `whatsapp_accounts`.
5. Keep **Require Admin Authorization** enabled and protect admin routes with your gate.
6. Run `php artisan whatsapp:doctor` after deploy to verify configuration.

See [SECURITY.md](SECURITY.md) and [UPGRADE.md](UPGRADE.md).

Screenshots
-----------

[](#screenshots)

> Placeholder — add screenshots of the admin dashboard, conversation inbox, and account management UI here before release.

ScreenshotDescription`docs/screenshots/dashboard.png`Admin dashboard with stats`docs/screenshots/inbox.png`Conversation timeline with reply form`docs/screenshots/accounts.png`Multi-account provider setupLicense
-------

[](#license)

This project is licensed under the [MIT License](LICENSE).

Copyright (c) 2026 Ashar Arsi

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance91

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity48

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

46d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/cd25ae7c14c2b43e44b01e76bda07a35f549b567e5ee65315f58d4e97567b0a4?d=identicon)[ashararsi](/maintainers/ashararsi)

---

Top Contributors

[![ashararsi](https://avatars.githubusercontent.com/u/57168419?v=4)](https://github.com/ashararsi "ashararsi (11 commits)")

---

Tags

laravelainotificationslaravel-packagetwilioopenaimessagingwebhookcrmcampaignwhatsappmetawhatsapp-businesswhatsapp-cloud-apiadmin-panelconversationsBroadcastlaravel-13multi-account

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/ashararsi-laravel-whatsapp-cloud/health.svg)

```
[![Health](https://phpackages.com/badges/ashararsi-laravel-whatsapp-cloud/health.svg)](https://phpackages.com/packages/ashararsi-laravel-whatsapp-cloud)
```

###  Alternatives

[psalm/plugin-laravel

Psalm plugin for Laravel

3345.3M347](/packages/psalm-plugin-laravel)[laravel/cashier

Laravel Cashier provides an expressive, fluent interface to Stripe's subscription billing services.

2.5k30.2M151](/packages/laravel-cashier)[laravel/pulse

Laravel Pulse is a real-time application performance monitoring tool and dashboard for your Laravel application.

1.7k15.1M136](/packages/laravel-pulse)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9762.4M133](/packages/roots-acorn)[laravel/mcp

Rapidly build MCP servers for your Laravel applications.

77922.3M186](/packages/laravel-mcp)[api-platform/laravel

API Platform support for Laravel

58174.6k17](/packages/api-platform-laravel)

PHPackages © 2026

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