practical tooling for MSP ops

HaloPSA SQL Schema: the tables and columns that matter

HaloPSA reports run read-only T-SQL against a schema inherited from NetHelpDesk. The names make no sense until someone tells you, so here they are.

  AREA (clients) ──Areaint──┐
  UNAME (agents) ─Assignedtoint─┤
  TSTATUS ─────────Status───────┼──► FAULTS (tickets) ◄──Faultid── ACTIONS (notes, time)
  REQUESTTYPE ───Requesttype────┘          │
                                           └── FEEDBACK (CSAT) via FBFaultID

Core tables

TableWhat it isColumns you'll use
FAULTSTickets, but also projects, opportunities and tasksFaultid, Symptom, dateoccured, datecleared, Status, Areaint, Assignedtoint, Requesttype, urgency, impact, fixbydate, FDeleted, Flastactiondate
ACTIONSEvery note, email, status change and time entryFaultid, whoagentid, ActionArrivalDate, timetaken (decimal hours), ActionChargeHours, ActionChargeAmount
AREAClientsAarea, aareadesc (name), AIsInactive
SITEClient sitesSsitenum, sdesc, Sarea
USERSEnd usersUid, uusername, uemail, Usite
UNAMEAgentsUnum, uname, Uisdisabled, usection
TSTATUSStatusesTstatus, tstatusdesc
REQUESTTYPETicket typesRTid, rtdesc, RTIsOpportunity, RTIsProject
FAULTARC / ACTARCArchived tickets and actionsSame shape. UNION ALL them for long-range history

Five rules that stop your reports lying

  1. Everything is a FAULT. Join REQUESTTYPE and filter RTIsOpportunity = 0 AND RTIsProject = 0, or your ticket counts include your sales pipeline.
  2. Soft deletes everywhere. Always add ISNULL(FDeleted,0) = 0.
  3. No priority column. FAULTS has urgency and impact; priority is derived.
  4. No SLA breach flag. Compute it: datecleared > fixbydate (resolution), FResponseDate > FRespondByDate (response).
  5. Stale tickets need no join. Flastactiondate on FAULTS gives you last activity directly.

Find any column yourself

SELECT TOP 10000 TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'FAULTS'
ORDER BY ORDINAL_POSITION

Swap FAULTS for any table. The TOP is mandatory, see the errors page.