Service Desk Triage - Complete Copilot Studio Project Tutorial

Here is the complete documentation and demonstration of Service Desk Triage Project – This project demonstrate the Power of AI and how Agents and Workflows can be created within Copilot Studio.

 

Do subscribe me on YouTube if you find this content helpful and follow me on LinkedIn

If you want the Complete Project Solution file – Become a Member to My Channel

Download the below resources

Prerequisite for the Project Development

Step 1: Create a Shared Mailbox in Microsoft 365 Admin Center and Add members to it

M365 Admin Center - Create Shared Mailbox

Step 2: Create the following Dataverse tables – Support Ticket and Ticket Task – Below are the XML of Each Table

Support Ticket Table Schema
<entities>
<entity name=”ai_supportticket“ displayname=”Support Ticket“ etc=”10852“ primaryidfield=”ai_supportticketid“ primarynamefield=”ai_ticketid“ disableplugins=”false“>
<fields>
<field displayname=”Category“ name=”ai_category“ type=”optionsetvalue“ customfield=”true“/>
<field displayname=”Created By“ name=”createdby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Created By (Delegate)“ name=”createdonbehalfby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Created On“ name=”createdon“ type=”datetime“/>
<field displayname=”Import Sequence Number“ name=”importsequencenumber“ type=”number“/>
<field displayname=”Modified By“ name=”modifiedby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Modified By (Delegate)“ name=”modifiedonbehalfby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Modified On“ name=”modifiedon“ type=”datetime“/>
<field displayname=”Owner“ name=”ownerid“ type=”owner“/>
<field displayname=”Owning Business Unit“ name=”owningbusinessunit“ type=”entityreference“ lookupType=”businessunit“/>
<field displayname=”Owning Team“ name=”owningteam“ type=”entityreference“ lookupType=”team“/>
<field displayname=”Owning User“ name=”owninguser“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Priority“ name=”ai_priority“ type=”optionsetvalue“ customfield=”true“/>
<field displayname=”Record Created On“ name=”overriddencreatedon“ type=”datetime“/>
<field displayname=”Requestor Email“ name=”ai_requestoremail“ type=”string“ customfield=”true“/>
<field displayname=”Status“ name=”statecode“ type=”state“/>
<field displayname=”Status Reason“ name=”statuscode“ type=”status“/>
<field displayname=”Subject“ name=”ai_subject“ type=”string“ customfield=”true“/>
<field displayname=”Summary“ name=”ai_summary“ type=”string“ customfield=”true“/>
<field displayname=”Support Ticket“ name=”ai_supportticketid“ type=”guid“ primaryKey=”true“/>
<field displayname=”Ticket ID“ name=”ai_ticketid“ type=”string“ customfield=”true“/>
<field displayname=”Ticket Status“ name=”ai_ticketstatus“ type=”optionsetvalue“ customfield=”true“/>
<field displayname=”Time Zone Rule Version Number“ name=”timezoneruleversionnumber“ type=”number“/>
<field displayname=”UTC Conversion Time Zone Code“ name=”utcconversiontimezonecode“ type=”number“/>
<field displayname=”Version Number“ name=”versionnumber“ type=”bigint“/>
</fields>
<relationships/>
</entity>
</entities>
 
Ticket Task Table Schema
<entities>
<entity name=”ai_tickettask“ displayname=”Ticket Task“ etc=”10853“ primaryidfield=”ai_tickettaskid“ primarynamefield=”ai_taskid“ disableplugins=”false“>
<fields>
<field displayname=”Created By“ name=”createdby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Created By (Delegate)“ name=”createdonbehalfby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Created On“ name=”createdon“ type=”datetime“/>
<field displayname=”Import Sequence Number“ name=”importsequencenumber“ type=”number“/>
<field displayname=”Modified By“ name=”modifiedby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Modified By (Delegate)“ name=”modifiedonbehalfby“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Modified On“ name=”modifiedon“ type=”datetime“/>
<field displayname=”Owner“ name=”ownerid“ type=”owner“/>
<field displayname=”Owning Business Unit“ name=”owningbusinessunit“ type=”entityreference“ lookupType=”businessunit“/>
<field displayname=”Owning Team“ name=”owningteam“ type=”entityreference“ lookupType=”team“/>
<field displayname=”Owning User“ name=”owninguser“ type=”entityreference“ lookupType=”systemuser“/>
<field displayname=”Record Created On“ name=”overriddencreatedon“ type=”datetime“/>
<field displayname=”Sequence“ name=”ai_sequence“ type=”number“ customfield=”true“/>
<field displayname=”Status“ name=”statecode“ type=”state“/>
<field displayname=”Status Reason“ name=”statuscode“ type=”status“/>
<field displayname=”Task ID“ name=”ai_taskid“ type=”string“ customfield=”true“/>
<field displayname=”Task Name“ name=”ai_taskname“ type=”string“ customfield=”true“/>
<field displayname=”Ticket ID“ name=”ai_ticketid“ type=”entityreference“ lookupType=”ai_supportticket“ customfield=”true“/>
<field displayname=”Ticket Task“ name=”ai_tickettaskid“ type=”guid“ primaryKey=”true“/>
<field displayname=”Time Zone Rule Version Number“ name=”timezoneruleversionnumber“ type=”number“/>
<field displayname=”UTC Conversion Time Zone Code“ name=”utcconversiontimezonecode“ type=”number“/>
<field displayname=”Version Number“ name=”versionnumber“ type=”bigint“/>
</fields>
<relationships/>
</entity>
</entities>

Step 3: Download the Service Desk Knowledge and Test Cases

Agent Development - Incident Triage Agent

Model : Claude Sonnet 4.6

Knowledge : ServiceDesk-KB.docx

Instruction :

Role

You are a Tier-1 service desk triage analyst at Last Minute Coders Ltd.

You receive one support email that has already been categorised as an

Incident. Your job is to triage it — not to resolve it, and not to talk

to the requester directly. You return structured data that a workflow

will act on.

Source of truth

The Service Desk Knowledge Base is the only authority for priority

definitions, SLA policy, escalation rules, standard resolutions, and

reply style. Where your own judgement and the knowledge base disagree,

the knowledge base wins.

If the knowledge base does not cover the subject of the email, say so by

setting `needs_human` to true. Do not fill the gap with general IT

knowledge.

How to set priority

Apply the priority definitions in the knowledge base to the specific

situation described. Judge business impact, never the language used.

The words “urgent”, “ASAP”, “critical” and “immediately” carry no weight

on their own.

Count what is actually stated. “My team can’t work” implies more than

one user but does not state a number — treat that as evidence, not

proof. If the evidence for P1 is ambiguous, assign P2 and set

`needs_human` to true. Never guess upward.

When to set needs_human

Set `needs_human` to true if any escalation condition in the knowledge

base applies, or if any of these are true:

You assigned P1.

You could not determine the affected service with confidence.

The email describes two or more unrelated problems.

The email is a reply in a thread and you cannot see the original issue.

You had to make an assumption to assign a priority.

When you set it, `human_reason` must state the specific trigger in one

sentence. “Uncertain” is not a reason. “Names external customer

Fabrikam” is.

Remediation steps

Return 2 to 4 steps, taken from the standard resolutions in the

knowledge base where they apply. Each step under 12 words, imperative,

in the order a Tier-1 engineer would perform them.

If the knowledge base has no standard resolution for this issue, return

a single step: “Assign to Tier 2 for diagnosis — no standard resolution

on file.”

Draft reply

Follow the reply guidance in the knowledge base. Under 120 words.

Acknowledge what the person actually said, state the category, state

what happens next.

Do not include a ticket number, a deadline, an SLA figure, an engineer’s

name, or a resolution estimate. The workflow adds those afterwards from

authoritative data. If you write them, they will be wrong.

Sign off as “Last Minute Coders Service Desk”. Never as yourself.

Hard limits

Never invent asset tags, ticket numbers, engineer names, system names,

root causes, or user counts.

Never state a cause you cannot support from the email or the knowledge

base. “Likely a network issue” is a guess; leave it out.

If a field cannot be determined from the email, return “Unknown”

rather than a plausible-sounding value.

Return the structured output only. No preamble, no commentary.

Classify Node - Workflow

INCIDENT
Something that previously worked is now broken, erroring, degraded, or
unavailable. The requester already had access and it has stopped working.
Includes outages, crashes, error messages, hardware faults, and things
that are slow or behaving wrongly.

 

ACCESS REQUEST
The requester wants access, a licence, a permission, an account, or a
group membership that they do not currently have. Nothing is broken —
they have simply never had this access, or their role has changed.
Includes new joiners, team moves, and requests for extra permissions on
a system they already use.

 

HOW TO
The requester wants to know how to do something that already works and
is already available to them. They are asking for guidance, steps, or an
explanation — not reporting a fault and not requesting new access.

 

SPAM
Marketing emails, newsletters, vendor cold outreach, conference and
webinar invitations, and automated system notifications such as
out-of-office replies, delivery receipts, and monitoring digests. Not
sent by a Contoso employee asking for help.

 

UNCLASSIFIED
Use only when the message does not clearly fit any other category, or
when it is impossible to tell whether something is broken or whether new
access is being requested. Also use for messages that are too vague to
act on, or that belong to another department such as HR, Finance, or
Facilities.

Human Review Node - Workflow

WHY YOU’RE SEEING THIS


────────────────────────────────
Ticket:

Priority:

Service:
From:
Received:
KB coverage:

────────────────────────────────

WHAT THEY SAID


PROPOSED STEPS


PROPOSED REPLY

Subscribe
Notify of
0 Comments
Oldest
Newest Most Voted
Scroll to Top
0
Would love your thoughts, please comment.x
()
x