PHPackages                             crumbls/helpdesk - 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. [Framework](/categories/framework)
4. /
5. crumbls/helpdesk

ActiveLibrary[Framework](/categories/framework)

crumbls/helpdesk
================

HelpDesk Package for Laravel.

2.1.0(5mo ago)10MITPHPPHP ^8.0

Since Feb 6Pushed 1mo agoCompare

[ Source](https://github.com/Crumbls/helpdesk)[ Packagist](https://packagist.org/packages/crumbls/helpdesk)[ Docs](https://github.com/crumbls/helpdesk)[ RSS](/packages/crumbls-helpdesk/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (4)Dependencies (9)Versions (5)Used By (0)

Crumbls HelpDesk
================

[](#crumbls-helpdesk)

A Laravel helpdesk and ticketing package with an API-first ticket workflow, guest intake, activity timelines, attachments, custom fields, SLA helpers, notifications, and optional Filament resources.

Status
------

[](#status)

This package is pre-1.0 and actively hardening for production use. The core API, events, notifications, activity log, attachments, guest ticket flow, custom fields, read state, queues, SLA calculations, and webhooks are covered by tests.

Breaking schema and config changes can still happen before 1.0. Review [CHANGELOG.md](CHANGELOG.md) before updating.

Features
--------

[](#features)

- REST API for departments, priorities, statuses, ticket types, tickets, comments, attachments, and custom fields.
- Secure API defaults with `web` and `auth` middleware.
- JSON and XML responses based on the `Accept` header.
- Config-driven models, including configurable user model and user-key-aware migrations.
- Department-agent membership via `helpdesk_department_user`.
- Protected attachment metadata and downloads.
- Custom fields scoped globally, by department, or by ticket type.
- Ticket references generated from the persisted ticket ID.
- Activity timelines, read/unread state, `last_activity_at`, and operational queues.
- Guest ticket intake with signed ticket access links.
- Inbound email command/webhook support.
- SLA due-date calculation and stale-ticket auto-close command.
- Event, notification, webhook, and activity-log listeners with independent config toggles.
- Optional Filament resources.
- Pint and PHPStan quality gates, plus a dirty-file Pint pre-commit hook.

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

[](#requirements)

- PHP 8.3+
- Laravel 9, 10, 11, 12, or 13

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

[](#installation)

```
composer require crumbls/helpdesk
php artisan migrate
```

Publish the config when you need to customize routes, middleware, models, notifications, guest access, webhooks, SLA behavior, or user key handling:

```
php artisan vendor:publish --provider="Crumbls\HelpDesk\HelpDeskServiceProvider"
```

Configuration
-------------

[](#configuration)

API routes are enabled by default at `/api/helpdesk` and require authentication by default:

```
'api' => [
    'enabled' => true,
    'route-prefix' => 'api/helpdesk',
    'middleware' => ['web', 'auth'],
],
```

Guest ticket routes and inbound email routes are configured independently:

```
'guest' => [
    'enabled' => false,
    'route-prefix' => 'helpdesk',
    'middleware' => ['web', 'throttle:6,1'],
],

'inbound_email' => [
    'enabled' => false,
],
```

### Swappable Models

[](#swappable-models)

Override any package model in `config/helpdesk.php`:

```
'models' => [
    'ticket' => \App\Models\SupportTicket::class,
    'user' => \App\Models\User::class,
],
```

### Custom User Keys

[](#custom-user-keys)

Migrations infer the configured user model key type by default. Override `helpdesk.user_keys` when your app uses custom string, char, UUID, or ULID user keys:

```
'user_keys' => [
    'table' => 'users',
    'key' => 'id',
    'column' => [
        'type' => 'ulid',
    ],
],
```

API Endpoints
-------------

[](#api-endpoints)

All endpoints are prefixed with `api/helpdesk` unless you change `api.route-prefix`.

ResourceEndpointMethodsDepartments`/departments`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Priorities`/priorities`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Statuses`/statuses`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Ticket types`/types`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Custom fields`/custom-fields`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Tickets`/tickets`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Comments`/comments`GET, POST, GET `/{id}`, PUT `/{id}`, DELETE `/{id}`Attachments`/attachments`POST, GET `/{id}`, DELETE `/{id}`Ticket workflow endpoints:

EndpointPurpose`POST /tickets/{id}/merge`Merge one ticket into another`POST /tickets/{id}/assign`Assign directly, least-loaded, or round-robin`POST /tickets/{id}/unassign`Remove an assignment`GET /tickets/{id}/activity`Fetch the activity timeline`POST /tickets/{id}/read`Mark a ticket read for a user`POST /tickets/{id}/unread`Mark a ticket unread for a user`GET /attachments/{id}/download`Download a protected attachmentTicket index filters:

```
GET /api/helpdesk/tickets?queue=open
GET /api/helpdesk/tickets?queue=closed
GET /api/helpdesk/tickets?queue=unassigned
GET /api/helpdesk/tickets?queue=assigned_to_me&user_id=1
GET /api/helpdesk/tickets?assigned_to=1
GET /api/helpdesk/tickets?department_id=1
GET /api/helpdesk/tickets?priority_id=1
GET /api/helpdesk/tickets?ticket_status_id=1
GET /api/helpdesk/tickets?ticket_type_id=1
GET /api/helpdesk/tickets?unread_for=1

```

Assignment examples:

```
{ "user_id": 5 }
```

```
{ "strategy": "least_loaded" }
```

```
{ "strategy": "round_robin", "department_id": 2 }
```

Custom Fields
-------------

[](#custom-fields)

Create custom fields through `/custom-fields`, then submit values in `tickets.custom_fields`:

```
{
  "key": "customer_plan",
  "label": "Customer Plan",
  "type": "select",
  "options": {
    "free": "Free",
    "pro": "Pro"
  },
  "is_required": true
}
```

Supported custom field types include `text`, `textarea`, `email`, `number`, `url`, `select`, `radio`, `checkbox`, `boolean`, `date`, and `datetime`.

Development
-----------

[](#development)

Install the local pre-commit hook:

```
composer hooks:install
```

Run quality gates:

```
composer test:lint
composer test:lint:dirty
composer test:types
./vendor/bin/pest --no-coverage
```

`phpstan-baseline.neon` is deliberate. Keep reducing it as model generics, typed config helpers, and dynamic Eloquent calls are hardened.

License
-------

[](#license)

This package is open-sourced software licensed under the [MIT license](LICENSE.md).

Credits
-------

[](#credits)

- Created by [Chase C. Miller](https://crumbls.com)
- Built with [Laravel](https://laravel.com)

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance83

Actively maintained with recent releases

Popularity2

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity43

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

Every ~5 days

Total

4

Last Release

178d ago

Major Versions

0.0.1a → 1.0.02026-02-06

1.0.0 → 2.0.02026-02-06

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/3020753?v=4)[Chase C. Miller](/maintainers/chasecmiller)[@chasecmiller](https://github.com/chasecmiller)

---

Top Contributors

[![chasecmiller](https://avatars.githubusercontent.com/u/3020753?v=4)](https://github.com/chasecmiller "chasecmiller (10 commits)")

---

Tags

deskhelphelpdesklaravelosticketsupportsystemlaravelSettingsCrumbls

###  Code Quality

TestsPest

Static AnalysisPHPStan, Rector

Code StyleLaravel Pint

Type Coverage Yes

### Embed Badge

![Health badge](/badges/crumbls-helpdesk/health.svg)

```
[![Health](https://phpackages.com/badges/crumbls-helpdesk/health.svg)](https://phpackages.com/packages/crumbls-helpdesk)
```

###  Alternatives

[laravel/octane

Supercharge your Laravel application's performance.

4.0k28.5M262](/packages/laravel-octane)[unopim/unopim

UnoPim Laravel PIM

10.8k2.5k](/packages/unopim-unopim)[nasirkhan/laravel-starter

A CMS like modular Laravel starter project.

1.4k2.7k](/packages/nasirkhan-laravel-starter)[ecotone/laravel

Ecotone for Laravel — CQRS, Event Sourcing, Sagas, Durable Workflows, and Outbox on top of Laravel Queue, via PHP attributes.

21327.3k4](/packages/ecotone-laravel)[codewithdennis/larament

Larament is a time-saving starter kit to quickly launch Laravel 13.x projects. It includes FilamentPHP 5.x pre-installed and configured, along with additional tools and features to streamline your development workflow.

4041.8k](/packages/codewithdennis-larament)[r2luna/brain

Brain: A process-driven architecture alternative for your Laravel Application.

6343.7k1](/packages/r2luna-brain)

PHPackages © 2026

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