Autotask Ticket Management
Overview
Autotask tickets are the core unit of service delivery in the PSA. Every client request, incident, problem, and change flows through the ticketing system. This skill covers comprehensive ticket management including business logic, SLA calculations, escalation rules, and performance metrics.
Ticket Status Codes
Based on the Autotask API, these are the standard ticket status values:
| Status ID | Name | Description | Business Logic | |-----------|------|-------------|----------------| | 1 | NEW | Newly created ticket | Default for new tickets, SLA clock starts | | 2 | IN_PROGRESS | Actively being worked | Resource should be assigned | | 5 | COMPLETE | Issue resolved | Requires resolution field, stops SLA | | 6 | WAITING_CUSTOMER | Awaiting customer response | SLA clock may pause | | 13 | WAITING_MATERIALS | Waiting for parts/equipment | SLA clock may pause | | 14 | ESCALATED | Escalated to higher tier | Requires escalation reason |
Status Transition Rules
NEW (1) ──────────────────────────────> COMPLETE (5)
│ ↑
↓ │
IN_PROGRESS (2) ──────────────────────────>─┤
│ │ │
│ ↓ │
│ WAITING_CUSTOMER (6) ──────────────>─┤
│ │ │
│ ↓ │
│ WAITING_MATERIALS (13) ────────────>─┘
│
↓
ESCALATED (14) ─────> IN_PROGRESS (2) ────> COMPLETE (5)
Validation Rules:
- Completing directly from NEW generates a warning
- COMPLETE requires resolution field
- ESCALATED requires escalation reason
- IN_PROGRESS should have assigned resource
Ticket Priority Levels
| Priority ID | Name | Response SLA | Resolution SLA | Business Context | |-------------|------|--------------|----------------|------------------| | 4 | CRITICAL | 1 hour | 4 hours | Complete business outage | | 3 | HIGH | 2 hours | 8 hours | Major productivity impact | | 2 | MEDIUM | 4 hours | 24 hours | Single user/workaround exists | | 1 | LOW | 8 hours | 72 hours | Minor issue/enhancement |
Note: In Autotask, lower numbers = lower priority. Priority 4 is most urgent.
Complete Ticket Field Reference
Core Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | id | int | System | Auto-generated unique identifier | | ticketNumber | string | System | Human-readable (e.g., T20240215.0001) | | title | string(255) | Yes | Brief issue summary | | description | text | No | Detailed description | | companyID | int | Yes | Company/account reference | | companyLocationID | int | No | Site/location within company | | contactID | int | No | Primary contact for ticket |
Classification Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | status | int | Yes | Current status (see codes above) | | priority | int | Yes | Urgency level (1-4) | | queueID | int | Yes | Service queue for routing | | issueType | int | No | Primary category | | subIssueType | int | No | Sub-category | | ticketType | int | No | Service Request, Incident, Problem, Change | | ticketCategory | int | No | Additional categorization |
Assignment Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | assignedResourceID | int | No | Technician assigned | | assignedResourceRoleID | int | No | Role for billing | | creatorResourceID | int | System | Who created the ticket | | lastActivityResourceID | int | System | Last person to update |
SLA & Timeline Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | createDate | datetime | System | When ticket was created | | dueDateTime | datetime | No | SLA due date/time | | completedDate | datetime | System | When marked complete | | firstResponseDateTime | datetime | System | First response timestamp | | resolutionPlanDateTime | datetime | No | Expected resolution time | | resolvedDateTime | datetime | System | Actual resolution time | | lastActivityDate | datetime | System | Last update timestamp |
Contract & Billing Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | contractID | int | No | Associated contract | | contractServiceID | int | No | Specific service on contract | | contractServiceBundleID | int | No | Service bundle | | estimatedHours | decimal | No | Estimated effort | | hoursToBeScheduled | decimal | No | Hours remaining |
Resolution Fields
| Field | Type | Required | Description | |-------|------|----------|-------------| | resolution | text | Conditional | Required when completing | | resolutionType | int | No | Resolution category |
SLA Calculation Logic
Default SLA Times by Priority
const SLA_DEFAULTS = {
CRITICAL: { response: 1, resolution: 4 }, // hours
HIGH: { response: 2, resolution: 8 },
MEDIUM: { response: 4, resolution: 24 },
LOW: { response: 8, resolution: 72 }
};
SLA Calculation Example
// Calculate SLA due dates
function calculateSLADueDate(ticket, contractSLA) {
const now = new Date();
const priority = ticket.priority || 2; // Default to MEDIUM
// Use contract SLA if available, otherwise defaults
const responseHours = contractSLA?.responseTimeHours || SLA_DEFAULTS[priority].response;
const resolutionHours = contractSLA?.resolutionTimeHours || SLA_DEFAULTS[priority].resolution;
return {
responseBy: addHours(now, responseHours),
resolveBy: addHours(now, resolutionHours),
businessHoursOnly: true
};
}
SLA Clock Behavior
| Status | SLA Clock | |--------|-----------| | NEW | Running | | IN_PROGRESS | Running | | WAITING_CUSTOMER | Paused (configurable) | | WAITING_MATERIALS | Paused (configurable) | | ESCALATED | Running | | COMPLETE | Stopped |
Escalation Rules
Automatic Escalation Triggers
function checkEscalationRules(ticket) {
const reasons = [];
const now = new Date();
// SLA Violation
if (ticket.dueDateTime && new Date(ticket.dueDateTime) < now) {
const hoursOverdue = Math.floor(
(now - new Date(ticket.dueDateTime)) / (1000 * 60 * 60)
);
reasons.push(`SLA violated by ${hoursOverdue} hours`);
escalationLevel = Math.min(3, Math.floor(hoursOverdue / 4) + 1);
}
// Stale Waiting Status
if (ticket.status === 6 && ticket.lastActivityDate) {
const daysSinceActivity = Math.floor(
(now - new Date(ticket.lastActivityDate)) / (1000 * 60 * 60 * 24)
);
if (daysSinceActivity > 7) {
reasons.push(`No customer response for ${daysSinceActivity} days`);
}
}
// Critical Without Assignment
if (ticket.priority === 4 && !ticket.assignedResourceID) {
reasons.push('Critical ticket without assigned resource');
}
return { requiresEscalation: reasons.length > 0, reasons };
}
Escalation Levels
| Level | Trigger | Action | |-------|---------|--------| | 1 | SLA 0-4 hours overdue | Notify assigned resource | | 2 | SLA 4-8 hours overdue | Notify team lead | | 3 | SLA 8+ hours overdue | Notify management |
Ticket Metrics & KPIs
Key Performance Indicators
function calculateTicketMetrics(tickets) {
const completedTickets = tickets.filter(t => t.status === 5);
// Average Resolution Time (hours)
const avgResolutionTime = completedTickets.reduce((sum, t) => {
if (t.createDate && t.completedDate) {
return sum + (new Date(t.completedDate) - new Date(t.createDate));
}
return sum;
}, 0) / completedTickets.length / (1000 * 60 * 60);
// SLA Compliance Rate
const ticketsWithSLA = tickets.filter(t => t.dueDateTime);
const slaCompliant = ticketsWithSLA.filter(t => {
if (t.status === 5) {