a2zwebltd / laravel-customer-support
A portable Laravel customer support / helpdesk engine — tickets, threaded replies, attachments, SLA tracking, mail notifications, Livewire UI, and Nova admin.
Package info
github.com/a2zwebltd/laravel-customer-support
pkg:composer/a2zwebltd/laravel-customer-support
Requires
- php: ^8.2
- laravel/framework: ^11.0|^12.0|^13.0
- spatie/laravel-medialibrary: ^11.0
Requires (Dev)
- laravel/pint: ^1.25
- livewire/livewire: ^3.0|^4.0
- orchestra/testbench: ^9.0|^10.0|^11.0
- pestphp/pest: ^3.0|^4.0
- pestphp/pest-plugin-laravel: ^3.0|^4.0
Suggests
- laravel/nova: Auto-registers Nova resources (SupportTicket, SupportTicketMessage) when present.
- livewire/flux: Recommended UI component library used by the bundled Blade templates.
- livewire/livewire: Enables the reactive Livewire UI layer (TicketsIndex, TicketCreate, TicketShow components).
README
A portable Laravel customer-support / helpdesk engine — tickets with threaded replies, attachments, internal notes, agent assignment, SLA tracking, mail notifications, a Livewire + Flux UI, and Nova admin resources.
Designed to drop into any Laravel app with minimal wiring while remaining fully customisable.
Requirements
- PHP 8.2+
- Laravel 11 / 12 / 13
livewire/livewire^3 or ^4 (for the bundled UI)livewire/flux^2 (recommended — Blade templates use Flux components)spatie/laravel-medialibrary^11 (attachments)laravel/nova^5 (optional — auto-registers Nova resources when present)
Installation
composer require a2zwebltd/laravel-customer-support
php artisan migrate
php artisan vendor:publish --tag=customer-support-config # optional
Add the trait to your User model:
use A2ZWeb\CustomerSupport\Concerns\HasSupportTickets; class User extends Authenticatable implements HasMedia { use HasSupportTickets; }
Define the agent gate in AppServiceProvider::boot():
Gate::define('manage-support-tickets', fn (User $user) => $user->is_admin);
Features
- Ticket statuses: Open, Pending, In Progress, Awaiting Customer, Resolved, Closed
- Priorities: Low / Normal / High / Urgent — each with configurable SLA hours
- Configurable categories
- Threaded replies (
SupportTicketMessage) - Internal notes (visible only to agents)
- Attachments via
spatie/laravel-medialibrary(on tickets and messages) - Agent assignment with
assigned_to - SLA timer (
due_at) +EscalateOverdueTicketsconsole command for cron escalation - Mail notifications: created / replied / status-changed / resolved (markdown, queueable)
- Domain events:
TicketCreated,TicketReplied,TicketStatusChanged,TicketAssigned - Policies on ticket + message resources
- Livewire + Flux UI (teal accent, dark-mode aware)
- Nova resources auto-registered when Nova is installed
Routes
| Method | URI | Name |
|---|---|---|
| GET | /support |
support.index |
| GET | /support/new |
support.create |
| GET | /support/{ticket} |
support.show |
| GET | /support/admin |
support.admin.dashboard |
(Prefix and middleware configurable in config/customer-support.php.)
Configuration
See config/customer-support.php. Highlights: user_model, routes, admin_gate, categories, sla_hours, mail.admin_recipients, attachments, theme.accent.
Cron
// routes/console.php use Illuminate\Support\Facades\Schedule; Schedule::command('support:escalate-overdue')->hourly();
Testing
composer test
License
MIT — see LICENSE file.