Paid add-on. Service is licensed separately from the open-source packages. See pricing
Filament screens
The resources and pages Odden Service adds to the Odden Filament admin.
Odden Service adds its screens to the Odden admin panel by itself when getodden/crm-filament is installed: it registers them through the open package's Odden\Filament\Support\Modules registry, so there is nothing to configure. They live in Odden\Service\Filament, with views under the odden-service-filament namespace. To leave them out, use OddenPlugin::make()->disableModules('service').
Resources
The resources are in the Service navigation group.
| Resource | Model | Navigation | Pages |
|---|---|---|---|
TicketResource |
Odden\Service\Models\Ticket |
Service › Tickets | list, board, create, edit |
SlaPolicyResource |
Odden\Service\Models\SlaPolicy |
Service › SLA Policies | list, create, edit |
KnowledgeArticleResource |
Odden\Service\Models\KnowledgeArticle |
Service › Knowledge Base | list, create, edit |
CannedResponseResource |
Odden\Service\Models\CannedResponse |
Service › Canned Responses | list, create, edit |
TicketRoutingRuleResource |
Odden\Service\Models\TicketRoutingRule |
Service › Ticket Routing Rules | list, create, edit |
Tickets
- List page: a Tickets Board button. Searching finds tickets by number, subject, company, agent, and the customer's first name, last name or email. Row actions are Resolve (
ResolveTicketAction, with a resolution note), Merge (MergeTicketsAction; only open tickets of the same contact are offered, see Merging tickets), Portal (opensTicket::getPortalUrl()) and Auto-Route (RouteTicketAction). - Board page (
/tickets/board): a kanban by ticket status. Each column shows its 50 newest tickets and counts them all. Dragging a card to Resolved runsResolveTicketAction; any other move updates the ticket'sstatus, and the model keepsresolved_at,closed_atand the SLA clock in step (see The SLA clock). - Create page: creates the ticket with
CreateTicketAction, so the description becomes the first message in the portal, routing runs when no agent is picked, and the contact gets the confirmation email. Contacts, companies and agents are searched on the server as you type. - Edit page: saving with the status set to Resolved runs
ResolveTicketAction. The Conversation Thread & Notes relation manager has an Add Reply / Note action that callsReplyTicketAction; inserting a canned response fills in its{{ tags }}for the ticket and agent.
Side effects to be aware of:
- Add Reply / Note with a public reply sends the ticket's contact a
TicketRepliedNotificationemail and logs a note on the contact's timeline. - Resolve sends the contact a
TicketResolvedCsatNotificationemail.
Both notifications are queued, see Notifications.
Canned responses
A canned response belongs to the agent who creates it. Shared ones are listed for, and usable by, every agent; a private one only for its author. Responses saved before the owner was recorded have none and are listed for everyone so they can be fixed.
Pages
Support Cockpit
ServiceCockpit, at /admin/service-cockpit. It is labelled Support Cockpit and is the first item in the Service group. Its title is "Support Agent Workspace".
This is an agent workspace. It shows open, unassigned, my-active and SLA-at-risk counts, plus the average CSAT. Its tabs are triage, my_tickets, sla_watch and all, with search, priority and source filters.
These actions write data:
- Claim sets the ticket's owner to the current user and moves
newtickets toopen. - Quick reply adds an agent message or internal note with
ReplyTicketActionand can set the status toopen,waiting_on_customerorresolved. You can insert canned responses and suggested knowledge-base articles (fromDeflectTicketAction). - Quick resolve runs
ResolveTicketActionwith an optional note.
Both use the same actions as the ticket resource, so a public reply emails the customer TicketRepliedNotification and a resolve emails TicketResolvedCsatNotification (when the ticket's contact has an email address), and both are logged on the contact's timeline. Internal notes send nothing. Setting a reply's status to resolved runs the resolve action too.
Service Analytics
ServiceAnalytics, at /admin/service-analytics in the Service group.
A read-only report of ticket volume, resolution rate, first response time, mean time to resolution, SLA compliance and breaches, CSAT distribution, channel and priority breakdowns, and per-agent performance. Date ranges are 7_days, 30_days (the default), this_month and all_time. It counts the tickets TicketResource shows (so tenant or user scoping in the resource applies), and the averages and per-agent figures are worked out by the database. With no ratings, the CSAT average (here and on the Executive Overview card) is shown as missing rather than as a number.
URLs
Resources use filament.admin.resources.{slug}.index, pages use filament.admin.pages.{slug}:
| Class | URL | Route |
|---|---|---|
TicketResource |
/admin/tickets, board at /admin/tickets/board |
filament.admin.resources.tickets.index, ...tickets.board |
SlaPolicyResource |
/admin/sla-policies |
filament.admin.resources.sla-policies.index |
KnowledgeArticleResource |
/admin/knowledge-articles |
filament.admin.resources.knowledge-articles.index |
CannedResponseResource |
/admin/canned-responses |
filament.admin.resources.canned-responses.index |
TicketRoutingRuleResource |
/admin/ticket-routing-rules |
filament.admin.resources.ticket-routing-rules.index |
| Page | URL |
|---|---|
ServiceCockpit |
/admin/service-cockpit |
ServiceAnalytics |
/admin/service-analytics |
Authorization
Pages and actions check your policies the same way the open resources do (see the Filament admin authorization).
| Page | Requires viewAny on |
|---|---|
| Support Cockpit, Service Analytics | TicketResource |
Tickets Board (/admin/tickets/board) |
TicketResource |
Page and board actions
| Page | Method | Checks |
|---|---|---|
| Tickets Board | moveTicket() |
update on the ticket |
| Support Cockpit | claimTicket(), claimAndOpen(), openReplyModal(), sendQuickReply(), openResolveModal(), quickResolveTicket() |
update on the ticket |
Resource actions
| Resource or page | Actions | Checks |
|---|---|---|
| Tickets | Resolve, Auto-Route | update on the ticket |
| Tickets | Merge | update on the ticket and on the destination ticket |
| Ticket Messages relation manager | Add Reply / Note | update on the ticket |
Swapping a built-in behaviour
| Contract | Used by | Built-in implementation |
|---|---|---|
Odden\Service\Contracts\DraftsTicketReply |
Draft a reply in a ticket's reply box | DraftTicketReplyAction: the best matching canned response plus matching help articles, no AI model. |
Overriding views
| View | Used by |
|---|---|
odden-service-filament::pages.service-cockpit |
ServiceCockpit |
odden-service-filament::pages.service-analytics |
ServiceAnalytics |
odden-service-filament::pages.ticket-kanban |
TicketResource board page |
Copy a view to resources/views/vendor/odden-service-filament under the same relative path to override it.