Auto-triage new ConnectWise PSA tickets and post a Teams digest

Every 15 minutes, classify each new ConnectWise PSA ticket, tag urgency, leave an internal note for the technician, and post a digest to Microsoft Teams.

Agentic Task
ConnectWise PSA (Manage)Microsoft TeamsCustomer SupportOperationsFeedback TriageNotifications & AlertsDaily Digests

Build me an agent workflow that auto-triages new ConnectWise PSA service tickets before a human dispatcher touches them, then posts a single rolled-up recap to a Microsoft Teams channel. The goal is to do the classification grunt work, not to replace the dispatcher: never auto-close, never auto-assign an owner, never move boards on its own.

Trigger: cron, every 15 minutes. ConnectWise PSA is not a poll provider, so use a cron schedule plus a filtered list call as the trigger pattern (same approach as our existing ConnectWise + Slack alerts prompt).

On each run, use ConnectWise PSA List Service Tickets with a conditions filter to pull tickets that were created in roughly the last 20 minutes (a little wider than the cron interval so nothing slips between runs) AND are still on the intake board / default queue AND are still in a 'New' style status with no owner. I should be able to set the board name, the new-status names, and the lookback window as workflow inputs. If the board ID is not known up front, fall back to List Service Boards / List Board Statuses to resolve the right IDs.

For every matched ticket the agent should:

1. Read the summary and the initial description (the first ticket note / detail description).

2. Classify urgency as Critical, High, Medium, or Low using concrete language signals. Critical = outage / down / can't access / production / business stopped / VIP company / many users affected. High = single named system unavailable, security-sounding language, named exec. Medium = single user, intermittent, normal service request. Low = how-to, password reset on a non-VIP, cosmetic. Treat VIP company names and a configurable list of critical systems (email, ERP, line-of-business app, etc.) as boosters.

3. Infer ticket type (incident vs request) from the same signals: outage / broken / not working / error = incident; please add / new user / change / how do I = request.

4. Suggest a candidate board / team based on keyword cues (network, email, M365, security, hardware, etc.) but ONLY surface this in the internal note. Do not actually move the ticket.

Write-back to ConnectWise PSA, in this order, per ticket:

a. Update Service Ticket via JSON Patch to set /priority/id to the priority that matches the classified urgency. Resolve priority IDs at the start of the run (the user should be able to map Critical/High/Medium/Low to their own ConnectWise priority records as workflow inputs).

b. Add Note to Service Ticket with internalAnalysisFlag=true (internal only, the customer must never see it). Note body should be short and structured: classified urgency, ticket type guess, suggested board/team, the keyword signals it matched on, and a one-line 'why' summary. Sign the note with a fixed marker like 'Auto-triage by Geni' so we can detect it later.

Idempotency: before doing ANY write on a ticket, fetch its notes and check for an existing internal note that contains the 'Auto-triage by Geni' marker. If one exists, skip the ticket entirely. Never write twice on the same ticket. If a write fails partway (priority succeeds but note fails, or vice versa), log it and move on, do not retry the priority change.

After all tickets in the batch are processed, post ONE rolled-up Microsoft Teams message via Create Channel Message to a configurable team + channel (the dispatch channel). Format:

Header line: 'Triage recap — X tickets classified at <time>'.

Then a Critical section (only if any), then High, then a single combined Medium/Low count. Each line: ticket #, company, one-line summary, classified urgency, and a direct deep link to the ticket in ConnectWise (https://{siteUrl}/v4_6_release/services/system_io/router/openrecord.rails?locale=en_US&recordType=ServiceFV&recid={ticketId}).

If zero new tickets were triaged this run, do NOT post anything to Teams. Silent runs are fine, dispatch does not need a 'nothing happened' ping every 15 minutes.

Workflow inputs I should be able to set when configuring this: ConnectWise intake board name(s), 'new' status names that count as untriaged, priority ID mapping for Critical/High/Medium/Low, VIP company list, critical systems list, Teams team + channel, and cron interval.

Hard constraints, please respect all of them: never call Update Service Ticket for status, owner, or board; only /priority/id. Internal notes must be internalAnalysisFlag=true so customers do not see them. Skip anything older than the lookback window even if it matches the other filters, so a backlog import does not get auto-triaged. Be conservative on classification, default to Medium when the description is ambiguous, and say so in the note.

Additional information

What does this prompt do?
  • Watches your ConnectWise PSA intake queue every 15 minutes for newly created tickets that no dispatcher has touched yet.
  • Reads the summary and description, picks an urgency of Critical, High, Medium or Low, and decides whether it looks like an incident or a request.
  • Updates the ticket's priority and leaves a short internal note explaining how it made the call, so the on-call technician sees the reasoning the moment they open it.
  • Posts a single tidy recap to a Microsoft Teams channel with the most urgent tickets called out at the top and a direct link to each one.
What do I need to use this?
  • A ConnectWise PSA login with permission to read service tickets, update their priority, and add internal notes.
  • A Microsoft Teams account with access to the channel where you want the triage recap to land.
  • An idea of which board or queue holds your raw intake tickets, and the name of the Teams channel your dispatchers watch.
How can I customize it?
  • Change how often it runs. Fifteen minutes is the default, but you can stretch it to every hour for slower shops or tighten it to every five minutes during business hours.
  • Tune the urgency rules. Swap in your own keywords for what counts as Critical or High, name your VIP companies, or call out specific systems like email, ERP, or line-of-business apps.
  • Point it at a different Teams channel, or send separate recaps for Critical tickets and everything else so on-call and dispatch see only what they need.

Frequently asked questions

Will the agent assign tickets or close them automatically?
No. It only suggests a priority and writes its reasoning into an internal note. Owner assignment, board moves, and status changes stay with your dispatcher, which is how most MSPs prefer to keep this kind of automation.
Will it triage the same ticket twice?
No. Before it touches a ticket, the agent checks whether it has already left an internal note on that ticket in a previous run and skips anything it has already handled.
What if the description is too vague to classify?
The agent defaults to Medium urgency and says so in the internal note, so a human still sees the ticket in the recap and can override the call in one click.
Can I use Slack instead of Microsoft Teams?
Yes. Swap the Teams step for Slack when you set the workflow up. We picked Teams here because most MSP shops run on the Microsoft stack.
Does this work with on-premise ConnectWise PSA?
Yes. You connect it the same way as cloud, just point it at your own server hostname instead of the regional ConnectWise URL.

Stop hand-sorting every new ticket before your day starts.

Connect ConnectWise PSA and Microsoft Teams once, and Geni triages your intake queue every 15 minutes so dispatch only sees what already has a recommendation.