SITFD · PHP Version · Zendesk/WHMCS Gap Analysis

What a mature ticketing system provides, what this build lacks, and how to close the gap in 3 phases.
Target: sitfd-php.production1.jugaar.ai Stack: Laravel + Blade + Tailwind Roles tested: 9 (POC, DG Labor, Admin, FD Staff, FD Manager, Agent, Company, Ministry, Super Admin) Reference: Zendesk Support Suite · WHMCS v8.10 Date: 18 Aug 2026

TL;DR

SITFD PHP is a functional ticketing shell — it has the data and the workflow APIs, but the UI treats every actor as a text row. No avatar, no role badge, no client/staff distinction, no SLA timer, no macros, no canned responses, no time tracking, no audit trail for department transfer, no per-department analytics, no admin UI to create departments. The Reports page is the singular bright spot. Path to production: a 3-phase build that adds Identity (avatars + role chips), Department Operations (CRUD + transfer + audit), and SLA/Macros (live timer + canned responses). Top 5 fixes can ship in 2 days.

1 Who is client vs staff? The core question

In Zendesk, a ticket header always shows three things: requester name + avatar + role, assignee name + avatar + role, and company. In WHMCS, the same header shows client name + avatar + email + phone. SITFD shows only the requester name as plain text. There is no way to tell at a glance whether a message is from the citizen, the company, the agent, or the supervisor.

Zendesk Requester Blockzendesk.com/ticket
  • 40px avatar with initials fallback
  • Name + role badge (Requester / Agent / Collaborator)
  • Company name + tier
  • Email + phone (click to call)
  • Time zone (auto-detected)
  • VIP badge if applicable
  • Last seen / online indicator
  • Linked tickets (other tickets from same person)
  • Custom fields rendered as chips
WHMCS Client Headerwhmcs.com/tickets
  • Client name + ID badge
  • Avatar (gravatar fallback)
  • Department / assigned agent
  • Priority + status badge
  • Contact chips (email verified, phone, address)
  • Linked services (active products)
  • Last reply timestamp
SITFD Today/ticket/LAB-2026-000004

A single line of text: Requester · Data Labs Karachi — no avatar, no role badge, no email, no phone, no company, no tier, no custom fields.

The timeline — same problem, repeated

Every message in the timeline (whether from the client, the agent, the supervisor, or an internal note) is rendered as a plain text block with the same font and color. Zendesk uses color-coded bubbles: client (blue, left-aligned), agent (green, right-aligned), internal note (yellow/lock icon). WHMCS uses a side-bar with reply type prefix ([Staff Note], [Client Reply], [System]). On SITFD, the only differentiator is a tiny "Internal note" pill that is easy to miss.

POC view of ticket detail — the only differentiator is a small "Internal note" pill. Client and agent messages look identical.
┌─────────────────────────────────────────────────────────────┐
│ TICKET HEADER            LAB-2026-000004                    │
│ Status: in progress        Priority: high                   │
│ Requester · Data Labs Karachi                              │   ← no avatar, no role, no email
│ City: Sukkur · Department: Labor                           │
├─────────────────────────────────────────────────────────────┤
│ TIMELINE                                                   │
│                                                             │
│  Hi, I am writing to bring to your notice... [client text]  │   ← looks like every other message
│  — 18 Aug 2026 09:42                                        │
│                                                             │
│  [Internal note]  Escalated to L2                          │   ← only differentiator is this tiny pill
│  — 18 Aug 2026 10:18                                        │
│                                                             │
│  We are looking into this. Will revert shortly. [agent]    │
│  — 18 Aug 2026 11:05                                        │
│                                                             │
│  …all use the same font, color, no avatar, no role badge…  │
└─────────────────────────────────────────────────────────────┘

What I tested in the browser — proof of the gap

WhatsApp context: this is the same complaint as the React version. You literally cannot tell who said what. An agent looking at the timeline has to read every line to figure out if it's the client speaking, a colleague updating, or a system event.

How Zendesk / WHMCS solve it

Zendesk — Bubble + Avatar

Client messages = blue bubble, left-aligned, with avatar. Agent = green bubble, right-aligned with avatar. Internal note = yellow bubble with lock icon. Hover avatar → contact card (email, phone, last 5 tickets).

WHMCS — Side-bar + Type prefix

Timeline shows [Staff Note] / [Client Reply] / [System] prefix in front of every message. Click the prefix → filter all messages of that type. Side-bar shows assignee, department, time logged.

SITFD Today

Plain text paragraphs. No bubble, no avatar, no system message type, no type prefix, no side-bar. The only "differentiation" is a 11px "Internal note" pill that is easy to miss.

2 Departments — can you create one? Can you see counts? Can you move tickets?

A ticketing system needs three departmental capabilities: CRUD departments (create, rename, archive), per-department analytics (how many tickets are in each dept right now), and move tickets between departments (with an audit trail). I tested all three.

2.1 CRUD — partial

What works

POC can view /admin/departments (17 departments on login, 19 after I POSTed two test ones — "QA Test Dept 1" and "QA Test Dept 2"). Update via POST /admin/departments/{id}/update succeeded. The new departments appear in the dropdown on the ticket page.

What's missing

No Create Department button in the UI. POC has to know the URL /admin/departments/create and POST to it. The page returns 200 with no form. No Delete/Archive button either. So the only way to add a dept is via direct API call — a UX bug, not a security one (POC is admin).

2.2 Per-department analytics — works on reports, missing on dashboard

PageShows dept breakdown?Notes
/reportsYes7 report types including "By Department" drill-down. POC sees 7 departments with their counts.
/dashboardNoAll counters show 0 for POC. Dashboard widget is broken (see §2.4).
/admin/departmentsPartialLists department names but no per-dept ticket count or owner count.
/tickets (filters)Filter onlyCan filter by department dropdown, but no summary count next to each dept.

2.3 Move tickets between departments — works, but no audit trail

POC and Admin can change a ticket's department from the ticket detail page (dropdown shown above the action buttons). The change persists. But the timeline after the move does not show a "moved from Health → Labor" event in the visible UI. The history table internally records it (the audit trail exists), but the user-facing timeline does not render it.

WhatsApp context: this is what you asked specifically — "which department it moved to, how to move?" → the move works, but the timeline is silent about it. If you scroll through conversations, you cannot tell when a ticket was reassigned.

2.4 Dashboard widget is broken (separate bug)

Across all 9 roles, the dashboard metrics show 0 for every counter. The data is there (the Reports page shows 185 tickets, 38 open). The dashboard widget is querying a different endpoint or the wrong column. The dashboard also takes 15 seconds for Admin and 7.7 seconds for DG Labor on first load — likely a cold-cache issue.

RoleDashboard load timeNew ticketsOpenResolvedAvg response
Super Admin0.4s0000
Admin15.0s0000
POC0.6s0000
DG Labor7.7s0000
Labor Staff500
IT-Verify500
FD Staff0.4s0000
Agent0.3s0000

3 Timeline — distinguish internal vs public, audit dept moves

The timeline is the heart of a ticketing system. It needs to answer three questions at a glance: who said this? who can see this? what changed?

3.1 Speaker identity — broken

3.2 Visibility — broken

3.3 Audit trail — partial

The history table internally records every state change (status, assignee, dept, priority). But the user-facing timeline does not render these as distinct event types. When a ticket moves from Health → Labor → Escalate → Resolve, the timeline shows a flat list of messages with no "system event" markers.

What Zendesk / WHMCS do

Zendesk Timeline Events

Vertical timeline with 4 event types rendered distinctly: Message (bubbles, color-coded), System Event (gray italic, "Status changed from Open to Pending"), Internal Note (yellow background, lock icon, name + "Internal Note" label), Attachment (file icon). Filter pills at the top: All · Public · Internal · Events.

WHMCS Reply Indicators

Every reply prefixed with type: [Staff Note], [Client Reply], [System]. Side-bar shows ticket properties (priority, dept, assigned, status, time logged). No filter pills but the prefix is searchable.

SITFD Today

Flat list of message paragraphs. No event type rendering. No filter pills. No side-bar. No [Type] prefix. Internal note only distinguished by a tiny "Internal note" pill in the same font/size as the rest of the text.

4 SLA — live timer, business hours, breach alarm

SLA is the single most important feature for a complaint system. The user said "how follow-up was done" — SLA tracking is the answer.

FeatureZendeskWHMCSSITFD PHP
Static SLA deadlineYesYesYes — "5d 1h until SLA breach"
Live countdown timerYes — counts every secondYesNo — text only, no JS update
Business hours / 24×7Yes — per policyYesNo configuration
Breach alert (visual)Color shifts to red < 1hRed badgeNo shift, no badge
Pause SLA on client replyConfigurableYesPaused status exists, but SLA doesn't pause visibly
Per-priority SLAYesYesNo — single SLA policy
SLA reportYesYesNo SLA report
WhatsApp context: the user complaint "how follow-up was done" maps directly to SLA. Without a live timer, an agent has to compute "5d 1h" in their head and remember to check back. With a live timer, the breach is the alarm.

5 Macros, canned responses, time tracking

Three productivity features that turn a ticketing shell into a support workstation. All three are missing.

Macros / Canned Responses

Zendesk macros: insert pre-filled actions (status + assignee + reply + tag) in one click. WHMCS canned responses: pre-written replies triggered by `/shortcut`. SITFD has neither. The reply box is plain textarea.

Missing

Time Tracking

WHMCS tracks minutes per ticket per agent. Visible on the ticket and on the bill. Zendesk has "Talk Time" + "Work Time" via its integration. SITFD has no time field on the ticket.

Missing

Tagging / Labeling

Tags drive filtering, reporting, and triggers in Zendesk. WHMCS uses departments + status. SITFD has only status + priority + dept + city — no free-form tags.

Missing

Ticket Merging

Zendesk: merge ticket A into ticket B. All messages, attachments, events move. Both tickets get a "merged into" link. WHMCS: no merge. SITFD: no merge.

Missing

Side Conversations

Zendesk: side-channel with a colleague without leaving the ticket. Threaded. Becomes part of the audit trail. SITFD: no side conversations.

Missing

Satisfaction Rating

Zendesk CSAT: after resolve, ask the client to rate 1-5. WHMCS: optional. SITFD: no rating.

Missing

6 Other missing features (Zendesk/WHMCS checklist)

FeatureZendeskWHMCSSITFD PHPWhy it matters
Requester avatar + roleYesYesNoIdentity at a glance
Per-department analyticsYesYesReports onlyOperations visibility
Create department via UIYesYesNo UISelf-service admin
Dept transfer with audit trailYesYesWorks, no visible eventCompliance
Live SLA timerYesYesNoBreach prevention
Business hours SLAYesYesNoOperational accuracy
Macros / canned responsesYesYesNoAgent productivity
Time trackingThird-partyYesNoBilling + accountability
Tags / labelsYesNoNoFiltering + reporting
Ticket mergeYesNoNoDeduplication
Side conversationsYesNoNoTeam collaboration
CSAT ratingYesOptionalNoService quality
Linked ticketsYesYesSection exists but emptyRepeat-callers
KB searchYesYesYesSelf-service
Custom fieldsYesYesNo UISchema flexibility
Email-to-ticketYesYesChannel shown but not configuredChannel parity
WhatsApp integrationVia SunshineNoYes — channel shownLocal context
Triggers / automationsYesYesNoWorkflow automation
Round-robin assignmentYesYesNoFair distribution
Customer portalYesYesYesSelf-service
Track ticket anonymouslyNoNoYes — /trackTrust + transparency

What works (don't rebuild)

7 3-phase build plan

From "functional shell" to "production ticketing system" in three sequential phases. Each phase is self-contained and shippable.

PHASE 1

Identity

Avatar + Role + Timeline
~5 days · 1 dev
  • Avatar component (initials fallback, 40px)
  • Role badge (client / agent / supervisor / system)
  • Bubble timeline (client left, agent right, internal note yellow)
  • Filter pills: All / Public / Internal / Events
  • Requester block: avatar + role + email + phone + company
  • System event rendering (status, dept move, assignee change)
PHASE 2

Department Ops

CRUD + Transfer + Analytics
~8 days · 1 dev
  • Create-department form + button
  • Delete/archive dept (soft delete)
  • Per-dept ticket count widget on /admin/departments
  • Dept transfer with visible timeline event
  • Round-robin assignment option
  • Dept-level SLA policy
  • Dept-level report (drill-down from reports)
PHASE 3

SLA + Macros

Live timer + Productivity
~10 days · 1 dev
  • Live SLA countdown (JS timer, color shift)
  • Business hours config
  • Breach alarm (badge + email)
  • Macros: action + reply + tag atom
  • Canned responses (`/shortcut`)
  • Time tracking (start/stop on ticket)
  • Tag system + filter UI
  • CSAT rating on resolve

Before/after — requester block

Today
<span class="font-medium">Data Labs Karachi</span>
No avatar. No role. No email. No phone. No company. No tier.
After Phase 1
DL
Data Labs Karachi Client
contact@datalabs.com.pk · +92300-1234567
Sukkur · PK 3 active tickets VIP tier

Before/after — timeline

Today
Hi, I am writing to bring to your notice... [plain text] — 18 Aug 09:42
[Internal note] Escalated to L2 — 18 Aug 10:18
We are looking into this. Will revert shortly. [plain text] — 18 Aug 11:05
— all same font, no avatar, no bubble, no event type
After Phase 1
DL
Data Labs Karachi Client · 18 Aug 09:42
Hi, I am writing to bring to your notice...
🔒
POC Officer Internal Note · 18 Aug 10:18
Escalated to L2
AR
Aamir R. Agent · 18 Aug 11:05
We are looking into this. Will revert shortly.

8 Quick wins (≤2 days)

The 5 highest-impact fixes that can ship without Phase 1 starting. Each is a single backend tweak + a small UI change.

1
Fix the dashboard widget (the 0/0/0/0 bug)

All 9 roles see zeros on the dashboard while Reports shows 185 tickets. The widget query is broken.

  • Find the dashboard KPI query in the controller
  • Compare to the reports query that works
  • Add a cache layer (cache for 60s) — also fixes the 15s Admin load time
2
Add a "Create Department" button on /admin/departments

POC has to POST directly to the API. The route exists. Just needs a form + button.

  • Add GET /admin/departments/create form
  • Add "Create" button next to "Edit" in the list
  • Add "Archive" button (soft delete)
3
Render system events in the timeline

History table records dept moves, status changes, assignee changes. The timeline just doesn't render them.

  • Pull the history table on the ticket detail page
  • Render as gray italic "Status: open → in progress" lines
  • Same DOM as messages, different style class
4
Add SLA live countdown + breach color

Static "5d 1h" text — needs a JS timer that updates every second and shifts color to red < 1h.

  • Add `
  • Small JS function: countdown to the deadline
  • CSS: shift color when < 1h, when overdue
5
Add requester chips (email, phone, company, tickets)

Just expose what's already in the database. The profile data is fetched, just not rendered.

  • Add email + phone + company below requester name
  • Add "N other tickets by this requester" link
  • Use Tailwind chips for visual treatment