Skip to the lesson
CivOps AI Academy · M19Help Desk and Service Management: Tickets, SLAs, Incidents, Changes and the CMDB
0%

Chapter 1 · Intake, routing and roles

From a request to a ticket

People ask a business for help by email, on a website, by phone and in chat. A service desk turns every one of those into the same thing: a ticket with a number, an owner, a clock and a history. This chapter says what the desk replaces, how a request becomes a ticket and finds its way to a person, and who may do what.

22 min8 channels, 1 queue7 ticket types5 roles, 3 system logins

By the end of this chapter you can

  • Say what M19 replaces, who it serves and what it leaves to other modules.
  • Follow a request from any channel to a ticket, and say how an emailed reply finds the ticket it answers.
  • Read an impact and urgency table, and name the five roles and three logins that act on tickets.

One desk, three kinds of people

M19 replaces help desk, IT service management and customer support software: Zendesk, Freshdesk and Freshservice, Jira Service Management, ServiceNow ITSM at small-business scale, Zoho Desk and Intercom [1][2]. It is one desk for three groups of people: customers who ask a business for help, employees who ask for a laptop or a password reset, and the people who look after plant IT and OT, the computers that run machines. Table names start with svc_.

The desk takes tickets from email, a portal, a chat widget, phone logging, Slack or Teams, and an API. It uses queues, groups and routing, SLA policies with business hours, a service catalogue with approvals, incident, problem and change handling per ITIL 4 [3], a knowledge base, satisfaction surveys, and a configuration database (CMDB) that includes PLCs, HMIs and SCADA servers linked to the plant's equipment list.

In scopeLeft to another module
Tickets from email, portal, chat, phone, Slack or Teams, APIField visits to a customer or machine (M18)
Queues, groups, routing, macros, automationInvestigating a quality complaint (M08); the desk only raises the complaint
SLA policies, business hours, pause states, breach alertsWriting public help-centre pages (M17)
Service catalogue, incident, major incident, problem, change enablement
Knowledge base, deflection, CSAT, CMDB with IT and OT items

The capabilities and their tiers

Each capability carries a tier. MVP must exist for a small business to cancel the old tool with confidence. STD is parity with mainstream tools. BIC is best-in-class work, here the AI assist, which is advanced.

CapabilityWhat it doesTier
Omnichannel intakeEmail-to-ticket with threading, portal, chat widget, phone logging, Slack or Teams, API; the requester is matched to a core_person or CRM contactMVP
Ticket workflowTypes, statuses, priorities from impact and urgency, categories, groups, assignment (round robin, skills), internal notes, merge, parent and childMVP
SLA managementPolicies by conditions; first response, next response and resolution targets; business hours, holidays, pause statuses, breach warningsMVP
Knowledge baseInternal and public articles with versions, suggestions while typing, deflection measurementMVP
Service catalogueRequest items with forms (reusing the M01 engine), approvals and fulfilment tasksSTD
Incident and major incidentMajor incident flag, communication templates, linked tickets, post-incident reviewSTD
Problem managementProblems linking incidents, root cause, workaround, known-error databaseSTD
Change enablementStandard, normal and emergency changes; risk; implementation and back-out plans; approval; change calendar; conflict detectionSTD
CMDB (IT and OT)Configuration items including PLC, HMI, SCADA servers and network gear; relationships; link to equipmentSTD
CSAT and reportingSurveys on resolve; first response, time to resolution, backlog, SLA attainment, agent loadSTD
AI assistTriage (category and priority), summaries, suggested replies and articles, always with the agent's approvalBIC
From a request to a surveySix channels (email, portal, chat, phone, Slack or Teams, API) feed one intake route, which makes a ticket. The ticket is routed to a group, worked by an agent, resolved and followed by a survey. EmailPortalChatPhoneSlack or TeamsAPIIntake routematches the person,numbers the ticketTicketsvc_ticket, status newRoutingcategory, group, priorityAgentreplies, notes, macrosResolvedlast public replySurveyone answer per ticketThe service clock runs from the ticket to resolution; every step leaves a message or a status change.
From a request to a survey. Every channel ends at one intake route. It matches the person, numbers the ticket and stores the first message; routing then picks the group, priority and agent. The last public reply is the recorded resolution, and a survey follows.

What a ticket holds

A ticket is a row in svc_ticket; every message on it, public reply or internal note, is a row in svc_ticket_message. Messages are never edited: a correction is a new message.

FieldAllowed values
ticket_typeincident, service_request, question, problem, change, complaint, task
channelemail, portal, chat, phone, slack, teams, api, walk_in
statusnew, open, pending_requester, pending_third_party, on_hold, resolved, closed
priorityp1, p2, p3, p4, worked out from impact and urgency (low, medium, high)
message author_typeagent, requester, system, ai; each message is public or internal (is_internal)

Threading: a reply joins its ticket

An email has a Message-ID header. An answer to it carries In-Reply-To and References headers naming the message it answers [4]. The desk makes each outgoing message's ID before it is saved, stores it in channel_message_id and sends it in that header, so a reply can be matched exactly. If the headers do not match, the ticket number in the subject is the second try. The subject words and the sender address alone are never used, because one person has many tickets and subjects are reused.

How a reply finds its ticketA sent message stores its Message-ID. A customer's reply carries In-Reply-To and References headers. The intake route matches the headers first, then the ticket number in the subject; either joins the ticket (a resolved ticket reopens; a closed one gets a new child ticket with it as parent), and with no match a new, unlinked ticket is made. Message sentMessage-ID made first,saved in channel_message_idCustomer repliesIn-Reply-To and Referencesname the message answered1 · Message headersmatch channel_message_id2 · Ticket numberfound in the subject3 · No matchnothing to joinJoins the ticketa resolved one reopens; a closedone gets a new child ticketJoins the ticketsame rules, found by numberNew ticketnot linked to any otherNever match on the subject words or the sender alone. Skip automatic replies and your own addresses.The same reply sent twice adds nothing, because channel_message_id is unique.
How a reply finds its ticket. Headers first, then the ticket number, otherwise a new ticket. A reply to a resolved ticket reopens it; a reply to a closed one starts a new ticket whose parent_ticket_id is the old one.
  • Two robots never answer each other. Mail marked Auto-Submitted, and mail from the desk's own addresses, is ignored.
  • Sending twice adds nothing. channel_message_id is unique, so the same email cannot be stored twice.
  • Unknown sender. The ticket is made with requester_person_id empty and the address kept for the lead to link or create.
  • Mail from the host is authenticated. The web address the mail host forwards to carries a secret that the host sends with every request, kept in the host's environment variables; a request without it is refused.

Knowledge check

A customer replies to a notification, but the reply's subject has been rewritten and no ticket number is in it. What should find the ticket?

Routing, priority and macros

A ticket takes the default_group_id of its category. The next agent is the group member whose last assignment is oldest, which is worked out by reading svc_ticket, so routing never writes to the group row. Priority comes from impact and urgency. The module does not fix the table; you write your own down. The one below is an example.

Priority from impact and urgencyA three by three grid of impact against urgency. High impact and high urgency is p1; high and medium or medium and high is p2; medium and medium, high and low, or low and high is p3; the remaining three cells are p4. UrgencyImpactLowMediumHighHighp3p2p1 · firstMediump4 · lastp3p2Lowp4 · lastp4 · lastp3An example table:high and high is p1;high and medium, or mediumand high, is p2; the reststep down to p3 and p4.Write your own and keep it.
An example impact and urgency table. The cell decides the priority, and the priority picks the SLA policy. A macro is a saved reply plus a set of changes (for example: reply, set pending_requester, assign); it runs as the agent who clicks it, so it can do nothing that agent could not do by hand.

Who may do what

Access is written once, in the Role and Exposure Matrix, and row-level security (the database rule that decides which rows each login may read or change) is generated from it. Five roles are people; three logins are not.

Role or loginWhat it doesWhat it cannot do
RequesterRaises requests in the portal; reads own tickets and the public messages on themSee internal notes or anyone else's ticket; write directly (every write goes through the intake route)
AgentWorks tickets in own groups: replies, internal notes, macros, problems, changes, draft articlesSet is_major_incident, the due times, or the resolved and closed times; update another group's tickets
Support leadEverything an agent does in every group; runs groups, SLA policies, categories, catalogue, macros; sets the major incident flag; publishes articles; reads the whole desk's numbersDelete anything; nobody can delete
Change approverReads changes, items and linked tickets; moves a change from authorize to scheduled or rejected, with the board decisionApprove a change they wrote
CI ownerKeeps own configuration items current: status, firmware version, address, equipment linkUpdate another owner's item
Intake routeReceives email, portal, chat and API requests; writes the ticket and message for the requester; routes at creationWrite internal notes or the clock's columns
Service clock routeWorks out due times, upserts SLA events, warns before a breach, closes resolved tickets, sends surveysReply to anyone
Import loginBrings in the old tool's history as the lead's script runs itWrite SLA events or change requests
ScreenForShows
/support, /support/new, /support/t/[ticket_no]RequesterMy requests; a form that offers published articles as the person types; one ticket with public messages and a reply box
/desk, /desk/t/[ticket_no]AgentOpen tickets sorted by due time with a badge in words (due in 40 minutes, breached, paused), never colour alone; the thread with an internal-note switch and a macro menu
/desk/changes, /desk/cisAgent, approver, CI ownerChanges and configuration items
/desk/leadLeadTickets at risk, breached and unassigned; each group's load; the report panel
Exercise · Trace five real requests20 minutes

You need: Your current help desk tool or shared inbox, a notebook, and the table of channels and statuses in this chapter

Use the last five requests that were solved in the tool you want to replace. Write down facts about each, not what the customer wrote: do not copy customer names or message text anywhere.

Outcome: A five-row table of channel, type, first reply time and role, with the unmatched channels and your own impact and urgency table. It is the start of the inventory you build from in Session 1.

Knowledge check

Which role or login sets requester_person_id on a portal request?

References

  1. Atlassian: Jira Service Management ITSM features. https://www.atlassian.com/software/jira/service-management/features/itsm
  2. Freshworks: Freshservice IT service desk. https://www.freshworks.com/freshservice/it-service-desk/
  3. Giva: IT service desk software guide (ITIL 4 practices). https://givainc.com/blog/it-service-desk-software
  4. RFC 5322: Internet Message Format (Message-ID, In-Reply-To, References). https://www.rfc-editor.org/rfc/rfc5322

Chapter 2 · SLA policies and the data model

The service-level clock and the tables

A service-level agreement is a promise about time: reply within so long, fix within so long. Keeping it needs a clock that counts only the hours the team works, skips holidays and stops while the team waits for the customer. This chapter shows that clock on four worked tickets and then lists every column of the fifteen tables the desk is built from.

28 min3 targets per policy4 worked tickets15 tables

By the end of this chapter you can

  • Say what an SLA policy holds and why a clock on wall-clock time is wrong.
  • Work out a first response and resolution due time across a weekend, a holiday and a pause.
  • Find any column of the fifteen svc_ tables, its type, whether it is required, and which are soft links.

What an SLA policy holds

A policy in svc_sla_policy is chosen for a ticket by its conditions (for example priority p3) and its priority_order. It has up to three targets in minutes: first_response_min, next_response_min and resolution_min. It points at svc_business_hours (a time zone, the opening periods for each weekday, and a list of holidays) and lists pause_statuses, the ticket statuses during which the clock stops. ISO/IEC 20000-1:2018 sets the requirements for a service management system and expects service levels to be agreed and monitored [1]; ITIL 4 calls the practice service level management [2].

The numbers below are lab values used through this module to practise the arithmetic. They are not recommendations; use your own.

SettingLab value
Business hoursMonday to Friday, 09:00 to 17:00, one time zone
HolidayMonday 2026-05-25
Policy for priority p3first response 240 minutes, next response 240, resolution 960 (16 business hours)
Pause statusespending_requester, pending_third_party, on_hold
svc_business_hours.schedule
{"mon": [["09:00","17:00"]], "tue": [["09:00","17:00"]], "wed": [["09:00","17:00"]],
 "thu": [["09:00","17:00"]], "fri": [["09:00","17:00"]], "sat": [], "sun": []}

Counting business time

The rule is the same every time: start the clock at the ticket's creation or, if that is outside business hours or on a holiday, at the next opening; count only minutes inside the opening periods; stop counting during a pause. Times are stored in UTC, the one agreed reference time with no daylight saving, so a stored moment means the same instant wherever it is read, and the sums are done in the business hours' time zone using the language's own time-zone support, never hand-made offsets, so a day when the clocks change still comes out right.

One ticket on business timeA timeline drawn to scale from Friday 15:00 to Wednesday 17:00. Only Friday 15:00 to 17:00, Tuesday 09:00 to 17:00 and Wednesday 09:00 to 17:00 count; the weekend and the Monday holiday do not. The first reply is due Tuesday 11:00 and the resolution Wednesday 15:00. FriSat · closedSun · closedMon · holidayTueWedCreated Fri 15:00First reply due Tue 11:00Resolution due Wed 15:0009:00–17:0009:00–17:00Business minutes counted: Fri 120 + Tue 480 + Wed 360 = 960, the resolution target.First reply: Fri 120 + Tue 120 = 240, the first response target.countednot counted (outside hours)holiday
Ticket B on the business clock. Created Friday 15:00, it has two business hours on Friday; the weekend and Monday's holiday count nothing; Tuesday and Wednesday supply the rest. Drawn to scale, one hour is 7.4 pixels.
A paused clockThree working days drawn to scale. A ticket created Tuesday 10:00 has 960 business minutes to resolve. Tuesday 15:00 to 17:00 and Wednesday 09:00 to 11:00 are paused, so the due time moves from Wednesday to Thursday 14:00. Tue 2026-05-19091317Wed 2026-05-20091317Thu 2026-05-21091317Created 10:00Resolution due Thu 14:00counted: 5 h + 6 h + 5 h = 16 h = 960 minutespaused in pending_requester: 2 h + 2 h = 240 minutes, not countedHours of the working day (24-hour clock); nights and weekends are left out.Resolved Thursday 13:30, before the due time, so the target is met.
Ticket D with a pause. It waited for the requester from Tuesday 15:00 to Wednesday 11:00, which is four business hours. They are not counted, so the 960 minutes end on Thursday 14:00. Only business hours are drawn.
TicketCreatedFirst reply dueResolution dueResolvedResult
ATue 10:00Tue 14:00Thu 10:00Thu 11:30Resolution breached by 90 minutes
BFri 15:00Tue 11:00Wed 15:00Wed 14:00Met
CSat 11:00 (starts Tue 09:00)Tue 13:00Wed 17:00Wed 16:00Met
DTue 10:00Tue 14:00Thu 14:00 (after 240 paused minutes)Thu 13:30Met

Three of four tickets meet every target: an SLA attainment of 75 percent (tickets meeting all targets divided by tickets under an SLA). These four tickets are the seed the clock must reproduce exactly in a test.

Knowledge check

With the lab values, a ticket is created on Saturday at 11:00 and Monday is not a holiday. When is its first response due?

Events, warnings and attainment

  • svc_sla_event holds one row per ticket and metric (first_response, next_response, resolution): target_at, met_at, breached and paused_minutes. This build computes first_response and resolution; next_response_min is stored in the policy but not computed, so no next_response event is written.
  • Warning. At a share of the target's business minutes that you choose (80 percent is an example) the lead gets an action item and the ticket shows as at risk before it breaches. When the target passes, breached is set.
  • Free way first. The clock can be run whenever an agent or the lead opens the queue. A scheduled job is optional; its limits are on your host's own pricing page.

The fifteen tables

Every table carries the standard columns id, tenant_id, created_at, created_by, updated_at, updated_by, row_version, archived_at and ext (extra data as JSON), and is keyed to the spine tables core_person, core_site and core_equipment, so the desk has no people list, site list or equipment list of its own. The table below shows the columns the module adds. Types: text, int, bool, ts (timestamp with time zone), uuid, json. An arrow is a foreign key; soft link means a plain uuid with no foreign key, so the desk works with it empty. req means required.

The fifteen tablesFive groups of svc_ tables beside the spine: desk setup, the ticket, requests and knowledge, problem and change, and configuration. Setup and the spine feed the ticket; the ticket links to problems and changes, which point at configuration items; configuration items point at the spine's equipment and sites. Desk setupsvc_support_groupsvc_business_hourssvc_sla_policysvc_categorysvc_macroThe ticketsvc_ticketsvc_ticket_messagesvc_sla_eventsvc_csat_responseThe spine (core_)core_personcore_sitecore_equipmentcore_attachmentcore_approvalcore_commentcore_action_itemRequests and knowledgesvc_catalog_itemsvc_kb_articleProblem and changesvc_problemsvc_change_requestConfigurationsvc_configuration_itemsvc_ci_relationshipEvery table also carries the standard columns: id, tenant_id, created_at, created_by, updated_at, updated_by, row_version, archived_at, ext.
Fifteen tables in five groups beside the spine. The desk's own tables point at each other and at the spine; links to other modules (CRM, forms, content) are soft.
TableHoldsColumns: type, req = required
svc_support_groupA team or queuename text req, unique per tenant; email_alias text; business_hours_id → svc_business_hours; manager_id → core_person. Members are kept in ext.members
svc_business_hoursWorking hours and holidaysname text req; timezone text req; schedule json req; holidays json
svc_sla_policySLA targets and conditionsname text req; conditions json req; first_response_min int; next_response_min int; resolution_min int; business_hours_id → svc_business_hours; pause_statuses json; priority_order int
svc_categoryThe category treename text req; parent_id → svc_category; default_group_id → svc_support_group
svc_ticketA ticketticket_no text req, unique per tenant; ticket_type text req (seven values); channel text req (eight); subject text req; description text; requester_person_id → core_person; requester_contact_ref soft link to crm_contact; account_ref soft link to crm_account; status text req (seven); priority text req (p1 to p4); impact and urgency text (low, medium, high); category_id → svc_category; group_id → svc_support_group; assignee_id → core_person; sla_policy_id → svc_sla_policy; first_response_due_at, resolution_due_at, first_responded_at, resolved_at, closed_at ts; parent_ticket_id → svc_ticket; problem_id → svc_problem; configuration_item_id → svc_configuration_item; is_major_incident bool
svc_ticket_messageA public reply or internal noteticket_id → svc_ticket req; author_type text req (agent, requester, system, ai); author_person_id → core_person; body text req; is_internal bool req; channel_message_id text, unique per tenant when present; sent_at ts req
svc_sla_eventMetric tracking per ticketticket_id → svc_ticket req; metric text req (first_response, next_response, resolution), unique per ticket; target_at ts req; met_at ts; breached bool req; paused_minutes int
svc_catalog_itemA requestable servicename text req; description text; form_template_ref soft link to frm_template; approval_route json; fulfilment_group_id → svc_support_group; sla_policy_id → svc_sla_policy; active bool req
svc_problemA problem or known errorproblem_no text req, unique per tenant; title text req; root_cause text; workaround text; status text req (open, investigating, known_error, resolved, closed); owner_id → core_person
svc_change_requestAn IT or OT changecr_no text req, unique per tenant; title text req; change_type text req (standard, normal, emergency); risk text req (low, medium, high); impact_analysis text; implementation_plan text; backout_plan text; scheduled_start and scheduled_end ts; status text req (draft, assess, authorize, scheduled, implementing, review, closed, failed, rejected); cab_decision_at ts; configuration_item_id → svc_configuration_item
svc_configuration_itemAn IT or OT configuration itemci_no text req, unique per tenant; ci_class text req (server, workstation, laptop, network_device, application, database, plc, hmi, scada_server, historian, printer, mobile_device, cloud_service); name text req; status text req (planned, in_service, maintenance, retired); owner_id → core_person; equipment_id → core_equipment; site_id → core_site; firmware_version text; ip_address text; attributes json
svc_ci_relationshipA dependency between itemsfrom_ci_id → svc_configuration_item req; to_ci_id → svc_configuration_item req; relation text req (depends_on, hosts, connects_to, part_of, backs_up). An item cannot relate to itself, and the same relation is stored once
svc_kb_articleA knowledge articletitle text req; body text req; visibility text req (internal, public); status text req (draft, published, retired); category_id → svc_category; version int req; helpful_yes int; helpful_no int; cms_entry_ref soft link to cms_entry
svc_macroA canned reply and set of actionsname text req; actions json req; group_id → svc_support_group; active bool req
svc_csat_responseA satisfaction answerticket_id → svc_ticket req, one per ticket; score int req; comment text; responded_at ts req

Rules the database enforces

  • Unique per tenant: ticket_no, problem_no, cr_no, ci_no, the group name, and channel_message_id when present.
  • One row only: one svc_sla_event per ticket and metric; one svc_csat_response per ticket.
  • Never wrong: a ticket cannot be its own parent; an item cannot relate to itself; a change cannot reach authorize without both an implementation plan and a back-out plan.
  • Your choice, written down: the satisfaction scale. The specification leaves it open; 1 to 5 with 4 and 5 counted as positive is an example.
  • Numbers: ticket and change numbers come from a numbering function that runs with its owner's rights, so no role needs a right to change the sequence table.

Knowledge check

Why is svc_ticket.requester_contact_ref a soft link and svc_ticket.group_id a foreign key?

Exercise · Work out a ticket's due times by hand20 minutes

You need: Paper or a text file, and the lab values in this chapter (or your own hours and holiday list)

Work the sums by hand before any code does, so the test in Session 4 has an answer you trust. Ticket E is created on Wednesday 2026-05-20 at 16:30, priority p3. A first reply was sent Wednesday 16:45. Use the lab policy, business hours of 09:00 to 17:00 on weekdays, and the holiday on Monday 2026-05-25.

Outcome: Ticket E with a first response due Thursday 2026-05-21 12:30, a resolution due Friday 2026-05-22 16:30 with no pause, and Tuesday 2026-05-26 10:30 with the two-hour pause. The first reply on Wednesday 16:45 meets the first response target, so the pause only moves the resolution target. If your answers differ, find which rule differs: start of the clock, the holiday, or the pause. Ticket E stays out of the seed: it is a separate case the Session 4 clock test must also match.

References

  1. ISO/IEC 20000-1:2018 Service management system requirements. https://www.iso.org/standard/70636.html
  2. Giva: IT service desk software guide (ITIL 4 practices). https://givainc.com/blog/it-service-desk-software

Chapter 3 · ITIL 4 practices for IT and OT

Incident, problem, change and the CMDB

A desk that only answers tickets keeps fixing the same fault. ITIL 4 separates the work into practices: restore service now (incident), find the cause (problem), change safely (change enablement), and know what you run (configuration). This chapter shows how the desk records each, and why a PLC change needs more care than a laptop change.

25 min3 change types13 item classes5 relationship types

By the end of this chapter you can

  • Tell an incident, a major incident, a problem, a known error and a change apart.
  • Walk a change through its statuses and name the rules that stop an unsafe one.
  • Record a PLC or HMI as a configuration item with relationships, and list what a change would affect.

Incidents and major incidents

An incident is an unplanned interruption or reduction in the quality of a service; the aim is to restore service quickly. In the desk it is a ticket with ticket_type incident. When many people are affected the lead sets is_major_incident. Related tickets are linked with parent_ticket_id, one communication template posts one public update to each, and a post-incident review follows (it is held outside the desk in this build, and its outcome goes into the problem's root cause). Agents cannot set the flag themselves; a macro that tries is refused for an agent.

Problems and known errors

A problem is the underlying cause of one or more incidents. A row in svc_problem is linked from the incidents through problem_id, records the root_cause and a workaround, and moves open, investigating, known_error, resolved, closed. When a workaround is known the problem is a known error, and the workaround is written as an internal knowledge article so the next agent does not have to ask. In the lab, a problem links at least two incidents; a fault that keeps returning is the reason to open one.

Incident, problem and changeIncidents are linked to a problem. The problem becomes a known error once its cause or workaround is recorded, and a change fixes it. A major incident and a knowledge article hang off the incidents and the known error. Incidentstickets: restore serviceProblemsvc_problem, problem_idKnown errorroot cause, workaroundChangesvc_change_requestMajor incidentflag, linked tickets,one update, reviewKnowledge articlethe workaround, so thenext agent need not askfixed: the problem is resolvedRestore service first (incident); find the cause (problem); change the system once, safely (change).
From incident to change. Incidents restore service. A problem collects them and finds the cause. A known error carries a workaround into the knowledge base. A change fixes the cause once, and the problem is then resolved.

Knowledge check

Four tickets about the same print server failing are linked to one svc_problem. What should that record hold beyond the links?

Change enablement

ITIL 4 describes change enablement as making as many changes succeed as possible by assessing risk, authorising them and managing the change schedule [1]. A row in svc_change_request has a type (standard, normal or emergency), a risk of low, medium or high, an impact analysis, an implementation plan, a back-out plan (how to undo it), a scheduled window, the board's decision time and the configuration item it touches. ISO/IEC 20000-1:2018, the requirements for a service management system, also includes change management and configuration management [3].

The three types, in ITIL 4 terms: a standard change is low risk, well understood and pre-authorised; a normal change is assessed and decided through the change board; an emergency change is urgent and is assessed and decided quickly. In this build all three types keep the same record and the same two gates, so the type is recorded but does not change the route.

The life of a change requestSeven steps from draft to closed: draft, assess, authorize, scheduled, implementing, review, closed. Authorizing needs an implementation plan and a back-out plan; scheduling needs an approver other than the author and, for a PLC or HMI, a management-of-change reference. A change may end as rejected or failed. draftassessauthorizescheduledimplementingreviewclosedGate to authorize:an implementation planand a back-out planGate to schedule:the approver is not the author;a PLC or HMI needs a MOCreference firstEnds early:rejected at authorize,failed in implementingAll three change types (standard, normal, emergency) keep the same record and the same two gates in this build.
The life of a change request. Two gates stop an unsafe change: no authorisation without both plans, and no scheduling by the author or, for a PLC or HMI, without a management-of-change reference.
  • Refused: a move to authorize with no back-out plan.
  • Refused: scheduled for a PLC or HMI item with no ext.moc_ref. The specification says change requests on PLC and HMI items need a link to the plant's management-of-change record (module M11) before authorisation. This build always asks for a reference for those two classes; with no M11 it can be the plant's own MOC document number. The agent who wrote the change records it in ext.moc_ref before moving the change to authorize, so the approver is not refused.
  • Not by the author. Nobody approves a change they created. The approver records the decision with a core_approval row and the cab_decision_at time.
  • Flagged: a second change on the same item in an overlapping window.

Knowledge check

A normal change on a PLC has an implementation plan and a back-out plan but no ext.moc_ref. What happens when the approver tries to schedule it?

The configuration database

A configuration item (CI) is anything that has to be managed to deliver a service. In svc_configuration_item there are thirteen classes, both IT (server, workstation, laptop, network_device, application, database, printer, mobile_device, cloud_service) and OT (plc, hmi, scada_server, historian). Each has an owner, a site, a status (planned, in_service, maintenance, retired), and, for firmware and addresses, firmware_version and ip_address. A CI can point at a core_equipment row through equipment_id, which links the IT view of a PLC to the maintenance view of the machine it runs.

svc_ci_relationship records dependencies with five relations: depends_on, hosts, connects_to, part_of and backs_up. This is the second pitfall: a CMDB without relationships cannot assess the impact of a change. A recursive query, one that follows links again and again, lists everything affected by an item and goes into the change's impact analysis. It follows depends_on and connects_to backwards, to the items that point at the one being changed, and hosts forwards, to the items the changed item hosts. That works because connects_to is always recorded from the item that uses the link to the item it talks to: the operator screen connects_to the PLC, never the PLC to the screen. Write the convention down; a row stored the other way round drops out of the impact list.

Configuration items and their relationshipsA press in the equipment list is linked to a PLC. An operator screen and a SCADA server connect to the PLC (connects_to is recorded from the item that uses the link to the item it talks to), a historian depends on the SCADA server, and the PLC depends on a network switch. A firmware change on the PLC affects the screen, the SCADA server and the historian. Press 3core_equipmentPLCplc · firmware changeNetwork switchnetwork_deviceOperator screenhmiSCADA serverscada_serverHistorianhistorianequipment_idconnects_toconnects_todepends_ondepends_onconnects_to is drawn from the item that uses the link to the item it talks to.Amber: the item being changed.Rose: items that depend on itor connect to it, found by arecursive query over relationships.
Who is affected by a PLC firmware change. The operator screen and the SCADA server connect to the PLC and the historian depends on the SCADA server, so all three are in the impact analysis. The switch is something the PLC depends on, so it is not affected by this change.
Exercise · Map one machine's controls and test a change25 minutes

You need: Your plant's equipment list, network diagram or the engineer who looks after one machine, and paper or a text file

Pick one machine with a PLC. Record only what you can see on a drawing or a label; do not log in to any controller, and do not write passwords, addresses of live systems or anything on a safety function into a shared file.

Outcome: A one-page CI map for one machine with classes, owners and relationships, and a draft change with an impact list, a back-out plan and a management-of-change reference, or a clear note that none exists yet.

References

  1. Giva: IT service desk software guide (ITIL 4 practices). https://givainc.com/blog/it-service-desk-software
  2. ISA: ISA/IEC 62443 series of standards. https://www.isa.org/standards-and-publications/isa-standards/isa-iec-62443-series-of-standards
  3. ISO/IEC 20000-1:2018 Service management system requirements. https://www.iso.org/standard/70636.html

Chapter 4 · Deflection, KPIs and cutover

Knowledge, satisfaction and moving out

A good desk gets fewer tickets over time because the answers are published, and it can prove it with numbers. This chapter covers the knowledge base, the survey and complaints, the six measures with their definitions, and how to move out of the old tool and cancel it only when the new one has matched its figures.

20 min6 KPIs4 worked ticket results1 side-by-side week

By the end of this chapter you can

  • Describe how a knowledge article is published, versioned and counted toward deflection.
  • Calculate first response, time to resolution and SLA attainment from the four seed tickets, and say how a median is found.
  • Plan an import, a side-by-side run and a cutover that ends with the old subscription cancelled.

Knowledge that deflects

An article in svc_kb_article is internal or public, and is a draft, published or retired. A change to a published article becomes a new row with the next version, and the old one is retired; nothing is edited in place. The portal's request form offers published public articles as the person types. If an article answers the question, no ticket is raised, and the visit counts toward the deflection rate: portal sessions with an article view and no ticket, divided by portal sessions. Agents see suggestions while they type, and each article keeps helpful_yes and helpful_no counts. ITIL 4 calls this practice knowledge management [4].

How a knowledge base deflects ticketsA requester types a subject and sees suggested articles. If an article answers it, no ticket is raised and the portal session counts toward the deflection rate. Otherwise a ticket is raised, and a repeated gap becomes a new draft article. Requestertypes the subjectin the portalSuggested articlespublished and public,shown while typingArticle answers itno ticket raisedTicket raisedan agent answersCounteddeflection rateArticle gap?svc.kb_gap.detectedA gap becomes a draft article; the lead publishes it; the next requester finds it.
The deflection loop. Articles answer some questions before a ticket exists. Questions that still become tickets repeat, and a repeated gap (the event svc.kb_gap.detected) is the signal to write a draft article for the lead to publish.

The specification names the event svc.kb_gap.detected and the deflection rate; the six sessions write them down but do not build them, because both need the portal's sessions to be recorded. The AI assist (tier BIC) can suggest a category and priority, summarise a long thread and propose a reply or an article. Every suggestion waits for the agent's approval, and a message from the assistant is recorded with author_type ai. Tickets hold personal data, so never paste ticket text into a chat or a prompt that you have not been cleared to use.

Satisfaction and complaints

When a ticket is resolved the desk prepares a survey link carrying a signed single-use token: a random value the server stamps with a secret key, so it cannot be guessed or altered and the requester can answer once without signing in. The intake route writes one svc_csat_response; a second answer is refused. CSAT is positive responses divided by responses, and you decide which scores are positive and write it down. If the email setting allows, the survey is emailed; otherwise the link shows on the ticket. Nothing emails a customer until you switch email on, and the sending provider's price is on its own price page.

A customer who is unhappy may be making a complaint, a ticket of type complaint. ISO 10002:2018 gives guidelines for handling complaints in an organisation [1]. The desk records it and publishes svc.ticket.complaint; investigating a quality complaint is the job of module M08.

Knowledge check

A customer answers the same survey link twice. What does the desk store?

The six measures

KPIDefinitionSeed result
First response timeMedian minutes to the first public replyReplies took 60, 180, 180 and 60 business minutes: median 120
Time to resolutionMedian business hours to resolve (minus paused time)17.5, 15, 15 and 15.5 hours: median 15.25
SLA attainmentTickets meeting all targets ÷ tickets under an SLA3 of 4 = 75 percent
CSATPositive responses ÷ responsesFrom your own survey; positive is your definition
Deflection ratePortal sessions with an article view and no ticket ÷ portal sessionsNeeds portal sessions to be recorded
Change success rateChanges without incident or rollback ÷ changesFrom closed changes against failed ones

A median is the middle value of the numbers sorted from least to most; with an even count it is the mean of the middle two. Count first response in business minutes or calendar minutes to match what the old tool counts, and write which.

Time to resolution of the four seed ticketsBusiness hours to resolve, drawn to scale: ticket A 17.5, B 15, C 15 and D 15.5 after removing its paused four hours. The median is 15.25 hours; the target is 16, so only ticket A breaches. 0 h5 h10 h15 h20 hTicket A17.5 hTicket B15 hTicket C15 hTicket D15.5 hMedian 15.25 hTarget 16 h (960 minutes)
Time to resolution of the four seed tickets, in business hours, drawn to scale. Ticket A passes the 16-hour target by 90 minutes; D looks long on the calendar but 4 of its hours were paused.

Knowledge check

Ticket D was resolved 19.5 business hours after it was created and spent 4 of them paused. What time to resolution does the report show?

Moving out of the old tool

The old tool can export tickets with comments, users, organisations and articles through its API, as the specification notes for Zendesk, Freshdesk and Jira Service Management; check that your plan includes it on the vendor's own page instead of guessing. The vendors' pages show the words they use for tickets, requests and articles [2][3]. Closed tickets arrive as history and articles arrive as drafts for the lead to review. The goal is a cutover you can undo until a set date, and a cancellation only after the new desk matches the old one.

Moving out of the old toolExport from the old tool, map and report, then import with a dedicated login. Open tickets go live, closed tickets become archived history and articles become drafts. A week side by side, a comparison with the old tool's own figures, the cutover and then the cancellation. Exporttickets, comments, users,organisations, articlesMap and reportstatuses, priorities, channels;nothing guessedImport loginrun twice = run once(legacy key is unique)Open ticketslive, original times keptClosed ticketshistory, archived_at setArticlesarrive as drafts to reviewSide by sidea week of daily importsCompareold tool's figures vs yoursCut overrollback plan writtenCancelafter the final export
From export to cancellation. Each step leaves something to check: counts that agree, a mapping with nothing guessed, an import that changes nothing the second time, and figures that match the old tool's own.
  1. Export everything and count it: tickets open and closed, comments, users, organisations, articles. Choose a date that separates history from live tickets. Keep the export in a private folder and decide how long you will hold it.
  2. Map old statuses, priorities, channels, types, groups and tags onto the desk's, and list anything unmapped in a report; never guess.
  3. Import with the import login. A unique legacy key on tickets, messages and articles (the old tool's name and id) makes the import idempotent: running it twice gives the same result.
  4. Run side by side for at least a week, importing each morning while the old tool stays live.
  5. Compare first response, time to resolution and SLA attainment with the old tool's own reports for the same days, and explain every difference. The usual causes are calendar time against business hours, another holiday list, another pause rule, another time zone, merged or spam tickets, and solved against closed.
  6. Cut over on a set date with a final import, a rollback plan and the date after which switching back is no longer possible. Then cancel the paid tool after the final export is stored and write the saving from real invoices.
Exercise · Reconcile one week against the old tool20 minutes

You need: The old tool's report page for one past week, a notebook or spreadsheet, and the definitions in this chapter

This is the check that decides whether you can cancel. Use the old tool's own reports, not your estimates. Do not copy customer names or message text.

Outcome: A one-page reconciliation sheet: the old tool's own figures with their report names, the settings behind them, three hand-worked tickets, every difference explained, and a written condition for cutover.

References

  1. ISO 10002:2018 Quality management: customer satisfaction: guidelines for complaints handling in organizations. https://www.iso.org/standard/71580.html
  2. Freshworks: Freshservice IT service desk. https://www.freshworks.com/freshservice/it-service-desk/
  3. Atlassian: Jira Service Management ITSM features. https://www.atlassian.com/software/jira/service-management/features/itsm
  4. Giva: IT service desk software guide (ITIL 4 practices). https://givainc.com/blog/it-service-desk-software

Chapter 5 · 14 questions · 80% passes

Final assessment

Fourteen questions across the element. Score 80% (12 of 14) to pass. Your LMS records your score and each answer; you can review the chapters and try again.

15 min14 questions≈ 15 minutesRetake allowed

Choose one answer for each question, then submit. You will see the right answer and why for every question.

1. Who is the M19 service desk for?
2. A customer replies to a notification email. How does the intake route first find the ticket?
3. Who sets requester_person_id when someone raises a request in the portal?
4. With business hours of Monday to Friday 09:00 to 17:00, a request arrives on Saturday at 11:00. When does its service-level clock start?
5. With the lab policy (first response 240 minutes, hours 09:00 to 17:00), a ticket is created Tuesday at 10:00. When is the first response due?
6. A ticket sits in pending_requester for four business hours, and that status is listed in the policy's pause_statuses. What happens to the resolution due time?
7. Why are requester_contact_ref and account_ref soft links?
8. Which set of steps belongs to handling a major incident in this module?
9. What does a problem record add that an incident does not have?
10. In this module, a change request on a PLC is heading for the change board. What must it have before the approver can authorise (schedule) it?
11. Why does a configuration database need relationships between items?
12. How does the specification define deflection rate?
13. In the import from the old tool, what happens to closed tickets from before the history date?
14. On the four seed tickets, first replies take 60, 180, 180 and 60 business minutes. What is the median first response?