Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Customer Support Laravel Package

a2zwebltd/laravel-customer-support

Portable Laravel helpdesk engine with ticketing, threaded replies, attachments, internal notes, agent assignment, SLA tracking, mail notifications, a Livewire + Flux UI, and optional Nova admin resources.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

The package is a Laravel-native, auto-discovered service provider with publishable config and migrations — the lowest-friction shape a PHP package can take. More importantly for us, its internal architecture separates domain from presentation: five action classes (CreateTicket, ReplyToTicket, AddInternalNote, ChangeTicketStatus, AssignTicket) own every state transition, DTOs (TicketData, MessageData) are the intake contract, four domain events (TicketCreated, TicketReplied, TicketStatusChanged, TicketAssigned) are the extension seam, and the Livewire/Flux UI is merely one consumer of those actions. That is the single most decision-relevant fact here: we can adopt the engine and discard the UI without forking, which materially reduces frontend lock-in.

Fit is good for a single-tenant SaaS or internal app on Laravel 11–13 where support is an in-product surface, not the company's primary helpdesk. Fit is poor if we need multi-tenancy, multiple user models or guards, UUID/ULID primary keys, team/group queues, business-hours SLA calendars, first-response-time tracking, CSAT, canned responses, or a knowledge base — none of these are present, and each is bespoke work.

Integration feasibility

Four wiring steps plus two asset steps. A competent Laravel developer reaches a working ticket flow in roughly half a day and production-ready in one to two days. The work is not in the code; it is in the operational prerequisites (queue worker, scheduler, private attachment disk, Tailwind source scanning). Those are configuration and deployment changes, not library risk.

Technical risk

The dominant risk is not code quality — it is vendor viability. Two GitHub stars, zero dependents, a two-person crew, and a single published release line (v1.0.0 → v1.2.1 within weeks) describe a young package with no evidenced third-party production usage. There is no stated support policy and no formal vulnerability process beyond "private communication." MIT licensing is the mitigant: we can fork and own the code, and the surface we'd own is small (~two models, five actions, four events).

Secondary risks:

  • Dependency depth. Hard requirements on spatie/laravel-medialibrary ^11, livewire/livewire ^3|^4, and Flux ^2. Flux is a commercial product — confirm we already hold the licence, or the "free UI" is not free.
  • Data model assumptions. user_model, an integer user_id/assigned_to, and a media table shared with any existing medialibrary install. Multi-guard or non-integer-key apps need verification before commitment.
  • Scope-vs-marketing gap. The description claims "response and resolution targets," but the README and skill notes say due_at is set once at creation from sla_hours per priority. Treat SLA as single-target until proven otherwise.
  • Silent-failure config surface. An undefined admin_gate means nobody is an agent and nothing errors. A missing layout view is a 500. Missing Tailwind @source lines render an unstyled dashboard. categories keys must be TicketCategory enum values or Nova throws a ValueError. These are cheap to fix and expensive to diagnose.

Key questions

  1. Do we already license Livewire Flux, and at what tier?
  2. Is our auth single-guard with integer user IDs? If not, does the package survive our model?
  3. Do we need multi-tenancy or per-customer/per-plan SLA tiers? If yes, this is a fork plus custom columns, not a configuration change — reprice the effort.
  4. What is our actual support volume and channel mix in 12 months? In-app only, or inbound email and chat too? Inbound email is a ~10-line webhook adapter on TicketData; chat is not.
  5. Who inside the team owns this dependency, and do we accept fork-and-maintain as plan B?

Verdict: adopt as a component, not a platform. Buy the domain layer and the notifications; budget separately for the UI and for whatever helpdesk capabilities we discover we need.

Integration Approach

Stack fit

Requirement Type Action
PHP 8.2+, Laravel 11/12/13 Hard Confirm against our pinned version, not the badge
livewire/livewire ^3|^4 Hard Verify we are not on Livewire 2
livewire/flux ^2 Recommended but de facto required Licence check; UI inherits --color-accent tokens
spatie/laravel-medialibrary ^11 Hard Confirm media table exists or migration will create it
laravel/nova ^5 Optional Ignore unless we run Nova; resources auto-register

If we are not on Livewire 3+ and unwilling to run Flux, the bundled UI is dead weight and we are buying models, migrations, actions, and mail — which is still a defensible purchase, but scope it as such.

Migration path

Greenfield: composer require, php artisan migrate, publish config, ship. Retrofit onto an existing install: the only realistic collisions are a pre-existing media table (benign) and route/middleware name conflicts (support.*, prefix /support) — both configurable via routes.prefix, routes.name_prefix, routes.middleware, and tables.prefix. Migrating from an incumbent tool (Zendesk/Intercom/Help Scout) is a custom ETL: replay historical tickets through CreateTicket/ReplyToTicket so statuses, due_at, and events fire correctly, or bulk-insert with the lifecycle hooks manually satisfied. Budget this as a separate workstream — it is not a package concern.

Compatibility

The Laravel 11/12/13 and Livewire 3/4 span is advertised, not proven, at this maturity level. Pin the package version in composer.json, run the host test suite plus a smoke test of the four user journeys (create, reply, status change, escalate) in CI before any upgrade.

Sequencing

  1. Spike, 1–2 days, throwaway branch. Install, run migrations, wire trait + gate + layout + Tailwind sources, create one ticket end to end. This validates every hidden prerequisite at minimum cost.
  2. Foundations. Private attachments.disk (local or private S3 — files stream through the authenticated support.attachment route, so no public URLs should ever be generated), queue worker with after_commit => true, Schedule::command('support:escalate-overdue')->hourly().
  3. Access control. Define manage-support-tickets; decide whether it maps to a role, a policy, or a flag. Add a sidebar entry ourselves — the host owns navigation.
  4. Integration seam. Listeners on the four events, always queued and afterCommit: Slack/CRM fan-out, first-response analytics, customer-facing reply notifications. Remember TicketReplied fires for internal notes too — branch on is_internal_note.
  5. UI decision. Restyle the bundled Livewire views (3–5 days) or build our own console on the model scopes (open, unassigned, overdue, forUser) and SlaTracking::forTicket(...)->humanLabel(). Decide before, not after, we've invested in the vendor views.

Operational Impact

Maintenance

Ongoing cost is small but non-zero: roughly 2–4 hours a month to track upstream releases, verify migrations against schema changes, and exercise upgrade PRs. The real maintenance obligation is fork readiness — the team should be able to vendor the package into our monorepo within a day if the maintainer disappears. With two models, five actions, and a handful of enums, that is a realistic contingency, not a fantasy. Assign a named owner regardless; orphaned dependencies at this maturity level rot quickly.

Support

There is no vendor SLA, no commercial support tier, and no community mass to lean on at two stars. Internal runbook coverage must include: how to become an agent (the gate), why mail didn't send (queue worker), why the dashboard is unstyled (Tailwind @source), and why a ticket was auto-escalated (the scheduled command). Without that, every one of these presents as a product bug.

Scaling

  • Data. Two tables plus media. status, assigned_to, and due_at need indexes as volume grows; the dashboard tabs are scope chains, so those queries are only as good as the indexes.
  • Escalation scan. support:escalate-overdue uses needsOverdueNotification(); hourly is cheap at thousands of rows, less so at millions. Watch the query plan before scaling the schedule frequency.
  • Attachments. Storage growth is unbounded and user-driven — set retention, size caps, and a bucket lifecycle policy. This is also our main compliance surface (PII, file content).
  • Mail and queue. Every mail implements ShouldQueue; throughput scales with the worker pool. Notification volume is the first thing a viral incident will spike — rate-limit and batch before that happens.

Failure modes

Failure Symptom Blast radius
admin_gate undefined Nobody can act as agent, no error raised Support outage, silent
No queue worker No notifications delivered, looks like a package bug Customer-facing trust
after_commit not set Mail/events fire for rolled-back tickets Phantom notifications, duplicate Slack posts
Public attachment disk Unauthenticated file access Data exposure / compliance
Missing Tailwind @source Unstyled dashboard Cosmetic but credibility-damaging
categories key drift Nova ValueError; form silently coerces to other Admin surface broken, misrouted tickets
Upstream upgrade changes scopes Our custom console filters silently change meaning Reporting/analytics drift

Ramp-up

One Laravel developer, half a day to first ticket, one to two days to production-deployable, three to five days if we restyle the UI, plus the email adapter and ETL as separate estimates. Agent-side training is trivial — six statuses, four priorities, internal notes versus public replies is the only concept that needs reinforcement. The steepest part of the curve is operational (scheduler, queue, private storage), and it is identical to infrastructure we presumably already run.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
xiloryx/log-collector
a21ns1g4ts/filament-stripe
la-php/laravel-admin
artisan-build/community-prompts
vleroy/smart
ayles-software/laravel-australian-public-holidays
cboxdk/laravel-id-spatie
cboxdk/laravel-id-billing
cboxdk/laravel-id-billing-bridge
simple-as-fuck/php-performance-log
hsluv/hsluv
seampact/codegen
seampact/hooks
seampact/ir
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table
siberfx/flysystem-wasabi
hollyit/token-replace
ippanelcom/laravel-sdk