A robust and dynamic ticketing system plugin for Filament 4, providing a complete helpdesk solution for your Laravel application.
Tickets List
Ticket View
Submit Ticket Form
User's Tickets List
User's Chat View
User's Chat View with Closed Status
You can install the package via composer:
composer require daacreators/creators-ticketing
After installation, publish the config file:
php artisan vendor:publish --tag="creators-ticketing-config"
The plugin integration code should be added to your main Filament admin panel provider file, which is typically located at:
app/Providers/Filament/AdminPanelProvider.php
Open your AdminPanelProvider.php file and modify the panel() method as shown below:
use Filament\Panel;use Filament\PanelProvider;use daacreators\CreatorsTicketing\TicketingPlugin; class AdminPanelProvider extends PanelProvider{ public function panel(Panel $panel): Panel { return $panel ->default() ->plugins([ TicketingPlugin::make(), ]); }}
Run the migrations:
php artisan migrate
After running migrations, you can seed default ticket statuses using the provided seeder:
php artisan db:seed --class=daacreators\\CreatorsTicketing\\Database\\Seeders\\TicketStatusSeeder
This will create the following default ticket statuses:
The seeder uses updateOrCreate to prevent duplicates, so you can safely run it multiple times.
⚠️ Important: Version 1.0.6 introduces new fields to the database table. If you are upgrading from a previous version, you must run the migrations after updating the package to ensure the system functions correctly:
php artisan migrate
Configure the package by setting values in your .env file or directly in the config/creators-ticketing.php file:
TICKETING_NAV_GROUP="Creators Ticketing" USER_MODEL="\App\Models\User" TICKETING_NAV_FIELD=emailTICKETING_NAV_ALLOWED=admin@demo.com,manager@demo.com
You can control who sees the ticketing resources in the admin panel by configuring the navigation visibility rules:
'navigation_visibility' => [ 'field' => 'email', 'allowed' => ['admin@site.com', 'manager@site.com']],
This plugin is fully localized and supports multiple languages out of the box. It automatically detects and uses your application's current locale configuration (config/app.php).
Currently supported languages:
en) - Defaultes)pt_BR)fr)de)ar)zh_CN)If you wish to modify the texts or add a new language, you can publish the translation files:
php artisan vendor:publish --tag="creators-ticketing-translations"
Tickets can be managed through the Filament admin panel. You can:
To add the tickets and ticket submission form to your frontend:
@livewire('creators-ticketing::ticket-submit-form')
The package includes a ticket statistics widget. Add it to your Filament dashboard:
use daacreators\CreatorsTicketing\Filament\Widgets\TicketStatsWidget; class DashboardConfig extends Config{ public function widgets(): array { return [ TicketStatsWidget::class, ]; }}
The plugin dispatches events for major ticket actions, allowing you to extend functionality with custom listeners.
All events are located in the daacreators\CreatorsTicketing\Events namespace:
| Event | Triggered When | Properties |
|---|---|---|
TicketCreated |
A new ticket is created | Ticket $ticket, ?User $user |
TicketAssigned |
Ticket is assigned/reassigned | Ticket $ticket, ?int $oldAssigneeId, ?int $newAssigneeId, ?User $assignedBy |
TicketStatusChanged |
Ticket status changes | Ticket $ticket, ?TicketStatus $oldStatus, TicketStatus $newStatus, ?User $changedBy |
TicketPriorityChanged |
Ticket priority changes | Ticket $ticket, TicketPriority $oldPriority, TicketPriority $newPriority, ?User $changedBy |
TicketTransferred |
Ticket moved to another department | Ticket $ticket, Department $oldDepartment, Department $newDepartment, ?User $transferredBy |
TicketReplyAdded |
Public reply added to ticket | Ticket $ticket, TicketReply $reply |
InternalNoteAdded |
Internal note added | Ticket $ticket, TicketReply $note |
TicketClosed |
Ticket status changed to closing status | Ticket $ticket, ?User $closedBy |
TicketDeleted |
Ticket is deleted | int $ticketId, string $ticketUid, ?User $deletedBy |
Model Classes:
Ticket → daacreators\CreatorsTicketing\Models\Ticket
TicketStatus → daacreators\CreatorsTicketing\Models\TicketStatus
TicketReply → daacreators\CreatorsTicketing\Models\TicketReply
Department → daacreators\CreatorsTicketing\Models\Department
TicketPriority → daacreators\CreatorsTicketing\Enums\TicketPriority (Enum)User → Your configured user model (default: App\Models\User)Note: Properties marked with
?are nullable and may benullin certain contexts.
Create a listener in your application to respond to these events:
Step 1: Create a listener class
php artisan make:listener SendTicketCreatedEmail
Step 2: Implement the listener
<?php namespace App\Listeners; use Illuminate\Support\Facades\Mail;use daacreators\CreatorsTicketing\Events\TicketCreated;use Illuminate\Contracts\Queue\ShouldQueue; class SendTicketCreatedEmail implements ShouldQueue{ public function handle(TicketCreated $event): void { $ticket = $event->ticket; $user = $event->user; Mail::to($ticket->requester->email)->send( new \App\Mail\TicketCreatedMail($ticket) ); if ($ticket->assignee) { Mail::to($ticket->assignee->email)->send( new \App\Mail\NewTicketAssignedMail($ticket) ); } }}
Step 3: Register the listener in EventServiceProvider
<?php namespace App\Providers; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;use daacreators\CreatorsTicketing\Events\TicketCreated;use daacreators\CreatorsTicketing\Events\TicketAssigned;use daacreators\CreatorsTicketing\Events\TicketStatusChanged;use App\Listeners\SendTicketCreatedEmail;use App\Listeners\NotifyAssigneeListener;use App\Listeners\SendStatusChangeNotification; class EventServiceProvider extends ServiceProvider{ protected $listen = [ TicketCreated::class => [ SendTicketCreatedEmail::class, ], TicketAssigned::class => [ NotifyAssigneeListener::class, ], TicketStatusChanged::class => [ SendStatusChangeNotification::class, ], ];}
1. Send Email When Ticket is Assigned
use daacreators\CreatorsTicketing\Events\TicketAssigned;use Illuminate\Support\Facades\Mail; class NotifyAssigneeListener{ public function handle(TicketAssigned $event): void { if ($event->newAssigneeId) { $assignee = \App\Models\User::find($event->newAssigneeId); Mail::to($assignee->email)->send( new \App\Mail\TicketAssignedToYouMail($event->ticket, $assignee) ); } }}
2. Send Slack Notification for High Priority Tickets
use daacreators\CreatorsTicketing\Events\TicketPriorityChanged;use daacreators\CreatorsTicketing\Enums\TicketPriority;use Illuminate\Support\Facades\Http; class SlackHighPriorityAlert{ public function handle(TicketPriorityChanged $event): void { if ($event->newPriority === TicketPriority::HIGH) { Http::post(config('services.slack.webhook_url'), [ 'text' => "High Priority Ticket: #{$event->ticket->ticket_uid}", 'blocks' => [ [ 'type' => 'section', 'text' => [ 'type' => 'mrkdwn', 'text' => "*Ticket:* {$event->ticket->title}\n*Department:* {$event->ticket->department->name}" ] ] ] ]); } }}
The package includes built-in security features:
Thank you for considering contributing to Creators Ticketing! You can contribute in the following ways:
The MIT License (MIT). Please see License File for more information.
If you discover any security-related issues, please email hello@jabirkhan.com.
Built with ❤️ by DAA Creators
DAA Creators is a software development team focused on building high-quality tools and plugins for the Laravel and Filament ecosystem. Creators Ticketing is our premier helpdesk and support solution.