Search by

daacreators / creators-ticketing

jabirmayar

A robust and dynamic ticketing system for Filament

Package info

github.com/jabirmayar/creators-ticketing

pkg:composer/daacreators/creators-ticketing

Statistics

Installs: 7 564

Dependents: 0

Suggesters: 0

Stars: 35

Open Issues: 5

v1.3.1 2026-10-23 13:46 UTC

README

Latest Version on Packagist Total Downloads License

A robust and dynamic ticketing system plugin for Filament, providing a complete helpdesk solution for your Laravel application.

Need a Helpdesk for Your Shopify Store?

Creators Helpdesk Creators Helpdesk – A modern, lightweight helpdesk for Shopify merchants. Try it free for 14 days.

Screenshots

Tickets List Tickets List

Ticket View Ticket View

Create Automation Create Automation

Submit Ticket Form Submit Ticket Form

User Tickets List User's Tickets List

User Tickets List User's Chat View

User Tickets List User's Chat View with Closed Status

Features

  • Full ticketing system with departments and forms
  • Agent management with department assignments
  • Custom form builder for ticket submissions
  • Real-time ticket chat using Livewire
  • Ticket statistics dashboard widget
  • Granular permission system
  • Read/Unread status indicators for agents
  • File attachments support
  • Advanced spam protection system
  • Responsive design
  • Multi-language support
  • Event system for extensibility
  • Automation based on events
  • Seamless integration with Filament

Requirements

  • PHP 8.2 or higher
  • Laravel 11.x|12.x
  • Filament 4.1.7|5.1 or higher
  • Livewire 3.x

Installation

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"

Setup: Filament Panel Integration

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

Seeding Ticket Statuses

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:

  • Open (Blue) - Default status for new tickets
  • In Progress (Amber) - Tickets being worked on
  • Answered (Green) - Tickets that have been answered
  • Pending (Purple) - Tickets waiting for response
  • Resolved (Green) - Tickets that have been resolved
  • Closed (Gray) - Closing status for completed tickets

The seeder uses updateOrCreate to prevent duplicates, so you can safely run it multiple times.

Upgrading

Upgrading to v1.3.0

Run php artisan migrate to add the guest fields and make ticket/reply requester IDs nullable, then run php artisan filament:assets and php artisan optimize:clear. The public page, guest submission, and customer emails are all opt-in; see the public support setup below. Existing embedded forms and authenticated ticket ownership remain supported.

The guest migrations preserve existing requester IDs and foreign-key actions. They support MySQL/MariaDB, PostgreSQL, and SQLite. Back up your database before upgrading. Rolling back is blocked while affected tables contain records with a null user_id; assign those records to users or archive them before rollback.

Public submission now validates that the department is active/public and that the form is active and attached to that department. Only configured form fields are persisted. Custom integrations that submitted other fields or modified server-controlled Livewire state must be updated. Public chat rejects closed tickets and escapes customer input; unsafe HTML is sanitized when displaying replies. TicketCreated is dispatched once per creation instead of twice from the embedded form.

Upgrading from v1.1.8 to v1.1.9

⚠️ Important: Version v1.1.9 and 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

Configuration

Basic Configuration

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=email
TICKETING_NAV_ALLOWED=admin@demo.com,manager@demo.com

UUID / ULID / Nanoid user IDs

This package now creates user_id, assignee_id, and seen_by columns using the configured user ID type.

  • UUID: no extra config needed (default for non-int keys)
  • ULID: no extra config needed if your user model uses HasUlids
  • Custom string (e.g. nanoid): set the key type + length so foreign keys match your users.id
TICKETING_USER_KEY_TYPE=char
TICKETING_USER_KEY_LENGTH=21

Navigation Visibility

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']
],

Multi-language Support

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:

  • πŸ‡ΊπŸ‡Έ English (en) - Default
  • πŸ‡ͺπŸ‡Έ Spanish (es)
  • πŸ‡§πŸ‡· Portuguese (Brazil) (pt_BR)
  • πŸ‡«πŸ‡· French (fr)
  • πŸ‡©πŸ‡ͺ German (de)
  • πŸ‡ΈπŸ‡¦ Arabic (ar)
  • πŸ‡¨πŸ‡³ Chinese (Simplified) (zh_CN)

Publishing Translations

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"

Usage

Public Support Page and Customer Emails

Customers can submit and follow a ticket without creating an account. Enable the public page, guest submissions, and customer email notifications in your application's .env:

TICKETING_PUBLIC_PAGE_ENABLED=true
TICKETING_ALLOW_GUEST_TICKETS=true
TICKETING_CUSTOMER_EMAILS_ENABLED=true
TICKETING_PUBLIC_PATH=support

Run the package migrations (including the guest ticket migrations) and publish the frontend CSS:

php artisan migrate
php artisan filament:assets
php artisan optimize:clear

Create an active public department, attach an active form, and seed the ticket statuses as described above. Visit /support for the customer submission page. The package supplies its own layout with Livewire and CSS; no application layout or login route is required for guests. Existing applications can continue embedding <livewire:creators-ticketing.ticket-submit-form />.

After submission, a customer sees a private /tickets/track/{token} link and receives a confirmation email containing the same link. Public staff replies also send an email with the reply text and ticket link. Customers use the link to view the conversation and reply in their browser. Internal notes and customer-authored replies do not send customer emails. Registered customers receive links to their own tickets on the support page and must be authenticated to access them.

Configure Laravel's mail transport and MAIL_FROM_ADDRESS before enabling emails. Notifications use Laravel's configured queue connection and are dispatched after database transactions commit. For an asynchronous queue such as database or redis, run a worker:

php artisan queue:work

The sync queue connection sends during the request. Failed asynchronous deliveries use Laravel's normal failed-job/retry handling. A synchronous mail or enqueue failure is reported without rejecting an already saved ticket. Use the log mailer for local previews. Email delivery to a real inbox requires a working mail transport.

The public support page, guest submission, and customer emails are all disabled by default. The /support route is only registered when TICKETING_PUBLIC_PAGE_ENABLED=true, so existing application routes remain unaffected by default. Tracking links for existing guest tickets remain available when the public page is disabled. If you supply your own layout, set guest_layout in config/creators-ticketing.php to your Blade layout name and include Livewire assets and the package CSS. When the public page is disabled, registered customer notifications omit the support-page action. After changing the public page setting or path, clear cached configuration and routes with php artisan optimize:clear.

Treat tracking links as passwords: anyone with a link can view and reply to that ticket. Changing or clearing its guest_token revokes access, including already open chats. Guests cannot browse other tickets by ID or use the authenticated private attachment endpoint. Guest replies accept plain text, enforce rate limits, and reject closed tickets. Replying directly to an email is not supported; inbound email handling is a separate integration.

The included host-application regression tests cover guest and authenticated submission, email contents and recipients, internal-note isolation, token authorization and revocation, validation, rate limits, and upgrade/rollback behavior. See tests/README.md for setup:

php artisan test --filter=CreatorsTicketing

Creating Forms

  1. Go to the Forms section in the admin panel
  2. Create a new form with custom fields

Setting Up Departments

  1. Navigate to the Filament admin panel
  2. Go to the Departments section
  3. Create departments and assign agents
  4. Assign the form to specific departments

Managing Tickets

Tickets can be managed through the Filament admin panel. You can:

  • View all tickets (New updates are marked with a "NEW" badge)
  • Assign tickets to agents
  • Change ticket status
  • Add internal notes
  • Communicate with users
  • Track ticket activities

Frontend Integration

To add the tickets and ticket submission form to your frontend:

@livewire('creators-ticketing.ticket-submit-form')

Dashboard Widget

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,
        ];
    }
}

Events System

The plugin dispatches events for major ticket actions, allowing you to extend functionality with custom listeners.

Available Events

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 be null in certain contexts.

Automation Rules

Automation rules allow you to automate actions on tickets based on specific events and conditions.

Supported Events

  • Ticket created
  • Ticket updated
  • Status changed
  • Priority Changed
  • Ticket assigned
  • Reply Added
  • Internal Note Added

Conditions

  • Department
  • Form
  • Status
  • Priority
  • Assignee
  • Requester
  • Created within X hours
  • Last activity within X hours

Actions

  • Assign ticket to agent
  • Change ticket status
  • Change ticket priority
  • Transfer ticket to another department
  • Add internal note
  • Add public reply

Managing Spam Filters

  1. Navigate to Spam Filters in the admin panel
  2. Click Create to add a new filter
  3. Select the filter type and action (block/allow)
  4. Add values (keywords, emails, IPs, or patterns)
  5. Set priority (higher numbers execute first)
  6. Optionally add a reason for internal reference

in config/creators-ticketing.php:

    'spam_protection' => [
        'enabled' => env('TICKETING_SPAM_PROTECTION', true),
        'rate_limiting' => [
            'enabled' => true,
            'max_tickets_per_hour' => 5,
            'max_tickets_per_day' => 20,
        ],
        'content_filtering' => [
            'enabled' => true,
            'check_links' => true,
            'max_links_allowed' => 3,
        ],
    ],

Viewing Spam Logs

All blocked submissions are logged with complete details:

  • Date and time of attempt
  • User information
  • Email and IP address
  • Filter type that triggered
  • Matched value
  • Complete ticket data that was submitted

Access spam logs through Spam Logs in the admin panel.

Security

To report a vulnerability privately, email hello@jabirkhan.com. See SECURITY.md for supported versions, reporting guidance, and the scope of automated dependency checks.

The package includes built-in security features:

  • Private file storage for attachments
  • Permission-based access control
  • Department-level agent restrictions

Note: attachments require storage/app/private to be writable by the PHP process. On some hosts (WSL/Docker/NFS bind mounts), permission changes like chmod may be denied; the package will continue to boot, but you must ensure correct ownership/permissions from the host.

Contributing

To rebuild the shipped CSS, use Node.js 22 and run npm ci --ignore-scripts followed by npm run build in the package directory. Commit the regenerated resources/dist/app.css. The compiler and Tailwind versions are pinned together, source scanning is limited to this package's views and PHP sources, and CI verifies that the committed CSS matches a clean build. The CLI's file watcher is overridden to 2.6.0 to avoid the vulnerable braces/micromatch dependency chain in its upstream pinned version; keep this override until the CLI updates that dependency.

Thank you for considering contributing to Creators Ticketing! You can contribute in the following ways:

  1. Report bugs
  2. Submit feature requests
  3. Submit pull requests
  4. Improve documentation

Support the Project

If this package saves you time or helps your business, consider supporting its development.

Support the Project

License

The MIT License (MIT). Please see License File for more information.

Credits

Support

If you discover any security-related issues, please email hello@jabirkhan.com.

Built with ❀️ by DAA Creators